public async Task <Unit> Handle(TalkingStickReturnRequest request, CancellationToken cancellationToken) { var participant = request.Participant; var rooms = await _mediator.FetchSynchronizedObject <SynchronizedRooms>(participant.ConferenceId, SynchronizedRooms.SyncObjId); if (!rooms.Participants.TryGetValue(participant.Id, out var roomId)) { throw SceneError.RoomNotFound.ToException(); } await using (await _repository.LockRoom(participant.ConferenceId, roomId)) { var currentSpeaker = await _repository.GetCurrentSpeaker(participant.ConferenceId, roomId); if (currentSpeaker != null && currentSpeaker.Value.Equals(participant)) { await _repository.RemoveCurrentSpeaker(currentSpeaker.Value.ConferenceId, roomId); await _modeHandler.InvalidateTalkingSceneWithLockAcquired(currentSpeaker.Value.ConferenceId, roomId); } else { return(Unit.Value); } } await _mediator.Send(new UpdateSynchronizedObjectRequest(participant.ConferenceId, SynchronizedSceneTalkingStick.SyncObjId(roomId))); return(Unit.Value); }
public async Task <Unit> Handle(TalkingStickPassRequest request, CancellationToken cancellationToken) { var(participant, roomId, failIfHasSpeaker) = request; await using (await _repository.LockRoom(participant.ConferenceId, roomId)) { await _mediator.Send(new ClearCacheRequest()); if (failIfHasSpeaker) { var currentSpeaker = await _repository.GetCurrentSpeaker(participant.ConferenceId, roomId); if (currentSpeaker != null) { throw SceneError.AlreadyHasSpeaker.ToException(); } } if (!await CheckParticipantIsInRoom(participant, roomId)) { throw new ParticipantNotFoundException(participant); } await _repository.SetCurrentSpeakerAndRemoveFromQueue(participant, roomId); await _modeHandler.InvalidateTalkingSceneWithLockAcquired(participant.ConferenceId, roomId); } await _mediator.Send(new UpdateSynchronizedObjectRequest(participant.ConferenceId, SynchronizedSceneTalkingStick.SyncObjId(roomId))); return(Unit.Value); }
public async Task Handle(ParticipantsRoomChangedNotification notification, CancellationToken cancellationToken) { var updatedRooms = GetRoomsWithAParticipantLeft(notification); foreach (var updatedRoom in updatedRooms) { await using (await _repository.LockRoom(notification.ConferenceId, updatedRoom)) { var participants = GetParticipantsThatLeftRoom(notification, updatedRoom); await _repository.RemoveFromQueue(participants, updatedRoom); await _modeHandler.InvalidateTalkingSceneWithLockAcquired(notification.ConferenceId, updatedRoom); } await _mediator.Send(new UpdateSynchronizedObjectRequest(notification.ConferenceId, SynchronizedSceneTalkingStick.SyncObjId(updatedRoom))); } }
public async Task <Unit> Handle(TalkingStickEnqueueRequest request, CancellationToken cancellationToken) { var(participant, remove) = request; var rooms = await _mediator.FetchSynchronizedObject <SynchronizedRooms>(participant.ConferenceId, SynchronizedRooms.SyncObjId); if (!rooms.Participants.TryGetValue(participant.Id, out var roomId)) { throw SceneError.RoomNotFound.ToException(); } await using (await _repository.LockRoom(participant.ConferenceId, roomId)) { await _mediator.Send(new ClearCacheRequest()); if (!await CheckParticipantIsInRoom(participant, roomId)) { throw new ConcurrencyException("Participant switched room."); } if (remove) { await _repository.RemoveFromQueue(participant.Yield(), roomId); } else { var queue = await _repository.FetchQueue(participant.ConferenceId, roomId); if (!queue.Contains(participant.Id)) { await _repository.Enqueue(participant, roomId); } await _modeHandler.InvalidateTalkingSceneWithLockAcquired(participant.ConferenceId, roomId); } } await _mediator.Send(new UpdateSynchronizedObjectRequest(participant.ConferenceId, SynchronizedSceneTalkingStick.SyncObjId(roomId))); return(Unit.Value); }