diff options
author | Brion Vibber <brion@pobox.com> | 2010-04-20 18:49:07 +0200 |
---|---|---|
committer | Brion Vibber <brion@pobox.com> | 2010-09-28 07:44:19 -0700 |
commit | 10379e8ddbebfca8a989dacd28e202312a17a297 (patch) | |
tree | a8180725221a01e1bbf58d9dbe9a77b3cbac2bec | |
parent | a6469aeed88a400d5d38d75a210417de4af4eea7 (diff) |
initial work on yammer importer code
-rw-r--r-- | plugins/YammerImport/YammerImportPlugin.php | 77 | ||||
-rw-r--r-- | plugins/YammerImport/yamdump.php | 157 |
2 files changed, 234 insertions, 0 deletions
diff --git a/plugins/YammerImport/YammerImportPlugin.php b/plugins/YammerImport/YammerImportPlugin.php new file mode 100644 index 000000000..02923493f --- /dev/null +++ b/plugins/YammerImport/YammerImportPlugin.php @@ -0,0 +1,77 @@ +<?php +/* + * StatusNet - the distributed open-source microblogging tool + * Copyright (C) 2010, StatusNet, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * @package YammerImportPlugin + * @maintainer Brion Vibber <brion@status.net> + */ + +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 000000000..60be81ca5 --- /dev/null +++ b/plugins/YammerImport/yamdump.php @@ -0,0 +1,157 @@ +<?php + +if (php_sapi_name() != 'cli') { + die('no'); +} + +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 |