. * * @category NoticeStream * @package StatusNet * @author Evan Prodromou * @author Mikael Nordfeldth * @copyright 2011 StatusNet, Inc. * @copyright 2014 Free Software Foundation, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ if (!defined('GNUSOCIAL') && !defined('STATUSNET')) { exit(1); } /** * Stream of notices for a profile's "all" feed * * @category General * @package StatusNet * @author Evan Prodromou * @author Mikael Nordfeldth * @copyright 2011 StatusNet, Inc. * @copyright 2014 Free Software Foundation, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ class InboxNoticeStream extends ScopingNoticeStream { /** * Constructor * * @param Profile $target Profile to get a stream for * @param Profile $scoped Currently scoped profile (if null, it is fetched) */ function __construct(Profile $target, Profile $scoped=null) { if ($scoped === null) { $scoped = Profile::current(); } // Note: we don't use CachingNoticeStream since RawInboxNoticeStream // uses Inbox::getKV(), which is cached. parent::__construct(new RawInboxNoticeStream($target), $scoped); } } /** * Raw stream of notices for the target's inbox * * @category General * @package StatusNet * @author Evan Prodromou * @copyright 2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ class RawInboxNoticeStream extends NoticeStream { protected $target = null; protected $inbox = null; /** * Constructor * * @param Profile $target Profile to get a stream for */ function __construct(Profile $target) { $this->target = $target; } /** * Get IDs in a range * * @param int $offset Offset from start * @param int $limit Limit of number to get * @param int $since_id Since this notice * @param int $max_id Before this notice * * @return Array IDs found */ function getNoticeIds($offset, $limit, $since_id, $max_id) { $notice = new Notice(); $notice->selectAdd(); $notice->selectAdd('id'); $notice->whereAdd(sprintf('notice.created > "%s"', $notice->escape($this->target->created))); // Reply:: is a table of mentions // Subscription:: is a table of subscriptions (every user is subscribed to themselves) $notice->whereAdd( sprintf('notice.id IN (SELECT notice_id FROM reply WHERE profile_id=%1$d) ' . 'OR notice.profile_id IN (SELECT subscribed FROM subscription WHERE subscriber=%d)', $this->target->id) ); $notice->limit($offset, $limit); $notice->orderBy('notice.created DESC'); if (!$notice->find()) { return array(); } $ids = $notice->fetchAll('id'); return $ids; } function getNotices($offset, $limit, $sinceId, $maxId) { $all = array(); do { $ids = $this->getNoticeIds($offset, $limit, $sinceId, $maxId); $notices = Notice::pivotGet('id', $ids); // By default, takes out false values $notices = array_filter($notices); $all = array_merge($all, $notices); if (count($notices < count($ids))) { $offset += $limit; $limit -= count($notices); } } while (count($notices) < count($ids) && count($ids) > 0); return new ArrayWrapper($all); } }