function getTags() { $profile = Profile::current(); $keypart = sprintf('Inbox:notice_tag:%d:%d', $this->user->id, $profile->id); $tag = Memcached_DataObject::cacheGet($keypart); if ($tag === false) { $stream = new InboxNoticeStream($this->user, $profile); $ids = $stream->getNoticeIds(0, Inbox::MAX_NOTICES, null, null); if (empty($ids)) { $tag = array(); } else { $weightexpr = common_sql_weight('notice_tag.created', common_config('tag', 'dropoff')); // @fixme should we use the cutoff too? Doesn't help with indexing per-user. $qry = 'SELECT notice_tag.tag, ' . $weightexpr . ' as weight ' . 'FROM notice_tag JOIN notice ' . 'ON notice_tag.notice_id = notice.id ' . 'WHERE notice.id in (' . implode(',', $ids) . ')' . 'GROUP BY notice_tag.tag ' . 'ORDER BY weight DESC '; $limit = TAGS_PER_SECTION; $offset = 0; if (common_config('db', 'type') == 'pgsql') { $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; } else { $qry .= ' LIMIT ' . $offset . ', ' . $limit; } $t = new Notice_tag(); $t->query($qry); $tag = array(); while ($t->fetch()) { $tag[] = clone $t; } } Memcached_DataObject::cacheSet($keypart, $tag, 3600); } return new ArrayWrapper($tag); }
function prepare($args) { if (parent::prepare($args)) { $stream = new InboxNoticeStream($this->user->getProfile(), $this->scoped); $this->notice = $stream->getNotices(($this->page - 1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1, null, null); return true; } else { return false; } }
/** * Get notices * * @param integer $limit max number of notices to return * * @return array notices */ function getNotices($limit = 0) { $stream = new InboxNoticeStream($this->user); $notice = $stream->getNotices(0, $limit, null, null); $notices = array(); while ($notice->fetch()) { $notices[] = clone $notice; } return $notices; }
function prepare($args) { if (parent::prepare($args)) { $cur = common_current_user(); $stream = new InboxNoticeStream($this->user, $cur->getProfile()); $this->notice = $stream->getNotices(($this->page - 1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1, null, null); return true; } else { return false; } }
/** * Get notices * * @return array notices */ function getNotices() { $notices = array(); $stream = new InboxNoticeStream($this->target, $this->scoped); $notice = $stream->getNotices(($this->page - 1) * $this->count, $this->count, $this->since_id, $this->max_id); while ($notice->fetch()) { $notices[] = clone $notice; } return $notices; }
/** * Get notices * * @return array notices */ function getNotices() { $notices = array(); $profile = null; if (isset($this->auth_user)) { $profile = $this->auth_user->getProfile(); } $stream = new InboxNoticeStream($this->user, $profile); $notice = $stream->getNotices(($this->page - 1) * $this->count, $this->count, $this->since_id, $this->max_id); while ($notice->fetch()) { $notices[] = clone $notice; } return $notices; }
function noticeInbox($offset = 0, $limit = NOTICES_PER_PAGE, $since_id = 0, $before_id = 0) { $stream = new InboxNoticeStream($this); return $stream->getNotices($offset, $limit, $since_id, $before_id); }
function newNotice($i, $tagmax) { global $userprefix; $options = array('scope' => common_config('notice', 'defaultscope')); $n = rand(0, $i - 1); $user = User::staticGet('nickname', sprintf('%s%d', $userprefix, $n)); $is_reply = rand(0, 1); $content = testNoticeContent(); if ($is_reply == 0) { $stream = new InboxNoticeStream($user, $user->getProfile()); $notices = $stream->getNotices(0, 20); if ($notices->N > 0) { $nval = rand(0, $notices->N - 1); $notices->fetch(); // go to 0th for ($i = 0; $i < $nval; $i++) { $notices->fetch(); } $options['reply_to'] = $notices->id; $dont_use_nickname = rand(0, 2); if ($dont_use_nickname != 0) { $rprofile = $notices->getProfile(); $content = "@" . $rprofile->nickname . " " . $content; } $private_to_addressees = rand(0, 4); if ($private_to_addressees == 0) { $options['scope'] |= Notice::ADDRESSEE_SCOPE; } } } $has_hash = rand(0, 2); if ($has_hash == 0) { $hashcount = rand(0, 2); for ($j = 0; $j < $hashcount; $j++) { $h = rand(0, $tagmax); $content .= " #tag{$h}"; } } $in_group = rand(0, 5); if ($in_group == 0) { $groups = $user->getGroups(); if ($groups->N > 0) { $gval = rand(0, $group->N - 1); $groups->fetch(); // go to 0th for ($i = 0; $i < $gval; $i++) { $groups->fetch(); } $options['groups'] = array($groups->id); $content = "!" . $groups->nickname . " " . $content; $private_to_group = rand(0, 2); if ($private_to_group == 0) { $options['scope'] |= Notice::GROUP_SCOPE; } } } $private_to_site = rand(0, 4); if ($private_to_site == 0) { $options['scope'] |= Notice::SITE_SCOPE; } $notice = Notice::saveNew($user->id, $content, 'system', $options); }
/** * 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; }
function newNotice($i, $tagmax) { global $userprefix; $options = array('scope' => Notice::defaultScope()); $n = rand(0, $i - 1); $user = User::getKV('nickname', sprintf('%s%d', $userprefix, $n)); $is_reply = rand(0, 1); $content = testNoticeContent(); if ($is_reply == 0) { $stream = new InboxNoticeStream($user->getProfile(), $user->getProfile()); $notices = $stream->getNotices(0, 20); if ($notices->N > 0) { $nval = rand(0, $notices->N - 1); $notices->fetch(); // go to 0th for ($i = 0; $i < $nval; $i++) { $notices->fetch(); } $options['reply_to'] = $notices->id; $dont_use_nickname = rand(0, 2); if ($dont_use_nickname != 0) { $rprofile = $notices->getProfile(); $content = "@" . $rprofile->nickname . " " . $content; } $private_to_addressees = rand(0, 4); if ($private_to_addressees == 0) { $options['scope'] |= Notice::ADDRESSEE_SCOPE; } } } else { $is_directed = rand(0, 4); if ($is_directed == 0) { $subs = $user->getSubscribed(0, 100)->fetchAll(); if (count($subs) > 0) { $seen = array(); $f = rand(0, 9); if ($f <= 6) { $addrs = 1; } else { if ($f <= 8) { $addrs = 2; } else { $addrs = 3; } } for ($m = 0; $m < $addrs; $m++) { $x = rand(0, count($subs) - 1); if ($seen[$x]) { continue; } if ($subs[$x]->id == $user->id) { continue; } $seen[$x] = true; $rprofile = $subs[$x]; $content = "@" . $rprofile->nickname . " " . $content; } $private_to_addressees = rand(0, 4); if ($private_to_addressees == 0) { $options['scope'] |= Notice::ADDRESSEE_SCOPE; } } } } $has_hash = rand(0, 2); if ($has_hash == 0) { $hashcount = rand(0, 2); for ($j = 0; $j < $hashcount; $j++) { $h = rand(0, $tagmax); $content .= " #tag{$h}"; } } $in_group = rand(0, 5); if ($in_group == 0) { $groups = $user->getGroups(); if ($groups instanceof User_group) { $gval = rand(0, $groups->N - 1); $groups->fetch(); // go to 0th for ($i = 0; $i < $gval; $i++) { $groups->fetch(); } $options['groups'] = array($groups->id); $content = "!" . $groups->nickname . " " . $content; $private_to_group = rand(0, 2); if ($private_to_group == 0) { $options['scope'] |= Notice::GROUP_SCOPE; } } } $private_to_site = rand(0, 4); if ($private_to_site == 0) { $options['scope'] |= Notice::SITE_SCOPE; } $notice = Notice::saveNew($user->id, $content, 'createsim', $options); }
protected function getNotices() { $stream = new InboxNoticeStream($this->target); return $stream->getNotices(0, $this->limit)->fetchAll(); }