From 599f4fe121f41629a1760b205747e6aec7f72fee Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 21 Sep 2010 13:56:30 -0700 Subject: [PATCH] Beginning stub of Yammer message->notice import --- plugins/YammerImport/YammerImportPlugin.php | 6 +- plugins/YammerImport/yamdump.php | 162 +++----------------- plugins/YammerImport/yammerimporter.php | 68 ++++++++ 3 files changed, 90 insertions(+), 146 deletions(-) create mode 100644 plugins/YammerImport/yammerimporter.php diff --git a/plugins/YammerImport/YammerImportPlugin.php b/plugins/YammerImport/YammerImportPlugin.php index 02923493fb..a3520d8a86 100644 --- a/plugins/YammerImport/YammerImportPlugin.php +++ b/plugins/YammerImport/YammerImportPlugin.php @@ -65,10 +65,12 @@ class YammerImportPlugin extends Plugin { $base = dirname(__FILE__); $lower = strtolower($cls); - switch ($cls) { + switch ($lower) { + case 'sn_yammerclient': + case 'yammerimporter': case 'yammerimqueuehandler': case 'importyammeraction': - require_once $base . $lower . '.php'; + require_once "$base/$lower.php"; return false; default: return true; diff --git a/plugins/YammerImport/yamdump.php b/plugins/YammerImport/yamdump.php index 60be81ca5d..953b7d1a62 100644 --- a/plugins/YammerImport/yamdump.php +++ b/plugins/YammerImport/yamdump.php @@ -8,150 +8,24 @@ define('INSTALLDIR', dirname(dirname(dirname(__FILE__)))); require INSTALLDIR . "/scripts/commandline.inc"; -class SN_YammerClient -{ - protected $apiBase = "https://www.yammer.com"; - protected $consumerKey, $consumerSecret; - protected $token, $tokenSecret; - - public function __construct($consumerKey, $consumerSecret, $token=null, $tokenSecret=null) - { - $this->consumerKey = $consumerKey; - $this->consumerSecret = $consumerSecret; - $this->token = $token; - $this->tokenSecret = $tokenSecret; - } - - /** - * Make an HTTP hit with OAuth headers and return the response body on success. - * - * @param string $path URL chunk for the API method - * @param array $params - * @return array - * - * @throws Exception for HTTP error - */ - protected function fetch($path, $params=array()) - { - $url = $this->apiBase . '/' . $path; - if ($params) { - $url .= '?' . http_build_query($params, null, '&'); - } - $headers = array('Authorization: ' . $this->authHeader()); - var_dump($headers); - - $client = HTTPClient::start(); - $response = $client->get($url, $headers); - - if ($response->isOk()) { - return $response->getBody(); - } else { - throw new Exception("Yammer API returned HTTP code " . $response->getStatus() . ': ' . $response->getBody()); - } - } - - /** - * Hit the main Yammer API point and decode returned JSON data. - * - * @param string $method - * @param array $params - * @return array from JSON data - * - * @throws Exception for HTTP error or bad JSON return - */ - protected function api($method, $params=array()) - { - $body = $this->fetch("api/v1/$method.json", $params); - $data = json_decode($body, true); - if (!$data) { - throw new Exception("Invalid JSON response from Yammer API"); - } - return $data; - } - - /** - * Build an Authorization header value from the keys we have available. - */ - protected function authHeader() - { - // token - // token_secret - $params = array('realm' => '', - 'oauth_consumer_key' => $this->consumerKey, - 'oauth_signature_method' => 'PLAINTEXT', - 'oauth_timestamp' => time(), - 'oauth_nonce' => time(), - 'oauth_version' => '1.0'); - if ($this->token) { - $params['oauth_token'] = $this->token; - } - if ($this->tokenSecret) { - $params['oauth_signature'] = $this->consumerSecret . '&' . $this->tokenSecret; - } else { - $params['oauth_signature'] = $this->consumerSecret . '&'; - } - if ($this->verifier) { - $params['oauth_verifier'] = $this->verifier; - } - $parts = array_map(array($this, 'authHeaderChunk'), array_keys($params), array_values($params)); - return 'OAuth ' . implode(', ', $parts); - } - - /** - * @param string $key - * @param string $val - */ - protected function authHeaderChunk($key, $val) - { - return urlencode($key) . '="' . urlencode($val) . '"'; - } - - /** - * @return array of oauth return data; should contain nice things - */ - public function requestToken() - { - if ($this->token || $this->tokenSecret) { - throw new Exception("Requesting a token, but already set up with a token"); - } - $data = $this->fetch('oauth/request_token'); - $arr = array(); - parse_str($data, $arr); - return $arr; - } - - /** - * @return array of oauth return data; should contain nice things - */ - public function accessToken($verifier) - { - $this->verifier = $verifier; - $data = $this->fetch('oauth/access_token'); - $this->verifier = null; - $arr = array(); - parse_str($data, $arr); - return $arr; - } - - /** - * Give the URL to send users to to authorize a new app setup - * - * @param string $token as returned from accessToken() - * @return string URL - */ - public function authorizeUrl($token) - { - return $this->apiBase . '/oauth/authorize?oauth_token=' . urlencode($token); - } - - public function messages($params) - { - return $this->api('messages', $params); - } -} - - // temp stuff require 'yam-config.php'; $yam = new SN_YammerClient($consumerKey, $consumerSecret, $token, $tokenSecret); -var_dump($yam->messages()); \ No newline at end of file +$imp = new YammerImporter(); + +$data = $yam->messages(); +/* + ["messages"]=> + ["meta"]=> // followed_user_ids, current_user_id, etc + ["threaded_extended"]=> // empty! + ["references"]=> // lists the users, threads, replied messages, tags +*/ + +// 1) we're getting messages in descending order, but we'll want to process ascending +// 2) we'll need to pull out all those referenced items too? +// 3) do we need to page over or anything? + +foreach ($data['messages'] as $message) { + $notice = $imp->messageToNotice($message); + var_dump($notice); +} diff --git a/plugins/YammerImport/yammerimporter.php b/plugins/YammerImport/yammerimporter.php new file mode 100644 index 0000000000..b322c9b64e --- /dev/null +++ b/plugins/YammerImport/yammerimporter.php @@ -0,0 +1,68 @@ +. + */ + +/** + * Basic client class for Yammer's OAuth/JSON API. + * + * @package YammerImportPlugin + * @author Brion Vibber + */ +class YammerImporter +{ + function messageToNotice($message) + { + $messageId = $message['id']; + $messageUrl = $message['url']; + + $profile = $this->findImportedProfile($message['sender_id']); + $content = $message['body']['plain']; + $source = 'yammer'; + $options = array(); + + if ($message['replied_to_id']) { + $replyto = $this->findImportedNotice($message['replied_to_id']); + if ($replyto) { + $options['replyto'] = $replyto; + } + } + $options['created'] = common_sql_date(strtotime($message['created_at'])); + + // Parse/save rendered text? + // Save liked info? + // @todo attachments? + + return array('orig_id' => $messageId, + 'profile' => $profile, + 'content' => $content, + 'source' => $source, + 'options' => $options); + } + + function findImportedProfile($userId) + { + // @fixme + return $userId; + } + + function findImportedNotice($messageId) + { + // @fixme + return $messageId; + } +} \ No newline at end of file -- 2.39.5