Exemplo n.º 1
0
        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,
            //    "*****@*****.**");
        }
Exemplo n.º 2
0
        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;
                    }
                }
            }
        }