From 0a20abf1d8a9a068df9310d6903cc303f39b25ed Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sun, 13 Jul 2014 17:13:05 +0200 Subject: [PATCH] Email notify-on-fave moved to Profile_prefs (run upgrade.php) --- actions/emailsettings.php | 9 --- classes/User.php | 3 +- lib/mail.php | 4 ++ plugins/Favorite/FavoritePlugin.php | 60 ++++++++++++++++++- .../Favorite/actions/apifavoritecreate.php | 8 +-- .../Favorite/actions/atompubfavoritefeed.php | 8 +-- plugins/Favorite/lib/favcommand.php | 8 +-- 7 files changed, 73 insertions(+), 27 deletions(-) diff --git a/actions/emailsettings.php b/actions/emailsettings.php index cc1a345f09..fea649d6de 100644 --- a/actions/emailsettings.php +++ b/actions/emailsettings.php @@ -214,13 +214,6 @@ class EmailsettingsAction extends SettingsAction $user->emailnotifysub); $this->elementEnd('li'); $this->elementStart('li'); - $this->checkbox('emailnotifyfav', - // TRANS: Checkbox label in e-mail preferences form. - _('Send me email when someone '. - 'adds my notice as a favorite.'), - $user->emailnotifyfav); - $this->elementEnd('li'); - $this->elementStart('li'); $this->checkbox('emailnotifymsg', // TRANS: Checkbox label in e-mail preferences form. _('Send me email when someone sends me a private message.'), @@ -324,7 +317,6 @@ class EmailsettingsAction extends SettingsAction if (Event::handle('StartEmailSaveForm', array($this, $this->scoped))) { $emailnotifysub = $this->boolean('emailnotifysub'); - $emailnotifyfav = $this->boolean('emailnotifyfav'); $emailnotifymsg = $this->boolean('emailnotifymsg'); $emailnotifynudge = $this->boolean('emailnotifynudge'); $emailnotifyattn = $this->boolean('emailnotifyattn'); @@ -338,7 +330,6 @@ class EmailsettingsAction extends SettingsAction $original = clone($user); $user->emailnotifysub = $emailnotifysub; - $user->emailnotifyfav = $emailnotifyfav; $user->emailnotifymsg = $emailnotifymsg; $user->emailnotifynudge = $emailnotifynudge; $user->emailnotifyattn = $emailnotifyattn; diff --git a/classes/User.php b/classes/User.php index b55b57c181..1ccbdbc217 100644 --- a/classes/User.php +++ b/classes/User.php @@ -73,7 +73,7 @@ class User extends Managed_DataObject 'email' => array('type' => 'varchar', 'length' => 255, 'description' => 'email address for password recovery etc.'), 'incomingemail' => array('type' => 'varchar', 'length' => 255, 'description' => 'email address for post-by-email'), 'emailnotifysub' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of subscriptions'), - 'emailnotifyfav' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of favorites'), + 'emailnotifyfav' => array('type' => 'int', 'size' => 'tiny', 'default' => null, 'description' => 'Notify by email of favorites'), 'emailnotifynudge' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of nudges'), 'emailnotifymsg' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of direct messages'), 'emailnotifyattn' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of @-replies'), @@ -289,7 +289,6 @@ class User extends Managed_DataObject // initially for sites using caching, since the initial encache // doesn't know about the defaults in the database. $user->emailnotifysub = 1; - $user->emailnotifyfav = 1; $user->emailnotifynudge = 1; $user->emailnotifymsg = 1; $user->emailnotifyattn = 1; diff --git a/lib/mail.php b/lib/mail.php index 182c95ea48..15b2351b43 100644 --- a/lib/mail.php +++ b/lib/mail.php @@ -683,6 +683,10 @@ function mail_notify_fave(User $rcpt, Profile $sender, Notice $notice) return; } + if (!$rcpt->getPref('notify', 'email_fave', 1)) { + return; + } + $bestname = $profile->getBestName(); common_switch_locale($rcpt->language); diff --git a/plugins/Favorite/FavoritePlugin.php b/plugins/Favorite/FavoritePlugin.php index 144fef7797..baa8df43c4 100644 --- a/plugins/Favorite/FavoritePlugin.php +++ b/plugins/Favorite/FavoritePlugin.php @@ -25,6 +25,8 @@ if (!defined('GNUSOCIAL')) { exit(1); } */ class FavoritePlugin extends ActivityHandlerPlugin { + protected $notify_email_fave = 1; + public function tag() { return 'favorite'; @@ -46,6 +48,27 @@ class FavoritePlugin extends ActivityHandlerPlugin $schema->ensureTable('fave', Fave::schemaDef()); return true; } + + public function onStartUpgrade() + { + // This is a migration feature that will make sure we move + // certain User preferences to the Profile_prefs table. + // Introduced after commit b5fd2a048fc621ea05d756caba17275ab3dd0af4 + // on Sun Jul 13 16:30:37 2014 +0200 + $user = new User(); + $user->whereAdd('emailnotifyfav IS NOT NULL'); + if ($user->find()) { + printfnq("Detected old User table (emailnotifyfav IS NOT NULL). Moving 'emailnotifyfav' property to Profile_prefs..."); + // Make sure we have our own tables setup properly + while ($user->fetch()) { + $user->setPref('email', 'notify_fave', $user->emailnotifyfav); + $orig = clone($user); + $user->emailnotifyfav = 'null'; // flag this preference as migrated + $user->update($orig); + } + printfnq("DONE.\n"); + } + } public function onEndUpgrade() { @@ -198,7 +221,7 @@ class FavoritePlugin extends ActivityHandlerPlugin foreach ($mentioned_ids as $id) { $mentioned = User::getKV('id', $id); if ($mentioned instanceof User && $mentioned->id != $stored->profile_id - && $mentioned->email && $mentioned->emailnotifyfav) { // do we have an email, and does user want it? + && $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()); } } @@ -390,6 +413,41 @@ class FavoritePlugin extends ActivityHandlerPlugin $supported = $supported || $cmd instanceof FavCommand; } + // Form stuff (settings etc.) + + 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; + + $action->elementStart('li'); + $action->checkbox('email-notify_fave', + // TRANS: Checkbox label in e-mail preferences form. + _('Send me email when someone adds my notice as a favorite.'), + $emailfave); + $action->elementEnd('li'); + + return true; + } + + public function onStartEmailSaveForm(Action $action, Profile $scoped) + { + $emailfave = $action->boolean('email-notify_fave') ? 1 : 0; + try { + if ($emailfave == $scoped->getPref('email', 'notify_fave')) { + // No need to update setting + return true; + } + } catch (NoResultException $e) { + // Apparently there's no previously stored setting, then continue to save it as it is now. + } + + $scoped->setPref('email', 'notify_fave', $emailfave); + + return true; + } + // Layout stuff public function onEndPersonalGroupNav(Menu $menu, Profile $target, Profile $scoped=null) diff --git a/plugins/Favorite/actions/apifavoritecreate.php b/plugins/Favorite/actions/apifavoritecreate.php index 4172692441..e0c8c0cd83 100644 --- a/plugins/Favorite/actions/apifavoritecreate.php +++ b/plugins/Favorite/actions/apifavoritecreate.php @@ -162,12 +162,10 @@ class ApiFavoriteCreateAction extends ApiAuthAction function notify($fave, $notice, $user) { $other = User::getKV('id', $notice->profile_id); - if ($other && $other->id != $user->id) { - if ($other->email && $other->emailnotifyfav) { - require_once INSTALLDIR.'/lib/mail.php'; + if ($other && $other->id != $user->id && !empty($other->email)) { + require_once INSTALLDIR.'/lib/mail.php'; - mail_notify_fave($other, $user->getProfile(), $notice); - } + mail_notify_fave($other, $user->getProfile(), $notice); // XXX: notify by IM // XXX: notify by SMS } diff --git a/plugins/Favorite/actions/atompubfavoritefeed.php b/plugins/Favorite/actions/atompubfavoritefeed.php index 4ff76e183d..cfc79ec0f0 100644 --- a/plugins/Favorite/actions/atompubfavoritefeed.php +++ b/plugins/Favorite/actions/atompubfavoritefeed.php @@ -361,12 +361,10 @@ class AtompubfavoritefeedAction extends ApiAuthAction function notify($fave, $notice, $user) { $other = User::getKV('id', $notice->profile_id); - if ($other && $other->id != $user->id) { - if ($other->email && $other->emailnotifyfav) { - require_once INSTALLDIR.'/lib/mail.php'; + if ($other && $other->id != $user->id && !empty($other->email)) { + require_once INSTALLDIR.'/lib/mail.php'; - mail_notify_fave($other, $user->getProfile(), $notice); - } + mail_notify_fave($other, $user->getProfile(), $notice); // XXX: notify by IM // XXX: notify by SMS } diff --git a/plugins/Favorite/lib/favcommand.php b/plugins/Favorite/lib/favcommand.php index 65ccdaae4b..94658b8a53 100644 --- a/plugins/Favorite/lib/favcommand.php +++ b/plugins/Favorite/lib/favcommand.php @@ -38,12 +38,10 @@ class FavCommand extends Command $other = User::getKV('id', $notice->profile_id); - if ($other && $other->id != $this->user->id) { - if ($other->email && $other->emailnotifyfav) { - require_once INSTALLDIR.'/lib/mail.php'; + if ($other && $other->id != $this->user->id && !empty($other->email)) { + require_once INSTALLDIR.'/lib/mail.php'; - mail_notify_fave($other, $this->user->getProfile(), $notice); - } + mail_notify_fave($other, $this->user->getProfile(), $notice); } Fave::blowCacheForProfileId($this->user->id);