]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Fetch more user data in Yammer imports, including the primary email address (preconfi...
authorBrion Vibber <brion@pobox.com>
Wed, 22 Sep 2010 01:15:32 +0000 (18:15 -0700)
committerBrion Vibber <brion@pobox.com>
Tue, 28 Sep 2010 14:44:22 +0000 (07:44 -0700)
plugins/YammerImport/sn_yammerclient.php
plugins/YammerImport/yamdump.php
plugins/YammerImport/yammer-import.php
plugins/YammerImport/yammerimporter.php

index f7382abae19c1e66eb7c3a773898c629954e77bd..0f244ced6a466772f405e70d66d7db89ccbbae28 100644 (file)
@@ -185,8 +185,36 @@ class SN_YammerClient
         return $this->apiBase . '/oauth/authorize?oauth_token=' . urlencode($token);
     }
 
+    /**
+     * High-level API hit: fetch all messages in the network (up to 20 at a time).
+     * Return data is the full JSON array returned, including meta and references
+     * sections.
+     *
+     * The matching messages themselves will be in the 'messages' item within.
+     *
+     * @param array $options optional set of additional params for the request.
+     * @return array
+     *
+     * @throws Exception on low-level or HTTP error
+     */
     public function messages($params=array())
     {
         return $this->api('messages', $params);
     }
+
+    /**
+     * High-level API hit: fetch all users in the network (up to 50 at a time).
+     * Return data is the full JSON array returned, listing user items.
+     *
+     * The matching messages themselves will be in the 'users' item within.
+     *
+     * @param array $options optional set of additional params for the request.
+     * @return array of JSON-sourced user data arrays
+     *
+     * @throws Exception on low-level or HTTP error
+     */
+    public function users($params=array())
+    {
+        return $this->api('users', $params);
+    }
 }
index ef392759810c3bc729b60e7aa36f19d3d27dd0fe..809baa1223332f9a26b8d389757f6058b8082630 100644 (file)
@@ -13,50 +13,22 @@ require 'yam-config.php';
 $yam = new SN_YammerClient($consumerKey, $consumerSecret, $token, $tokenSecret);
 $imp = new YammerImporter($yam);
 
-$data = $yam->messages();
+$data = $yam->users();
 var_dump($data);
-
-/*
-  ["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?
-
-// 20 qualifying messages per hit...
-// use older_than to grab more
-// (better if we can go in reverse though!)
-// meta: The older-available element indicates whether messages older than those shown are available to be fetched. See the older_than parameter mentioned above.
-
-foreach ($data['references'] as $item) {
-    if ($item['type'] == 'user') {
-        $user = $imp->prepUser($item);
-        var_dump($user);
-    } else if ($item['type'] == 'group') {
-        $group = $imp->prepGroup($item);
-        var_dump($group);
-    } else if ($item['type'] == 'tag') {
-        // could need these if we work from the parsed message text
-        // otherwise, the #blarf in orig text is fine.
-    } else if ($item['type'] == 'thread') {
-        // Shouldn't need thread info; we'll reconstruct conversations
-        // from the reply-to chains.
-    } else if ($item['type'] == 'message') {
-        // If we're processing everything, then we don't need the refs here.
-    } else {
-        echo "(skipping unknown ref: " . $item['type'] . ")\n";
-    }
+// @fixme follow paging
+foreach ($data as $item) {
+    $user = $imp->prepUser($item);
+    var_dump($user);
 }
 
-// Process in reverse chron order...
+/*
+$data = $yam->messages();
+var_dump($data);
 // @fixme follow paging
 $messages = $data['messages'];
-array_reverse($messages);
+$messages = array_reverse($messages);
 foreach ($messages as $message) {
     $notice = $imp->prepNotice($message);
     var_dump($notice);
 }
+*/
index da99c48e903c5f2e085a6950ecf728692631edec..7241809ba05733e4095604eb0d00821daf1c23af 100644 (file)
@@ -13,44 +13,26 @@ require 'yam-config.php';
 $yam = new SN_YammerClient($consumerKey, $consumerSecret, $token, $tokenSecret);
 $imp = new YammerImporter($yam);
 
-$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?
+// First, import all the users!
+// @fixme follow paging -- we only get 50 at a time
+$data = $yam->users();
+foreach ($data as $item) {
+    $user = $imp->importUser($item);
+    echo "Imported Yammer user " . $item['id'] . " as $user->nickname ($user->id)\n";
+}
 
