private static void MessagesMain(string text, Data.ClientConnectOnly clientinfo)//Отправка сообщения в общий чат { WriteLine($"Сообщение в общий чат: {text}", ConsoleColor.Green); byte[] buffer = new byte[1024]; //%MME - Получение сообщение в общий чат buffer = Encoding.UTF8.GetBytes($"%MME:{text}:{clientinfo.Nick}:{clientinfo.ID}"); foreach (Data.ClientConnectOnly client in Data.ClientsOnlyData) { try { client.ClientSocket.Client.Send(buffer); } catch { WriteLine($"Ошибка клиента: {client.Nick}, {client.Email}", ConsoleColor.Red); client.ClientSocket.Close(); Data.ClientsOnlyData.Remove(client); } } }
private static void CheckNewConnect(object i)//Проверка нового подключения { WriteLine("Новое подключение!", ConsoleColor.Green); byte[] buffer = new byte[4098]; TcpClient client = (TcpClient)i; //NetworkStream networkClient = client.GetStream(); //Task.Delay(30).Wait();//Ждём отправки сообщения //int messi = networkClient.Read(buffer, 0, buffer.Length); int messi = client.Client.Receive(buffer); Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, messi)); Task.Delay(100).Wait(); //Провека проги try { if (Encoding.UTF8.GetString(buffer, 0, messi) != "TCPCHAT 1.0")//!!! { WriteLine("Ошибка: Cтарый или другой клиент!", ConsoleColor.Red); client.Close(); return;//Проверить! (Готово) } } catch { WriteLine("Ошибка! Клиент!", ConsoleColor.Red); client.Close(); return; } //Команды Task.Delay(10).Wait(); linkCommand: Task.Delay(100).Wait(); //messi = client.Receive(buffer); try { messi = client.Client.Receive(buffer); } catch { WriteLine("Клиент " + ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString() + " отключён.", ConsoleColor.Yellow); return; } string answer = Encoding.UTF8.GetString(buffer, 0, messi); WriteLine("Проверка нового подклюение...", ConsoleColor.Yellow); if (answer.Contains("%REG"))//регистрация { //email Match regex = Regex.Match(answer, "%REG:(.*):(.*):(.*):(.*)");//Антон! string email = regex.Groups[1].Value; //string email = answer. //TODO: Сделать проверку email через подтверждение (Нужен smtp сервер) //пароль string pValue = regex.Groups[2].Value; if (pValue.Length > 64 || pValue.Length < 4) { return; //Фикс длинных/коротких паролей } string passworld = SHA256(pValue); //Фикс CWE-257 Console.WriteLine(passworld); //Nick string nick = regex.Groups[3].Value; Console.WriteLine(nick); //Аватарка int avatar = int.Parse(regex.Groups[4].Value); //Проверка bool checkNewAccount = Database.CheckClientEmail(email); //Если true, то email такой есть if (checkNewAccount)//!!! { Console.WriteLine("0"); client.Client.Send(Encoding.UTF8.GetBytes("%REGWRONGEMAIL")); goto linkCommand; } else { Console.WriteLine("1"); Settings set = (Settings)Data.Settings; set.LastIdUser = Database.GetLastIdAccount() + 1; Database.AccountAdd(email, passworld, nick, set.LastIdUser, avatar, false); client.Client.Send(Encoding.UTF8.GetBytes("%REGOD")); WriteLine($"Новый аккаунт! {email}, {passworld}", ConsoleColor.Green); Data.Settings = set; SettingsManager.Save(); //Проверка подтверждения //1 - есть подтверждение, 0 - нет (Но злой Антон всё переделал :) ) messi = client.Client.Receive(buffer); answer = Encoding.UTF8.GetString(buffer, 0, messi); if (answer == "1") { CheckDataConfirm: //email regex = Regex.Match(answer, "%LOG:(.*):(.*)");//Антон! string emailCheck = regex.Groups[1].Value; //пароль string passworldCheck = regex.Groups[2].Value; //Проверка //1 - успешно, 0 - не успешно if (emailCheck != email) { ErrorConfirmData(client, email, passworld); goto CheckDataConfirm; } else if (passworldCheck != passworld) { ErrorConfirmData(client, email, passworld); goto CheckDataConfirm; } else { client.Client.Send(Encoding.UTF8.GetBytes("1")); } } return; } } else if (answer.Contains("%LOG"))//Вход { //email answer = Encoding.UTF8.GetString(buffer, 0, messi); Match regex = Regex.Match(answer, "%LOG:(.*):(.*)");//Антон! string email = regex.Groups[1].Value; Console.WriteLine(email); //пароль string passworld = regex.Groups[2].Value; Console.WriteLine(passworld); //Проверка email bool checkClient = Database.CheckClientEmail(email); if (!checkClient) { //networkClient.Write(Encoding.UTF8.GetBytes("0"), 0, buffer.Length); client.Client.Send(Encoding.UTF8.GetBytes("%LOGWRONGEMAIL"));// False WriteLine("Неправильный email!", ConsoleColor.Red); goto linkCommand; } else { //Проверка пароля bool checkPassworld = Database.CheckClientPassworld(passworld); if (!checkPassworld)//!!! { Console.WriteLine("%LOGWRONGEPASS"); client.Client.Send(Encoding.UTF8.GetBytes("%LOGWRONGEPASS")); WriteLine($"Неправильный пароли в {email}!", ConsoleColor.Red); goto linkCommand; } else { Console.WriteLine("%LOGOD"); client.Client.Send(Encoding.UTF8.GetBytes("%LOGOD")); //Инцилизация! Data.ClientConnectOnly onlyClient = new Data.ClientConnectOnly(client, Database.GetNickClient(email), email, passworld, Database.GetIdClient(email), Data.UserAvatar.Avatar1, false);//TODO Data.ClientsOnlyData.Add(onlyClient); Console.WriteLine($"{onlyClient.Email} {onlyClient.ID} {onlyClient.Nick} " + $"{onlyClient.Passworld}"); Thread thread = new Thread(new ParameterizedThreadStart(MessagesClient)) { IsBackground = true }; thread.Start(onlyClient); WriteLine($"Вход аккаунт! {email}, {passworld}", ConsoleColor.Green); return; } } } }
private static void MessagesClient(object i)//Команды от клиента { Data.ClientConnectOnly onlyClient = (Data.ClientConnectOnly)i; byte[] buffer = new byte[1024]; int messi; string answer; while (true) { Task.Delay(10).Wait(); linkStartListenCommand: try { //Пример: %MES:Hello! (Ник мы уже знаем) messi = onlyClient.ClientSocket.Client.Receive(buffer); answer = Encoding.UTF8.GetString(buffer, 0, messi); WriteLine($"Получена команда {answer} от {onlyClient.Nick}:{onlyClient.ID}", ConsoleColor.Green); } catch (Exception ex) { onlyClient.ClientSocket.Close(); Data.ClientsOnlyData.Remove(onlyClient); WriteLine($"Клиент вышел: {ex.Message}", ConsoleColor.Red); return; } if (answer.Contains("%MES"))//Для общего чата (отправка сообщения) { try { Match regex = Regex.Match(answer, "%MES:(.*)"); string messagesText = regex.Groups[1].Value; //Сама отправка сообщения MessagesMain(messagesText, onlyClient); //Добавление в базу данных Database.AddMessageInMainChat(messagesText, onlyClient.ID); } catch { WriteLine($"Ошибка отправки сообщение в общий чат от {onlyClient.ID}", ConsoleColor.Red); return; } } else if (answer.Contains("%NCT"))//Новый чат { //%NCT:idUser try { Match regex = Regex.Match(answer, "%NCT:(.*)"); Database.CreateNewDialog(onlyClient.ID, long.Parse(regex.Groups[1].Value)); onlyClient.ClientSocket.Client.Send(Encoding.UTF8.GetBytes("1")); WriteLine("Готово!", ConsoleColor.Green); } catch { WriteLine($"Ошибка при %NCT от {onlyClient.ID}:{onlyClient.Nick}", ConsoleColor.Red); return; } } else if (answer.Contains("%MSE"))//Для отдельного чата (отправка) { Match regex = Regex.Match(answer, "%MSE:(.*):(.*)"); //id чата long idChat = long.Parse(regex.Groups[1].Value); //Сообщение string mess = regex.Groups[2].Value; //Обработка //Есть такой чат? var set = (Settings)Data.Settings; bool yesChat = false; foreach (Data.IMessageInfoChat chatInfo in set.MessageInfoChats) { if (chatInfo.ID == idChat) { yesChat = true; } } try { if (!yesChat) { WriteLine($"Есть такой чат! %MSE:{onlyClient.ID}", ConsoleColor.Red); } else { //Сама отправка сообщение //Если клиент онлайн, то отправляем нему что есть новое сообщение //Поиск чата Data.IMessageInfoChat infoChat = new Data.IMessageInfoChat(null); foreach (Data.IMessageInfoChat messageInfo in set.MessageInfoChats) { if (messageInfo.ID == idChat) { infoChat = messageInfo; } } if (infoChat.NameTable == null) { onlyClient.ClientSocket.Client.Send(Encoding.UTF8.GetBytes("%ERROR:NotHaveChat")); //%ERROR:NotHaveChat Если нет чата goto linkStartListenCommand; } //Обработка данных var id1Mess = new Data.InfoClientMessInfoChat(); //Сам наш клиент var id2Mess = new Data.InfoClientMessInfoChat(); //А это получатель //или подругому) if (infoChat.ID1 == onlyClient.ID) { id1Mess = new Data.InfoClientMessInfoChat(onlyClient.ID, Data.TypeUserInfoMess.Sender); id2Mess = new Data.InfoClientMessInfoChat(infoChat.ID, Data.TypeUserInfoMess.Recipient); } //Анализ клиента //Если клиент онлайн просто присылаем ему сообщение и добавляем в базу данных if (id2Mess.TypeClient == Data.TypeUserInfoMess.Recipient) { if (CheckClientOnly(id2Mess.ID)) { //Добавление в базу данных //TODO //Получение socket и отправка Data.ClientConnectOnly clientId2 = new Data.ClientConnectOnly(); foreach (Data.ClientConnectOnly temp in Data.ClientsOnlyData) { if (id2Mess.ID == temp.ID) { clientId2 = temp; } } clientId2.ClientSocket.Client.Send(Encoding.UTF8.GetBytes("%NEWMES")); } } else { if (CheckClientOnly(id1Mess.ID)) { //Получение socket Data.ClientConnectOnly clientId1 = new Data.ClientConnectOnly(); //foreach (Data.ClientConnectOnly temp in Data.ClientConnectOnly) //{ // Странная ошибка //} } } } } catch (Exception ex) { WriteLine($"%MSE Ошибка: {ex.Message}", ConsoleColor.Red); } } else if (answer.Contains("%UPM"))//Отправить последнии сообщение (обновление сообщений) TODO { try { Match regex = Regex.Match(answer, "%UPM:(.*):(.*)"); long idChat = long.Parse(regex.Groups[1].Value); long countMess = long.Parse(regex.Groups[2].Value); //id 0 это главный чат for (long Iupm = 0; Iupm < countMess; Iupm++) { //buffer = Encoding.UTF8.GetBytes(); //onlyClient.ClientSocket.Client.Send(); } WriteLine($"Готово '%UPM' от: {onlyClient.Nick}, {onlyClient.ID}!", ConsoleColor.Green); } catch (Exception ex) { WriteLine($"Ошибка: {ex.Message}", ConsoleColor.Red); return; } } else if (answer.Contains("%EXI"))//Выход (отключение) { try { onlyClient.ClientSocket.Close(); Data.ClientsOnlyData.Remove(onlyClient); return; } catch { onlyClient.ClientSocket.Close(); Data.ClientsOnlyData.Remove(onlyClient); WriteLine($"Ошибка клиента при выходе: {onlyClient.ID}:{onlyClient.Nick}", ConsoleColor.Red); return; } } else if (answer.Contains("%INF"))//Получить информацию о аккаунте { try { int idClient = int.Parse(answer.Substring(5));//%INF:{id} Data.ClientConnectOffline client = Database.GetClientInfo(idClient); //INF:{id}:{name}:{status}:{email} if (client.UserAvatar != Data.UserAvatar.Custom) { bool status = CheckClientOnly(client.ID); buffer = Encoding.UTF8.GetBytes($"%INF:{client.ID}:{client.Nick}:{status}:" + $"{client.Email}"); onlyClient.ClientSocket.Client.Send(buffer); } else { Data.ClientConnectOffline offline = Database.GetClientInfo(idClient);//Проверить! //TODO: Вот тут просто отправлять аватарку } WriteLine($"Команда %INF от {onlyClient.Nick}:{onlyClient.ID} выполнена", ConsoleColor.Green); } catch { WriteLine($"Ошибка в %INF от {onlyClient.ID}:{onlyClient.Nick}", ConsoleColor.Red); return; } } else if (answer.Contains("%DEL"))//Удалить аккаунт { //Подтверждение (пароль) messi = onlyClient.ClientSocket.Client.Receive(buffer); answer = Encoding.UTF8.GetString(buffer, 0, messi); //TODO md5 //неверный пароль if (answer != onlyClient.Passworld) { onlyClient.ClientSocket.Client.Send(Encoding.UTF8.GetBytes("%ERRPASSWORLD")); goto linkStartListenCommand; } //TODO } else if (answer.Contains("%SЕM"))//Отправить файл (Сообщение) (( В общий чат )) { } else if (answer.Contains("%UUS"))//Обновление клиентов (только онлайн) { try { string stringTemp = $"%UUS:{Data.ClientsOnlyData.Count}:"; foreach (Data.ClientConnectOnly client in Data.ClientsOnlyData) { stringTemp += $"{client.Nick};{client.ID}:"; } Console.WriteLine(stringTemp); byte[] answerUUS = Encoding.UTF8.GetBytes(stringTemp); //networkStream.Write(answerUUS, 0, answerUUS.Length); onlyClient.ClientSocket.Client.Send(answerUUS); } catch { WriteLine($"Ошибка в %UUS от {onlyClient.ID}:{onlyClient.Nick}", ConsoleColor.Red); return; } } else if (answer.Contains("%UAT"))//Загрузка (обновление) аватарки клиента { //%UAT:typeAvatar:sizeFile Match regex = Regex.Match(answer, "%UAT:(.*):(.*)"); Data.UserAvatar userAvatar = (Data.UserAvatar) short.Parse(regex.Groups[1].Value); //Обновление аватарки if (File.Exists($@"Avatars\{onlyClient.ID}.png")) { File.Delete($@"Avatars\{onlyClient.ID}.png"); } if (userAvatar == Data.UserAvatar.Custom) { /*Инфа о файле * (Максимальный размер 8 мб)*/ int sizeFile = int.Parse(regex.Groups[2].Value); //ДЛЯ ПОЛУЧЕНИЕ ФАЙЛОВ ПОРТ 909!!! UdpClient udpClient = new UdpClient(909, AddressFamily.InterNetwork); IPEndPoint end = (IPEndPoint)onlyClient.ClientSocket.Client.RemoteEndPoint; //Загрузка файла byte[] bufferFile = udpClient.Receive(ref end); File.WriteAllBytes($@"Avatars\{onlyClient.ID}.png", bufferFile); //TODO: Добавить в базу данных! } else { //TODO:Просто добавить в базу данных! } WriteLine($"Полученена аватарка от {onlyClient.ID}:{onlyClient.Nick}...", ConsoleColor.Yellow); } else//TODO: Это потом для API! { try { //%ERR:CommandIsNot - Такой команды нет onlyClient.ClientSocket.Client.Send(Encoding.UTF8.GetBytes("%ERR:CommandIsNot")); WriteLine("Такой команды нет!", ConsoleColor.Red); } catch { WriteLine("Ошибка при отправке ОШИБКИ CommandIsNot", ConsoleColor.Red); return; } } } }
static void MessagesDialog(string text, Data.ClientConnectOnly clientinfo, long chatID)/*Отправка сообщений * отдельный чат*/ { //TODO }