Esempio n. 1
0
        protected override void OnRun(MessageContent content, ServerCommandArgs args)
        {
            if (string.IsNullOrEmpty(content.RoomName))
            {
                throw new ArgumentException("RoomName");
            }

            if (string.Equals(content.RoomName, ServerModel.MainRoomName))
            {
                return;
            }

            using (var server = ServerModel.Get())
            {
                Room room;
                if (!TryGetRoom(server, content.RoomName, args.ConnectionId, out room))
                {
                    return;
                }

                if (!room.Users.Contains(args.ConnectionId))
                {
                    ServerModel.Api.SendSystemMessage(args.ConnectionId, SystemMessageId.RoomAccessDenied);
                    return;
                }

                var roomRefreshedContent = new ClientRoomRefreshedCommand.MessageContent
                {
                    Room  = room,
                    Users = ServerModel.Api.GetRoomUsers(server, room)
                };
                ServerModel.Server.SendMessage(args.ConnectionId, ClientRoomRefreshedCommand.CommandId, roomRefreshedContent);
            }
        }
Esempio n. 2
0
        public void Run(ServerCommandArgs args)
        {
            var receivedContent = Serializer.Deserialize <MessageContent>(args.Message);

            if (receivedContent.User == null)
            {
                throw new ArgumentNullException("User");
            }

            if (receivedContent.User.Nick == null)
            {
                throw new ArgumentNullException("User.Nick");
            }

            if (receivedContent.User.Nick.Contains(Connection.TempConnectionPrefix))
            {
                SendFail(args.ConnectionId, "Соединение не может быть зарегистрировано с таким ником. Выберите другой.");
                return;
            }

            using (var server = ServerModel.Get())
            {
                var room      = server.Rooms[ServerModel.MainRoomName];
                var userExist = room.Users.Any(nick => string.Equals(receivedContent.User.Nick, nick));

                if (userExist)
                {
                    SendFail(args.ConnectionId, "Соединение не может быть зарегистрировано с таким ником. Он занят.");
                    return;
                }
                else
                {
                    ServerModel.Logger.WriteInfo("User login: {0}", receivedContent.User.Nick);

                    server.Users.Add(receivedContent.User.Nick, receivedContent.User);
                    room.AddUser(receivedContent.User.Nick);

                    var regResponseContent = new ClientRegistrationResponseCommand.MessageContent {
                        Registered = true
                    };
                    ServerModel.Server.RegisterConnection(args.ConnectionId, receivedContent.User.Nick, receivedContent.OpenKey);
                    ServerModel.Server.SendMessage(receivedContent.User.Nick, ClientRegistrationResponseCommand.Id, regResponseContent);

                    var sendingContent = new ClientRoomRefreshedCommand.MessageContent
                    {
                        Room  = room,
                        Users = room.Users.Select(nick => server.Users[nick]).ToList()
                    };

                    foreach (var connectionId in room.Users)
                    {
                        ServerModel.Server.SendMessage(connectionId, ClientRoomRefreshedCommand.Id, sendingContent);
                    }

                    ServerModel.Notifier.Registered(new ServerRegistrationEventArgs {
                        Nick = receivedContent.User.Nick
                    });
                }
            }
        }
        protected override void OnRun(MessageContent content, CommandArgs args)
        {
            if (string.IsNullOrEmpty(content.RoomName))
            {
                throw new ArgumentException("content.RoomName");
            }

            using (var server = ServerModel.Get())
            {
                Room room;
                if (!TryGetRoom(server.Chat, content.RoomName, args.ConnectionId, out room))
                {
                    return;
                }

                if (!room.IsUserExist(args.ConnectionId))
                {
                    ServerModel.Api.Perform(new ServerSendSystemMessageAction(args.ConnectionId, SystemMessageId.RoomAccessDenied));
                    return;
                }

                var roomRefreshedContent = new ClientRoomRefreshedCommand.MessageContent
                {
                    Room  = room.ToDto(args.ConnectionId),
                    Users = server.Chat.GetRoomUserDtos(room.Name)
                };

                ServerModel.Server.SendMessage(args.ConnectionId, ClientRoomRefreshedCommand.CommandId, roomRefreshedContent);
            }
        }
