Optionally hide spam from timelines

For sites with a lot of spam, this will hide that spam from timelines for everyone but moderators.
This commit is contained in:
Evan Prodromou 2012-03-21 10:17:11 -04:00
parent a431fca442
commit d942072a6c
3 changed files with 89 additions and 48 deletions

View File

@ -2387,75 +2387,101 @@ class Notice extends Managed_DataObject
// If there's no scope, anyone (even anon) is in scope. // If there's no scope, anyone (even anon) is in scope.
if ($scope == 0) { if ($scope == 0) { // Not private
return true;
}
// If there's scope, anon cannot be in scope return !$this->isHiddenSpam();
if (empty($profile)) { } else { // Private, somehow
return false;
}
// Author is always in scope // If there's scope, anon cannot be in scope
if ($this->profile_id == $profile->id) { if (empty($profile)) {
return true;
}
// Only for users on this site
if ($scope & Notice::SITE_SCOPE) {
$user = $profile->getUser();
if (empty($user)) {
return false; return false;
} }
}
// Only for users mentioned in the notice // Author is always in scope
if ($scope & Notice::ADDRESSEE_SCOPE) { if ($this->profile_id == $profile->id) {
return true;
$repl = Reply::pkeyGet(array('notice_id' => $this->id,
'profile_id' => $profile->id));
if (empty($repl)) {
return false;
} }
}
// Only for members of the given group // Only for users on this site
if ($scope & Notice::GROUP_SCOPE) { if ($scope & Notice::SITE_SCOPE) {
$user = $profile->getUser();
// XXX: just query for the single membership if (empty($user)) {
return false;
$groups = $this->getGroups();
$foundOne = false;
foreach ($groups as $group) {
if ($profile->isMember($group)) {
$foundOne = true;
break;
} }
} }
if (!$foundOne) { // Only for users mentioned in the notice
return false;
if ($scope & Notice::ADDRESSEE_SCOPE) {
$repl = Reply::pkeyGet(array('notice_id' => $this->id,
'profile_id' => $profile->id));
if (empty($repl)) {
return false;
}
} }
// Only for members of the given group
if ($scope & Notice::GROUP_SCOPE) {
// XXX: just query for the single membership
$groups = $this->getGroups();
$foundOne = false;
foreach ($groups as $group) {
if ($profile->isMember($group)) {
$foundOne = true;
break;
}
}
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();
} }
}
// Only for followers of the author function isHiddenSpam() {
// Hide posts by silenced users from everyone but moderators.
if (common_config('notice', 'hidespam')) {
if ($scope & Notice::FOLLOWER_SCOPE) {
$author = $this->getProfile(); $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) static function groupsFromText($text, $profile)

View File

@ -288,7 +288,8 @@ $default =
'gc_limit' => 1000), // max sessions to expire at a time 'gc_limit' => 1000), // max sessions to expire at a time
'notice' => 'notice' =>
array('contentlimit' => null, 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' => 'message' =>
array('contentlimit' => null), array('contentlimit' => null),
'location' => 'location' =>

View File

@ -151,6 +151,20 @@ class NoticeList extends Widget
Memcached_DataObject::pivotGet('Notice', 'repeat_of', $ids, array('profile_id' => $p->id)); 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)); Event::handle('EndNoticeListPrefill', array(&$notices, &$profiles, $avatarSize));
} }
} }