-// 20 qualifying messages per hit...
-// use older_than to grab more
-// (better if we can go in reverse though!)
-// meta: The older-available element indicates whether messages older than those shown are available to be fetched. See the older_than parameter mentioned above.
+$data = $yam->messages();
+// @fixme pull the full group list; this'll be a partial list with less data
+// and only for groups referenced in the message set.
 foreach ($data['references'] as $item) {
-    if ($item['type'] == 'user') {
-        $user = $imp->importUser($item);
-        echo "Imported Yammer user " . $item['id'] . " as $user->nickname ($user->id)\n";
-    } else if ($item['type'] == 'group') {
+    if ($item['type'] == 'group') {
         $group = $imp->importGroup($item);
         echo "Imported Yammer group " . $item['id'] . " as $group->nickname ($group->id)\n";
-    } else if ($item['type'] == 'tag') {
-        // could need these if we work from the parsed message text
-        // otherwise, the #blarf in orig text is fine.
-    } else if ($item['type'] == 'thread') {
-        // Shouldn't need thread info; we'll reconstruct conversations
-        // from the reply-to chains.
-    } else if ($item['type'] == 'message') {
-        // If we're processing everything, then we don't need the refs here.
-    } else {
-        echo "(skipping unknown ref: " . $item['type'] . ")\n";
     }
 }
 
 // Process in reverse chron order...
-// @fixme follow paging
+// @fixme follow paging -- we only get 20 at a time, and start at the most recent!
 $messages = $data['messages'];
 $messages = array_reverse($messages);
 foreach ($messages as $item) {
index bb6db73528e4b77b24280a9a664e318c1c4fbf01..583ed3a8c117bff0a7d53329cdd69185c3af9507 100644 (file)
@@ -158,16 +158,60 @@ class YammerImporter
         $options['nickname'] = $item['name'];
         $options['fullname'] = trim($item['full_name']);
 
-        // We don't appear to have full bio avail here!
-        $options['bio'] = $item['job_title'];
-
-        // What about other data like emails?
-
         // Avatar... this will be the "_small" variant.
         // Remove that (pre-extension) suffix to get the orig-size image.
         $avatar = $item['mugshot_url'];
 
-        // Warning: we don't have following state for other users?
+        // The following info is only available in full data, not in the reference version.
+
+        // There can be extensive contact info, but for now we'll only pull the primary email.
+        if (isset($item['contact'])) {
+            foreach ($item['contact']['email_addresses'] as $addr) {
+                if ($addr['type'] == 'primary') {
+                    $options['email'] = $addr['address'];
+                    $options['email_confirmed'] = true;
+                    break;
+                }
+            }
+        }
+
+        // There can be multiple external URLs; for now pull the first one as home page.
+        if (isset($item['external_urls'])) {
+            foreach ($item['external_urls'] as $url) {
+                if (common_valid_http_url($url)) {
+                    $options['homepage'] = $url;
+                    break;
+                }
+            }
+        }
+
+        // Combine a few bits into the bio...
+        $bio = array();
+        if (!empty($item['job_title'])) {
+            $bio[] = $item['job_title'];
+        }
+        if (!empty($item['summary'])) {
+            $bio[] = $item['summary'];
+        }
+        if (!empty($item['expertise'])) {
+            $bio[] = _m('Expertise:') . ' ' . $item['expertise'];
+        }
+        $options['bio'] = implode("\n\n", $bio);
+
+        // Pull raw location string, may be lookupable
+        if (!empty($item['location'])) {
+            $options['location'] = $item['location'];
+        }
+
+        // Timezone is in format like 'Pacific Time (US & Canada)'
+        // We need to convert that to a zone id. :P
+        // @fixme timezone not yet supported at registration time :)
+        if (!empty($item['timezone'])) {
+            $tz = $this->timezone($item['timezone']);
+            if ($tz) {
+                $options['timezone'] = $tz;
+            }
+        }
 
         return array('orig_id' => $origId,
                      'orig_url' => $origUrl,
@@ -325,6 +369,18 @@ class YammerImporter
         return common_sql_date(strtotime($ts));
     }
 
+    private function timezone($tz)
+    {
+        // Blaaaaaarf!
+        $known = array('Pacific Time (US & Canada)' => 'America/Los_Angeles',
+                       'Eastern Time (US & Canada)' => 'America/New_York');
+        if (array_key_exists($known, $tz)) {
+            return $known[$tz];
+        } else {
+            return false;
+        }
+    }
+
     /**
      * Download and update given avatar image
      *