return $def;
}
-
+
/* Notice types */
const LOCAL_PUBLIC = 1;
const REMOTE = 0;
const FOLLOWER_SCOPE = 8;
protected $_profile = array();
-
+
/**
* Will always return a profile, if anything fails it will
* (through _setProfile) throw a NoProfileException.
}
return $this->_profile[$this->profile_id];
}
-
+
public function _setProfile(Profile $profile=null)
{
if (!$profile instanceof Profile) {
}
return $title;
}
-
+
public function getContent()
{
return $this->content;
$notice->insert(); // throws exception on failure
// If it's not part of a conversation, it's
// the beginning of a new conversation.
- if (empty($notice->conversation)) {
+ if (empty($notice->conversation)) {
$orig = clone($notice);
// $act->context->conversation will be null if it was not provided
$conv = Conversation::create($notice, $options['conversation']);
'distribute' => true);
// options will have default values when nothing has been supplied
- $options = array_merge($defaults, $options);
+ $options = array_merge($defaults, $options);
foreach (array_keys($defaults) as $key) {
// Only convert the keynames we specify ourselves from 'defaults' array into variables
$$key = $options[$key];
// Prepare inbox delivery, may be queued to background.
$stored->distribute();
}
-
+
return $stored;
}
}
$args = func_get_args();
-
$format = array_shift($args);
-
$keyPart = vsprintf($format, $args);
-
$cacheKey = Cache::key($keyPart);
-
$c->delete($cacheKey);
// delete the "last" stream, too, if this notice is
}
protected $_attachments = array();
-
+
function attachments() {
if (isset($this->_attachments[$this->id])) {
return $this->_attachments[$this->id];
}
-
+
$f2ps = File_to_post::listGet('post_id', array($this->id));
-
$ids = array();
-
foreach ($f2ps[$this->id] as $f2p) {
- $ids[] = $f2p->file_id;
+ $ids[] = $f2p->file_id;
}
-
- $files = File::multiGet('id', $ids);
+ $files = File::multiGet('id', $ids);
$this->_attachments[$this->id] = $files->fetchAll();
-
return $this->_attachments[$this->id];
}
$root->free();
return $root;
}
-
+
if (is_null($profile)) {
$keypart = sprintf('notice:conversation_root:%d:null', $this->id);
} else {
$this->id,
$profile->id);
}
-
+
$root = self::cacheGet($keypart);
if ($root !== false && $root->inScope($profile)) {
function getReplyProfiles()
{
$ids = $this->getReplies();
-
+
$profiles = Profile::multiGet('id', $ids);
-
+
return $profiles->fetchAll();
}
*
* @return array of Group objects
*/
-
+
protected $_groups = array();
-
+
function getGroups()
{
// Don't save groups for repeats
if (!empty($this->repeat_of)) {
return array();
}
-
+
if (isset($this->_groups[$this->id])) {
return $this->_groups[$this->id];
}
-
+
$gis = Group_inbox::listGet('notice_id', array($this->id));
$ids = array();
- foreach ($gis[$this->id] as $gi)
- {
+ foreach ($gis[$this->id] as $gi) {
$ids[] = $gi->group_id;
}
-
+
$groups = User_group::multiGet('id', $ids);
-
$this->_groups[$this->id] = $groups->fetchAll();
-
return $this->_groups[$this->id];
}
-
+
function _setGroups($groups)
{
$this->_groups[$this->id] = $groups;
// Unfortunately this is likely to lose tags or URLs
// at the end of long notices.
$content = mb_substr($content, 0, $maxlen - 4) . ' ...';
- }
+ }
// Scope is same as this one's
$scope = self::defaultScope();
}
- // If there's no scope, anyone (even anon) is in scope.
-
- if ($scope == 0) { // Not private
-
+ if ($scope == 0) { // Not scoping, so it is public.
return !$this->isHiddenSpam($profile);
+ }
- } else { // Private, somehow
-
- // If there's scope, anon cannot be in scope
+ // If there's scope, anon cannot be in scope
+ if (empty($profile)) {
+ return false;
+ }
- if (empty($profile)) {
- return false;
- }
+ // Author is always in scope
+ if ($this->profile_id == $profile->id) {
+ return true;
+ }
- // Author is always in scope
+ // Only for users on this site
+ if (($scope & Notice::SITE_SCOPE) && !$profile->isLocal()) {
+ return false;
+ }
- if ($this->profile_id == $profile->id) {
- return true;
- }
+ // Only for users mentioned in the notice
+ if ($scope & Notice::ADDRESSEE_SCOPE) {
- // Only for users on this site
+ $reply = Reply::pkeyGet(array('notice_id' => $this->id,
+ 'profile_id' => $profile->id));
- if (($scope & Notice::SITE_SCOPE) && !$profile->isLocal()) {
+ if (!$reply instanceof Reply) {
return false;
}
+ }
- // Only for users mentioned in the notice
-
- if ($scope & Notice::ADDRESSEE_SCOPE) {
-
- $reply = Reply::pkeyGet(array('notice_id' => $this->id,
- 'profile_id' => $profile->id));
-
- if (!$reply instanceof Reply) {
- return false;
- }
- }
-
- // Only for members of the given group
-
- if ($scope & Notice::GROUP_SCOPE) {
-
- // XXX: just query for the single membership
+ // Only for members of the given group
+ if ($scope & Notice::GROUP_SCOPE) {
- $groups = $this->getGroups();
+ // XXX: just query for the single membership
- $foundOne = false;
+ $groups = $this->getGroups();
- foreach ($groups as $group) {
- if ($profile->isMember($group)) {
- $foundOne = true;
- break;
- }
- }
+ $foundOne = false;
- if (!$foundOne) {
- return false;
+ foreach ($groups as $group) {
+ if ($profile->isMember($group)) {
+ $foundOne = true;
+ break;
}
}
- // Only for followers of the author
+ if (!$foundOne) {
+ return false;
+ }
+ }
- $author = null;
+ // Only for followers of the author
+ $author = null;
- if ($scope & Notice::FOLLOWER_SCOPE) {
+ if ($scope & Notice::FOLLOWER_SCOPE) {
- try {
- $author = $this->getProfile();
- } catch (Exception $e) {
- return false;
- }
-
- if (!Subscription::exists($profile, $author)) {
- return false;
- }
+ try {
+ $author = $this->getProfile();
+ } catch (Exception $e) {
+ return false;
}
- return !$this->isHiddenSpam($profile);
+ if (!Subscription::exists($profile, $author)) {
+ return false;
+ }
}
+
+ return !$this->isHiddenSpam($profile);
}
function isHiddenSpam($profile) {
-
+
// Hide posts by silenced users from everyone but moderators.
if (common_config('notice', 'hidespam')) {
$skip = array('_profile', '_groups', '_attachments', '_faves', '_replies', '_repeats');
return array_diff($vars, $skip);
}
-
+
static function defaultScope()
{
$scope = common_config('notice', 'defaultscope');
static function fillProfiles($notices)
{
$map = self::getProfiles($notices);
-
foreach ($notices as $entry=>$notice) {
try {
if (array_key_exists($notice->profile_id, $map)) {
unset($notices[$entry]);
}
}
-
+
return array_values($map);
}
-
+
static function getProfiles(&$notices)
{
$ids = array();
foreach ($notices as $notice) {
$ids[] = $notice->profile_id;
}
-
$ids = array_unique($ids);
-
- return Profile::pivotGet('id', $ids);
+ return Profile::pivotGet('id', $ids);
}
-
+
static function fillGroups(&$notices)
{
$ids = self::_idsOf($notices);
-
$gis = Group_inbox::listGet('notice_id', $ids);
-
$gids = array();
- foreach ($gis as $id => $gi)
- {
+ foreach ($gis as $id => $gi) {
foreach ($gi as $g)
{
$gids[] = $g->group_id;
}
}
-
+
$gids = array_unique($gids);
-
$group = User_group::pivotGet('id', $gids);
-
foreach ($notices as $notice)
{
$grps = array();
static function fillAttachments(&$notices)
{
$ids = self::_idsOf($notices);
-
$f2pMap = File_to_post::listGet('post_id', $ids);
-
$fileIds = array();
-
foreach ($f2pMap as $noticeId => $f2ps) {
foreach ($f2ps as $f2p) {
- $fileIds[] = $f2p->file_id;
+ $fileIds[] = $f2p->file_id;
}
}
$fileIds = array_unique($fileIds);
-
$fileMap = File::pivotGet('id', $fileIds);
-
foreach ($notices as $notice)
{
$files = array();