From 06859cc14e5d68c83e4ecb38a0a32f354bc6ed80 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 23 Sep 2008 22:36:15 -0400 Subject: [PATCH] Twitter bridge - pref setting to turn off sending @-replies to Twitter darcs-hash:20080924023615-7b5ce-c747e8236b3967824ed93f18285e1b6e0b46c3f0.gz --- actions/twittersettings.php | 36 +++++++++++++++++++++++++------ db/laconica.sql | 2 +- lib/util.php | 42 ++++++++++++++++++++++++------------- 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/actions/twittersettings.php b/actions/twittersettings.php index 058bec1b0f..a7c70c2876 100644 --- a/actions/twittersettings.php +++ b/actions/twittersettings.php @@ -71,13 +71,19 @@ class TwittersettingsAction extends SettingsAction { if ($flink) { common_checkbox('noticesync', _('Automatically send my notices to Twitter.'), - ($flink->noticesync) ? true : false); + ($flink->noticesync > 0) ? true : false); + + common_checkbox('replysync', _('Don\'t send local "@" replies to Twitter.'), + ($flink->noticesync == 3) ? true : false, NULL, 'true'); + common_checkbox('friendsync', _('Subscribe to my Twitter friends here.'), - ($flink->friendsync) ? true : false); + ($flink->friendsync) ? true : false, NULL, 'true', true); + common_submit('save', _('Save')); } else { common_checkbox('noticesync', _('Automatically send my notices to Twitter.'), true); - common_checkbox('friendsync', _('Subscribe to my Twitter friends here.'), true); + common_checkbox('replysync', _('Don\'t send local "@" replies to Twitter.'), false, NULL, 'true'); + common_checkbox('friendsync', _('Subscribe to my Twitter friends here.'), false, NULL, 'true', true); common_submit('add', _('Add')); } @@ -109,12 +115,13 @@ class TwittersettingsAction extends SettingsAction { $twitter_username = $this->trimmed('twitter_username'); $twitter_password = $this->trimmed('twitter_password'); $noticesync = $this->boolean('noticesync'); + $replysync = $this->boolean('replysync'); $friendsync = $this->boolean('friendsync'); if (!Validate::string($twitter_username, array('min_length' => 1, 'max_length' => 15, 'format' => VALIDATE_NUM . VALIDATE_ALPHA . '_'))) { - $this->show_form(_('Username must have only numbers, upper- and lowercase letters, and underscore (_).')); + $this->show_form(_('Username must have only numbers, upper- and lowercase letters, and underscore (_). 15 chars max.')); return; } @@ -155,7 +162,15 @@ class TwittersettingsAction extends SettingsAction { $flink->service = 1; // Twitter $flink->credentials = $twitter_password; $flink->created = common_sql_now(); - $flink->noticesync = ($noticesync) ? 1 : 0; + + if ($noticesync) { + if ($replysync) { + $flink->noticesync = 3; + } else { + $flink->noticesync = 1; + } + } + $flink->friendsync = ($friendsync) ? 2 : 0; $flink->profilesync = 0; // XXX: leave as default? $flink_id = $flink->insert(); @@ -210,6 +225,8 @@ class TwittersettingsAction extends SettingsAction { function save_preferences() { $noticesync = $this->boolean('noticesync'); $friendsync = $this->boolean('friendsync'); + $replysync = $this->boolean('replysync'); + $user = common_current_user(); $flink = Foreign_link::getForeignLink($user->id, 1); @@ -219,7 +236,14 @@ class TwittersettingsAction extends SettingsAction { return; } - $flink->noticesync = ($noticesync) ? 1 : 0; + if ($noticesync) { + if ($replysync) { + $flink->noticesync = 3; + } else { + $flink->noticesync = 1; + } + } + $flink->friendsync = ($friendsync) ? 2 : 0; // $flink->profilesync = 0; // XXX: leave as default? $result = $flink->update(); diff --git a/db/laconica.sql b/db/laconica.sql index 82f9cecae5..f7813b95de 100644 --- a/db/laconica.sql +++ b/db/laconica.sql @@ -281,7 +281,7 @@ create table foreign_link ( foreign_id int comment 'link ' references foreign_user(id), service int not null comment 'foreign key to service' references foreign_service(id), credentials varchar(255) comment 'authc credentials, typically a password', - noticesync tinyint not null default 1 comment 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming', + noticesync tinyint not null default 1 comment 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies', friendsync tinyint not null default 2 comment 'friend synchronization, bit 1 = sync outgoing, bit 2 = sync incoming', profilesync tinyint not null default 1 comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming', created datetime not null comment 'date this record was created', diff --git a/lib/util.php b/lib/util.php index b0edb8ef04..a45f4a2149 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1107,16 +1107,28 @@ 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->noticesync == 1) { - if (!common_twitter_broadcast($notice, $flink)) { - common_debug('Unable to send notice: ' . $notice->id . ' to Twitter.', __FILE__); + if ($flink->noticesync >= 1) { + $ok_to_send = true; + + // Check to see whether user wants to filter @-replies + if ($flink->noticesync == 3) { + if (preg_match('/(?:^|\s)@([A-Za-z0-9_\-\.]{1,64})/', $notice->content)) { + $ok_to_send = false; + } + } + + if ($ok_to_send) { + $result = common_twitter_broadcast($notice, $flink); + + if (!$result) { + common_debug('Unable to send notice: ' . $notice->id . ' to Twitter.', __FILE__); + } } } - + if (common_config('queue', 'enabled')) { # Do it later! return common_enqueue_notice($notice); @@ -1125,17 +1137,17 @@ function common_broadcast_notice($notice, $remote=false) { } } -function common_twitter_broadcast($notice, $flink) { +function common_twitter_broadcast($notice, $flink) { global $config; $success = true; $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, @@ -1151,27 +1163,27 @@ function common_twitter_broadcast($notice, $flink) { 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.", + 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 + // Twitter should return a status $status = json_decode($data); if (!$status->id) { @@ -1179,8 +1191,8 @@ function common_twitter_broadcast($notice, $flink) { __FILE__); $success = false; } - - return $status; + + return $success; } # Stick the notice on the queue