public static Data.ClientConnectOffline GetClientInfo(long id)//Получить инфо о клиенте { //Ник string nick = GetNickClient(id); //Пароль string passworld = GetClientPassworld(id); //Аватарку Data.UserAvatar avatar = GetClientAvatar(id); //Email string email = GetClientEmail(id); //Offical bool offical = GetClientOffical(id); return(new Data.ClientConnectOffline(id, nick, passworld, avatar, email, false)); //return new Data.ClientConnectOffline(id, "Gladi", "324252", Data.UserAvatar.Avatar1, // "*****@*****.**"); }
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; } } } }