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
18 changes: 6 additions & 12 deletions wcfsetup/install/files/lib/action/UserIgnoreAction.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use wcf\command\user\IgnoreUser;
use wcf\command\user\UnignoreUser;
use wcf\data\user\ignore\UserIgnore;
use wcf\data\user\ignore\UserIgnoreAction as IgnoreUserIgnoreAction;
use wcf\data\user\UserProfile;
use wcf\http\Helper;
use wcf\system\cache\runtime\UserProfileRuntimeCache;
use wcf\system\cache\runtime\UserRuntimeCache;
use wcf\system\exception\IllegalLinkException;
use wcf\system\exception\PermissionDeniedException;
use wcf\system\form\builder\field\RadioButtonFormField;
Expand Down Expand Up @@ -61,19 +63,11 @@ public function handle(ServerRequestInterface $request): ResponseInterface

$type = \intval($form->getData()['data']['type']);

$user = UserRuntimeCache::getInstance()->getObject($parameters['id']);
if ($type === UserIgnore::TYPE_NO_IGNORE) {
(new IgnoreUserIgnoreAction([], 'unignore', [
'data' => [
'userID' => $parameters['id'],
],
]))->executeAction();
(new UnignoreUser(WCF::getUser(), $user))();
} else {
(new IgnoreUserIgnoreAction([], 'ignore', [
'data' => [
'userID' => $parameters['id'],
'type' => $type,
],
]))->executeAction();
(new IgnoreUser(WCF::getUser(), $user, $type))();
}

