assertParameter($parameters, 'type')) { case 'create': if (!$user->getPermission('user.chat.canTemproom')) { throw new PermissionDeniedException(); } break; case 'invite': if (!$room->isTemporary) { throw new UserInputException( 'message', WCF::getLanguage()->getDynamicVariable('chat.error.notInTemproom') ); } if ($room->ownerID !== $user->userID) { throw new PermissionDeniedException(); } $recipient = new UserProfile($this->assertUser($this->assertParameter($parameters, 'username'))); if ($recipient->isIgnoredUser($user->userID)) { throw new UserInputException( 'message', WCF::getLanguage()->getDynamicVariable( 'chat.error.userIgnoresYou', [ 'user' => $recipient, ] ) ); } break; case 'delete': if (!$room->isTemporary) { throw new UserInputException( 'message', WCF::getLanguage()->getDynamicVariable( 'chat.error.notInTemproom' ) ); } if ($room->ownerID !== $user->userID) { throw new PermissionDeniedException(); } break; default: throw new UserInputException('message'); } } /** * @inheritDoc */ public function execute($parameters, Room $room, ?UserProfile $user = null) { if ($user === null) { $user = new UserProfile(WCF::getUser()); } switch ($this->assertParameter($parameters, 'type')) { case 'create': $fields = [ 'title' => WCF::getLanguage()->getDynamicVariable( 'chat.room.temporary.blueprint', [ 'user' => $user, ] ), 'topic' => '', 'position' => 999, 'isTemporary' => true, 'ownerID' => $user->userID, ]; WCF::getDB()->beginTransaction(); // create room $tempRoom = (new RoomAction([], 'create', [ 'data' => $fields, ]))->executeAction()['returnValues']; $objectTypeID = $this->getMessageObjectTypeID('be.bastelstu.chat.messageType.temproomCreated'); (new MessageAction( [ ], 'create', [ 'data' => [ 'roomID' => $room->roomID, 'userID' => $user->userID, 'username' => $user->username, 'time' => TIME_NOW, 'objectTypeID' => $objectTypeID, 'payload' => \serialize([ 'room' => $tempRoom, ]), ], 'updateTimestamp' => true, ] ))->executeAction(); WCF::getDB()->commitTransaction(); return; case 'invite': $recipient = $this->getUser($this->assertParameter($parameters, 'username')); WCF::getDB()->beginTransaction(); try { $sql = "INSERT INTO chat1_room_temporary_invite (userID, roomID) VALUES (?, ?)"; $statement = WCF::getDB()->prepare($sql); $statement->execute([ $recipient->userID, $room->roomID ]); } catch (\wcf\system\database\DatabaseException $e) { WCF::getDB()->rollBackTransaction(); // Duplicate key errors don't cause harm. if ((string)$e->getCode() !== '23000') { throw $e; } return; } $objectTypeID = $this->getMessageObjectTypeID('be.bastelstu.chat.messageType.temproomInvited'); (new MessageAction( [ ], 'create', [ 'data' => [ 'roomID' => $room->roomID, 'userID' => $user->userID, 'username' => $user->username, 'time' => TIME_NOW, 'objectTypeID' => $objectTypeID, 'payload' => \serialize([ 'recipient' => $recipient->userID, 'recipientName' => $recipient->username, ]), ], 'updateTimestamp' => true, ] ))->executeAction(); WCF::getDB()->commitTransaction(); return; case 'delete': (new RoomAction( [ $room, ], 'delete' ))->executeAction(); return; default: throw new UserInputException('message'); } } }