Esempio n. 1
0
        public void Execute(Server server, TcpClient client, IMessage message)
        {
            DisconnectMessage disconnectMessage = message as DisconnectMessage;

            User user = server.GetUsers().Find(u => u.SessionIds.Contains(disconnectMessage.SessionId));

            if (user != null)
            {
                user.SessionIds.Remove(disconnectMessage.SessionId);
                server.RemoveClient(client);

                if (user.SessionIds.Count == 0)
                {
                    // Send user count to all clients (broadcast)
                    UserCountMessage userCountMessage = new UserCountMessage
                    {
                        UserCount       = server.GetUsers().Count,
                        UserOnlineCount = server.GetUsers().Count(u => u.SessionIds.Count > 0)
                    };

                    string userCountMessageJson  = JsonSerializer.Serialize(userCountMessage);
                    byte[] userCountMessageBytes = System.Text.Encoding.UTF8.GetBytes(userCountMessageJson);

                    foreach (TcpClient remoteClient in server.GetClients())
                    {
                        remoteClient.GetStream().Write(userCountMessageBytes, 0, userCountMessageBytes.Length);
                    }
                }
            }
        }
        public void Execute(Server server, TcpClient client, IMessage message)
        {
            var connectMessage = message as ConnectMessage;

            bool authenticatedServerPassword = true;

            if (server.HasPassword())
            {
                authenticatedServerPassword = server.CheckPassword(connectMessage.ServerPassword);
            }

            var  user = server.GetUsers().Find(u => u.Username == connectMessage.Username && u.Password == connectMessage.Password);
            bool authenticatedUser = (user != null);

            bool authenticated          = authenticatedServerPassword && authenticatedUser;
            var  connectResponseMessage = new ConnectResponseMessage();

            if (authenticated)
            {
                string sessionId = Guid.NewGuid().ToString();
                user.SessionIds.Add(sessionId);
                connectResponseMessage.SessionId = sessionId;
                server.AddClient(client);
                Console.WriteLine("Client connected.");

                if (user.SessionIds.Count == 1)
                {
                    // Send user count to all clients (broadcast)
                    UserCountMessage userCountMessage = new UserCountMessage
                    {
                        UserCount       = server.GetUsers().Count,
                        UserOnlineCount = server.GetUsers().Count(u => u.SessionIds.Count > 0),
                        UserNames       = server.GetOnlineUserNames()
                    };

                    string userCountMessageJson  = JsonSerializer.Serialize(userCountMessage);
                    byte[] userCountMessageBytes = System.Text.Encoding.UTF8.GetBytes(userCountMessageJson);

                    foreach (TcpClient remoteClient in server.GetClients())
                    {
                        remoteClient.GetStream().Write(userCountMessageBytes, 0, userCountMessageBytes.Length);
                    }
                }
            }

            connectResponseMessage.Success = authenticated;

            string json = JsonSerializer.Serialize(connectResponseMessage);

            byte[] msg = System.Text.Encoding.UTF8.GetBytes(json);
            client.GetStream().Write(msg, 0, msg.Length);
        }
        public void Execute(TcpClient client, IMessage message)
        {
            UserCountMessage userCountMessage = message as UserCountMessage;
            StringBuilder    sb = new StringBuilder();

            foreach (string username in userCountMessage.UserNames)
            {
                if (username != null)
                {
                    sb.Append($"\"{username}\" ");
                }
            }
            string usernames = sb.ToString();

            Console.WriteLine($"Online users: {usernames} ");
            Console.WriteLine($"Total (online / sum): {userCountMessage.UserOnlineCount} / " +
                              $"{userCountMessage.UserCount}");
        }
        public void Execute(Server server, TcpClient client, IMessage message)
        {
            RegisterMessage registerMessage = message as RegisterMessage;

            User test = server.GetUsers().Find(u => u.Username == registerMessage.Username);

            RegisterResponseMessage registerResponseMessage = new RegisterResponseMessage
            {
                Success = false
            };

            bool authenticatedServerPassword = true;

            if (server.HasPassword())
            {
                authenticatedServerPassword = server.CheckPassword(registerMessage.ServerPassword);
            }

            if (authenticatedServerPassword)
            {
                if (!IsValid(server, registerMessage.Username, registerMessage.Password))
                {
                    registerResponseMessage.Content = errorMessage;
                }
                else
                {
                    //int id = server.GetUsers().OrderBy(u => u.Id).Last().Id + 1;

                    User user = new User
                    {
                        Id         = server.GetNextUserId(),
                        Username   = registerMessage.Username.Trim(),
                        Password   = registerMessage.Password,
                        SessionIds = new List <string>(),
                        tcpClients = new List <TcpClient>()
                    };

                    server.AddUser(user);

                    user.tcpClients.Add(client);

                    server.SaveUsers();

                    registerResponseMessage.Content = "New User created";

                    string sessionId = Guid.NewGuid().ToString();
                    user.SessionIds.Add(sessionId);
                    registerResponseMessage.SessionId = sessionId;
                    server.AddClient(client);

                    UserCountMessage userCountMessage = new UserCountMessage
                    {
                        UserCount       = server.GetUsers().Count,
                        UserOnlineCount = server.GetUsers().Count(u => u.SessionIds.Count > 0)
                    };

                    string userCountMessageJson  = JsonSerializer.Serialize(userCountMessage);
                    byte[] userCountMessageBytes = System.Text.Encoding.UTF8.GetBytes(userCountMessageJson);

                    UserListRequestMessage userListRequestMessage = message as UserListRequestMessage;

                    var    query        = from u in server.GetUsers() select new { u.Id, u.Username };
                    var    userList     = query.ToList();
                    string userListJson = JsonSerializer.Serialize(userList);
                    UserListResponseMessage userListResponseMessage = new UserListResponseMessage
                    {
                        UserListJson = userListJson
                    };

                    string messageJson = JsonSerializer.Serialize(userListResponseMessage);
                    byte[] byteMessage = Encoding.UTF8.GetBytes(messageJson);

                    foreach (TcpClient remoteClient in server.GetClients())
                    {
                        if (remoteClient != client)
                        {
                            remoteClient.GetStream().Write(byteMessage, 0, byteMessage.Length);
                        }
                        remoteClient.GetStream().Write(userCountMessageBytes, 0, userCountMessageBytes.Length);
                    }
                }
            }
            bool authenticated = IsValid(server, registerMessage.Username, registerMessage.Password) && authenticatedServerPassword;

            registerResponseMessage.Success = authenticated;
            string json_response = JsonSerializer.Serialize(registerResponseMessage);

            byte[] msg = System.Text.Encoding.UTF8.GetBytes(json_response);

            client.GetStream().Write(msg, 0, msg.Length);
        }
