Merge branch '0.8.x' of git@gitorious.org:+laconica-developers/laconica/dev into 0.8.x

This commit is contained in:
Evan Prodromou 2009-07-09 10:11:31 -04:00
commit 14267381e9
3 changed files with 219 additions and 25 deletions

View File

@ -90,10 +90,10 @@ function isFacebookBound($notice, $flink) {
if ($result != 1) { if ($result != 1) {
$user = $flink->getUser(); $user = $flink->getUser();
$msg = "Can't send notice $notice->id to Facebook " . $msg = "Not sending notice $notice->id to Facebook " .
"because user $user->nickname hasn't given the " . "because user $user->nickname hasn't given the " .
'Facebook app \'status_update\' permission.'; 'Facebook app \'status_update\' permission.';
common_log(LOG_INFO, $msg); common_debug($msg);
$success = false; $success = false;
} }
@ -118,7 +118,10 @@ function facebookBroadcastNotice($notice)
$status = null; $status = null;
$fbuid = $flink->foreign_id; $fbuid = $flink->foreign_id;
$user = $flink->getUser();
// Get the status 'verb' (prefix) the user has set // Get the status 'verb' (prefix) the user has set
try { try {
$prefix = $facebook->api_client-> $prefix = $facebook->api_client->
data_getUserPreference(FACEBOOK_NOTICE_PREFIX, $fbuid); data_getUserPreference(FACEBOOK_NOTICE_PREFIX, $fbuid);
@ -126,23 +129,79 @@ function facebookBroadcastNotice($notice)
$status = "$prefix $notice->content"; $status = "$prefix $notice->content";
} catch(FacebookRestClientException $e) { } catch(FacebookRestClientException $e) {
common_log(LOG_ERR, $e->getMessage()); common_log(LOG_WARNING, $e->getMessage());
return false; common_log(LOG_WARNING,
'Unable to get the status verb setting from Facebook ' .
"for $user->nickname (user id: $user->id).");
} }
// Okay, we're good to go! // Okay, we're good to go, update the FB status
try { try {
$facebook->api_client->users_setStatus($status, $fbuid, false, true); $facebook->api_client->users_setStatus($status, $fbuid, false, true);
updateProfileBox($facebook, $flink, $notice);
} catch(FacebookRestClientException $e) { } catch(FacebookRestClientException $e) {
common_log(LOG_ERR, $e->getMessage()); common_log(LOG_ERR, $e->getMessage());
return false; common_log(LOG_ERR,
'Unable to update Facebook status for ' .
"$user->nickname (user id: $user->id)!");
// Should we remove flink if this fails? $code = $e->getCode();
if ($code >= 200) {
// 200 The application does not have permission to operate on the passed in uid parameter.
// 250 Updating status requires the extended permission status_update.
// see: http://wiki.developers.facebook.com/index.php/Users.setStatus#Example_Return_XML
remove_facebook_app($flink);
}
}
// Now try to update the profile box
try {
updateProfileBox($facebook, $flink, $notice);
} catch(FacebookRestClientException $e) {
common_log(LOG_WARNING, $e->getMessage());
common_log(LOG_WARNING,
'Unable to update Facebook profile box for ' .
"$user->nickname (user id: $user->id).");
} }
} }
return true; return true;
} }
function remove_facebook_app($flink)
{
$user = $flink->getUser();
common_log(LOG_INFO, 'Removing Facebook App Foreign link for ' .
"user $user->nickname (user id: $user->id).");
$result = $flink->delete();
if (empty($result)) {
common_log(LOG_ERR, 'Could not remove Facebook App ' .
"Foreign_link for $user->nickname (user id: $user->id)!");
common_log_db_error($flink, 'DELETE', __FILE__);
}
// Notify the user that we are removing their FB app access
$result = mail_facebook_app_removed($user);
if (!$result) {
$msg = 'Unable to send email to notify ' .
"$user->nickname (user id: $user->id) " .
'that their Facebook app link was ' .
'removed!';
common_log(LOG_WARNING, $msg);
}
}

View File

