X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FFavorite%2FFavoritePlugin.php;h=810957c322fbb499f30ce6a2a386f1ee6aa6b821;hb=9102429a135bdd204b000e9b813dffd8682169e2;hp=baa8df43c441b5261fdb2e009b2afb0538648d86;hpb=7617fb65d701e3c8fbdb5e2798c2956531facf67;p=quix0rs-gnu-social.git diff --git a/plugins/Favorite/FavoritePlugin.php b/plugins/Favorite/FavoritePlugin.php index baa8df43c4..810957c322 100644 --- a/plugins/Favorite/FavoritePlugin.php +++ b/plugins/Favorite/FavoritePlugin.php @@ -25,7 +25,7 @@ if (!defined('GNUSOCIAL')) { exit(1); } */ class FavoritePlugin extends ActivityHandlerPlugin { - protected $notify_email_fave = 1; + protected $email_notify_fave = 1; public function tag() { @@ -49,6 +49,11 @@ class FavoritePlugin extends ActivityHandlerPlugin return true; } + public function initialize() + { + common_config_set('email', 'notify_fave', $this->email_notify_fave); + } + public function onStartUpgrade() { // This is a migration feature that will make sure we move @@ -59,6 +64,10 @@ class FavoritePlugin extends ActivityHandlerPlugin $user->whereAdd('emailnotifyfav IS NOT NULL'); if ($user->find()) { printfnq("Detected old User table (emailnotifyfav IS NOT NULL). Moving 'emailnotifyfav' property to Profile_prefs..."); + // First we'll make sure Profile_prefs exists + $schema = Schema::get(); + $schema->ensureTable('profile_prefs', Profile_prefs::schemaDef()); + // Make sure we have our own tables setup properly while ($user->fetch()) { $user->setPref('email', 'notify_fave', $user->emailnotifyfav); @@ -179,24 +188,32 @@ class FavoritePlugin extends ActivityHandlerPlugin if (!isset($options['created'])) { $options['created'] = !empty($act->time) ? common_sql_date($act->time) : common_sql_now(); } - if (!isset($options['uri'])) { - $options['uri'] = !empty($act->id) ? $act->id : $act->selfLink; - } // We must have an objects[0] here because in isMyActivity we require the count to be == 1 $actobj = $act->objects[0]; - try { - $object = Fave::saveActivityObject($actobj, $stored); - } catch (ServerException $e) { - // Probably that the favored notice doesn't exist in our local database - // but may also be some missing profile or so, which we could catch in a - // more explicit catch-statement. - return null; - } + $object = Fave::saveActivityObject($actobj, $stored); return $object; } + // FIXME: Put this in lib/activityhandlerplugin.php when we're ready + // with the other microapps/activityhandlers as well. + // Also it should be StartNoticeAsActivity (with a prepped Activity, including ->context etc.) + public function onEndNoticeAsActivity(Notice $stored, Activity $act, Profile $scoped=null) + { + if (!$this->isMyNotice($stored)) { + return true; + } + + common_debug('Extending activity '.$stored->id.' with '.get_called_class()); + $this->extendActivity($stored, $act, $scoped); + return false; + } + + public function extendActivity(Notice $stored, Activity $act, Profile $scoped=null) + { + Fave::extendActivity($stored, $act, $scoped); + } public function activityObjectFromNotice(Notice $notice) { @@ -214,19 +231,6 @@ class FavoritePlugin extends ActivityHandlerPlugin } } - protected function notifyMentioned(Notice $stored, array &$mentioned_ids) - { - require_once INSTALLDIR.'/lib/mail.php'; - - foreach ($mentioned_ids as $id) { - $mentioned = User::getKV('id', $id); - if ($mentioned instanceof User && $mentioned->id != $stored->profile_id - && $mentioned->email && $mentioned->getPref('email', 'notify_fave', $this->notify_email_fave)) { // do we have an email, and does user want it? - mail_notify_fave($mentioned, $stored->getProfile(), $stored->getParent()); - } - } - } - // API stuff /** @@ -339,9 +343,8 @@ class FavoritePlugin extends ActivityHandlerPlugin public function onAppendUserActivityStreamObjects(UserActivityStream $uas, array &$objs) { - $faves = array(); $fave = new Fave(); - $fave->user_id = $uas->user->id; + $fave->user_id = $uas->getUser()->id; if (!empty($uas->after)) { $fave->whereAdd("modified > '" . common_sql_date($uas->after) . "'"); @@ -349,11 +352,11 @@ class FavoritePlugin extends ActivityHandlerPlugin if ($fave->find()) { while ($fave->fetch()) { - $faves[] = clone($fave); + $objs[] = clone($fave); } } - return $faves; + return true; } public function onStartShowThreadedNoticeTailItems(NoticeListItem $nli, Notice $notice, &$threadActive) @@ -368,6 +371,22 @@ class FavoritePlugin extends ActivityHandlerPlugin return true; } + public function onEndFavorNotice(Profile $actor, Notice $target) + { + try { + $notice_author = $target->getProfile(); + // Don't notify ourselves of our own favorite on our own notice, + // or if it's a remote user (since we don't know their email addresses etc.) + if ($notice_author->id == $actor->id || !$notice_author->isLocal()) { + return true; + } + $local_user = $notice_author->getUser(); + mail_notify_fave($local_user, $actor, $target); + } catch (Exception $e) { + // Mm'kay, probably not a local user. Let's skip this favor notification. + } + } + /** * EndInterpretCommand for FavoritePlugin will handle the 'fav' command * using the class FavCommand. @@ -385,7 +404,7 @@ class FavoritePlugin extends ActivityHandlerPlugin if (empty($arg)) { $result = null; } else { - list($other, $extra) = $this->split_arg($arg); + list($other, $extra) = CommandInterpreter::split_arg($arg); if (!empty($extra)) { $result = null; } else { @@ -408,7 +427,7 @@ class FavoritePlugin extends ActivityHandlerPlugin /** * Are we allowed to perform a certain command over the API? */ - public function onCommandSupportedAPI(Command $cmd, array &$supported) + public function onCommandSupportedAPI(Command $cmd, &$supported) { $supported = $supported || $cmd instanceof FavCommand; } @@ -417,9 +436,7 @@ class FavoritePlugin extends ActivityHandlerPlugin public function onEndEmailFormData(Action $action, Profile $scoped) { - // getConfigData will fall back on systemwide default - // and we only wish to save numerical true or false. - $emailfave = $scoped->getPref('email', 'notify_fave', $this->notify_email_fave) ? 1 : 0; + $emailfave = $scoped->getConfigPref('email', 'notify_fave') ? 1 : 0; $action->elementStart('li'); $action->checkbox('email-notify_fave', @@ -498,3 +515,69 @@ class FavoritePlugin extends ActivityHandlerPlugin return true; } } + +/** + * Notify a user that one of their notices has been chosen as a 'fave' + * + * @param User $rcpt The user whose notice was faved + * @param Profile $sender The user who faved the notice + * @param Notice $notice The notice that was faved + * + * @return void + */ +function mail_notify_fave(User $rcpt, Profile $sender, Notice $notice) +{ + if (!$rcpt->receivesEmailNotifications() || !$rcpt->getConfigPref('email', 'notify_fave')) { + return; + } + + // This test is actually "if the sender is sandboxed" + if (!$sender->hasRight(Right::EMAILONFAVE)) { + return; + } + + if ($rcpt->hasBlocked($sender)) { + // If the author has blocked us, don't spam them with a notification. + return; + } + + // We need the global mail.php for various mail related functions below. + require_once INSTALLDIR.'/lib/mail.php'; + + $bestname = $sender->getBestName(); + + common_switch_locale($rcpt->language); + + // TRANS: Subject for favorite notification e-mail. + // TRANS: %1$s is the adding user's long name, %2$s is the adding user's nickname. + $subject = sprintf(_('%1$s (@%2$s) added your notice as a favorite'), $bestname, $sender->getNickname()); + + // TRANS: Body for favorite notification e-mail. + // TRANS: %1$s is the adding user's long name, $2$s is the date the notice was created, + // TRANS: %3$s is a URL to the faved notice, %4$s is the faved notice text, + // TRANS: %5$s is a URL to all faves of the adding user, %6$s is the StatusNet sitename, + // TRANS: %7$s is the adding user's nickname. + $body = sprintf(_("%1\$s (@%7\$s) just added your notice from %2\$s". + " as one of their favorites.\n\n" . + "The URL of your notice is:\n\n" . + "%3\$s\n\n" . + "The text of your notice is:\n\n" . + "%4\$s\n\n" . + "You can see the list of %1\$s's favorites here:\n\n" . + "%5\$s"), + $bestname, + common_exact_date($notice->created), + common_local_url('shownotice', + array('notice' => $notice->id)), + $notice->content, + common_local_url('showfavorites', + array('nickname' => $sender->getNickname())), + common_config('site', 'name'), + $sender->getNickname()) . + mail_footer_block(); + + $headers = _mail_prepare_headers('fave', $rcpt->getNickname(), $sender->getNickname()); + + common_switch_locale(); + mail_to_user($rcpt, $subject, $body, $headers); +}