}
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
$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;
}
}
}
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]);
}
}
if ($this->repeat_of) {
$repeated = Notice::staticGet('id', $this->repeat_of);
- $act->objects[] = $repeated->asActivity($cur);
+ if (!empty($repeated)) {
+ $act->objects[] = $repeated->asActivity($cur);
+ }
} else {
$act->objects[] = ActivityObject::fromNotice($this);
}
if ($result === false) {
$bResult = false;
- if (Event::handle('StartNoticeInScope', array($notice, $profile, &$bResult))) {
+ if (Event::handle('StartNoticeInScope', array($this, $profile, &$bResult))) {
$bResult = $this->_inScope($profile);
- Event::handle('EndNoticeInScope', array($notice, $profile, &$bResult));
+ Event::handle('EndNoticeInScope', array($this, $profile, &$bResult));
}
$result = ($bResult) ? 1 : 0;
self::cacheSet($keypart, $result, 0, 300);
// 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;
+ }
+ }
+
+ // Only for users mentioned in the notice
- $repl = Reply::pkeyGet(array('notice_id' => $this->id,
- 'profile_id' => $profile->id));
+ 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) {
+
+ try {
+ $author = $this->getProfile();
+ } catch (Exception $e) {
+ return false;
+ }
+
+ if (!Subscription::exists($profile, $author)) {
+ return false;
+ }
}
+
+ return !$this->isHiddenSpam($profile);
}
+ }
- // Only for followers of the author
+ function isHiddenSpam($profile) {
+
+ // Hide posts by silenced users from everyone but moderators.
- if ($scope & Notice::FOLLOWER_SCOPE) {
- $author = $this->getProfile();
- if (!Subscription::exists($profile, $author)) {
- return false;
+ if (common_config('notice', 'hidespam')) {
+
+ try {
+ $author = $this->getProfile();
+ } catch(Exception $e) {
+ // If we can't get an author, keep it hidden.
+ // XXX: technically not spam, but, whatever.
+ return true;
+ }
+
+ if ($author->hasRole(Profile_role::SILENCED)) {
+ if (empty($profile) || (($profile->id !== $author->id) && (!$profile->hasRight(Right::REVIEWSPAM)))) {
+ return true;
+ }
}
}
- return true;
+ return false;
}
static function groupsFromText($text, $profile)