Esempio n. 4
0
        protected override void OnRun(MessageContent content, ServerCommandArgs args)
        {
            if (string.IsNullOrEmpty(content.RoomName))
            {
                throw new ArgumentException("RoomName");
            }

            if (string.Equals(content.RoomName, ServerModel.MainRoomName))
            {
                return;
            }

            if (!RoomExists(content.RoomName, args.ConnectionId))
            {
                return;
            }

            using (var server = ServerModel.Get())
            {
                var room = server.Rooms[content.RoomName];

                if (!room.Users.Contains(args.ConnectionId))
                {
                    ServerModel.Api.SendSystemMessage(args.ConnectionId, MessageId.RoomAccessDenied);
                    return;
                }

                var roomRefreshedContent = new ClientRoomRefreshedCommand.MessageContent
                {
                    Room  = room,
                    Users = room.Users.Select(nick => server.Users[nick]).ToList()
                };
                ServerModel.Server.SendMessage(args.ConnectionId, ClientRoomRefreshedCommand.CommandId, roomRefreshedContent);
            }
        }
Esempio n. 5
0
        protected override void OnRun(MessageContent content, ServerCommandArgs args)
        {
            if (content.User == null)
            {
                throw new ArgumentNullException("User");
            }

            if (content.User.Nick == null)
            {
                throw new ArgumentNullException("User.Nick");
            }

            if (content.User.Nick.Contains(Connection.TempConnectionPrefix))
            {
                SendFail(args.ConnectionId, MessageId.NotRegisteredBadName);
                return;
            }

            using (var server = ServerModel.Get())
            {
                var room      = server.Rooms[ServerModel.MainRoomName];
                var userExist = room.Users.Any(nick => string.Equals(content.User.Nick, nick));

                if (userExist)
                {
                    SendFail(args.ConnectionId, MessageId.NotRegisteredNameAlreadyExist);
                    return;
                }
                else
                {
                    ServerModel.Logger.WriteInfo("User login: {0}", content.User.Nick);

                    server.Users.Add(content.User.Nick, content.User);
                    room.AddUser(content.User.Nick);

                    var regResponseContent = new ClientRegistrationResponseCommand.MessageContent {
                        Registered = true
                    };

                    ServerModel.Server.RegisterConnection(args.ConnectionId, content.User.Nick);
                    ServerModel.Server.SendMessage(content.User.Nick, ClientRegistrationResponseCommand.CommandId, regResponseContent);

                    var sendingContent = new ClientRoomRefreshedCommand.MessageContent
                    {
                        Room  = room,
                        Users = room.Users.Select(nick => server.Users[nick]).ToList()
                    };

                    foreach (var connectionId in room.Users)
                    {
                        ServerModel.Server.SendMessage(connectionId, ClientRoomRefreshedCommand.CommandId, sendingContent);
                    }

                    ServerModel.Notifier.Registered(new ServerRegistrationEventArgs {
                        Nick = content.User.Nick
                    });
                }
            }
        }
Esempio n. 6
0
        protected static void RefreshRoom(ServerContext server, Room room)
        {
            var roomRefreshedContent = new ClientRoomRefreshedCommand.MessageContent
              {
            Room = room,
            Users = room.Users.Select(nick => server.Users[nick]).ToList()
              };

              foreach (string user in room.Users)
            ServerModel.Server.SendMessage(user, ClientRoomRefreshedCommand.CommandId, roomRefreshedContent);
        }
Esempio n. 7
0
    public void Perform()
    {
      using (var server = ServerModel.Get())
      {
        var emptyRooms = new List<string>();
        foreach (var room in server.Chat.GetRooms())
        {
          if (!room.Users.Contains(_nick))
            continue;

          room.RemoveUser(_nick);

          if (room.Name != ServerChat.MainRoomName)
          {
            if (room.IsEmpty)
              emptyRooms.Add(room.Name);
            else
            {
              if (room.Admin == _nick)
              {
                room.Admin = room.Users.FirstOrDefault();
                if (room.Admin != null)
                  ServerModel.Api.Perform(new ServerSendSystemMessageAction(room.Admin, SystemMessageId.RoomAdminChanged, room.Name));
              }
            }
          }

          foreach (var userNick in room.Users)
          {
            var sendingContent = new ClientRoomRefreshedCommand.MessageContent
            {
              Room = room.ToDto(userNick),
              Users = server.Chat.GetRoomUserDtos(room.Name)
            };
            ServerModel.Server.SendMessage(userNick, ClientRoomRefreshedCommand.CommandId, sendingContent);
          }
        }

        // Remove all empty rooms
        foreach (var emptyRoomName in emptyRooms)
          server.Chat.RemoveRoom(emptyRoomName);

        // Removing user from chat after all rooms processing
        server.Chat.RemoveUser(_nick);
      }

      ServerModel.Notifier.ConnectionUnregistered(new ConnectionEventArgs(_nick));

      // Closing the connection after model clearing
      if (_removeConnection)
        ServerModel.Server.CloseConnection(_nick);
    }