@ -625,3 +625,75 @@ function mail_notify_attn($user, $notice)
common_init_locale(); common_init_locale();
mail_to_user($user, $subject, $body); mail_to_user($user, $subject, $body);
} }
/**
* Send a mail message to notify a user that her Twitter bridge link
* has stopped working, and therefore has been removed. This can
* happen when the user changes her Twitter password, or otherwise
* revokes access.
*
* @param User $user user whose Twitter bridge link has been removed
*
* @return boolean success flag
*/
function mail_twitter_bridge_removed($user)
{
common_init_locale($user->language);
$profile = $user->getProfile();
$subject = sprintf(_('Your Twitter bridge has been disabled.'));
$body = sprintf(_("Hi, %1\$s. We're sorry to inform you that your " .
'link to Twitter has been disabled. Your Twitter credentials ' .
'have either changed (did you recently change your Twitter ' .
'password?) or you have otherwise revoked our access to your ' .
"Twitter account.\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"),
$profile->getBestName(),
common_local_url('twittersettings'),
common_config('site', 'name'));
common_init_locale();
return mail_to_user($user, $subject, $body);
}
/**
* Send a mail message to notify a user that her Facebook Application
* access has been removed.
*
* @param User $user user whose Facebook app link has been removed
*
* @return boolean success flag
*/
function mail_facebook_app_removed($user)
{
common_init_locale($user->language);
$profile = $user->getProfile();
$site_name = common_config('site', 'name');
$subject = sprintf(
_('Your %s Facebook application access has been disabled.',
$site_name));
$body = sprintf(_("Hi, %1\$s. We're sorry to inform you that we are " .
'unable to update your Facebook status from %s, and have disabled ' .
'the Facebook application for your account. This may be because ' .
'you have removed the Facebook application\'s authorization, or ' .
'have deleted your Facebook account. You can re-enable the ' .
'Facebook application and automatic status updating by ' .
"re-installing the %1\$s Facebook application.\n\nRegards,\n\n%1\$s"),
$site_name);
common_init_locale();
return mail_to_user($user, $subject, $body);
}

View File

@ -360,13 +360,10 @@ function is_twitter_bound($notice, $flink) {
function broadcast_twitter($notice) function broadcast_twitter($notice)
{ {
$success = true;
$flink = Foreign_link::getByUserID($notice->profile_id, $flink = Foreign_link::getByUserID($notice->profile_id,
TWITTER_SERVICE); 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_twitter_bound($notice, $flink)) { if (is_twitter_bound($notice, $flink)) {
$fuser = $flink->getForeignUser(); $fuser = $flink->getForeignUser();
@ -401,33 +398,99 @@ function broadcast_twitter($notice)
curl_setopt_array($ch, $options); curl_setopt_array($ch, $options);
$data = curl_exec($ch); $data = curl_exec($ch);
$errmsg = curl_error($ch); $errmsg = curl_error($ch);
$errno = curl_errno($ch);
if ($errmsg) { if (!empty($errmsg)) {
common_debug("cURL error: $errmsg - " . common_debug("cURL error ($errno): $errmsg - " .
"trying to send notice for $twitter_user.", "trying to send notice for $twitter_user.",
__FILE__); __FILE__);
$success = false;
$user = $flink->getUser();
if ($errmsg == 'The requested URL returned error: 401') {
common_debug(sprintf('User %s (user id: %s) ' .
'has bad Twitter credentials!',
$user->nickname, $user->id));
// Bad credentials we need to delete the foreign_link
// to Twitter and inform the user.
remove_twitter_link($flink);
return true;
} else {
// Some other error happened, so we should try to
// send again later
return false;
}
} }
curl_close($ch); curl_close($ch);
if (!$data) { if (empty($data)) {
common_debug("No data returned by Twitter's " . common_debug("No data returned by Twitter's " .
"API trying to send update for $twitter_user", "API trying to send update for $twitter_user",
__FILE__); __FILE__);
$success = false;
}
// Twitter should return a status // XXX: Not sure this represents a failure to send, but it
$status = json_decode($data); // probably does
if (!$status->id) { return false;
common_debug("Unexpected data returned by Twitter " .
" API trying to send update for $twitter_user", } else {
__FILE__);
$success = false; // Twitter should return a status
$status = json_decode($data);
if (empty($status)) {
common_debug("Unexpected data returned by Twitter " .
" API trying to send update for $twitter_user",
__FILE__);
// XXX: Again, this could represent a failure posting
// or the Twitter API might just be behaving flakey.
// We're treating it as a failure to post.
return false;
}
} }
} }
return $success; return true;
} }
function remove_twitter_link($flink)
{
$user = $flink->getUser();
common_log(LOG_INFO, 'Removing Twitter bridge Foreign link for ' .
"user $user->nickname (user id: $user->id).");
$result = $flink->delete();
if (empty($result)) {
common_log(LOG_ERR, 'Could not remove Twitter bridge ' .
"Foreign_link for $user->nickname (user id: $user->id)!");
common_log_db_error($flink, 'DELETE', __FILE__);
}
// Notify the user that her Twitter bridge is down
$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 ' .
'removed!';
common_log(LOG_WARNING, $msg);
}
}