Как оформить события для чата на C#?

204
13 октября 2017, 13:14

Хочу реализовать комнаты чата, и допустим, в комнате 5 и кто-то в комнату 5 пишет, то сгенерировать событие и переслать всем пользователям комнаты. То-есть не всем разослать, а потом проверить,если он в комнате, а рассылать непосредственно в комнату. Точнее, если юзер 1 в комнате 5, то он подписывается на событие получения нового сообщения, но только не для всех, а для комнаты 5.
Как такое реализовать?
Спасибо

Answer 1

Ну вот вам примерный скелет.

У нас есть сообщение:

class Message
{
    // текст сообщения, дата отправления, адресат, ...
}

Весь чат состоит из комнат:

class Chat
{
    List<Room> rooms;
    public AllRooms => rooms.AsReadOnly();
    // и так далее
}

Комната содержит юзеров, список сообщений, и выставляет события прихода нового сообщения (а также, возможно, другие):

class Room
{
    List<User> users;
    List<Message> messages;
    public event EventHandler<NewMessageEventArgs> NewMessage;
    void AddMessage(message)
    {
        // проверки
        messages.Add(message);
        OnNewMessage(message);
    }
    void OnNewMessage(Message message) =>
        NewMessage?.Invoke(this, message);
}
class NewMessageEventArgs : EventArgs
{
    public Message Message { get; }
    // ...
}

Юзеры, попадая в комнату, подписываются на приход нового сообщения:

class User
{
    void JoinRoom(Room room)
    {
        try
        {
            room.AddUser(this);
            // комната может и не пустить
        }
        catch (RoomException ex)
        {
            // обработать и выйти
        }
        // получить текущие сообщения...
        messages = room.GetCurrentMessages();
        // и подписаться на новые:
        room.NewMessage += OnNewMessage;
    }
}

Вроде бы всё?

READ ALSO
Выход за пределы списка C#

Выход за пределы списка C#

Есть класс матрицы и метод, который возвращает определитель матрицы - DeterminantПо неведомым причинам выходит за пределы двумерного списка

189
Восстановление слова

Восстановление слова

Добрый вечер - возможно ли с данного кода восстановить начальный string?

189