From: Evan Prodromou Date: Wed, 21 Mar 2012 14:17:11 +0000 (-0400) Subject: Optionally hide spam from timelines X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=3fb3ddb3a6472db243254c432ab930216de3b705;p=quix0rs-gnu-social.git Optionally hide spam from timelines For sites with a lot of spam, this will hide that spam from timelines for everyone but moderators. --- diff --git a/classes/Notice.php b/classes/Notice.php index 68351477f0..a944830e51 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -2387,75 +2387,101 @@ 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(); - 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 on this site + + if ($scope & Notice::SITE_SCOPE) { + $user = $profile->getUser(); + if (empty($user)) { + return false; + } } - } - // Only for users mentioned in the notice + // Only for users mentioned in the notice - if ($scope & Notice::ADDRESSEE_SCOPE) { + if ($scope & Notice::ADDRESSEE_SCOPE) { - $repl = Reply::pkeyGet(array('notice_id' => $this->id, - 'profile_id' => $profile->id)); + $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(); } + } + + function isHiddenSpam() { - // Only for followers of the author + + // Hide posts by silenced users from everyone but moderators. + + 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 (!$profile->hasRole(Profile_role::MODERATOR)) { + return true; + } } } - return true; + return false; } static function groupsFromText($text, $profile) diff --git a/lib/default.php b/lib/default.php index b20af476d6..82ffe80a5d 100644 --- a/lib/default.php +++ b/lib/default.php @@ -288,7 +288,8 @@ $default = 'gc_limit' => 1000), // max sessions to expire at a time 'notice' => array('contentlimit' => null, - 'defaultscope' => null), // null means 1 if site/private, 0 otherwise + 'defaultscope' => null, // null means 1 if site/private, 0 otherwise + 'hidespam' => false), // Whether to hide silenced users from timelines 'message' => array('contentlimit' => null), 'location' => diff --git a/lib/noticelist.php b/lib/noticelist.php index 7f38cf005b..5df123fb5f 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -151,6 +151,20 @@ class NoticeList extends Widget Memcached_DataObject::pivotGet('Notice', 'repeat_of', $ids, array('profile_id' => $p->id)); } + if (common_config('notice', 'hidespam')) { + + $pids = array(); + + foreach ($profiles as $profile) { + $pids[] = $profile->id; + } + + Memcached_DataObject::pivotGet('Profile_role', + 'profile_id', + $pids, + array('role' => Profile_role::SILENCED)); + } + Event::handle('EndNoticeListPrefill', array(&$notices, &$profiles, $avatarSize)); } }