Example #1
0
/**
 *
 * @param User $user 
 * @return TwitterOAuthClient
 */
function twitterAuthForUser(User $user)
{
    $flink = Foreign_link::getByUserID($user->id, TWITTER_SERVICE);
    $token = TwitterOAuthClient::unpackToken($flink->credentials);
    if (!$token) {
        throw new ServerException("No Twitter OAuth credentials for this user.");
    }
    return new TwitterOAuthClient($token->key, $token->secret);
}
 function fetchTwitterFriends($flink)
 {
     $friends = array();
     $client = null;
     if (TwitterOAuthClient::isPackedToken($flink->credentials)) {
         $token = TwitterOAuthClient::unpackToken($flink->credentials);
         $client = new TwitterOAuthClient($token->key, $token->secret);
         common_debug($this->name() . '- Grabbing friends IDs with OAuth.');
     } else {
         common_debug("Skipping Twitter friends for {$flink->user_id} since not OAuth.");
         return $friends;
     }
     try {
         $friends_ids = $client->friendsIds();
     } catch (Exception $e) {
         common_log(LOG_WARNING, $this->name() . ' - error getting friend ids: ' . $e->getMessage());
         return $friends;
     }
     if (empty($friends_ids)) {
         common_debug($this->name() . " - Twitter user {$flink->foreign_id} " . 'doesn\'t have any friends!');
         return $friends;
     }
     common_debug($this->name() . ' - Twitter\'s API says Twitter user id ' . "{$flink->foreign_id} has " . count($friends_ids) . ' friends.');
     // Calculate how many pages to get...
     $pages = ceil(count($friends_ids) / 100);
     if ($pages == 0) {
         common_debug($this->name() . " - {$user} seems to have no friends.");
     }
     for ($i = 1; $i <= $pages; $i++) {
         try {
             $more_friends = $client->statusesFriends(null, null, null, $i);
         } catch (Exception $e) {
             common_log(LOG_WARNING, $this->name() . ' - cURL error getting Twitter statuses/friends ' . "page {$i} - " . $e->getCode() . ' - ' . $e->getMessage());
         }
         if (empty($more_friends)) {
             common_log(LOG_WARNING, $this->name() . " - Couldn't retrieve page {$i} " . "of Twitter user {$flink->foreign_id} friends.");
             continue;
         } else {
             if (is_array($more_friends)) {
                 $friends = array_merge($friends, $more_friends);
             }
         }
     }
     return $friends;
 }
 /**
  * Notify remote users when their notices get de-favorited.
  *
  * @param Profile $profile Profile person doing the de-faving
  * @param Notice  $notice  Notice being favored
  *
  * @return hook return value
  */
 function onEndDisfavorNotice(Profile $profile, Notice $notice)
 {
     $flink = Foreign_link::getByUserID($profile->id, TWITTER_SERVICE);
     // twitter service
     if (empty($flink)) {
         return true;
     }
     if (!TwitterOAuthClient::isPackedToken($flink->credentials)) {
         $this->log(LOG_INFO, "Skipping fave processing for {$profile->id} since link is not OAuth.");
         return true;
     }
     $status_id = twitter_status_id($notice);
     if (empty($status_id)) {
         return true;
     }
     try {
         $token = TwitterOAuthClient::unpackToken($flink->credentials);
         $client = new TwitterOAuthClient($token->key, $token->secret);
         $client->favoritesDestroy($status_id);
     } catch (Exception $e) {
         common_log(LOG_ERR, "Error attempting to unfavorite bridged notice on Twitter: " . $e->getMessage());
     }
     return true;
 }
