123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- <?php
- if (!defined('GNUSOCIAL')) { exit(1); }
- class UserEmailSummaryHandler extends QueueHandler
- {
-
- const MAX_NOTICES = 200;
-
- function transport()
- {
- return 'usersum';
- }
-
- function handle($user_id) : bool
- {
-
- $ess = Email_summary_status::getKV('user_id', $user_id);
- if (!empty($ess) && !$ess->send_summary) {
- common_log(LOG_INFO, sprintf('Not sending email summary for user %s by request.', $user_id));
- return true;
- }
- $since_id = null;
- if (!empty($ess)) {
- $since_id = $ess->last_summary_id;
- }
- $user = User::getKV('id', $user_id);
- if (empty($user)) {
- common_log(LOG_INFO, sprintf('Not sending email summary for user %s; no such user.', $user_id));
- return true;
- }
- if (empty($user->email)) {
- common_log(LOG_INFO, sprintf('Not sending email summary for user %s; no email address.', $user_id));
- return true;
- }
- try {
- $profile = $user->getProfile();
- } catch (UserNoProfileException $e) {
- common_log(LOG_WARNING, sprintf('Not sending email summary for user %s; no profile.', $user_id));
- return true;
- }
-
- $stream = new InboxNoticeStream($profile, $profile);
- $notice = $stream->getNotices(0, self::MAX_NOTICES, $since_id);
- if (empty($notice) || $notice->N == 0) {
- common_log(LOG_WARNING, sprintf('Not sending email summary for user %s; no notices.', $user_id));
- return true;
- }
-
-
- $new_top = null;
- if ($notice->fetch()) {
- $new_top = $notice->id;
- }
-
- $subject = sprintf(_m('Your latest updates from %s'), common_config('site', 'name'));
- $out = new XMLStringer(true);
- $out->elementStart('html');
- $out->elementStart('head');
- $out->element('title', null, $subject);
- $out->elementEnd('head');
- $out->elementStart('body');
- $out->elementStart('div', array('width' => '100%',
- 'style' => 'background-color: #ffffff; border: 4px solid #4c609a; padding: 10px;'));
- $out->elementStart('div', array('style' => 'color: #ffffff; background-color: #4c609a; font-weight: bold; margin-bottom: 10px; padding: 4px;'));
-
-
- $out->raw(sprintf(_m('Recent updates from %1$s for %2$s:'),
- common_config('site', 'name'),
- $profile->getBestName()));
- $out->elementEnd('div');
- $out->elementStart('table', array('width' => '550px',
- 'style' => 'border: none; border-collapse: collapse;', 'cellpadding' => '6'));
- do {
- $profile = Profile::getKV('id', $notice->profile_id);
- if (empty($profile)) {
- continue;
- }
- $avatarUrl = $profile->avatarUrl(AVATAR_STREAM_SIZE);
- $out->elementStart('tr');
- $out->elementStart('td', array('width' => AVATAR_STREAM_SIZE,
- 'height' => AVATAR_STREAM_SIZE,
- 'align' => 'left',
- 'valign' => 'top',
- 'style' => 'border-bottom: 1px dotted #C5CEE3; padding: 10px 6px 10px 6px;'));
- $out->element('img', array('src' => $avatarUrl,
- 'width' => AVATAR_STREAM_SIZE,
- 'height' => AVATAR_STREAM_SIZE,
- 'alt' => $profile->getBestName()));
- $out->elementEnd('td');
- $out->elementStart('td', array('align' => 'left',
- 'valign' => 'top',
- 'style' => 'border-bottom: 1px dotted #C5CEE3; padding: 10px 6px 10px 6px;'));
- $out->element('a', array('href' => $profile->profileurl),
- $profile->nickname);
- $out->text(' ');
- $out->raw($notice->getRendered());
- $out->elementStart('div', array('style' => 'font-size: 0.8em; padding-top: 4px;'));
- $noticeurl = $notice->getLocalUrl();
-
- assert(!empty($noticeurl));
- $out->elementStart('a', array('rel' => 'bookmark',
- 'href' => $noticeurl));
- $dt = common_date_iso8601($notice->created);
- $out->element('abbr', array('style' => 'border-bottom: none;',
- 'title' => $dt),
- common_date_string($notice->created));
- $out->elementEnd('a');
- $out->element('a', array('href' => $notice->getConversationUrl()),
-
- _m('in context'));
- $out->elementEnd('div');
- $out->elementEnd('td');
- $out->elementEnd('tr');
- } while ($notice->fetch());
- $out->elementEnd('table');
-
-
- $out->raw("<p>" . sprintf(_m('<a href="%1$s">change your email settings for %2$s</a>'),
- common_local_url('emailsettings'),
- common_config('site', 'name'))."</p>");
- $out->elementEnd('div');
- $out->elementEnd('body');
- $out->elementEnd('html');
- $body = $out->getString();
-
- mail_to_user($user,
- $subject,
- $body,
- array('Content-Type' => 'text/html; charset=utf-8',
- 'Mime-Version' => '1.0'));
- if (empty($ess)) {
- $ess = new Email_summary_status();
- $ess->user_id = $user_id;
- $ess->created = common_sql_now();
- $ess->last_summary_id = $new_top;
- $ess->modified = common_sql_now();
- $ess->insert();
- } else {
- $orig = clone($ess);
- $ess->last_summary_id = $new_top;
- $ess->modified = common_sql_now();
- $ess->update($orig);
- }
- return true;
- }
- }
|