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:
parent
a431fca442
commit
d942072a6c
|
@ -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)
|
||||||
|
|
|
@ -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' =>
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user