From da87d4334ab7ffb1dd76fc58b8ac6384597dd1e7 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 21 Sep 2010 18:15:32 -0700 Subject: [PATCH] Fetch more user data in Yammer imports, including the primary email address (preconfirmed, so we can do stuff like tell people to reset their passwords and log in!) and some bio info. --- plugins/YammerImport/sn_yammerclient.php | 28 ++++++++++ plugins/YammerImport/yamdump.php | 48 ++++------------- plugins/YammerImport/yammer-import.php | 42 +++++---------- plugins/YammerImport/yammerimporter.php | 68 +++++++++++++++++++++--- 4 files changed, 112 insertions(+), 74 deletions(-) diff --git a/plugins/YammerImport/sn_yammerclient.php b/plugins/YammerImport/sn_yammerclient.php index f7382abae1..0f244ced6a 100644 --- a/plugins/YammerImport/sn_yammerclient.php +++ b/plugins/YammerImport/sn_yammerclient.php @@ -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); + } } diff --git a/plugins/YammerImport/yamdump.php b/plugins/YammerImport/yamdump.php index ef39275981..809baa1223 100644 --- a/plugins/YammerImport/yamdump.php +++ b/plugins/YammerImport/yamdump.php @@ -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); } +*/ diff --git a/plugins/YammerImport/yammer-import.php b/plugins/YammerImport/yammer-import.php index da99c48e90..7241809ba0 100644 --- a/plugins/YammerImport/yammer-import.php +++ b/plugins/YammerImport/yammer-import.php @@ -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) { diff --git a/plugins/YammerImport/yammerimporter.php b/plugins/YammerImport/yammerimporter.php index bb6db73528..583ed3a8c1 100644 --- a/plugins/YammerImport/yammerimporter.php +++ b/plugins/YammerImport/yammerimporter.php @@ -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 * -- 2.39.5