Example #4
0
function broadcast_oauth($notice, $flink)
{
    $user = $flink->getUser();
    $statustxt = format_status($notice);
    $params = twitter_update_params($notice);
    $token = TwitterOAuthClient::unpackToken($flink->credentials);
    $client = new TwitterOAuthClient($token->key, $token->secret);
    $status = null;
    try {
        $status = $client->statusesUpdate($statustxt, $params);
    } catch (OAuthClientException $e) {
        return process_error($e, $flink, $notice);
    }
    if (empty($status)) {
        // This could represent a failure posting,
        // or the Twitter API might just be behaving flakey.
        $errmsg = sprintf('Twitter bridge - No data returned by Twitter API when ' . 'trying to post notice %d for User %s (user id %d).', $notice->id, $user->nickname, $user->id);
        common_log(LOG_WARNING, $errmsg);
        return false;
    }
    // Notice crossed the great divide
    $msg = sprintf('Twitter bridge - posted notice %d to Twitter using ' . 'OAuth for User %s (user id %d).', $notice->id, $user->nickname, $user->id);
    common_log(LOG_INFO, $msg);
    return true;
}
 /**
  * Notify remote users when their notices get de-favorited.
  *
  * @param Profile $profile Profile person doing the de-faving
  * @param Notice  $notice  Notice being favored
  *
  * @return hook return value
  */
 function onEndDisfavorNotice(Profile $profile, Notice $notice)
 {
     $flink = Foreign_link::getByUserID($profile->id, TWITTER_SERVICE);
     // twitter service
     if (empty($flink)) {
         return true;
     }
     if (!TwitterOAuthClient::isPackedToken($flink->credentials)) {
         $this->log(LOG_INFO, "Skipping fave processing for {$profile->id} since link is not OAuth.");
         return true;
     }
     $status_id = twitter_status_id($notice);
     if (empty($status_id)) {
         return true;
     }
     $token = TwitterOAuthClient::unpackToken($flink->credentials);
     $client = new TwitterOAuthClient($token->key, $token->secret);
     $client->favoritesDestroy($status_id);
     return true;
 }
 /**
  * Saves a Foreign_link between Twitter user and local user,
  * which includes the access token and secret.
  *
  * @param int        $user_id StatusNet user ID
  * @param int        $twuid   Twitter user ID
  * @param OAuthToken $token   the access token to save
  *
  * @return nothing
  */
 function saveForeignLink($user_id, $twuid, $access_token)
 {
     $flink = new Foreign_link();
     $flink->user_id = $user_id;
     $flink->service = TWITTER_SERVICE;
     // delete stale flink, if any
     $result = $flink->find(true);
     if (!empty($result)) {
         $flink->safeDelete();
     }
     $flink->user_id = $user_id;
     $flink->foreign_id = $twuid;
     $flink->service = TWITTER_SERVICE;
     $creds = TwitterOAuthClient::packToken($access_token);
     $flink->credentials = $creds;
     $flink->created = common_sql_now();
     // Defaults: noticesync on, everything else off
     $flink->set_flags(true, false, false, false);
     $flink_id = $flink->insert();
     if (empty($flink_id)) {
         common_log_db_error($flink, 'INSERT', __FILE__);
         // TRANS: Server error displayed when linking to a Twitter account fails.
         $this->serverError(_m('Could not link your Twitter account.'));
     }
     return $flink_id;
 }
 function getTimeline($flink, $timelineUri = 'home_timeline')
 {
     if (empty($flink)) {
         common_log(LOG_ERR, $this->name() . " - Can't retrieve Foreign_link for foreign ID {$fid}");
         return;
     }
     common_log(LOG_DEBUG, $this->name() . ' - Trying to get ' . $timelineUri . ' timeline for Twitter user ' . $flink->foreign_id);
     $client = null;
     if (TwitterOAuthClient::isPackedToken($flink->credentials)) {
         $token = TwitterOAuthClient::unpackToken($flink->credentials);
         $client = new TwitterOAuthClient($token->key, $token->secret);
         common_log(LOG_DEBUG, $this->name() . ' - Grabbing ' . $timelineUri . ' timeline with OAuth.');
     } else {
         common_log(LOG_ERR, "Skipping " . $timelineUri . " timeline for " . $flink->foreign_id . " since not OAuth.");
     }
     $timeline = null;
     $lastId = Twitter_synch_status::getLastId($flink->foreign_id, $timelineUri);
     common_log(LOG_DEBUG, "Got lastId value '" . $lastId . "' for foreign id '" . $flink->foreign_id . "' and timeline '" . $timelineUri . "'");
     try {
         $timeline = $client->statusesTimeline($lastId, $timelineUri);
     } catch (Exception $e) {
         common_log(LOG_ERR, $this->name() . ' - Unable to get ' . $timelineUri . ' timeline for user ' . $flink->user_id . ' - code: ' . $e->getCode() . 'msg: ' . $e->getMessage());
     }
     if (empty($timeline)) {
         common_log(LOG_DEBUG, $this->name() . " - Empty '" . $timelineUri . "' timeline.");
         return;
     }
     common_log(LOG_INFO, $this->name() . ' - Retrieved ' . sizeof($timeline) . ' statuses from ' . $timelineUri . ' timeline' . ' - for user ' . $flink->user_id);
     if (!empty($timeline)) {
         $qm = QueueManager::get();
         // Reverse to preserve order
         foreach (array_reverse($timeline) as $status) {
             $data = array('status' => $status, 'for_user' => $flink->foreign_id);
             $qm->enqueue($data, 'tweetin');
         }
         $lastId = twitter_id($timeline[0]);
         Twitter_synch_status::setLastId($flink->foreign_id, $timelineUri, $lastId);
         common_debug("Set lastId value '{$lastId}' for foreign id '{$flink->foreign_id}' and timeline '" . $timelineUri . "'");
     }
     // Okay, record the time we synced with Twitter for posterity
     $flink->last_noticesync = common_sql_now();
     $flink->update();
 }
 function getTimeline($flink)
 {
     if (empty($flink)) {
         common_log(LOG_WARNING, $this->name() . " - Can't retrieve Foreign_link for foreign ID {$fid}");
         return;
     }
     common_debug($this->name() . ' - Trying to get timeline for Twitter user ' . $flink->foreign_id);
     $client = null;
     if (TwitterOAuthClient::isPackedToken($flink->credentials)) {
         $token = TwitterOAuthClient::unpackToken($flink->credentials);
         $client = new TwitterOAuthClient($token->key, $token->secret);
         common_debug($this->name() . ' - Grabbing friends timeline with OAuth.');
     } else {
         common_debug("Skipping friends timeline for {$flink->foreign_id} since not OAuth.");
     }
     $timeline = null;
     $lastId = Twitter_synch_status::getLastId($flink->foreign_id, 'home_timeline');
     common_debug("Got lastId value '{$lastId}' for foreign id '{$flink->foreign_id}' and timeline 'home_timeline'");
     try {
         $timeline = $client->statusesHomeTimeline($lastId);
     } catch (Exception $e) {
         common_log(LOG_WARNING, $this->name() . ' - Twitter client unable to get friends timeline for user ' . $flink->user_id . ' - code: ' . $e->getCode() . 'msg: ' . $e->getMessage());
     }
     if (empty($timeline)) {
         common_log(LOG_WARNING, $this->name() . " - Empty timeline.");
         return;
     }
     common_debug(LOG_INFO, $this->name() . ' - Retrieved ' . sizeof($timeline) . ' statuses from Twitter.');
     // Reverse to preserve order
     foreach (array_reverse($timeline) as $status) {
         // Hacktastic: filter out stuff coming from this StatusNet
         $source = mb_strtolower(common_config('integration', 'source'));
         if (preg_match("/{$source}/", mb_strtolower($status->source))) {
             common_debug($this->name() . ' - Skipping import of status ' . $status->id . ' with source ' . $source);
             continue;
         }
         // Don't save it if the user is protected
         // FIXME: save it but treat it as private
         if ($status->user->protected) {
             continue;
         }
         $notice = $this->saveStatus($status);
         if (!empty($notice)) {
             Inbox::insertNotice($flink->user_id, $notice->id);
         }
     }
     if (!empty($timeline)) {
         Twitter_synch_status::setLastId($flink->foreign_id, 'home_timeline', $timeline[0]->id);
         common_debug("Set lastId value '{$timeline[0]->id}' for foreign id '{$flink->foreign_id}' and timeline 'home_timeline'");
     }
     // Okay, record the time we synced with Twitter for posterity
     $flink->last_noticesync = common_sql_now();
     $flink->update();
 }
 function getTimeline($flink)
 {
     if (empty($flink)) {
         common_log(LOG_WARNING, $this->name() . " - Can't retrieve Foreign_link for foreign ID {$fid}");
         return;
     }
     common_debug($this->name() . ' - Trying to get timeline for Twitter user ' . $flink->foreign_id);
     // XXX: Biggest remaining issue - How do we know at which status
     // to start importing?  How many statuses?  Right now I'm going
     // with the default last 20.
     $client = null;
     if (TwitterOAuthClient::isPackedToken($flink->credentials)) {
         $token = TwitterOAuthClient::unpackToken($flink->credentials);
         $client = new TwitterOAuthClient($token->key, $token->secret);
         common_debug($this->name() . ' - Grabbing friends timeline with OAuth.');
     } else {
         $client = new TwitterBasicAuthClient($flink);
         common_debug($this->name() . ' - Grabbing friends timeline with basic auth.');
     }
     $timeline = null;
     try {
         $timeline = $client->statusesFriendsTimeline();
     } catch (Exception $e) {
         common_log(LOG_WARNING, $this->name() . ' - Twitter client unable to get friends timeline for user ' . $flink->user_id . ' - code: ' . $e->getCode() . 'msg: ' . $e->getMessage());
     }
     if (empty($timeline)) {
         common_log(LOG_WARNING, $this->name() . " - Empty timeline.");
         return;
     }
     common_debug(LOG_INFO, $this->name() . ' - Retrieved ' . sizeof($timeline) . ' statuses from Twitter.');
     // Reverse to preserve order
     foreach (array_reverse($timeline) as $status) {
         // Hacktastic: filter out stuff coming from this StatusNet
         $source = mb_strtolower(common_config('integration', 'source'));
         if (preg_match("/{$source}/", mb_strtolower($status->source))) {
             common_debug($this->name() . ' - Skipping import of status ' . $status->id . ' with source ' . $source);
             continue;
         }
         $this->saveStatus($status, $flink);
     }
     // Okay, record the time we synced with Twitter for posterity
     $flink->last_noticesync = common_sql_now();
     $flink->update();
 }