Esempio n. 8
0
        /// <summary>
        /// Посылает команду обновления комнаты всем ее участникам.
        /// </summary>
        /// <param name="server">Контекст сервера.</param>
        /// <param name="room">Комната.</param>
        protected static void RefreshRoom(ServerContext server, Room room)
        {
            var roomRefreshedContent = new ClientRoomRefreshedCommand.MessageContent
            {
                Room  = room,
                Users = room.Users.Select(nick => server.Users[nick]).ToList()
            };

            foreach (string user in room.Users)
            {
                ServerModel.Server.SendMessage(user, ClientRoomRefreshedCommand.Id, roomRefreshedContent);
            }
        }
Esempio n. 9
0
        /// <summary>
        /// Удаляет пользователя и закрывает соединение с ним.
        /// </summary>
        /// <param name="nick">Ник пользователя, соединение котрого будет закрыто.</param>
        public void RemoveUser(string nick)
        {
            ServerModel.Server.CloseConnection(nick);

            using (var server = ServerModel.Get())
            {
                foreach (string roomName in server.Rooms.Keys)
                {
                    Room room = server.Rooms[roomName];

                    if (!room.Users.Contains(nick))
                    {
                        continue;
                    }

                    room.RemoveUser(nick);
                    server.Users.Remove(nick);

                    if (string.Equals(room.Admin, nick))
                    {
                        room.Admin = room.Users.FirstOrDefault();

                        if (room.Admin != null)
                        {
                            string message = string.Format("Вы назначены администратором комнаты {0}.", room.Name);
                            ServerModel.API.SendSystemMessage(room.Admin, message);
                        }
                    }

                    var sendingContent = new ClientRoomRefreshedCommand.MessageContent
                    {
                        Room  = room,
                        Users = room.Users.Select(n => server.Users[n]).ToList()
                    };

                    foreach (string user in room.Users)
                    {
                        if (user == null)
                        {
                            continue;
                        }

                        ServerModel.Server.SendMessage(user, ClientRoomRefreshedCommand.Id, sendingContent);
                    }
                }
            }

            ServerModel.Notifier.Unregistered(new ServerRegistrationEventArgs {
                Nick = nick
            });
        }
Esempio n. 10
0
        public void RemoveUser(string nick)
        {
            ServerModel.Server.CloseConnection(nick);

            using (var server = ServerModel.Get())
            {
                foreach (string roomName in server.Rooms.Keys)
                {
                    var room = server.Rooms[roomName];
                    if (!room.Users.Contains(nick))
                    {
                        continue;
                    }

                    room.RemoveUser(nick);
                    server.Users.Remove(nick);

                    if (string.Equals(room.Admin, nick))
                    {
                        room.Admin = room.Users.FirstOrDefault();
                        if (room.Admin != null)
                        {
                            ServerModel.Api.SendSystemMessage(room.Admin, MessageId.RoomAdminChanged, room.Name);
                        }
                    }

                    var sendingContent = new ClientRoomRefreshedCommand.MessageContent
                    {
                        Room  = room,
                        Users = room.Users.Select(n => server.Users[n]).ToList()
                    };

                    foreach (string user in room.Users)
                    {
                        if (user == null)
                        {
                            continue;
                        }

                        ServerModel.Server.SendMessage(user, ClientRoomRefreshedCommand.CommandId, sendingContent);
                    }
                }
            }

            ServerModel.Notifier.Unregistered(new ServerRegistrationEventArgs {
                Nick = nick
            });
        }
