Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{if $mimeType === 'text/plain'}
{lang}wcf.moderation.activation.notification.mail.plaintext{/lang}
{if $affectedObject}

{unsafe:$affectedObject->getMailText($mimeType)} {* this line ends with a space *}
{/if}
{else}
{lang}wcf.moderation.activation.notification.mail.html{/lang}
{if $affectedObject}
{assign var='user' value=$event->getAuthor()}

{if $notificationType == 'instant'}{assign var='avatarSize' value=48}
{else}{assign var='avatarSize' value=32}{/if}
{capture assign='userContent'}
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td><a href="{link controller='User' object=$user isHtmlEmail=true}{/link}"
title="{$user->username}">{unsafe:$user->getAvatar()->getSafeImageTag($avatarSize)}</a></td>
<td class="boxContent">
<div class="containerHeadline">
<h3>
{if $moderationQueue->userID}
<a href="{link controller='User' object=$user isHtmlEmail=true}{/link}">{$moderationQueue->username}</a>
{else}
{$moderationQueue->username}
{/if}
&#xb7;
<small>{$moderationQueue->time|plainTime}</small>
</h3>
</div>
<div>
{unsafe:$affectedObject->getMailText($mimeType)}
</div>
</td>
</tr>
</table>
{/capture}
{include file='email_paddingHelper' block=true class='box'|concat:$avatarSize content=$userContent sandbox=true}
{/if}
{/if}
7 changes: 7 additions & 0 deletions com.woltlab.wcf/userNotificationEvent.xml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@
<permissions>mod.general.canUseModeration</permissions>
<preset>1</preset>
</event>
<event>
<name>activation</name>
<objecttype>com.woltlab.wcf.moderation.queue</objecttype>
<classname>wcf\system\user\notification\event\ActivationModerationQueueUserNotificationEvent</classname>
<permissions>mod.general.canUseModeration</permissions>
<preset>0</preset>
</event>
<event>
<name>comment</name>
<objecttype>com.woltlab.wcf.moderation.queue.notification</objecttype>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,15 @@
use wcf\data\moderation\queue\ModerationQueue;
use wcf\data\moderation\queue\ModerationQueueAction;
use wcf\data\moderation\queue\ModerationQueueList;
use wcf\data\object\type\ObjectTypeCache;
use wcf\system\cache\builder\UserGroupOptionCacheBuilder;
use wcf\system\cache\runtime\UserProfileRuntimeCache;
use wcf\system\database\util\PreparedStatementConditionBuilder;
use wcf\system\exception\NotImplementedException;
use wcf\system\request\LinkHandler;
use wcf\system\SingletonFactory;
use wcf\system\user\notification\object\ModerationQueueUserNotificationObject;
use wcf\system\user\notification\UserNotificationHandler;
use wcf\system\WCF;

/**
Expand Down Expand Up @@ -77,7 +82,7 @@ public function removeContent(ModerationQueue $queue, string $message = '')
* Adds an entry to moderation queue.
*
* @param mixed[] $additionalData
* @return void
* @return ModerationQueue
*/
protected function addEntry(int $objectTypeID, int $objectID, int $containerID = 0, array $additionalData = [])
{
Expand All @@ -104,6 +109,7 @@ protected function addEntry(int $objectTypeID, int $objectID, int $containerID =
],
]);
$objectAction->executeAction();
$queue = $objectAction->getReturnValues()['returnValues'];
} else {
$objectAction = new ModerationQueueAction([$row['queueID']], 'update', [
'data' => [
Expand All @@ -115,9 +121,86 @@ protected function addEntry(int $objectTypeID, int $objectID, int $containerID =
],
]);
$objectAction->executeAction();
$queue = new ModerationQueue($row['queueID']);
}

ModerationQueueManager::getInstance()->resetModerationCount();

return $queue;
}