Esempio n. 5
0
        public void Execute(Server server, TcpClient client, IMessage message)
        {
            var registrationMessage = message as RegistrationMessage;

            bool authenticatedServerPassword = true;

            if (server.HasPassword())
            {
                authenticatedServerPassword = server.CheckPassword(registrationMessage.ServerPassword);
            }
            var tmpUserList = server.GetUsers();
            int newId       = (tmpUserList.Select(x => x.Id).Max()) + 1;
            var user        = new User()
            {
                Username = registrationMessage.Username,
                Password = registrationMessage.Password,
                Id       = newId
            };

            server.AddUsers(user);
            string userJson = JsonSerializer.Serialize(server.GetUsers());

            File.WriteAllText("users.json", userJson);
            bool authenticatedUser = true;

            bool authenticated = authenticatedServerPassword && authenticatedUser;
            ConnectResponseMessage connectResponseMessage = new ConnectResponseMessage();

            if (authenticated)
            {
                string sessionId = Guid.NewGuid().ToString();
                user.SessionIds.Add(sessionId);
                connectResponseMessage.SessionId = sessionId;
                server.AddClient(client);
                Console.WriteLine("Client connected.");

                if (user.SessionIds.Count == 1)
                {
                    // Send user count to all clients (broadcast)
                    UserCountMessage userCountMessage = new UserCountMessage
                    {
                        UserCount       = server.GetUsers().Count,
                        UserOnlineCount = server.GetUsers().Count(u => u.SessionIds.Count > 0),
                        UserNames       = server.GetOnlineUserNames()
                    };

                    string userCountMessageJson  = JsonSerializer.Serialize(userCountMessage);
                    byte[] userCountMessageBytes = System.Text.Encoding.UTF8.GetBytes(userCountMessageJson);

                    foreach (TcpClient remoteClient in server.GetClients())
                    {
                        remoteClient.GetStream().Write(userCountMessageBytes, 0, userCountMessageBytes.Length);
                    }
                }
            }

            connectResponseMessage.Success = authenticated;

            string json = JsonSerializer.Serialize(connectResponseMessage);

            byte[] msg = System.Text.Encoding.UTF8.GetBytes(json);
            client.GetStream().Write(msg, 0, msg.Length);

            var registrationResponseMessage = new RegistrationResponseMessage();

            foreach (User usr in server.GetUsers())
            {
                registrationResponseMessage.Users.Add(new ChatProtocol.User(usr.Id, usr.Username));
            }

            string jsonReg = JsonSerializer.Serialize(registrationResponseMessage);

            byte[] regMsg = System.Text.Encoding.UTF8.GetBytes(jsonReg);
            client.GetStream().Write(regMsg, 0, regMsg.Length);
        }
