diff --git a/composer.lock b/composer.lock index e0ed9282b20..7f93588c6f6 100644 --- a/composer.lock +++ b/composer.lock @@ -179,12 +179,12 @@ "source": { "type": "git", "url": "https://github.com/ChristophWurst/nextcloud_composer.git", - "reference": "8d20160d6a06f4731acaee1989fd4f81c854ec9a" + "reference": "ed583894ecc139b3c8c687cf602e2113ff15ffb9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ChristophWurst/nextcloud_composer/zipball/8d20160d6a06f4731acaee1989fd4f81c854ec9a", - "reference": "8d20160d6a06f4731acaee1989fd4f81c854ec9a", + "url": "https://api.github.com/repos/ChristophWurst/nextcloud_composer/zipball/ed583894ecc139b3c8c687cf602e2113ff15ffb9", + "reference": "ed583894ecc139b3c8c687cf602e2113ff15ffb9", "shasum": "" }, "require": { @@ -215,7 +215,7 @@ "issues": "https://github.com/ChristophWurst/nextcloud_composer/issues", "source": "https://github.com/ChristophWurst/nextcloud_composer/tree/master" }, - "time": "2022-02-09T01:16:59+00:00" + "time": "2022-02-25T01:19:34+00:00" }, { "name": "composer/package-versions-deprecated", diff --git a/lib/Events/EndCallForEveryoneEvent.php b/lib/Events/EndCallForEveryoneEvent.php index a080e5f0719..0693ceb9f1c 100644 --- a/lib/Events/EndCallForEveryoneEvent.php +++ b/lib/Events/EndCallForEveryoneEvent.php @@ -30,6 +30,8 @@ class EndCallForEveryoneEvent extends ModifyRoomEvent { /** @var string[] */ protected $sessionIds; + /** @var string[] */ + protected $userIds; public function __construct(Room $room, ?Participant $actor = null) { @@ -51,4 +53,20 @@ public function setSessionIds(array $sessionIds): void { public function getSessionIds(): array { return $this->sessionIds; } + + /** + * @param string[] $userIds + * @return void + */ + public function setUserIds(array $userIds): void { + $this->userIds = $userIds; + } + + /** + * Only available in the after-event + * @return string[] + */ + public function getUserIds(): array { + return $this->userIds; + } } diff --git a/lib/Service/ParticipantService.php b/lib/Service/ParticipantService.php index eb26ae2361f..24f8e4a3ab8 100644 --- a/lib/Service/ParticipantService.php +++ b/lib/Service/ParticipantService.php @@ -913,14 +913,19 @@ public function endCallForEveryone(Room $room, Participant $moderator): void { $participants = $this->getParticipantsInCall($room); $changedSessionIds = []; + $changedUserIds = []; // kick out all participants out of the call foreach ($participants as $participant) { $changedSessionIds[] = $participant->getSession()->getSessionId(); + if ($participant->getAttendee()->getActorType() === Attendee::ACTOR_USERS) { + $changedUserIds[] = $participant->getAttendee()->getActorId(); + } $this->changeInCall($room, $participant, Participant::FLAG_DISCONNECTED, true); } $event->setSessionIds($changedSessionIds); + $event->setUserIds($changedUserIds); $this->dispatcher->dispatch(Room::EVENT_AFTER_END_CALL_FOR_EVERYONE, $event); } diff --git a/lib/Status/Listener.php b/lib/Status/Listener.php index a41953ea6ee..de585b76050 100644 --- a/lib/Status/Listener.php +++ b/lib/Status/Listener.php @@ -26,6 +26,8 @@ namespace OCA\Talk\Status; +use OCA\Talk\Events\EndCallForEveryoneEvent; +use OCA\Talk\Events\ModifyEveryoneEvent; use OCA\Talk\Events\ModifyParticipantEvent; use OCA\Talk\Model\Attendee; use OCA\Talk\Room; @@ -53,6 +55,12 @@ public static function register(IEventDispatcher $dispatcher): void { $listener = \OC::$server->get(self::class); $listener->revertUserStatus($event); }); + + $dispatcher->addListener(Room::EVENT_AFTER_END_CALL_FOR_EVERYONE, static function (EndCallForEveryoneEvent $event) { + /** @var self $listener */ + $listener = \OC::$server->get(self::class); + $listener->revertUserStatusOnEndCallForEveryone($event); + }); } public function setUserStatus(ModifyParticipantEvent $event): void { @@ -62,8 +70,21 @@ public function setUserStatus(ModifyParticipantEvent $event): void { } public function revertUserStatus(ModifyParticipantEvent $event): void { + if ($event instanceof ModifyEveryoneEvent) { + // Do not revert the status with 3 queries per user. + // We will update it in one go at the end. + return; + } + if ($event->getParticipant()->getAttendee()->getActorType() === Attendee::ACTOR_USERS) { $this->statusManager->revertUserStatus($event->getParticipant()->getAttendee()->getActorId(), 'call', IUserStatus::AWAY); } } + + public function revertUserStatusOnEndCallForEveryone(EndCallForEveryoneEvent $event): void { + $userIds = $event->getUserIds(); + if (!empty($userIds)) { + $this->statusManager->revertMultipleUserStatus($userIds, 'call', IUserStatus::AWAY); + } + } }