]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/TwitterBridge/twitter.php
Merge branch '0.9.x' of gitorious.org:statusnet/mainline into 1.0.x
[quix0rs-gnu-social.git] / plugins / TwitterBridge / twitter.php
index 20cdf42b823276f477dfc5240020037d2efe6299..cd1ad70b9b8369fe9b512afd8d18cb5b1d4ff10e 100644 (file)
@@ -23,7 +23,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
 
 define('TWITTER_SERVICE', 1); // Twitter is foreign_service ID 1
 
-require_once INSTALLDIR . '/plugins/TwitterBridge/twitterbasicauthclient.php';
 require_once INSTALLDIR . '/plugins/TwitterBridge/twitteroauthclient.php';
 
 function add_twitter_user($twitter_id, $screen_name)
@@ -31,7 +30,6 @@ function add_twitter_user($twitter_id, $screen_name)
     // Clear out any bad old foreign_users with the new user's legit URL
     // This can happen when users move around or fakester accounts get
     // repoed, and things like that.
-
     $luser = Foreign_user::getForeignUser($twitter_id, TWITTER_SERVICE);
 
     if (!empty($luser)) {
@@ -70,7 +68,6 @@ function save_twitter_user($twitter_id, $screen_name)
 {
     // Check to see whether the Twitter user is already in the system,
     // and update its screen name and uri if so.
-
     $fuser = Foreign_user::getForeignUser($twitter_id, TWITTER_SERVICE);
 
     if (!empty($fuser)) {
@@ -88,9 +85,7 @@ function save_twitter_user($twitter_id, $screen_name)
         }
 
     } else {
-
         // Kill any old, invalid records for this screen name
-
         $fuser = Foreign_user::getByNickname($screen_name, TWITTER_SERVICE);
 
         if (!empty($fuser)) {
@@ -111,13 +106,11 @@ function save_twitter_user($twitter_id, $screen_name)
 }
 
 function is_twitter_bound($notice, $flink) {
-
     // Check to see if notice should go to Twitter
     if (!empty($flink) && ($flink->noticesync & FOREIGN_NOTICE_SEND)) {
 
         // If it's not a Twitter-style reply, or if the user WANTS to send replies,
         // or if it's in reply to a twitter notice
-
         if (!preg_match('/^@[a-zA-Z0-9_]{1,15}\b/u', $notice->content) ||
             ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) ||
             is_twitter_notice($notice->reply_to)) {
@@ -130,14 +123,9 @@ function is_twitter_bound($notice, $flink) {
 
 function is_twitter_notice($id)
 {
-    $notice = Notice::staticGet('id', $id);
-
-    if (empty($notice)) {
-        // it's not any kind of notice, so it's definitely not a Twitter notice.
-        return false;
-    }
+    $n2s = Notice_to_status::staticGet('notice_id', $id);
 
-    return ($notice->source == 'twitter');
+    return (!empty($n2s));
 }
 
 function broadcast_twitter($notice)
@@ -146,10 +134,12 @@ function broadcast_twitter($notice)
                                        TWITTER_SERVICE);
 
     // Don't bother with basic auth, since it's no longer allowed
-
     if (!empty($flink) && TwitterOAuthClient::isPackedToken($flink->credentials)) {
         if (!empty($notice->repeat_of) && is_twitter_notice($notice->repeat_of)) {
-            return retweet_notice($flink, Notice::staticGet('id', $notice->repeat_of));
+            $retweet = retweet_notice($flink, Notice::staticGet('id', $notice->repeat_of));
+            if (!empty($retweet)) {
+                Notice_to_status::saveNew($notice->id, $retweet->id);
+            }
         } else if (is_twitter_bound($notice, $flink)) {
             return broadcast_oauth($notice, $flink);
         }
@@ -165,8 +155,14 @@ function retweet_notice($flink, $notice)
 
     $id = twitter_status_id($notice);
 
+    if (empty($id)) {
+        common_log(LOG_WARNING, "Trying to retweet notice {$notice->id} with no known status id.");
+        return null;
+    }
+
     try {
         $status = $client->statusesRetweet($id);
+        return $status;
     } catch (OAuthClientException $e) {
         return process_error($e, $flink, $notice);
     }
@@ -174,12 +170,12 @@ function retweet_notice($flink, $notice)
 
 function twitter_status_id($notice)
 {
-    if ($notice->source == 'twitter' &&
-        preg_match('#^http://twitter.com/[\w_.]+/status/(\d+)$#', $notice->uri, $match)) {
-        return $match[1];
+    $n2s = Notice_to_status::staticGet('notice_id', $notice->id);
+    if (empty($n2s)) {
+        return null;
+    } else {
+        return $n2s->status_id;
     }
-
-    return null;
 }
 
 /**
@@ -197,6 +193,10 @@ function twitter_update_params($notice)
         $params['lat'] = $notice->lat;
         $params['long'] = $notice->lon;
     }
+    if (!empty($notice->reply_to) && is_twitter_notice($notice->reply_to)) {
+        $reply = Notice::staticGet('id', $notice->reply_to);
+        $params['in_reply_to_status_id'] = twitter_status_id($reply);
+    }
     return $params;
 }
 
@@ -211,6 +211,9 @@ function broadcast_oauth($notice, $flink) {
 
     try {
         $status = $client->statusesUpdate($statustxt, $params);
+        if (!empty($status)) {
+            Notice_to_status::saveNew($notice->id, $status->id);
+        }
     } catch (OAuthClientException $e) {
         return process_error($e, $flink, $notice);
     }
@@ -219,7 +222,6 @@ function broadcast_oauth($notice, $flink) {
 
         // 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,
@@ -232,7 +234,6 @@ function broadcast_oauth($notice, $flink) {
     }
 
     // Notice crossed the great divide
-
     $msg = sprintf('Twitter bridge - posted notice %d to Twitter using ' .
                    'OAuth for User %s (user id %d).',
                    $notice->id,
@@ -244,52 +245,6 @@ function broadcast_oauth($notice, $flink) {
     return true;
 }
 
-function broadcast_basicauth($notice, $flink)
-{
-    $user = $flink->getUser();
-
-    $statustxt = format_status($notice);
-    $params = twitter_update_params($notice);
-
-    $client = new TwitterBasicAuthClient($flink);
-    $status = null;
-
-    try {
-        $status = $client->statusesUpdate($statustxt, $params);
-    } catch (BasicAuthException $e) {
-        return process_error($e, $flink, $notice);
-    }
-
-    if (empty($status)) {
-
-        $errmsg = sprintf('Twitter bridge - No data returned by Twitter API when ' .
-                          'trying to post notice %d for %s (user id %d).',
-                          $notice->id,
-                          $user->nickname,
-                          $user->id);
-
-        common_log(LOG_WARNING, $errmsg);
-
-        $errmsg = sprintf('No data returned by Twitter API when ' .
-                          'trying to post notice %d for %s (user id %d).',
-                          $notice->id,
-                          $user->nickname,
-                          $user->id);
-        common_log(LOG_WARNING, $errmsg);
-        return false;
-    }
-
-    $msg = sprintf('Twitter bridge - posted notice %d to Twitter using ' .
-                   'HTTP basic auth for User %s (user id %d).',
-                   $notice->id,
-                   $user->nickname,
-                   $user->id);
-
-    common_log(LOG_INFO, $msg);
-
-    return true;
-}
-
 function process_error($e, $flink, $notice)
 {
     $user = $flink->getUser();
@@ -327,15 +282,14 @@ function process_error($e, $flink, $notice)
 
 function format_status($notice)
 {
-    // XXX: Hack to get around PHP cURL's use of @ being a a meta character
-    $statustxt = preg_replace('/^@/', ' @', $notice->content);
+    // Start with the plaintext source of this notice...
+    $statustxt = $notice->content;
 
     // Convert !groups to #hashes
-
     // XXX: Make this an optional setting?
-
     $statustxt = preg_replace('/(^|\s)!([A-Za-z0-9]{1,64})/', "\\1#\\2", $statustxt);
 
+    // Twitter still has a 140-char hardcoded max.
     if (mb_strlen($statustxt) > 140) {
         $noticeUrl = common_shorten_url($notice->uri);
         $urlLen = mb_strlen($noticeUrl);
@@ -363,11 +317,9 @@ function remove_twitter_link($flink)
     // Notify the user that her Twitter bridge is down
 
     if (isset($user->email)) {
-
         $result = mail_twitter_bridge_removed($user);
 
         if (!$result) {
-
             $msg = 'Unable to send email to notify ' .
               "$user->nickname (user id: $user->id) " .
               'that their Twitter bridge link was ' .
@@ -376,7 +328,6 @@ function remove_twitter_link($flink)
             common_log(LOG_WARNING, $msg);
         }
     }
-
 }
 
 /**
@@ -389,7 +340,6 @@ function remove_twitter_link($flink)
  *
  * @return boolean success flag
  */
-
 function mail_twitter_bridge_removed($user)
 {
     $profile = $user->getProfile();
@@ -402,11 +352,11 @@ function mail_twitter_bridge_removed($user)
 
     $body = sprintf(_m('Hi, %1$s. We\'re sorry to inform you that your ' .
         'link to Twitter has been disabled. We no longer seem to have ' .
-    'permission to update your Twitter status. (Did you revoke ' .
-    '%3$s\'s access?)' . "\n\n" .
+    'permission to update your Twitter status. Did you maybe revoke ' .
+    '%3$s\'s access?' . "\n\n" .
     'You can re-enable your Twitter bridge by visiting your ' .
     "Twitter settings page:\n\n\t%2\$s\n\n" .
-        "Regards,\n%3\$s\n"),
+        "Regards,\n%3\$s"),
         $profile->getBestName(),
         common_local_url('twittersettings'),
         common_config('site', 'name'));
@@ -414,4 +364,3 @@ function mail_twitter_bridge_removed($user)
     common_switch_locale();
     return mail_to_user($user, $subject, $body);
 }
-