]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/twitter.php
Ticket http://laconi.ca/trac/ticket/1274
[quix0rs-gnu-social.git] / lib / twitter.php
index 5eb15005a6dcfdb50c774c26cf556d1a035886f8..7abb40151686eb3779d689ba6bff9aa60f88ebed 100644 (file)
@@ -19,6 +19,8 @@
 
 if (!defined('LACONICA')) { exit(1); }
 
+define("TWITTER_SERVICE", 1); // Twitter is foreign_service ID 1
+
 function get_twitter_data($uri, $screen_name, $password)
 {
 
@@ -28,21 +30,20 @@ function get_twitter_data($uri, $screen_name, $password)
             CURLOPT_FAILONERROR        => true,
             CURLOPT_HEADER            => false,
             CURLOPT_FOLLOWLOCATION    => true,
-            # CURLOPT_USERAGENT        => "identi.ca",
+            CURLOPT_USERAGENT      => "Laconica",
             CURLOPT_CONNECTTIMEOUT    => 120,
             CURLOPT_TIMEOUT            => 120,
             # Twitter is strict about accepting invalid "Expect" headers
             CURLOPT_HTTPHEADER => array('Expect:')
     );
 
-
     $ch = curl_init($uri);
     curl_setopt_array($ch, $options);
     $data = curl_exec($ch);
     $errmsg = curl_error($ch);
 
     if ($errmsg) {
-        common_debug("Twitter bridge - cURL error: $errmsg - trying to load: $uri with user $twit_user.",
+        common_debug("Twitter bridge - cURL error: $errmsg - trying to load: $uri with user $screen_name.",
             __FILE__);
     }
 
@@ -95,7 +96,7 @@ function add_twitter_user($twitter_id, $screen_name)
     $fuser->nickname = $screen_name;
     $fuser->uri = 'http://twitter.com/' . $screen_name;
     $fuser->id = $twitter_id;
-    $fuser->service = 1; // Twitter
+    $fuser->service = TWITTER_SERVICE; // Twitter
     $fuser->created = common_sql_now();
     $result = $fuser->insert();
 
@@ -206,3 +207,92 @@ function save_twitter_friends($user, $twitter_id, $screen_name, $password)
     return true;
 }
 
+function is_twitter_bound($notice, $flink) {
+
+    // Check to see if notice should go to Twitter
+    if ($flink->noticesync & FOREIGN_NOTICE_SEND) {
+
+        // If it's not a Twitter-style reply, or if the user WANTS to send replies.
+        if (!preg_match('/^@[a-zA-Z0-9_]{1,15}\b/u', $notice->content) ||
+            ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY)) {
+                return true;
+        }
+    }
+    
+    return false;
+}
+
+function broadcast_twitter($notice)
+{
+    $success = true;
+
+    $flink = Foreign_link::getByUserID($notice->profile_id, 
+        TWITTER_SERVICE);
+            
+    // XXX: Not sure WHERE to check whether a notice should go to 
+    // Twitter. Should we even put in the queue if it shouldn't? --Zach
+    if (!is_null($flink) && is_twitter_bound($notice, $flink)) {
+
+        $fuser = $flink->getForeignUser();
+        $twitter_user = $fuser->nickname;
+        $twitter_password = $flink->credentials;
+        $uri = 'http://www.twitter.com/statuses/update.json';
+
+        // XXX: Hack to get around PHP cURL's use of @ being a a meta character
+        $statustxt = preg_replace('/^@/', ' @', $notice->content);
+
+        $options = array(
+            CURLOPT_USERPWD        => "$twitter_user:$twitter_password",
+            CURLOPT_POST           => true,
+            CURLOPT_POSTFIELDS     => 
+                array(
+                        'status' => $statustxt,
+                        'source' => common_config('integration', 'source')
+                     ),
+            CURLOPT_RETURNTRANSFER => true,
+            CURLOPT_FAILONERROR    => true,
+            CURLOPT_HEADER         => false,
+            CURLOPT_FOLLOWLOCATION => true,
+            CURLOPT_USERAGENT      => "Laconica",
+            CURLOPT_CONNECTTIMEOUT => 120,  // XXX: How long should this be?
+            CURLOPT_TIMEOUT        => 120,
+
+            # Twitter is strict about accepting invalid "Expect" headers
+            CURLOPT_HTTPHEADER => array('Expect:')
+            );
+
+        $ch = curl_init($uri);
+        curl_setopt_array($ch, $options);
+        $data = curl_exec($ch);
+        $errmsg = curl_error($ch);
+
+        if ($errmsg) {
+            common_debug("cURL error: $errmsg - " .
+                "trying to send notice for $twitter_user.",
+                         __FILE__);
+            $success = false;
+        }
+
+        curl_close($ch);
+
+        if (!$data) {
+            common_debug("No data returned by Twitter's " .
+                "API trying to send update for $twitter_user",
+                         __FILE__);
+            $success = false;
+        }
+
+        // Twitter should return a status
+        $status = json_decode($data);
+
+        if (!$status->id) {
+            common_debug("Unexpected data returned by Twitter " .
+                " API trying to send update for $twitter_user",
+                         __FILE__);
+            $success = false;
+        }
+    }
+    
+    return $success;
+}
+