<?php /* * Copyright (c) 2010-2024 Tim Düsterhus. * * Use of this software is governed by the Business Source License * included in the LICENSE file. * * Change Date: 2028-06-15 * * On the date above, in accordance with the Business Source * License, use of this software will be governed by version 2 * or later of the General Public License. */ namespace chat\data\user; use chat\data\room\Room; use chat\data\room\RoomAction; use wcf\data\AbstractDatabaseObjectAction; use wcf\system\cache\runtime\UserProfileRuntimeCache; use wcf\system\cache\runtime\UserRuntimeCache; use wcf\system\event\EventHandler; use wcf\system\exception\PermissionDeniedException; use wcf\system\exception\UserInputException; /** * Executes chat user-related actions. */ class UserAction extends AbstractDatabaseObjectAction { /** * @inheritDoc */ protected $className = User::class; /** * Validates parameters and permissions. */ public function validateGetUsersByID() { if (!Room::canSeeAny()) { throw new PermissionDeniedException(); } $this->readIntegerArray('userIDs'); } /** * Returns information about the users identified by the given userIDs. */ public function getUsersByID() { $userList = UserProfileRuntimeCache::getInstance()->getObjects($this->parameters['userIDs']); return \array_map(function ($user) { if (!$user) { return null; } $payload = [ 'image16' => $user->getAvatar()->getImageTag(16), 'image24' => $user->getAvatar()->getImageTag(24), 'image32' => $user->getAvatar()->getImageTag(32), 'image48' => $user->getAvatar()->getImageTag(48), 'imageUrl' => $user->getAvatar()->getURL(), 'link' => $user->getLink(), 'anchor' => $user->getAnchorTag(), 'userID' => $user->userID, 'username' => $user->username, 'userTitle' => $user->getUserTitle(), 'userRankClass' => $user->getRank() ? $user->getRank()->cssClassName : null, 'formattedUsername' => $user->getFormattedUsername(), 'away' => $user->chatAway, 'color1' => $user->chatColor1, 'color2' => $user->chatColor2, ]; EventHandler::getInstance()->fireAction($this, 'getUsersByID', $payload); return $payload; }, $userList); } /** * Clears dead clients. */ public function clearDeadSessions() { $sessions = User::getDeadSessions(); if ($sessions === []) { return; } $userIDs = \array_map(static function ($item) { return $item['userID']; }, $sessions); $users = UserRuntimeCache::getInstance()->getObjects($userIDs); foreach ($sessions as $session) { $parameters = [ 'user' => $users[$session['userID']], 'roomID' => $session['roomID'], 'sessionID' => $session['sessionID'], ]; try { (new RoomAction( [ ], 'leave', $parameters ))->executeAction(); } catch (UserInputException $e) { // Probably some other request has been faster to remove this session, ignore } } } /** * @inheritDoc */ public function create() { throw new \BadMethodCallException(); } /** * @inheritDoc */ public function update() { throw new \BadMethodCallException(); } /** * @inheritDoc */ public function delete() { throw new \BadMethodCallException(); } }