示例#1
0
        private void button1_Click(object sender, EventArgs e)
        {
            CreateRoomForm f = new CreateRoomForm();

            f.ShowDialog();

            if (f.Created)
            {
                _chatClient.CreateRoom(f.RoomName, Login);
            }
        }
        private async Task DispatchCommand(ICommand command,
                                           IChatClient chatClient,
                                           IDictionary <string, ChatRoom> knownRooms,
                                           IDictionary <string, IRoom> roomInstances,
                                           ICollection <Task> roomsTasks,
                                           CancellationToken stoppingToken)
        {
            switch (command)
            {
            case JoinRoomCommand joinRoomCommand:
            {
                var roomName = joinRoomCommand.RoomName;
                if (!knownRooms.TryGetValue(roomName, out var room))
                {
                    logger.LogWarning("Cannot join unknown [room={Room}][known={Keys}]",
                                      roomName,
                                      string.Join(",", knownRooms.Keys));

                    return;
                }

                try
                {
                    roomInstances[roomName] = await chatClient.JoinRoom(room, stoppingToken);
                }
                catch (ChatException error)
                {
                    logger.LogError(error, "Failed joining chat room: {Description}", error.Message);
                    break;
                }

                logger.LogDebug("Joined [room={Room}]", roomInstances[roomName]);

                roomsTasks.Add(ListenForMessages(roomInstances[roomName], stoppingToken));

                Console.WriteLine($"Joined {room}");

                break;
            }

            case ListRoomsCommand:
            {
                var roomsList = await chatClient.ListRooms(stoppingToken);

                foreach (var chatRoom in roomsList)
                {
                    if (knownRooms.TryAdd(chatRoom.Name, chatRoom))
                    {
                        logger.LogDebug("Added [room={Room}]", chatRoom);
                    }
                }

                foreach (var(room, _) in knownRooms)
                {
                    Console.WriteLine($"{room}");
                }

                break;
            }

            case SendMessageCommand sendMessageCommand:
            {
                var roomName = sendMessageCommand.RoomName;
                if (!roomInstances.TryGetValue(roomName, out var room))
                {
                    logger.LogWarning("Cannot send to unknown [room={Room}][joined={Keys}]",
                                      roomName,
                                      string.Join(",", roomInstances.Keys));
                    return;
                }

                await room.SendMessage(sendMessageCommand.Message, stoppingToken);

                logger.LogDebug("Sent [message={Message}] to [room={Room}]", sendMessageCommand.Message, room);

                break;
            }

            case CreateRoomCommand createRoomCommand:
            {
                var roomName = createRoomCommand.RoomName;
                if (roomInstances.TryGetValue(roomName, out _))
                {
                    logger.LogWarning("Cannot create existing room [room={Room}][joined={Keys}]",
                                      roomName,
                                      string.Join(",", roomInstances.Keys));
                    return;
                }

                await chatClient.CreateRoom(roomName, stoppingToken);

                break;
            }

            case InfoCommand:
            {
                Console.WriteLine($"Name: {chatClient.User.Name}");
                break;
            }

            default:
            {
                logger.LogWarning("Unknown [command={Command}]", command);
                break;
            }
            }
        }