]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/TwitterBridge/twitter.php
Merge branch 'master' into nightly
[quix0rs-gnu-social.git] / plugins / TwitterBridge / twitter.php
index 05fbdf2c4fc0ad7f3f66377988ead214545a8e37..99389a759f3e28a377c39d479702d654d37f4573 100644 (file)
@@ -28,16 +28,17 @@ 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)) {
-        $result = $luser->delete();
+    try {
+        $fuser = Foreign_user::getForeignUser($twitter_id, TWITTER_SERVICE);
+        $result = $fuser->delete();
         if ($result != false) {
             common_log(
                 LOG_INFO,
                 "Twitter bridge - removed old Twitter user: $screen_name ($twitter_id)."
             );
         }
+    } catch (NoResultException $e) {
+        // no old foreign users exist for this id
     }
 
     $fuser = new Foreign_user();
@@ -49,9 +50,8 @@ function add_twitter_user($twitter_id, $screen_name)
     $fuser->created = common_sql_now();
     $result = $fuser->insert();
 
-    if (empty($result)) {
-        common_log(LOG_WARNING,
-            "Twitter bridge - failed to add new Twitter user: $twitter_id - $screen_name.");
+    if ($result === false) {
+        common_log(LOG_WARNING, "Twitter bridge - failed to add new Twitter user: $twitter_id - $screen_name.");
         common_log_db_error($fuser, 'INSERT', __FILE__);
     } else {
         common_log(LOG_INFO,
@@ -66,11 +66,10 @@ 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);
+    try {
+        $fuser = Foreign_user::getForeignUser($twitter_id, TWITTER_SERVICE);
 
-    if (!empty($fuser)) {
         // Delete old record if Twitter user changed screen name
-
         if ($fuser->nickname != $screen_name) {
             $oldname = $fuser->nickname;
             $fuser->delete();
@@ -80,11 +79,13 @@ function save_twitter_user($twitter_id, $screen_name)
                                          $screen_name,
                                          $oldname));
         }
-    } else {
-        // Kill any old, invalid records for this screen name
-        $fuser = Foreign_user::getByNickname($screen_name, TWITTER_SERVICE);
+    } catch (NoResultException $e) {
+        // No old users exist for this id
 
-        if (!empty($fuser)) {
+        // Kill any old, invalid records for this screen name
+        // XXX: Is this really only supposed to be run if the above getForeignUser fails?
+        try {
+            $fuser = Foreign_user::getByNickname($screen_name, TWITTER_SERVICE);
             $fuser->delete();
             common_log(
                 LOG_INFO,
@@ -95,6 +96,8 @@ function save_twitter_user($twitter_id, $screen_name)
                     $fuser->id
                 )
             );
+        } catch (NoResultException $e) {
+            // No old users exist for this screen_name
         }
     }
 
@@ -116,13 +119,13 @@ function is_twitter_bound($notice, $flink) {
     }
 
     // Check to see if notice should go to Twitter
-    if (!empty($flink) && ($flink->noticesync & FOREIGN_NOTICE_SEND == FOREIGN_NOTICE_SEND)) {
+    if (!empty($flink) && (($flink->noticesync & FOREIGN_NOTICE_SEND) == 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 == FOREIGN_NOTICE_SEND_REPLY) ||
-            is_twitter_notice($notice->reply_to)) {
+        if ( (($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) == FOREIGN_NOTICE_SEND_REPLY) ||
+               is_twitter_notice($notice->reply_to) || is_twitter_notice($notice->repeat_of) ||
+             (empty($notice->reply_to) && !preg_match('/^@[a-zA-Z0-9_]{1,15}\b/u', $notice->content)) ){
             return true;
         }
     }
@@ -132,7 +135,7 @@ function is_twitter_bound($notice, $flink) {
 
 function is_twitter_notice($id)
 {
-    $n2s = Notice_to_status::staticGet('notice_id', $id);
+    $n2s = Notice_to_status::getKV('notice_id', $id);
 
     return (!empty($n2s));
 }
@@ -177,14 +180,18 @@ function twitter_id($status, $field='id')
  */
 function broadcast_twitter($notice)
 {
-    $flink = Foreign_link::getByUserID($notice->profile_id,
-                                       TWITTER_SERVICE);
+    try {
+        $flink = Foreign_link::getByUserID($notice->profile_id, TWITTER_SERVICE);
+    } catch (NoResultException $e) {
+        // Alright so don't broadcast it then! (since there's no foreign link)
+        return true;
+    }
 
     // Don't bother with basic auth, since it's no longer allowed
-    if (!empty($flink) && TwitterOAuthClient::isPackedToken($flink->credentials)) {
+    if (TwitterOAuthClient::isPackedToken($flink->credentials)) {
         if (is_twitter_bound($notice, $flink)) {
             if (!empty($notice->repeat_of) && is_twitter_notice($notice->repeat_of)) {
-                $retweet = retweet_notice($flink, Notice::staticGet('id', $notice->repeat_of));
+                $retweet = retweet_notice($flink, Notice::getKV('id', $notice->repeat_of));
                 if (is_object($retweet)) {
                     Notice_to_status::saveNew($notice->id, twitter_id($retweet));
                     return true;
@@ -239,7 +246,7 @@ function retweet_notice($flink, $notice)
 
 function twitter_status_id($notice)
 {
-    $n2s = Notice_to_status::staticGet('notice_id', $notice->id);
+    $n2s = Notice_to_status::getKV('notice_id', $notice->id);
     if (empty($n2s)) {
         return null;
     } else {
@@ -263,14 +270,19 @@ function twitter_update_params($notice)
         $params['long'] = $notice->lon;
     }
     if (!empty($notice->reply_to) && is_twitter_notice($notice->reply_to)) {
-        $reply = Notice::staticGet('id', $notice->reply_to);
+        $reply = Notice::getKV('id', $notice->reply_to);
         $params['in_reply_to_status_id'] = twitter_status_id($reply);
     }
     return $params;
 }
 
-function broadcast_oauth($notice, $flink) {
-    $user = $flink->getUser();
+function broadcast_oauth($notice, Foreign_link $flink) {
+    try {
+        $user = $flink->getUser();
+    } catch (ServerException $e) {
+        common_log(LOG_WARNING, 'Discarding broadcast_oauth for notice '.$notice->id.' because of exception: '.$e->getMessage());
+        return true;
+    }
     $statustxt = format_status($notice);
     $params = twitter_update_params($notice);
 
@@ -377,11 +389,16 @@ function format_status($notice)
     // XXX: Make this an optional setting?
     $statustxt = preg_replace('/(^|\s)!([A-Za-z0-9]{1,64})/', "\\1#\\2", $statustxt);
 
+    // detect links, each link uses 23 characters on twitter
+    $numberOfLinks = preg_match_all('`((http|https|ftp)://[^\s<]+[^\s<\.)])`i', $statustxt);
+    $statusWithoutLinks = preg_replace('`((http|https|ftp)://[^\s<]+[^\s<\.)])`i', '', $statustxt);
+    $statusLength = mb_strlen($statusWithoutLinks)  + $numberOfLinks * 23;
+
     // Twitter still has a 140-char hardcoded max.
-    if (mb_strlen($statustxt) > 140) {
-        $noticeUrl = common_shorten_url($notice->uri);
-        $urlLen = mb_strlen($noticeUrl);
-        $statustxt = mb_substr($statustxt, 0, 140 - ($urlLen + 3)) . ' … ' . $noticeUrl;
+    if ($statusLength > 140) {
+        $noticeUrl = common_shorten_url($notice->getUrl());
+        // each link uses 23 chars on twitter + 3 for the ' … ' => 26
+        $statustxt = mb_substr($statustxt, 0, 140 - 26) . ' … ' . $noticeUrl;
     }
 
     return $statustxt;