From 412eae10fe81c6493f3ca5e05d7365839045f54e Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 28 Aug 2008 15:25:09 -0400 Subject: [PATCH] Twitter integration - Notices now broadcast (directly) to Twitter from linked accts. darcs-hash:20080828192509-7b5ce-8387c67500c082eb5a0107c0f78d4cf5620825af.gz --- classes/Foreign_link.php | 16 +++++++++- lib/util.php | 65 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/classes/Foreign_link.php b/classes/Foreign_link.php index 4fcad4b171..f4f8abfc41 100644 --- a/classes/Foreign_link.php +++ b/classes/Foreign_link.php @@ -29,7 +29,6 @@ class Foreign_link extends DB_DataObject // XXX: This only returns a 1->1 single obj mapping. Change? Or make // a getForeignUsers() that returns more than one? --Zach static function getForeignLink($user_id, $service) { - $flink = new Foreign_link(); $flink->whereAdd("service = $service"); $flink->whereAdd("user_id = $user_id"); @@ -43,4 +42,19 @@ class Foreign_link extends DB_DataObject return NULL; } + // Convenience method + function getForeignUser() { + $fuser = new Foreign_user(); + $fuser->whereAdd('service = ' . $this->service); + $fuser->whereAdd('id = ' . $this->foreign_id); + $fuser->limit(1); + + if ($fuser->find()) { + $fuser->fetch(); + return $fuser; + } + + return NULL; + } + } diff --git a/lib/util.php b/lib/util.php index 0ac679afc8..016821c57a 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1088,6 +1088,16 @@ function common_save_replies($notice) { } function common_broadcast_notice($notice, $remote=false) { + + // Check to see if notice should go to Twitter + $flink = Foreign_link::getForeignLink($notice->profile_id, 1); // 1 == Twitter + + if ($flink) { + if (!common_twitter_broadcast($notice, $flink)) { + common_debug('Unable to send notice: ' . $notice->id . ' to Twitter.', __FILE__); + } + } + if (common_config('queue', 'enabled')) { # Do it later! return common_enqueue_notice($notice); @@ -1096,6 +1106,61 @@ function common_broadcast_notice($notice, $remote=false) { } } +function common_twitter_broadcast($notice, $flink) { + $success = true; + $fuser = $flink->getForeignUser(); + $twitter_user = $fuser->nickname; + $twitter_password = $flink->credentials; + $uri = 'http://www.twitter.com/statuses/update.json'; + $statustxt = $notice->content; + + $options = array( + CURLOPT_USERPWD => "$twitter_user:$twitter_password", + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => array( + 'status' => $statustxt, + 'source' => 'Laconica' + ), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FAILONERROR => true, + CURLOPT_HEADER => false, + CURLOPT_FOLLOWLOCATION => true, + // CURLOPT_USERAGENT => "identi.ca", + CURLOPT_CONNECTTIMEOUT => 120, // XXX: Scary!!!! How long should this be? + CURLOPT_TIMEOUT => 120 + ); + + $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 $status; +} + # Stick the notice on the queue function common_enqueue_notice($notice) {