Пример #1
0
        public async Task SendPrivateChatMessage_ParticipantConnected_ReceiveNotificationAndAddToSubscriptions()
        {
            const string message = "Hello";

            // arrange
            var(connection, conference) = await ConnectToOpenedConference();

            var olaf           = CreateUser();
            var olafConnection = await ConnectUserToConference(olaf, conference);

            var channel = ChannelSerializer
                          .Encode(new PrivateChatChannel(new HashSet <string> {
                olaf.Sub, Moderator.Sub
            })).ToString();

            var chatMessageNotification = new TaskCompletionSource <ChatMessageDto>();

            olafConnection.Hub.On(CoreHubMessages.ChatMessage,
                                  (ChatMessageDto dto) => chatMessageNotification.SetResult(dto));

            // act
            await connection.Hub.InvokeAsync(nameof(CoreHub.SendChatMessage),
                                             new SendChatMessageDto(message, channel, new ChatMessageOptions()));

            // assert
            await chatMessageNotification.Task.WithDefaultTimeout();

            var syncSubscriptionsId = SynchronizedSubscriptions.SyncObjId(connection.User.Sub);
            await connection.SyncObjects.AssertSyncObject <SynchronizedSubscriptions>(syncSubscriptionsId,
                                                                                      value => Assert.Contains(value.Subscriptions.Keys, x => x == channel));
        }
Пример #2
0
        public async Task <SuccessOrError <Unit> > Handle(SendChatMessageRequest request,
                                                          CancellationToken cancellationToken)
        {
            var(participant, _, channel, _) = request;
            var conferenceId = participant.ConferenceId;

            var message = await BuildChatMessage(request);

            var channelId = ChannelSerializer.Encode(channel);

            var messagesCount =
                await _chatRepository.AddChatMessageAndGetMessageCount(conferenceId, channelId.ToString(), message);

            var subscribedParticipants =
                await _mediator.Send(new FetchSubscribedParticipantsRequest(conferenceId, channelId));

            if (channel is PrivateChatChannel privateChatChannel)
            {
                subscribedParticipants = await UpdateParticipantsSubscriptionsIfNecessary(subscribedParticipants,
                                                                                          privateChatChannel, participant.ConferenceId);
            }

            await _mediator.Publish(new ChatMessageReceivedNotification(conferenceId, subscribedParticipants, message,
                                                                        channel, messagesCount));

            await _mediator.Send(new SetParticipantTypingRequest(participant, channel, false));

            return(Unit.Value);
        }
Пример #3
0
        private async Task <SynchronizedObjectId> WaitForGlobalChat(UserConnection connection)
        {
            var chatChannels = await WaitForChatChannels(connection);

            var globalChannelId = ChannelSerializer.Encode(GlobalChatChannel.Instance).ToString();

            return(chatChannels.Single(x => x.ToString() == globalChannelId));
        }
Пример #4
0
        public async Task <EntityPage <ChatMessage> > Handle(FetchMessagesRequest request,
                                                             CancellationToken cancellationToken)
        {
            var(conferenceId, chatChannel, start, end) = request;
            var channelId = ChannelSerializer.Encode(chatChannel).ToString();

            return(await _chatRepository.FetchMessages(conferenceId, channelId, start, end));
        }
Пример #5
0
 public async Task Handle(RoomsRemovedNotification notification, CancellationToken cancellationToken)
 {
     foreach (var removedRoomId in notification.RemovedRoomIds)
     {
         var channel   = new RoomChatChannel(removedRoomId);
         var channelId = ChannelSerializer.Encode(channel);
         await _chatRepository.DeleteChannel(notification.ConferenceId, channelId.ToString());
     }
 }
Пример #6
0
        public override void RunImpl()
        {
            Channel channel = ChannelSerializer.Load();
            Rank    rank    = RankSerializer.Load();

            Client.SendPacket(new PROTOCOL_BASE_GET_SYSTEM_INFO_ACK(rank, channel));
            Client.SendPacket(new PROTOCOL_BASE_NOTICE_ACK());
            Client.SendPacket(new PROTOCOL_BASE_URL_LIST_ACK());
            Client.SendPacket(new PROTOCOL_BASE_MAP_RULELIST_ACK());
            Client.SendPacket(new PROTOCOL_BASE_MAP_MATCHINGLIST_PART_1_ACK());
            Client.SendPacket(new PROTOCOL_BASE_MAP_MATCHINGLIST_PART_2_ACK());
            Client.SendPacket(new PROTOCOL_BASE_MAP_MATCHINGLIST_PART_3_ACK());
        }
Пример #7
0
 public static bool TryParseChatChannel(string s, [NotNullWhen(true)] out ChatChannel?channel)
 {
     try
     {
         channel = ChannelSerializer.Decode(SynchronizedObjectId.Parse(s));
         return(true);
     }
     catch (Exception)
     {
         channel = null;
         return(false);
     }
 }
Пример #8
0
        public async Task Handle(ChatMessageReceivedNotification notification, CancellationToken cancellationToken)
        {
            var(_, participants, message, channel, messagesCount) = notification;

            ChatMessageSender?sender = null;

            if (!message.Options.IsAnonymous)
            {
                sender = message.Sender;
            }

            var channelId = ChannelSerializer.Encode(channel).ToString();

            var messageDto = new ChatMessageDto(messagesCount - 1, channelId, sender, message.Message,
                                                message.Timestamp, message.Options);

            var participantGroups = participants.Select(CoreHubGroups.OfParticipant);
            await _hubContext.Clients.Groups(participantGroups).ChatMessage(messageDto, cancellationToken);
        }
Пример #9
0
        public override void RunImpl()
        {
            Channel channel = ChannelSerializer.Load();

            Client.SendPacket(new PROTOCOL_BASE_GET_CHANNELLIST_ACK(channel));
        }
Пример #10
0
 private SynchronizedObjectId GetChannelId(ChatChannel channel)
 {
     return(ChannelSerializer.Encode(channel));
 }