Esempio n. 11
0
        private void SendRefresh(string userNick, Room room, List <User> users)
        {
            var messageContent = new ClientRoomRefreshedCommand.MessageContent
            {
                Room  = room,
                Users = users
            };

            foreach (var nick in room.Users)
            {
                if (nick == userNick)
                {
                    continue;
                }

                ServerModel.Server.SendMessage(nick, ClientRoomRefreshedCommand.CommandId, messageContent);
            }
        }
Esempio n. 12
0
        private void SendRefresh(UserId userId, Room room, UserDto[] users)
        {
            foreach (var currentId in room.Users)
            {
                if (currentId == userId)
                {
                    continue;
                }

                var messageContent = new ClientRoomRefreshedCommand.MessageContent
                {
                    Room  = room.ToDto(currentId),
                    Users = users
                };

                ServerModel.Server.SendMessage(currentId, ClientRoomRefreshedCommand.CommandId, messageContent);
            }
        }
Esempio n. 13
0
        public void RemoveUser(string nick)
        {
            using (var server = ServerModel.Get())
            {
                foreach (var room in server.Rooms.Values)
                {
                    if (!room.Users.Contains(nick))
                    {
                        continue;
                    }

                    room.RemoveUser(nick);

                    if (room.Admin == nick)
                    {
                        room.Admin = room.Users.FirstOrDefault();
                        if (room.Admin != null)
                        {
                            ServerModel.Api.SendSystemMessage(room.Admin, SystemMessageId.RoomAdminChanged, room.Name);
                        }
                    }

                    var sendingContent = new ClientRoomRefreshedCommand.MessageContent
                    {
                        Room  = room,
                        Users = GetRoomUsers(server, room)
                    };

                    foreach (var user in room.Users)
                    {
                        ServerModel.Server.SendMessage(user, ClientRoomRefreshedCommand.CommandId, sendingContent);
                    }
                }

                // Removing user from model after all rooms
                server.Users.Remove(nick);
            }

            // Closing the connection after model clearing
            ServerModel.Server.CloseConnection(nick);
            ServerModel.Notifier.Unregistered(new ServerRegistrationEventArgs {
                Nick = nick
            });
        }
Esempio n. 14
0
        public void Run(ServerCommandArgs args)
        {
            var receivedContent = Serializer.Deserialize <MessageContent>(args.Message);

            if (string.IsNullOrEmpty(receivedContent.RoomName))
            {
                throw new ArgumentException("RoomName");
            }

            if (string.Equals(receivedContent.RoomName, ServerModel.MainRoomName))
            {
                return;
            }

            if (!RoomExists(receivedContent.RoomName, args.ConnectionId))
            {
                return;
            }

            using (var server = ServerModel.Get())
            {
                var room = server.Rooms[receivedContent.RoomName];

                if (!room.Users.Contains(args.ConnectionId))
                {
                    ServerModel.API.SendSystemMessage(args.ConnectionId, "Вы не входите в состав этой комнаты.");
                    return;
                }

                var roomRefreshedContent = new ClientRoomRefreshedCommand.MessageContent
                {
                    Room  = room,
                    Users = room.Users.Select(nick => server.Users[nick]).ToList()
                };
                ServerModel.Server.SendMessage(args.ConnectionId, ClientRoomRefreshedCommand.Id, roomRefreshedContent);
            }
        }
Esempio n. 15
0
        protected override void OnRun(MessageContent content, CommandArgs args)
        {
            if (string.IsNullOrEmpty(content.RoomName))
            {
                throw new ArgumentException(nameof(content.RoomName));
            }

            if (content.Users == null)
            {
                throw new ArgumentNullException(nameof(content.Users));
            }

            if (content.RoomName == ServerChat.MainRoomName)
            {
                ServerModel.Api.Perform(new ServerSendSystemMessageAction(args.ConnectionId, SystemMessageId.RoomItsMainRoom));
                return;
            }

            using (var server = ServerModel.Get())
            {
                if (!TryGetRoom(server.Chat, content.RoomName, args.ConnectionId, out Room room))
                {
                    return;
                }

                if (!room.Admin.Equals(args.ConnectionId))
                {
                    ServerModel.Api.Perform(new ServerSendSystemMessageAction(args.ConnectionId, SystemMessageId.RoomAccessDenied));
                    return;
                }

                var invitedUsers = new HashSet <UserId>();
                foreach (var userId in content.Users)
                {
                    if (room.IsUserExist(userId))
                    {
                        continue;
                    }

                    room.AddUser(userId);
                    invitedUsers.Add(userId);
                }

                var users = server.Chat.GetRoomUserDtos(room.Name);
                foreach (var userId in room.Users)
                {
                    var roomDto = room.ToDto(userId);

                    if (invitedUsers.Contains(userId))
                    {
                        var roomOpenContent = new ClientRoomOpenedCommand.MessageContent
                        {
                            Room  = roomDto,
                            Users = users
                        };

                        ServerModel.Server.SendMessage(userId, ClientRoomOpenedCommand.CommandId, roomOpenContent);
                    }
                    else
                    {
                        var roomRefreshContent = new ClientRoomRefreshedCommand.MessageContent
                        {
                            Room  = roomDto,
                            Users = users
                        };

                        ServerModel.Server.SendMessage(userId, ClientRoomRefreshedCommand.CommandId, roomRefreshContent);
                    }
                }
            }
        }
