/** * extra information for XMPP messages, as defined by Twitter * * @param Profile $profile Profile of the sending user * @param Notice $notice Notice being sent * * @return string Extra information (Atom, HTML, addresses) in string format */ protected function format_entry(Notice $notice) { $profile = $notice->getProfile(); $entry = $notice->asAtomEntry(true, true); $xs = new XMLStringer(); $xs->elementStart('html', array('xmlns' => 'http://jabber.org/protocol/xhtml-im')); $xs->elementStart('body', array('xmlns' => 'http://www.w3.org/1999/xhtml')); $xs->element('a', array('href' => $profile->profileurl), $profile->nickname); try { $parent = $notice->getParent(); $orig_profile = $parent->getProfile(); $orig_profurl = $orig_profile->getUrl(); $xs->text(" => "); $xs->element('a', array('href' => $orig_profurl), $orig_profile->nickname); $xs->text(": "); } catch (InvalidUrlException $e) { $xs->text(sprintf(' => %s', $orig_profile->nickname)); } catch (NoParentNoticeException $e) { $xs->text(": "); } if (!empty($notice->rendered)) { $notice->rendered = str_replace("\t", "", $notice->rendered); $xs->raw($notice->rendered); } else { $xs->raw(common_render_content($notice->content, $notice)); } $xs->text(" "); $xs->element('a', array('href' => common_local_url('conversation', array('id' => $notice->conversation)) . '#notice-' . $notice->id), sprintf(_m('[%u]'), $notice->id)); $xs->elementEnd('body'); $xs->elementEnd('html'); $html = $xs->getString(); return $html . ' ' . $entry; }
/** * extra information for XMPP messages, as defined by Twitter * * @param Profile $profile Profile of the sending user * @param Notice $notice Notice being sent * * @return string Extra information (Atom, HTML, addresses) in string format */ protected function format_entry(Notice $notice) { $profile = $notice->getProfile(); $entry = $notice->asAtomEntry(true, true); $xs = new XMLStringer(); $xs->elementStart('html', array('xmlns' => 'http://jabber.org/protocol/xhtml-im')); $xs->elementStart('body', array('xmlns' => 'http://www.w3.org/1999/xhtml')); $xs->element('a', array('href' => $profile->profileurl), $profile->nickname); try { $parent = $notice->getParent(); $orig_profile = $parent->getProfile(); $orig_profurl = $orig_profile->getUrl(); $xs->text(" => "); $xs->element('a', array('href' => $orig_profurl), $orig_profile->nickname); $xs->text(": "); } catch (InvalidUrlException $e) { $xs->text(sprintf(' => %s', $orig_profile->nickname)); } catch (NoParentNoticeException $e) { $xs->text(": "); } catch (NoResultException $e) { // Parent notice was probably deleted. $xs->text(": "); } // FIXME: Why do we replace \t with ''? is it just to make it pretty? shouldn't whitespace be handled well...? $xs->raw(str_replace("\t", "", $notice->getRendered())); $xs->text(" "); $xs->element('a', array('href' => common_local_url('conversation', array('id' => $notice->conversation)) . '#notice-' . $notice->id), sprintf(_m('[%u]'), $notice->id)); $xs->elementEnd('body'); $xs->elementEnd('html'); $html = $xs->getString(); return $html . ' ' . $entry; }
static function toHTML($profile, $question, $answer) { $notice = $question->getNotice(); $out = new XMLStringer(); $cls = array('qna_answer'); if (!empty($answer->best)) { $cls[] = 'best'; } $out->elementStart('p', array('class' => implode(' ', $cls))); $out->elementStart('span', 'answer-content'); $out->raw(common_render_text($answer->content)); $out->elementEnd('span'); if (!empty($answer->revisions)) { $out->elementstart('span', 'answer-revisions'); $out->text(htmlspecialchars(sprintf(_m('%s revision', '%s revisions', $answer->revisions), $answer->revisions))); $out->elementEnd('span'); } $out->elementEnd('p'); return $out->getString(); }
/** * extra information for XMPP messages, as defined by Twitter * * @param Profile $profile Profile of the sending user * @param Notice $notice Notice being sent * * @return string Extra information (Atom, HTML, addresses) in string format */ function jabber_format_entry($profile, $notice) { $entry = $notice->asAtomEntry(true, true); $xs = new XMLStringer(); $xs->elementStart('html', array('xmlns' => 'http://jabber.org/protocol/xhtml-im')); $xs->elementStart('body', array('xmlns' => 'http://www.w3.org/1999/xhtml')); $xs->element('a', array('href' => $profile->profileurl), $profile->nickname); $xs->text(": "); if (!empty($notice->rendered)) { $xs->raw($notice->rendered); } else { $xs->raw(common_render_content($notice->content, $notice)); } $xs->text(" "); $xs->element('a', array('href' => common_local_url('conversation', array('id' => $notice->conversation)) . '#notice-' . $notice->id), sprintf(_('[%s]'), $notice->id)); $xs->elementEnd('body'); $xs->elementEnd('html'); $html = $xs->getString(); return $html . ' ' . $entry; }
/** * Send a summary email to the user * * @param mixed $object * @return boolean true on success, false on failure */ function handle($user_id) { // Skip if they've asked not to get summaries $ess = Email_summary_status::staticGet('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::staticGet('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; } $profile = $user->getProfile(); if (empty($profile)) { common_log(LOG_WARNING, sprintf('Not sending email summary for user %s; no profile.', $user_id)); return true; } $stream = new InboxNoticeStream($user, $user->getProfile()); $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; } // XXX: This is risky fingerpoken in der objektvars, but I didn't feel like // figuring out a better way. -ESP $new_top = null; if ($notice instanceof ArrayWrapper) { $new_top = $notice->_items[0]->id; } // TRANS: Subject for e-mail. $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;')); // TRANS: Text in e-mail summary. // TRANS: %1$s is the StatusNet sitename, %2$s is the recipient's profile name. $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')); while ($notice->fetch()) { $profile = Profile::staticGet('id', $notice->profile_id); if (empty($profile)) { continue; } $avatar = $profile->getAvatar(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' => $avatar ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE), '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->rendered); $out->elementStart('div', array('style' => 'font-size: 0.8em; padding-top: 4px;')); $noticeurl = $notice->bestUrl(); // above should always return an URL 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'); if ($notice->hasConversation()) { $conv = Conversation::staticGet('id', $notice->conversation); $convurl = $conv->uri; if (!empty($convurl)) { $out->text(' '); $out->element('a', array('href' => $convurl . '#notice-' . $notice->id), _m('in context')); } } $out->elementEnd('div'); $out->elementEnd('td'); $out->elementEnd('tr'); } $out->elementEnd('table'); // TRANS: Link text for link to e-mail settings. // TRANS: %1$s is a link to the e-mail settings, %2$s is the StatusNet sitename. $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(); // FIXME: do something for people who don't like HTML email 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; }
static function toHTML($profile, $question) { $notice = $question->getNotice(); $out = new XMLStringer(); $cls = array('qna_question'); if (!empty($question->closed)) { $cls[] = 'closed'; } $out->elementStart('p', array('class' => implode(' ', $cls))); if (!empty($question->description)) { $out->elementStart('span', 'question-description'); $out->raw(common_render_text($question->description)); $out->elementEnd('span'); } $cnt = $question->countAnswers(); if (!empty($cnt)) { $out->elementStart('span', 'answer-count'); // TRANS: Number of given answers to a question. // TRANS: %s is the number of given answers. $out->text(sprintf(_m('%s answer', '%s answers', $cnt), $cnt)); $out->elementEnd('span'); } if (!empty($question->closed)) { $out->elementStart('span', 'question-closed'); // TRANS: Notification that a question cannot be answered anymore because it is closed. $out->text(_m('This question is closed.')); $out->elementEnd('span'); } $out->elementEnd('p'); return $out->getString(); }