]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
initial work on yammer importer code
authorBrion Vibber <brion@pobox.com>
Tue, 20 Apr 2010 16:49:07 +0000 (18:49 +0200)
committerBrion Vibber <brion@pobox.com>
Tue, 28 Sep 2010 14:44:19 +0000 (07:44 -0700)
plugins/YammerImport/YammerImportPlugin.php [new file with mode: 0644]
plugins/YammerImport/yamdump.php [new file with mode: 0644]

diff --git a/plugins/YammerImport/YammerImportPlugin.php b/plugins/YammerImport/YammerImportPlugin.php
new file mode 100644 (file)
index 0000000..0292349
--- /dev/null
@@ -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 (file)
index 0000000..60be81c
--- /dev/null
@@ -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