Esempio n. 16
0
        public void Run(ServerCommandArgs args)
        {
            var receivedContent = Serializer.Deserialize <MessageContent>(args.Message);

            if (string.IsNullOrEmpty(receivedContent.RoomName))
            {
                throw new ArgumentException("RoomName");
            }

            if (receivedContent.Users == null)
            {
                throw new ArgumentNullException("Users");
            }

            if (string.Equals(receivedContent.RoomName, ServerModel.MainRoomName))
            {
                ServerModel.API.SendSystemMessage(args.ConnectionId, "Невозможно пригласить пользователей в основную комнату. Они и так все здесь.");
                return;
            }

            if (!RoomExists(receivedContent.RoomName, args.ConnectionId))
            {
                return;
            }

            using (var server = ServerModel.Get())
            {
                var room = server.Rooms[receivedContent.RoomName];

                if (!room.Admin.Equals(args.ConnectionId))
                {
                    ServerModel.API.SendSystemMessage(args.ConnectionId, "Вы не являетесь администратором комнаты. Операция отменена.");
                    return;
                }

                var invitedUsers = new List <User>();
                foreach (var user in receivedContent.Users)
                {
                    if (room.Users.Contains(user.Nick))
                    {
                        continue;
                    }

                    room.AddUser(user.Nick);
                    invitedUsers.Add(user);
                }

                var users           = room.Users.Select(nick => server.Users[nick]).ToList();
                var roomOpenContent = new ClientRoomOpenedCommand.MessageContent
                {
                    Room  = room,
                    Type  = room is VoiceRoom ? RoomType.Voice : RoomType.Chat,
                    Users = users
                };

                var roomRefreshContent = new ClientRoomRefreshedCommand.MessageContent
                {
                    Room  = room,
                    Users = users
                };

                foreach (var user in room.Users)
                {
                    if (invitedUsers.Contains(server.Users[user]))
                    {
                        ServerModel.Server.SendMessage(user, ClientRoomOpenedCommand.Id, roomOpenContent);
                    }
                    else
                    {
                        ServerModel.Server.SendMessage(user, ClientRoomRefreshedCommand.Id, roomRefreshContent);
                    }
                }
            }
        }
Esempio n. 17
0
        protected override void OnRun(MessageContent content, ServerCommandArgs args)
        {
            if (string.IsNullOrEmpty(content.RoomName))
            {
                throw new ArgumentException("RoomName");
            }

            if (content.Users == null)
            {
                throw new ArgumentNullException("Users");
            }

            if (string.Equals(content.RoomName, ServerModel.MainRoomName))
            {
                ServerModel.Api.SendSystemMessage(args.ConnectionId, MessageId.RoomItsMainRoom);
                return;
            }

            if (!RoomExists(content.RoomName, args.ConnectionId))
            {
                return;
            }

            using (var server = ServerModel.Get())
            {
                var room = server.Rooms[content.RoomName];

                if (!room.Admin.Equals(args.ConnectionId))
                {
                    ServerModel.Api.SendSystemMessage(args.ConnectionId, MessageId.RoomAccessDenied);
                    return;
                }

                var invitedUsers = new HashSet <string>();
                foreach (var user in content.Users)
                {
                    if (room.ContainsUser(user.Nick))
                    {
                        continue;
                    }

                    room.AddUser(user.Nick);
                    invitedUsers.Add(user.Nick);
                }

                var users = room.Users
                            .Select(nick => server.Users[nick])
                            .ToList();

                var roomOpenContent = new ClientRoomOpenedCommand.MessageContent
                {
                    Room  = room,
                    Type  = room is VoiceRoom ? RoomType.Voice : RoomType.Chat,
                    Users = users
                };

                var roomRefreshContent = new ClientRoomRefreshedCommand.MessageContent
                {
                    Room  = room,
                    Users = users
                };

                foreach (var userId in room.Users)
                {
                    if (invitedUsers.Contains(userId))
                    {
                        ServerModel.Server.SendMessage(userId, ClientRoomOpenedCommand.CommandId, roomOpenContent);
                    }
                    else
                    {
                        ServerModel.Server.SendMessage(userId, ClientRoomRefreshedCommand.CommandId, roomRefreshContent);
                    }
                }
            }
        }