Esempio n. 6
0
        public void Execute(TcpClient client, IMessage message)
        {
            UserCountMessage userCountMessage = message as UserCountMessage;

            Console.WriteLine($"Users (online / sum): {userCountMessage.UserOnlineCount} / {userCountMessage.UserCount}");
        }
        public void Execute(Server server, TcpClient client, IMessage message)
        {
            var connectMessage = message as ConnectMessage;

            var authenticatedServerPassword = true;

            if (server.HasPassword())
            {
                authenticatedServerPassword = server.CheckPassword(connectMessage.ServerPassword);
            }

            var user = server.GetUsers().Find(u => u.Username == connectMessage.ClientUsername && u.Password == connectMessage.ClientPassword);
            var authenticatedUser = (user != null);

            var authenticated          = authenticatedServerPassword && authenticatedUser;
            var connectResponseMessage = new ConnectResponseMessage();

            if (authenticated)
            {
                var sessionId = Guid.NewGuid().ToString();
                user.SessionIds.Add(sessionId);
                user.Clients.Add(client);
                connectResponseMessage.SessionId = sessionId;
                server.AddClient(client);
                Console.WriteLine("Client connected.");
                if (user.SessionIds.Count == 1)
                {
                    // Send user count to all clients (broadcast)
                    var userCountMessage = new UserCountMessage
                    {
                        UserCount       = server.GetUsers().Count,
                        UserOnlineCount = server.GetUsers().Count(u => u.SessionIds.Count > 0),
                    };

                    var userCountMessageJson  = JsonSerializer.Serialize(userCountMessage);
                    var userCountMessageBytes = System.Text.Encoding.UTF8.GetBytes(userCountMessageJson);

                    foreach (TcpClient remoteClient in server.GetClients())
                    {
                        remoteClient.GetStream().Write(userCountMessageBytes, 0, userCountMessageBytes.Length);
                    }
                    Thread.Sleep(50);
                }
            }

            connectResponseMessage.Success = authenticated;

            var json = JsonSerializer.Serialize(connectResponseMessage);
            var msg  = System.Text.Encoding.UTF8.GetBytes(json);

            client.GetStream().Write(msg, 0, msg.Length);

            /*List<DirectChatMessage> messageList = server.GetMessages();
             * if (messageList != null)
             * {
             *  foreach (var savedMessage in messageList)
             *  {
             *      if (savedMessage.ToUserId == user.Id)
             *      {
             *          var directChatMessage = savedMessage;
             *          directChatMessage.SessionId = null;
             *          var directChatJson = JsonSerializer.Serialize(directChatMessage);
             *          var chatMsg = System.Text.Encoding.UTF8.GetBytes(directChatJson);
             *          client.GetStream().Write(chatMsg, 0, chatMsg.Length);
             *      }
             *  }
             * }*/
        }