return new JsonResponse([
Expand Down
61 changes: 61 additions & 0 deletions wcfsetup/install/files/lib/command/user/IgnoreUser.class.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

namespace wcf\command\user;

use wcf\data\user\User;
use wcf\event\user\UserIgnored;
use wcf\system\event\EventHandler;
use wcf\system\user\command\Unfollow;
use wcf\system\user\storage\UserStorageHandler;
use wcf\system\WCF;

/**
* Saves that one user ignores another user.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.3
*/
final class IgnoreUser
{
public function __construct(
private readonly User $user,
private readonly User $target,
/** @var UserIgnore::TYPE_BLOCK_DIRECT_CONTACT|UserIgnore::TYPE_HIDE_MESSAGES */
private readonly int $type
) {}

public function __invoke(): void
{
$this->ignoreUser($this->user, $this->target, $this->type);

(new Unfollow($this->target, $this->user))();

$this->resetStorage($this->user, $this->target);

$event = new UserIgnored($this->user, $this->target, $this->type);
EventHandler::getInstance()->fire($event);
}

private function resetStorage(User $user, User $target): void
{
UserStorageHandler::getInstance()->reset([$user->userID], 'ignoredUserIDs');
UserStorageHandler::getInstance()->reset([$target->userID], 'ignoredByUserIDs');
}

private function ignoreUser(User $user, User $target, int $type): void
{
$sql = "INSERT INTO wcf1_user_ignore
(userID, ignoreUserID, type, time)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE type = VALUES(type), time = VALUES(time)";
$statement = WCF::getDB()->prepare($sql);
$statement->execute([
$user->userID,
$target->userID,
$type,
TIME_NOW,
]);
}
}
45 changes: 45 additions & 0 deletions wcfsetup/install/files/lib/command/user/UnignoreUser.class.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

namespace wcf\command\user;

use wcf\data\user\User;
use wcf\event\user\UserUnignored;
use wcf\system\event\EventHandler;
use wcf\system\user\storage\UserStorageHandler;
use wcf\system\WCF;

/**
* Saves that a user is no longer ignoring another user.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.3
*/
final class UnignoreUser
{
public function __construct(
private readonly User $user,
private readonly User $target,
) {}

public function __invoke(): void
{
$this->removeUserIgnore($this->user, $this->target);

UserStorageHandler::getInstance()->reset([$this->user->userID], 'ignoredUserIDs');
UserStorageHandler::getInstance()->reset([$this->target->userID], 'ignoredByUserIDs');

$event = new UserUnignored($this->user, $this->target);
EventHandler::getInstance()->fire($event);
}

private function removeUserIgnore(User $user, User $target): void
{
$sql = "DELETE FROM wcf1_user_ignore
WHERE userID = ?
AND ignoreUserID = ?";
$statement = WCF::getDB()->prepare($sql);
$statement->execute([$user->userID, $target->userID]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

namespace wcf\data\user\ignore;

use wcf\command\user\IgnoreUser;
use wcf\command\user\UnignoreUser;
use wcf\data\AbstractDatabaseObjectAction;
use wcf\data\user\follow\UserFollow;
use wcf\data\user\follow\UserFollowEditor;
use wcf\system\cache\runtime\UserProfileRuntimeCache;
use wcf\system\exception\IllegalLinkException;
use wcf\system\exception\PermissionDeniedException;
Expand Down Expand Up @@ -38,6 +38,8 @@ class UserIgnoreAction extends AbstractDatabaseObjectAction
* Validates the 'ignore' action.
*
* @return void
*
* @deprecated 6.3
*/
public function validateIgnore()
{
Expand Down Expand Up @@ -70,53 +72,15 @@ public function validateIgnore()
* Ignores a user.
*
* @return array{isIgnoredUser: 1}
*
* @deprecated 6.3 use the `IgnoreUser` command instead.
*/
public function ignore()
{
$ignore = new UserIgnoreEditor(UserIgnore::getIgnore($this->parameters['data']['userID']));
$type = $this->parameters['data']['type'] ?? UserIgnore::TYPE_BLOCK_DIRECT_CONTACT;
$userProfile = UserProfileRuntimeCache::getInstance()->getObject($this->parameters['data']['userID']);

if ($ignore->ignoreID) {
$ignore->update([
'type' => $type,
'time' => TIME_NOW,
]);
} else {
$ignore = UserIgnoreEditor::createOrIgnore([
'ignoreUserID' => $this->parameters['data']['userID'],
'type' => $type,
'time' => TIME_NOW,
'userID' => WCF::getUser()->userID,
]);
}

if ($ignore !== null) {
UserStorageHandler::getInstance()->reset([WCF::getUser()->userID], 'ignoredUserIDs');
UserStorageHandler::getInstance()->reset([$this->parameters['data']['userID']], 'ignoredByUserIDs');

// check if target user is following the current user
$sql = "SELECT *
FROM wcf1_user_follow
WHERE userID = ?
AND followUserID = ?";
$statement = WCF::getDB()->prepare($sql);
$statement->execute([
$this->parameters['data']['userID'],
WCF::getUser()->userID,
]);

$follow = $statement->fetchObject(UserFollow::class);

// remove follower
if ($follow !== null) {
$followEditor = new UserFollowEditor($follow);
$followEditor->delete();

// reset storage
UserStorageHandler::getInstance()->reset([WCF::getUser()->userID], 'followerUserIDs');
UserStorageHandler::getInstance()->reset([$this->parameters['data']['userID']], 'followingUserIDs');
}
}
(new IgnoreUser(WCF::getUser(), $userProfile->getDecoratedObject(), $type))();

return ['isIgnoredUser' => 1];
}
Expand All @@ -125,6 +89,8 @@ public function ignore()
* Validates the 'unignore' action.
*
* @return void
*
* @deprecated 6.3
*/
public function validateUnignore()
{
Expand All @@ -140,18 +106,14 @@ public function validateUnignore()
* Unignores a user.
*
* @return array{isIgnoredUser: 0}
*
* @deprecated 6.3 use the `UnignoreUser` command instead.
*/
public function unignore()
{
$ignore = UserIgnore::getIgnore($this->parameters['data']['userID']);

if ($ignore->ignoreID) {
$ignoreEditor = new UserIgnoreEditor($ignore);
$ignoreEditor->delete();
$userProfile = UserProfileRuntimeCache::getInstance()->getObject($this->parameters['data']['userID']);

UserStorageHandler::getInstance()->reset([WCF::getUser()->userID], 'ignoredUserIDs');
UserStorageHandler::getInstance()->reset([$this->parameters['data']['userID']], 'ignoredByUserIDs');
}
(new UnignoreUser(WCF::getUser(), $userProfile->getDecoratedObject()))();

return ['isIgnoredUser' => 0];
}
Expand Down
23 changes: 23 additions & 0 deletions wcfsetup/install/files/lib/event/user/UserIgnored.class.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace wcf\event\user;

use wcf\data\user\User;
use wcf\event\IPsr14Event;

/**
* Indicates that the user has ignored another user.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.3
*/
final class UserIgnored implements IPsr14Event
{
public function __construct(
public readonly User $user,
public readonly User $target,
public readonly int $type,
) {}
}
22 changes: 22 additions & 0 deletions wcfsetup/install/files/lib/event/user/UserUnignored.class.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace wcf\event\user;

use wcf\data\user\User;
use wcf\event\IPsr14Event;

/**
* Indicates that the user no longer ignores another user.
*
* @author Olaf Braun
* @copyright 2001-2025 WoltLab GmbH
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
* @since 6.3
*/
final class UserUnignored implements IPsr14Event
{
public function __construct(
public readonly User $user,
public readonly User $target,
) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@
*/
final class Unfollow
{
public function __construct(private readonly User $user, private readonly User $target)
{
}
public function __construct(
private readonly User $user,
private readonly User $target,
) {}

public function __invoke(): void
{
Expand Down