Esempio n. 18
0
        /// <summary>
        /// Удаляет пользователя и закрывает соединение с ним.
        /// </summary>
        /// <param name="nick">Ник пользователя, соединение котрого будет закрыто.</param>
        public void RemoveUser(string nick)
        {
            ServerModel.Server.CloseConnection(nick);

              using (var server = ServerModel.Get())
              {
            foreach (string roomName in server.Rooms.Keys)
            {
              Room room = server.Rooms[roomName];

              if (!room.Users.Contains(nick))
            continue;

              room.RemoveUser(nick);
              server.Users.Remove(nick);

              if (string.Equals(room.Admin, nick))
              {
            room.Admin = room.Users.FirstOrDefault();

            if (room.Admin != null)
            {
              string message = string.Format("Вы назначены администратором комнаты {0}.", room.Name);
              ServerModel.API.SendSystemMessage(room.Admin, message);
            }
              }

              var sendingContent = new ClientRoomRefreshedCommand.MessageContent
              {
            Room = room,
            Users = room.Users.Select(n => server.Users[n]).ToList()
              };

              foreach (string user in room.Users)
              {
            if (user == null)
              continue;

            ServerModel.Server.SendMessage(user, ClientRoomRefreshedCommand.Id, sendingContent);
              }
            }
              }

              ServerModel.Notifier.Unregistered(new ServerRegistrationEventArgs { Nick = nick });
        }
Esempio n. 19
0
        protected override void OnRun(MessageContent content, ServerCommandArgs args)
        {
            if (string.IsNullOrEmpty(content.RoomName))
            {
                throw new ArgumentException("RoomName");
            }

            if (content.Users == null)
            {
                throw new ArgumentNullException("Users");
            }

            if (string.Equals(content.RoomName, ServerModel.MainRoomName))
            {
                ServerModel.Api.SendSystemMessage(args.ConnectionId, SystemMessageId.RoomItsMainRoom);
                return;
            }

            using (var server = ServerModel.Get())
            {
                Room room;
                if (!TryGetRoom(server, content.RoomName, args.ConnectionId, out room))
                {
                    return;
                }

                if (!room.Admin.Equals(args.ConnectionId))
                {
                    ServerModel.Api.SendSystemMessage(args.ConnectionId, SystemMessageId.RoomAccessDenied);
                    return;
                }

                var invitedUsers = new HashSet <string>();
                foreach (var userNick in content.Users)
                {
                    if (room.ContainsUser(userNick))
                    {
                        continue;
                    }

                    room.AddUser(userNick);
                    invitedUsers.Add(userNick);
                }

                var users = ServerModel.Api.GetRoomUsers(server, room);

                var roomOpenContent = new ClientRoomOpenedCommand.MessageContent
                {
                    Room  = room,
                    Type  = room.Type,
                    Users = users
                };

                var roomRefreshContent = new ClientRoomRefreshedCommand.MessageContent
                {
                    Room  = room,
                    Users = users
                };

                foreach (var userId in room.Users)
                {
                    if (invitedUsers.Contains(userId))
                    {
                        ServerModel.Server.SendMessage(userId, ClientRoomOpenedCommand.CommandId, roomOpenContent);
                    }
                    else
                    {
                        ServerModel.Server.SendMessage(userId, ClientRoomRefreshedCommand.CommandId, roomRefreshContent);
                    }
                }
            }
        }