. */ /** * Basic client class for Yammer's OAuth/JSON API. * * @package YammerImportPlugin * @author Brion Vibber */ class YammerImporter { protected $users=array(); protected $groups=array(); protected $notices=array(); /** * Load or create an imported profile from Yammer data. * * @param object $item loaded JSON data for Yammer importer * @return Profile */ function importUser($item) { $data = $this->prepUser($item); $profileId = $this->findImportedUser($data['orig_id']); if ($profileId) { return Profile::staticGet('id', $profileId); } else { $user = User::register($data['options']); // @fixme set avatar! $this->recordImportedUser($data['orig_id'], $user->id); return $user->getProfile(); } } /** * Load or create an imported group from Yammer data. * * @param object $item loaded JSON data for Yammer importer * @return User_group */ function importGroup($item) { $data = $this->prepGroup($item); $groupId = $this->findImportedGroup($data['orig_id']); if ($groupId) { return User_group::staticGet('id', $groupId); } else { $group = User_group::register($data['options']); // @fixme set avatar! $this->recordImportedGroup($data['orig_id'], $group->id); return $group; } } /** * Load or create an imported notice from Yammer data. * * @param object $item loaded JSON data for Yammer importer * @return Notice */ function importNotice($item) { $data = $this->prepNotice($item); $noticeId = $this->findImportedNotice($data['orig_id']); if ($noticeId) { return Notice::staticGet('id', $noticeId); } else { $notice = Notice::saveNew($data['profile'], $data['content'], $data['source'], $data['options']); // @fixme attachments? $this->recordImportedNotice($data['orig_id'], $notice->id); return $notice; } } /** * Pull relevant info out of a Yammer data record for a user import. * * @param array $item * @return array */ function prepUser($item) { if ($item['type'] != 'user') { throw new Exception('Wrong item type sent to Yammer user import processing.'); } $origId = $item['id']; $origUrl = $item['url']; // @fixme check username rules? $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? return array('orig_id' => $origId, 'orig_url' => $origUrl, 'avatar' => $avatar, 'options' => $options); } /** * Pull relevant info out of a Yammer data record for a group import. * * @param array $item * @return array */ function prepGroup($item) { if ($item['type'] != 'group') { throw new Exception('Wrong item type sent to Yammer group import processing.'); } $origId = $item['id']; $origUrl = $item['url']; $privacy = $item['privacy']; // Warning! only public groups in SN so far $options['nickname'] = $item['name']; $options['fullname'] = $item['full_name']; $options['created'] = $this->timestamp($item['created_at']); $avatar = $item['mugshot_url']; // as with user profiles... $options['mainpage'] = common_local_url('showgroup', array('nickname' => $options['nickname'])); // @fixme what about admin user for the group? // bio? homepage etc? aliases? $options['local'] = true; return array('orig_id' => $origId, 'orig_url' => $origUrl, 'options' => $options); } /** * Pull relevant info out of a Yammer data record for a notice import. * * @param array $item * @return array */ function prepNotice($item) { if (isset($item['type']) && $item['type'] != 'message') { throw new Exception('Wrong item type sent to Yammer message import processing.'); } $origId = $item['id']; $origUrl = $item['url']; $profile = $this->findImportedUser($item['sender_id']); $content = $item['body']['plain']; $source = 'yammer'; $options = array(); if ($item['replied_to_id']) { $replyto = $this->findImportedNotice($item['replied_to_id']); if ($replyto) { $options['replyto'] = $replyto; } } $options['created'] = $this->timestamp($item['created_at']); // Parse/save rendered text? // Save liked info? // @todo attachments? return array('orig_id' => $origId, 'orig_url' => $origUrl, 'profile' => $profile, 'content' => $content, 'source' => $source, 'options' => $options); } private function findImportedUser($origId) { if (isset($this->users[$origId])) { return $this->users[$origId]; } else { return false; } } private function findImportedGroup($origId) { if (isset($this->groups[$origId])) { return $this->groups[$origId]; } else { return false; } } private function findImportedNotice($origId) { if (isset($this->notices[$origId])) { return $this->notices[$origId]; } else { return false; } } private function recordImportedUser($origId, $userId) { $this->users[$origId] = $userId; } private function recordImportedGroup($origId, $groupId) { $this->groups[$origId] = $groupId; } private function recordImportedNotice($origId, $noticeId) { $this->notices[$origId] = $noticeId; } /** * Normalize timestamp format. * @param string $ts * @return string */ private function timestamp($ts) { return common_sql_date(strtotime($ts)); } }