From 324fada5ea80ece851a2481127a5cbd5732e171f Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 20 Apr 2010 18:49:07 +0200 Subject: [PATCH] initial work on yammer importer code --- plugins/YammerImport/YammerImportPlugin.php | 77 ++++++++++ plugins/YammerImport/yamdump.php | 157 ++++++++++++++++++++ 2 files changed, 234 insertions(+) create mode 100644 plugins/YammerImport/YammerImportPlugin.php create mode 100644 plugins/YammerImport/yamdump.php diff --git a/plugins/YammerImport/YammerImportPlugin.php b/plugins/YammerImport/YammerImportPlugin.php new file mode 100644 index 0000000000..02923493fb --- /dev/null +++ b/plugins/YammerImport/YammerImportPlugin.php @@ -0,0 +1,77 @@ +. + */ + +/** + * @package YammerImportPlugin + * @maintainer Brion Vibber + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/'); + +class YammerImportPlugin extends Plugin +{ + /** + * Hook for RouterInitialized event. + * + * @param Net_URL_Mapper $m path-to-action mapper + * @return boolean hook return + */ + function onRouterInitialized($m) + { + $m->connect('admin/import/yammer', + array('action' => 'importyammer')); + return true; + } + + /** + * Set up queue handlers for import processing + * @param QueueManager $qm + * @return boolean hook return + */ + function onEndInitializeQueueManager(QueueManager $qm) + { + $qm->connect('importym', 'ImportYmQueueHandler'); + + return true; + } + + /** + * Automatically load the actions and libraries used by the plugin + * + * @param Class $cls the class + * + * @return boolean hook return + * + */ + function onAutoload($cls) + { + $base = dirname(__FILE__); + $lower = strtolower($cls); + switch ($cls) { + case 'yammerimqueuehandler': + case 'importyammeraction': + require_once $base . $lower . '.php'; + return false; + default: + return true; + } + } +} diff --git a/plugins/YammerImport/yamdump.php b/plugins/YammerImport/yamdump.php new file mode 100644 index 0000000000..60be81ca5d --- /dev/null +++ b/plugins/YammerImport/yamdump.php @@ -0,0 +1,157 @@ +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