Пример #1
0
 public static void logToBase(CoreServer.Message toLogMes)//Добавление логов в базу
 {
     using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + Environment.CurrentDirectory + @"\tcpChat.db; Version=3;"))
     {
         conn.Open();
         SQLiteCommand cmdInsert = conn.CreateCommand();
         DateTime      tempDate  = Convert.ToDateTime(toLogMes.DateTime);
         string        format    = "yyyy-MM-dd HH:mm:ss";
         cmdInsert.CommandText = String.Format("INSERT INTO logs (datetime,username,body) VALUES('{0}', '{1}','{2}');", tempDate.ToString(format), toLogMes.UserName, toLogMes.body);
         cmdInsert.ExecuteNonQuery();
     }
 }
Пример #2
0
        public void Process()     //Метод принятия сообщений и их обработка
        {
            //Отправлка сообщение со списком подключенных пользователей
            CoreServer.Message OnMes     = new CoreServer.Message("online", "", "", "", ServerObject.GetClients());
            IFormatter         formatter = new BinaryFormatter();

            formatter.Serialize(this.Stream, OnMes);

            int flagForSign = 0;    //Флаг обозначения что пользователь вошёл

            try
            {
                string messageString; //Часть строки сообщения для вывода в чат
                string bodyMess = ""; //Часть строки сообщения для вывода в чат

                while (true)
                {
                    CoreServer.Message mess = new CoreServer.Message();//Создание объекта сообщения

                    try
                    {
                        mess      = GetMessage();//Получение сообщения
                        userName  = mess.UserName;
                        this.name = userName;

                        if (mess.type == "mess")//Если тип сообщения "Сообщение"
                        {
                            //Разбор сообщения и вывод его в чат и трансляция всем участникам
                            messageString = String.Format("{0}:{1}:", mess.DateTime, userName);
                            bodyMess      = mess.body;
                            LOG.toBody(messageString, bodyMess, 0);
                            bodyMess = "";
                            logToBase(mess);//Логирование сообщения
                            server.BroadcastMessage(mess, this.Id);
                        }

                        else if (mess.type == "signIn")//Если тип сообщения "Вход"
                        {
                            //Обработка входа пользователя в чат. Поиск его в базе и отправкой соответствующего сообщения
                            logToBase(mess);//Логирование сообщения
                            //Подключение к базе и выполнение нужных действий
                            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + Environment.CurrentDirectory + @"\tcpChat.db; Version=3;"))
                            {
                                conn.Open();
                                SQLiteCommand cmd       = conn.CreateCommand();
                                SQLiteCommand cmdInsert = conn.CreateCommand();


                                cmd.CommandText = "SELECT * FROM users WHERE login='******' AND pass='******'";
                                try
                                {
                                    SQLiteDataReader r = cmd.ExecuteReader();
                                    if (r.HasRows)
                                    {
                                        CoreServer.Message regAns = new CoreServer.Message("signAnYes", mess.UserName, "Добро пожаловать в чат :)!", "", ServerObject.GetClients());

                                        formatter.Serialize(this.Stream, regAns);
                                        r.Close();
                                        flagForSign = 1;
                                    }
                                    else
                                    {
                                        CoreServer.Message regAns = new CoreServer.Message("signAnNo", mess.UserName, "Такой пользователь не найден или неверен пароль!", "", ServerObject.GetClients());

                                        formatter.Serialize(this.Stream, regAns);
                                        Close();
                                    }
                                }
                                catch (SQLiteException ex)
                                {
                                    MessageBox.Show(ex.Message);
                                }
                            }
                            //ТРанслирования сообщения если пользователь успешно вошёл в чат
                            if (flagForSign == 1)
                            {
                                server.BroadcastMessage(mess, this.Id);
                            }
                        }
                        else if (mess.type == "regg")//Если тип сообщения "Регистрация"
                        {
                            //Обработка регистрации пользователя в чате. Поиск его в базе и отправкой соответствующего сообщения

                            logToBase(mess);//Логирование сообщения
                            //Подключение к базе и выполнение нужных действий
                            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + Environment.CurrentDirectory + @"\tcpChat.db; Version=3;"))
                            {
                                conn.Open();
                                SQLiteCommand cmd       = conn.CreateCommand();
                                SQLiteCommand cmdInsert = conn.CreateCommand();


                                cmd.CommandText = "SELECT * FROM users WHERE login='******'";
                                try
                                {
                                    SQLiteDataReader r = cmd.ExecuteReader();
                                    if (r.HasRows)
                                    {
                                        CoreServer.Message regAns = new CoreServer.Message("regansvNo", mess.UserName, "Такой пользователь уже существует!", "", ServerObject.GetClients());
                                        formatter.Serialize(this.Stream, regAns);
                                        r.Close();
                                        Close();
                                    }
                                    else
                                    {
                                        cmdInsert.CommandText = String.Format("INSERT INTO users (login,pass) VALUES('{0}', '{1}');", mess.UserName, mess.body);
                                        cmdInsert.ExecuteNonQuery();
                                        LOG.toBody("Пользователь " + mess.UserName, " успешно зарегестрировался", 1);

                                        CoreServer.Message regAns = new CoreServer.Message("regansvYes", mess.UserName, "Вы успешно зарегистрированы!", "", ServerObject.GetClients());
                                        formatter.Serialize(this.Stream, regAns);
                                    }
                                }
                                catch (SQLiteException ex)
                                {
                                    MessageBox.Show(ex.Message);
                                }
                            }
                        }
                        else if (mess.type == "reqonline") //Если тип сообщения "Запрос онлайна"
                        {
                            //Обработка сообщения запроса онлайн пользователей с последующим ответом
                            CoreServer.Message tempMess;
                            BinaryFormatter    tempFprm = new BinaryFormatter();
                            do
                            {
                                tempMess = (CoreServer.Message)tempFprm.Deserialize(Stream);
                            }while (Stream.DataAvailable);
                            tempMess.OnlineUser = ServerObject.GetClients();
                            OnMes = new CoreServer.Message("online", "", "", "", ServerObject.GetClients());
                            formatter.Serialize(this.Stream, OnMes);
                        }
                    }
                    catch
                    {
                        //Отправка сообщения о том, что пользователь вышел из чата
                        messageString = String.Format("{0}:{1} покинул чат!", DateTime.Now.ToString(), userName);
                        bodyMess      = "";
                        LOG.toBody(messageString, bodyMess, 1);
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                LOG.toBody(e.Message, null, 1);//Вывод исключения в чат
            }
            finally
            {
                //В случае выхода из цикла удаляется пользователь из списк онлайн и трансляция сообщения выхода пользователя
                server.RemoveConnection(this.Id);
                CoreServer.Message exMes = new CoreServer.Message("exit", userName, "Пользователь вышел из чата", DateTime.Now.ToString(), ServerObject.GetClients());
                logToBase(exMes);//Логирование сообщения
                if (flagForSign == 1)
                {
                    server.BroadcastMessage(exMes, this.Id);
                }
                Close();
            }
        }