/**
* Notifies all moderators affected by the given queue entry by firing the given
* user notification event of the `com.woltlab.wcf.moderation.queue` object type.
*
* @since 6.3
*/
protected function notifyModerators(ModerationQueue $queue, string $eventName): void
{
/** @see TMultiRecipientModerationQueueCommentUserNotificationObjectType::loadModerators() */
$userGroupOptionCache = UserGroupOptionCacheBuilder::getInstance()->getData();
$canUseModerationOption = $userGroupOptionCache['options']['mod.general.canUseModeration'];

$sql = "SELECT DISTINCT userID
FROM (
SELECT userID
FROM wcf1_user_to_group
WHERE groupID IN (
SELECT groupID
FROM wcf1_user_group_option_value
WHERE optionID = ?
AND optionValue = ?
)
) users_in_groups_with_access
WHERE userID NOT IN (
SELECT userID
FROM wcf1_user_to_group
WHERE groupID IN (
SELECT groupID
FROM wcf1_user_group_option_value
WHERE optionID = ?
AND optionValue = ?
)
)
AND userID NOT IN (
SELECT userID
FROM wcf1_moderation_queue_to_user
WHERE queueID = ?
)";
$statement = WCF::getDB()->prepare($sql);
$statement->execute([
$canUseModerationOption->optionID,
1,
$canUseModerationOption->optionID,
-1,
$queue->queueID,
]);
$userIDs = $statement->fetchAll(\PDO::FETCH_COLUMN);
if ($userIDs === []) {
return;
}
UserProfileRuntimeCache::getInstance()->cacheObjectIDs($userIDs);
$objectType = ObjectTypeCache::getInstance()->getObjectType($queue->objectTypeID);
$processor = $objectType->getProcessor();
\assert($processor instanceof IModerationQueueHandler);

$userIDs = \array_filter($userIDs, function ($userID) use ($processor, $queue) {
return $processor->isAffectedUser($queue, $userID);
});
if ($userIDs === []) {
return;
}
foreach ($userIDs as $userID) {
$user = UserProfileRuntimeCache::getInstance()->getObject($userID);
ModerationQueueManager::getInstance()->setAssignment([$queue->queueID => true], $user->getDecoratedObject());
}

UserNotificationHandler::getInstance()->fireEvent(
$eventName,
'com.woltlab.wcf.moderation.queue',
new ModerationQueueUserNotificationObject($queue),
$userIDs
);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use wcf\form\ModerationActivationForm;
use wcf\system\exception\InvalidObjectTypeException;
use wcf\system\moderation\queue\activation\IModerationQueueActivationHandler;
use wcf\system\WCF;

/**
* Moderation queue implementation for moderated content.
Expand Down Expand Up @@ -71,6 +72,20 @@ public function addModeratedContent(string $objectType, int $objectID, array $ad
);
}

#[\Override]
protected function addEntry(int $objectTypeID, int $objectID, int $containerID = 0, array $additionalData = [])
{
$queue = parent::addEntry($objectTypeID, $objectID, $containerID, $additionalData);

// Content disabled by a moderator does not require a notification.
$user = WCF::getUser();
if ($user->isGuest() || !$this->getProcessor(null, $objectTypeID)->isAffectedUser($queue, $user->userID)) {
$this->notifyModerators($queue, 'activation');
}

return $queue;
}

/**
* Adds multiple entries for moderated content at once.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,9 @@
use wcf\data\moderation\queue\ModerationQueue;
use wcf\data\moderation\queue\ModerationQueueAction;
use wcf\data\moderation\queue\ViewableModerationQueue;
use wcf\data\object\type\ObjectTypeCache;
use wcf\form\ModerationReportForm;
use wcf\system\cache\builder\UserGroupOptionCacheBuilder;
use wcf\system\cache\runtime\UserProfileRuntimeCache;
use wcf\system\exception\InvalidObjectTypeException;
use wcf\system\moderation\queue\report\IModerationQueueReportHandler;
use wcf\system\user\notification\object\ModerationQueueUserNotificationObject;
use wcf\system\user\notification\UserNotificationHandler;
use wcf\system\WCF;

/**
Expand Down Expand Up @@ -182,74 +177,8 @@ protected function addEntry(int $objectTypeID, int $objectID, int $containerID =

ModerationQueueManager::getInstance()->resetModerationCount();

$this->notifyModerators($queue);
}

private function notifyModerators(ModerationQueue $queue): void
{
/** @see TMultiRecipientModerationQueueCommentUserNotificationObjectType::loadModerators() */
$userGroupOptionCache = UserGroupOptionCacheBuilder::getInstance()->getData();
$canUseModerationOption = $userGroupOptionCache['options']['mod.general.canUseModeration'];

$sql = "SELECT DISTINCT userID
FROM (
SELECT userID
FROM wcf1_user_to_group
WHERE groupID IN (
SELECT groupID
FROM wcf1_user_group_option_value
WHERE optionID = ?
AND optionValue = ?
)
) users_in_groups_with_access
WHERE userID NOT IN (
SELECT userID
FROM wcf1_user_to_group
WHERE groupID IN (
SELECT groupID
FROM wcf1_user_group_option_value
WHERE optionID = ?
AND optionValue = ?
)
)
AND userID NOT IN (
SELECT userID
FROM wcf1_moderation_queue_to_user
WHERE queueID = ?
)";
$statement = WCF::getDB()->prepare($sql);
$statement->execute([
$canUseModerationOption->optionID,
1,
$canUseModerationOption->optionID,
-1,
$queue->queueID,
]);
$userIDs = $statement->fetchAll(\PDO::FETCH_COLUMN);
if ($userIDs === []) {
return;
}
UserProfileRuntimeCache::getInstance()->cacheObjectIDs($userIDs);
$objectType = ObjectTypeCache::getInstance()->getObjectType($queue->objectTypeID);
$processor = $objectType->getProcessor();
\assert($processor instanceof IModerationQueueHandler);

$userIDs = \array_filter($userIDs, function ($userID) use ($processor, $queue) {
return $processor->isAffectedUser($queue, $userID);
});
if ($userIDs === []) {
return;
}
foreach ($userIDs as $userID) {
$user = UserProfileRuntimeCache::getInstance()->getObject($userID);
ModerationQueueManager::getInstance()->setAssignment([$queue->queueID => true], $user->getDecoratedObject());
}
$this->notifyModerators($queue, 'report');

UserNotificationHandler::getInstance()->fireEvent(
'report',
'com.woltlab.wcf.moderation.queue',
new ModerationQueueUserNotificationObject($queue),
$userIDs
);
return $queue;
}
}
Loading
Loading