public void DisableClient(ConnectedUser user) { ConnectedUsers.Remove(user); user?.TcpClient?.Close(); SendMessageToAllUsersAsync(null, $"{user.Login} отключился от сервера"); DisplayColoredText($"Соеденение с пользователем {user.Login} разорвано", ConsoleColor.Red); }
private void Autorization(string inputLogin, string inputPassword, TcpClient client) { DisplayColoredText($"Пользователь {inputLogin} пытается войти", ConsoleColor.Yellow); using var Database = new DarkChatDbContext(); User user = Database.Users.FirstOrDefault(u => u.Login == inputLogin); if (user?.Login == inputLogin && VerifyHashedPassword(user.Password, inputPassword))//проверка данных пользователя { //TODO: Реализовать нормальную проверку есть ли уже этот пользователь на сервере или его нету bool userIsPresentOnTheServer = ConnectedUsers.Any(u => u.Login == inputLogin); if (userIsPresentOnTheServer == false) { SendResponce("success", client); DisplayColoredText($"Пользователь {user.Login} идентифицирован", ConsoleColor.Green); SendMessageToAllUsersAsync(null, $"Пользователь {user.Login} вошел на сервер"); ConnectedUser connectedUser = new ConnectedUser(user, client); ConnectedUsers.Add(connectedUser); ListenMessageFromUserAsync(connectedUser); } else { SendResponce("Fail: Такой аккаунт уже присутствует на сервере", client); DisplayColoredText($"Warning! Произошла попытка входа на один аккаунт с двух разных клиентов, на аккаунт пользователя под именем {inputLogin}" , ConsoleColor.Red); } } else { SendResponce("Fail: Неверные данные авторизации", client); DisplayColoredText($"Пользователь {inputLogin} не идентифицирован", ConsoleColor.Red); } }
async private void SendMessageToAllUsersAsync(ConnectedUser sender, string message) { await Task.Run(() => { string resultMessage = $"[{DateTime.Now}] {sender?.Login}: {message}"; //TODO: Тут подумать про то что мы можем изменять изменять сообзения по хотению DisplayColoredText(resultMessage, ConsoleColor.White); foreach (var user in ConnectedUsers)//TODO:Тут была сомнительная проверка if (user.TcpClient.Connected) { SendResponce(resultMessage, user.TcpClient); } }); }
async private void ListenMessageFromUserAsync(ConnectedUser user) { await Task.Run(() => { while (true) { string message = GetDataFromClient(user.TcpClient); //метод GetDataFromClient в случай ошибки отключит пользователя от сервера if (message == string.Empty) { ConnectedUsers.Remove(user); return; } SendMessageToAllUsersAsync(sender: user, message); Thread.Sleep(400); } }); }