X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FNotice.php;h=a813db99b3b234a8ab8a057a4a6f1084c4da689a;hb=8e52c6fc030e453d6f61fb5b4a8f3113092adb91;hp=adcc25973c5a093b8a24462f0d61bd97181a4945;hpb=a28a6d2f72043fc180c186f3ac70c4c554af4369;p=quix0rs-gnu-social.git diff --git a/classes/Notice.php b/classes/Notice.php index adcc25973c..a813db99b3 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -122,11 +122,11 @@ class Notice extends Managed_DataObject 'notice_repeat_of_fkey' => array('notice', array('repeat_of' => 'id')), # @fixme: what about repeats of deleted notices? ), 'indexes' => array( + 'notice_created_id_is_local_idx' => array('created', 'id', 'is_local'), 'notice_profile_id_idx' => array('profile_id', 'created', 'id'), - 'notice_conversation_idx' => array('conversation'), - 'notice_created_idx' => array('created'), - 'notice_replyto_idx' => array('reply_to'), - 'notice_repeatof_idx' => array('repeat_of'), + 'notice_repeat_of_created_id_idx' => array('repeat_of', 'created', 'id'), + 'notice_conversation_created_id_idx' => array('conversation', 'created', 'id'), + 'notice_replyto_idx' => array('reply_to') ) ); @@ -645,7 +645,7 @@ class Notice extends Managed_DataObject } self::blow('notice:list-ids:conversation:%s', $this->conversation); - self::blow('conversation::notice_count:%d', $this->conversation); + self::blow('conversation:notice_count:%d', $this->conversation); if (!empty($this->repeat_of)) { // XXX: we should probably only use one of these @@ -1008,10 +1008,7 @@ class Notice extends Managed_DataObject $users = $ptag->getUserSubscribers(); foreach ($users as $id) { if (!array_key_exists($id, $ni)) { - $user = User::staticGet('id', $id); - if (!$user->hasBlocked($profile)) { - $ni[$id] = NOTICE_INBOX_SOURCE_PROFILE_TAG; - } + $ni[$id] = NOTICE_INBOX_SOURCE_PROFILE_TAG; } } } @@ -1020,23 +1017,24 @@ class Notice extends Managed_DataObject if (!array_key_exists($recipient, $ni)) { $ni[$recipient] = NOTICE_INBOX_SOURCE_REPLY; } + } - // Exclude any deleted, non-local, or blocking recipients. - $profile = $this->getProfile(); - $originalProfile = null; - if ($this->repeat_of) { - // Check blocks against the original notice's poster as well. - $original = Notice::staticGet('id', $this->repeat_of); - if ($original) { - $originalProfile = $original->getProfile(); - } + // Exclude any deleted, non-local, or blocking recipients. + $profile = $this->getProfile(); + $originalProfile = null; + if ($this->repeat_of) { + // Check blocks against the original notice's poster as well. + $original = Notice::staticGet('id', $this->repeat_of); + if ($original) { + $originalProfile = $original->getProfile(); } - foreach ($ni as $id => $source) { - $user = User::staticGet('id', $id); - if (empty($user) || $user->hasBlocked($profile) || - ($originalProfile && $user->hasBlocked($originalProfile))) { - unset($ni[$id]); - } + } + + foreach ($ni as $id => $source) { + $user = User::staticGet('id', $id); + if (empty($user) || $user->hasBlocked($profile) || + ($originalProfile && $user->hasBlocked($originalProfile))) { + unset($ni[$id]); } } @@ -2365,7 +2363,11 @@ class Notice extends Managed_DataObject $result = self::cacheGet($keypart); if ($result === false) { - $bResult = $this->_inScope($profile); + $bResult = false; + if (Event::handle('StartNoticeInScope', array($this, $profile, &$bResult))) { + $bResult = $this->_inScope($profile); + Event::handle('EndNoticeInScope', array($this, $profile, &$bResult)); + } $result = ($bResult) ? 1 : 0; self::cacheSet($keypart, $result, 0, 300); } @@ -2383,75 +2385,100 @@ class Notice extends Managed_DataObject // If there's no scope, anyone (even anon) is in scope. - if ($scope == 0) { - return true; - } + if ($scope == 0) { // Not private - // If there's scope, anon cannot be in scope + return !$this->isHiddenSpam($profile); - if (empty($profile)) { - return false; - } + } else { // Private, somehow - // Author is always in scope + // If there's scope, anon cannot be in scope - if ($this->profile_id == $profile->id) { - return true; - } + if (empty($profile)) { + return false; + } - // Only for users on this site + // Author is always in scope - if ($scope & Notice::SITE_SCOPE) { - $user = $profile->getUser(); - if (empty($user)) { - return false; + if ($this->profile_id == $profile->id) { + return true; } - } - // Only for users mentioned in the notice + // Only for users on this site - if ($scope & Notice::ADDRESSEE_SCOPE) { + if ($scope & Notice::SITE_SCOPE) { + $user = $profile->getUser(); + if (empty($user)) { + return false; + } + } - $repl = Reply::pkeyGet(array('notice_id' => $this->id, - 'profile_id' => $profile->id)); + // Only for users mentioned in the notice + + if ($scope & Notice::ADDRESSEE_SCOPE) { + + $repl = Reply::pkeyGet(array('notice_id' => $this->id, + 'profile_id' => $profile->id)); - if (empty($repl)) { - return false; + if (empty($repl)) { + return false; + } } - } - // Only for members of the given group + // Only for members of the given group - if ($scope & Notice::GROUP_SCOPE) { + if ($scope & Notice::GROUP_SCOPE) { - // XXX: just query for the single membership + // XXX: just query for the single membership - $groups = $this->getGroups(); + $groups = $this->getGroups(); - $foundOne = false; + $foundOne = false; - foreach ($groups as $group) { - if ($profile->isMember($group)) { - $foundOne = true; - break; + foreach ($groups as $group) { + if ($profile->isMember($group)) { + $foundOne = true; + break; + } + } + + if (!$foundOne) { + return false; } } - if (!$foundOne) { - return false; + // Only for followers of the author + + $author = null; + + if ($scope & Notice::FOLLOWER_SCOPE) { + + $author = $this->getProfile(); + + if (!Subscription::exists($profile, $author)) { + return false; + } } + + return !$this->isHiddenSpam($profile); } + } + + function isHiddenSpam($profile) { + + // Hide posts by silenced users from everyone but moderators. - // Only for followers of the author + if (common_config('notice', 'hidespam')) { - if ($scope & Notice::FOLLOWER_SCOPE) { $author = $this->getProfile(); - if (!Subscription::exists($profile, $author)) { - return false; + + if ($author->hasRole(Profile_role::SILENCED)) { + if (empty($profile) || !$profile->hasRight(Right::REVIEWSPAM)) { + return true; + } } } - return true; + return false; } static function groupsFromText($text, $profile)