Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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;
                    }
                }
            }
        }
Esempio n. 3
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;
                    }
                }
            }
        }
Esempio n. 4
0
 static void MessagesDialog(string text, Data.ClientConnectOnly clientinfo, long chatID)/*Отправка сообщений
                                                                                         * отдельный чат*/
 {
     //TODO
 }