From aebab2742a66712bf2d33f7f75c093a4be6cb795 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 20 Jun 2011 12:58:14 -0700 Subject: [PATCH] Add ability to send special one-time reminders --- plugins/EmailReminder/EmailReminderPlugin.php | 56 ++++++++++--------- .../EmailReminder/classes/Email_reminder.php | 43 +++++++------- .../lib/siteconfirmreminderhandler.php | 14 +++-- .../lib/userconfirmregreminderhandler.php | 25 ++++++++- .../lib/userinvitereminderhandler.php | 28 ++++++++-- plugins/EmailReminder/mail-src/invite-onetime | 26 +++++++++ plugins/EmailReminder/mail-src/register-1 | 2 +- .../EmailReminder/mail-src/register-onetime | 9 +++ .../scripts/sendemailreminder.php | 17 ++++-- 9 files changed, 155 insertions(+), 65 deletions(-) create mode 100644 plugins/EmailReminder/mail-src/invite-onetime create mode 100644 plugins/EmailReminder/mail-src/register-onetime diff --git a/plugins/EmailReminder/EmailReminderPlugin.php b/plugins/EmailReminder/EmailReminderPlugin.php index 0bb10921b0..701d04e016 100644 --- a/plugins/EmailReminder/EmailReminderPlugin.php +++ b/plugins/EmailReminder/EmailReminderPlugin.php @@ -114,22 +114,25 @@ class EmailReminderPlugin extends Plugin } /** + * Send a reminder and record doing so * - * @param type $object - * @param type $subject - * @param type $day + * @param string $type type of reminder + * @param mixed $object Confirm_address or Invitation object + * @param string $subject subjct of the email reminder + * @param int $day number of days */ static function sendReminder($type, $object, $subject, $day) { - common_debug("QQQQQ sendReminder() enter ... ", __FILE__); - - $title = "{$type}-{$day}"; - - common_debug("QQQQ title = {$title}", __FILE__); + // XXX: -1 is a for the special one-time reminder (maybe 30) would be + // better? Like >= 30 days? + if ($day == -1) { + $title = "{$type}-onetime"; + } else { + $title = "{$type}-{$day}"; + } // Record the fact that we sent a reminder if (self::sendReminderEmail($type, $object, $subject, $title)) { - common_debug("Recording reminder record for {$object->address}", __FILE__); try { Email_reminder::recordReminder($type, $object, $day); } catch (Exception $e) { @@ -138,19 +141,21 @@ class EmailReminderPlugin extends Plugin } } - common_debug("QQQQQ sendReminder() exit ... ", __FILE__); - return true; } /** + * Send a real live email reminder * - * @param type $object - * @param type $subject - * @param type $title - * @return type + * @todo This would probably be better as two or more sep functions + * + * @param string $type type of reminder + * @param mixed $object Confirm_address or Invitation object + * @param string $subject subjct of the email reminder + * @param string $title title of the email reminder + * @return boolean true if the email subsystem doesn't explode */ - static function sendReminderEmail($type, $object, $subject, $title=null) { + static function sendReminderEmail($type, $object, $subject, $title = null) { $sitename = common_config('site', 'name'); $recipients = array($object->address); @@ -177,14 +182,15 @@ class EmailReminderPlugin extends Plugin $template = DocFile::forTitle($title, DocFile::mailPaths()); - $body = $template->toHTML( - array( - 'confirmurl' => $confirmUrl, - 'inviter' => $inviter, - 'inviterurl' => $inviterUrl - // @todo private invitation message - ) - ); + $blankfillers = array('confirmurl' => $confirmUrl); + + if ($type == UserInviteReminderHandler::INVITE_REMINDER) { + $blankfillers['inviter'] = $inviter; + $blankfillers['inviterurl'] = $inviterUrl; + // @todo private invitation message? + } + + $body = $template->toHTML($blankfillers); return mail_send($recipients, $headers, $body); } @@ -205,5 +211,5 @@ class EmailReminderPlugin extends Plugin ); return true; } - + } diff --git a/plugins/EmailReminder/classes/Email_reminder.php b/plugins/EmailReminder/classes/Email_reminder.php index 2a82e6c4d8..58dc2e1460 100644 --- a/plugins/EmailReminder/classes/Email_reminder.php +++ b/plugins/EmailReminder/classes/Email_reminder.php @@ -28,8 +28,6 @@ class Email_reminder extends Managed_DataObject { - const INVITE_REMINDER = 'invite'; // @todo Move this to the invite reminder handler - public $__table = 'email_reminder'; public $type; // type of reminder @@ -56,40 +54,45 @@ class Email_reminder extends Managed_DataObject } /** + * Do we need to send a reminder? * - * @param type $type - * @param type $confirm - * @param type $day - * @return type + * @param string $type type of reminder + * @param Object $object an object with a 'code' property + * (Confirm_address or Invitation) + * @param int $days Number of days after the code was created + * @return boolean true if any Email_reminder records were found */ - static function needsReminder($type, $confirm, $days) { + static function needsReminder($type, $object, $days = null) { $reminder = new Email_reminder(); $reminder->type = $type; - $reminder->code = $confirm->code; - $reminder->days = $days; + $reminder->code = $object->code; + if (!empty($days)) { + $reminder->days = $days; + } + $result = $reminder->find(); - $result = $reminder->find(true); - - if (empty($result)) { - return true; + if (!empty($result)) { + return false; } - return false; + return true; } /** + * Record a record of sending the reminder * - * @param type $type - * @param type $confirm - * @param type $day - * @return type + * @param string $type type of reminder + * @param Object $object an object with a 'code' property + * (Confirm_address or Invitation) + * @param int $days Number of days after the code was created + * @return int $result row ID of the new reminder record */ - static function recordReminder($type, $confirm, $days) { + static function recordReminder($type, $object, $days) { $reminder = new Email_reminder(); $reminder->type = $type; - $reminder->code = $confirm->code; + $reminder->code = $object->code; $reminder->days = $days; $reminder->sent = $reminder->created = common_sql_now(); $result = $reminder->insert(); diff --git a/plugins/EmailReminder/lib/siteconfirmreminderhandler.php b/plugins/EmailReminder/lib/siteconfirmreminderhandler.php index e5b561827b..d75c40f530 100644 --- a/plugins/EmailReminder/lib/siteconfirmreminderhandler.php +++ b/plugins/EmailReminder/lib/siteconfirmreminderhandler.php @@ -60,22 +60,24 @@ class SiteConfirmReminderHandler extends QueueHandler /** * Handle the site * - * @param string $reminderType type of reminder to send + * @param array $remitem type of reminder to send and any special options * @return boolean true on success, false on failure */ - function handle($reminderType) + function handle($remitem) { + list($type, $opts) = $remitem; + $qm = QueueManager::get(); try { - switch($reminderType) { + switch($type) { case UserConfirmRegReminderHandler::REGISTER_REMINDER: $confirm = new Confirm_address(); - $confirm->address_type = $object; + $confirm->address_type = $type; $confirm->find(); while ($confirm->fetch()) { try { - $qm->enqueue($confirm, 'uregrem'); + $qm->enqueue(array($confirm, $opts), 'uregrem'); } catch (Exception $e) { common_log(LOG_WARNING, $e->getMessage()); continue; @@ -87,7 +89,7 @@ class SiteConfirmReminderHandler extends QueueHandler $invitation->find(); while ($invitation->fetch()) { try { - $qm->enqueue($invitation, 'uinvrem'); + $qm->enqueue(array($invitation, $opts), 'uinvrem'); } catch (Exception $e) { common_log(LOG_WARNING, $e->getMessage()); continue; diff --git a/plugins/EmailReminder/lib/userconfirmregreminderhandler.php b/plugins/EmailReminder/lib/userconfirmregreminderhandler.php index 5f1bbd62d9..d8345c10a9 100644 --- a/plugins/EmailReminder/lib/userconfirmregreminderhandler.php +++ b/plugins/EmailReminder/lib/userconfirmregreminderhandler.php @@ -64,16 +64,34 @@ class UserConfirmRegReminderHandler extends UserReminderHandler { * * @todo abstract this bit further * - * @param Confirm_address $confirm + * @param array $regitem confirmation address and any special options * @return boolean success value */ - function sendNextReminder($confirm) + function sendNextReminder($regitem) { + list($confirm, $opts) = $regitem; + $regDate = strtotime($confirm->modified); // Seems like my best bet $now = strtotime('now'); // Days since registration $days = ($now - $regDate) / 86499; // 60*60*24 = 86499 + // $days = ($now - $regDate) / 120; // Two mins, good for testing + + if ($days > 7 && isset($opts['onetime'])) { + // Don't send the reminder if we're past the normal reminder window and + // we've already pestered her at all before + if (Email_reminder::needsReminder(self::REGISTER_REMINDER, $confirm)) { + common_log(LOG_INFO, "Sending one-time registration confirmation reminder to {$confirm->address}", __FILE__); + $subject = _m("One time reminder - please confirm your registration!"); + return EmailReminderPlugin::sendReminder( + self::REGISTER_REMINDER, + $confirm, + $subject, + -1 // special one-time indicator + ); + } + } // Welcome to one of the ugliest switch statement I've ever written @@ -86,7 +104,8 @@ class UserConfirmRegReminderHandler extends UserReminderHandler { self::REGISTER_REMINDER, $confirm, $subject, - 1); + 1 + ); } else { return true; } diff --git a/plugins/EmailReminder/lib/userinvitereminderhandler.php b/plugins/EmailReminder/lib/userinvitereminderhandler.php index c4acecc62f..4ca68be686 100644 --- a/plugins/EmailReminder/lib/userinvitereminderhandler.php +++ b/plugins/EmailReminder/lib/userinvitereminderhandler.php @@ -62,24 +62,42 @@ class UserInviteReminderHandler extends UserReminderHandler { * * @todo Abstract this stuff further * - * @param Invitation $invitation + * @param array $invitem Invitation obj and any special options * @return boolean success value */ - function sendNextReminder($invitation) + function sendNextReminder($invitem) { + list($invitation, $opts) = $invitem; + $invDate = strtotime($invitation->created); $now = strtotime('now'); - + // Days since first invitation was sent $days = ($now - $invDate) / 86499; // 60*60*24 = 86499 + // $days = ($now - $regDate) / 120; // Two mins, good for testing $siteName = common_config('site', 'name'); + if ($days > 7 && isset($opts['onetime'])) { + // Don't send the reminder if we're past the normal reminder window and + // we've already pestered her at all before + if (Email_reminder::needsReminder(self::INVITE_REMINDER, $invitation)) { + common_log(LOG_INFO, "Sending one-time invitation reminder to {$invitation->address}", __FILE__); + $subject = _m("One time reminder - you have been invited to join {$siteName}!"); + return EmailReminderPlugin::sendReminder( + self::INVITE_REMINDER, + $invitation, + $subject, + -1 // special one-time indicator + ); + } + } + switch($days) { case ($days > 1 && $days < 2): if (Email_reminder::needsReminder(self::INVITE_REMINDER, $invitation, 1)) { common_log(LOG_INFO, "Sending one day invitation reminder to {$invitation->address}", __FILE__); - $subject = _m("Reminder - You have been invited to join {$siteName}!"); + $subject = _m("Reminder - you have been invited to join {$siteName}!"); return EmailReminderPlugin::sendReminder( self::INVITE_REMINDER, $invitation, @@ -102,7 +120,7 @@ class UserInviteReminderHandler extends UserReminderHandler { } else { return true; } - break; + break; } return true; } diff --git a/plugins/EmailReminder/mail-src/invite-onetime b/plugins/EmailReminder/mail-src/invite-onetime new file mode 100644 index 0000000000..0426e4f7de --- /dev/null +++ b/plugins/EmailReminder/mail-src/invite-onetime @@ -0,0 +1,26 @@ +Special ONE TIME reminder... + +%%arg.inviter%% has invited you to join them on %%site.name%%. + +%%site.name%% is a micro-blogging service that lets you keep +up-to-date with people you know and people who interest you. + +You can also share news about yourself, your thoughts, or your life +online with people who know about you. + +It's great for meeting new people who share your interests. + +You can see %%arg.inviter%%'s profile page on %%site.name%% here: + +> [%%arg.inviterurl%%](%%arg.inviterurl%%) + +If you'd like to try the service, click on the link below to accept +the invitation. + +> [%%arg.confirmurl%%](%%arg.confirmurl%%) + +If not, you can ignore this message. Thanks for your patience and your time. + +Sincerely, + +%%site.name%% diff --git a/plugins/EmailReminder/mail-src/register-1 b/plugins/EmailReminder/mail-src/register-1 index 9461842407..3caa451452 100644 --- a/plugins/EmailReminder/mail-src/register-1 +++ b/plugins/EmailReminder/mail-src/register-1 @@ -1,4 +1,4 @@ -Hey, it's been a whole day! +Reminder: Someone (probably you) has requested an account on %%site.name%% using this email address. diff --git a/plugins/EmailReminder/mail-src/register-onetime b/plugins/EmailReminder/mail-src/register-onetime new file mode 100644 index 0000000000..0cefd12532 --- /dev/null +++ b/plugins/EmailReminder/mail-src/register-onetime @@ -0,0 +1,9 @@ +Hi, this is a special ONE TIME reminder. + +Someone (probably you) has requested an account on %%site.name%% using this email address. + +To confirm the address, click the following URL or copy it into the address bar of your browser. + +> [%%arg.confirmurl%%](%%arg.confirmurl%%) + +If it was not you, you can safely ignore this message. diff --git a/plugins/EmailReminder/scripts/sendemailreminder.php b/plugins/EmailReminder/scripts/sendemailreminder.php index 4cb7087fc7..6c5ad63f4d 100644 --- a/plugins/EmailReminder/scripts/sendemailreminder.php +++ b/plugins/EmailReminder/scripts/sendemailreminder.php @@ -20,8 +20,8 @@ define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..')); -$shortoptions = 't:e:au'; -$longoptions = array('type=', 'email=', 'all', 'universe'); +$shortoptions = 't:e:auo'; +$longoptions = array('type=', 'email=', 'all', 'universe', 'onetime'); $helptext = <<enqueue($type, 'siterem'); + $qm->enqueue(array($type, $opts), 'siterem'); if (!$quiet) { print "Sent pending {$type} reminders to all unconfirmed addresses in the known universe.\n"; } } } @@ -111,13 +118,13 @@ if (have_option('u', 'universe')) { if (empty($result)) { throw new Exception("No confirmation code found for {$address}."); } - $qm->enqueue($confirm, $utransport); + $qm->enqueue(array($confirm, $opts), $utransport); if (!$quiet) { print "Sent all pending {$type} reminder to {$address}.\n"; } } } else if (have_option('a', 'all')) { foreach ($reminders as $reminder) { extract($reminder); - $qm->enqueue($type, 'siterem'); + $qm->enqueue(array($type, $opts), 'siterem'); if (!$quiet) { print "Sent pending {$type} reminders to all unconfirmed addresses on the site.\n"; } } } else {