//Метод отправки сообщений private void Sending_Message() { //Чтобы не отправлялись пустые сообщения if (TextBox_Message.Text.Length != 0) { try { //Открываем соединение connection.Open(); //Строка запроса для БД (недописана) string sql_cmd = "INSERT INTO server_chats.messages (Text_Message, Date_Message, ID_Sender, ID_Reciever, Visible_Message) VALUES (@TEXT, NOW(), @MYID, @FRIENDID, 0);"; //Команда запроса MySqlCommand cmd = connection.CreateCommand(); cmd.CommandText = sql_cmd; //Добавляем параметры MySqlParameter text_message = new MySqlParameter("@TEXT", MySqlDbType.Text); text_message.Value = TextBox_Message.Text; cmd.Parameters.Add(text_message); MySqlParameter myID = new MySqlParameter("@MYID", MySqlDbType.Int32); myID.Value = IDuser; cmd.Parameters.Add(myID); MySqlParameter friendID = new MySqlParameter("@FRIENDID", MySqlDbType.Int32); friendID.Value = IDFriend; cmd.Parameters.Add(friendID); //Выполняем запрос cmd.ExecuteNonQuery(); //Добавляем сообщение в диалог //Нет возможности добавить ID для своего сообщения, т.к. его формирует БД //Отправленное сообщение возможно не получится удалить, пока не перезайти в диалог Message my_message = new Message(); my_message.Message_ID = -1; my_message.Message_Text = TextBox_Message.Text; my_message.Message_Date = DateTime.Now.ToString(); my_message.backGround = (Brush)Application.Current.Resources["MyMessageColor"]; my_message.borderBrush = (Brush)Application.Current.Resources["MyMessageColor"]; Message_List.Items.Add(my_message); Message_List.ScrollIntoView(Message_List.Items[Message_List.Items.Count - 1]); TextBox_Message.Text = ""; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { //Закрываем соединение connection.Close(); } } }
//Удаление сообщения из диалога private void DeleteMessage_Click(object sender, RoutedEventArgs e) { //Кнопка удаления сообщения, хранящее ID удаляемого сообщения Button message = sender as Button; try { //Открываем соединение connection.Open(); //Строка запроса string sql_cmd = "DELETE FROM server_chats.messages WHERE ID = @IDMESSAGE;"; //Команда запроса MySqlCommand cmd = connection.CreateCommand(); cmd.CommandText = sql_cmd; //Добавляем параметры MySqlParameter messageID = new MySqlParameter("@IDMESSAGE", MySqlDbType.Int32); messageID.Value = message.Content.ToString(); cmd.Parameters.Add(messageID); //Выполняем запрос cmd.ExecuteNonQuery(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { //Закрываем соединение connection.Close(); //Вызываем функцию загрузки сообщений Message_List.Items.Clear(); if (MessageCount <= 1000) { Loading_Messages("SELECT * FROM server_chats.messages WHERE (ID_Sender = @MYID AND ID_Reciever = @IDFRIEND) OR (ID_Sender = @IDFRIEND AND ID_Reciever = @MYID)"); } else { Loading_Messages("SELECT * FROM server_chats.messages WHERE (ID_Sender = @MYID AND ID_Reciever = @IDFRIEND) OR (ID_Sender = @IDFRIEND AND ID_Reciever = @MYID) LIMIT @COUNT-1000,@COUNT;"); } Message_List.ScrollIntoView(Message_List.Items[Message_List.Items.Count - 1]); } }
//Запуск асинхронной операции обновления текущего диалога public async void Refresh_Chat_Async() { while (IDFriend != -1) { //Проверка на наличие непрочитанных сообщений bool unreadMessage = false; try { //Открываем соединение await connection_async.OpenAsync(); //Строка запроса string sql_cmd = "SELECT * FROM server_chats.messages WHERE (ID_Reciever = @MYID AND ID_Sender = @FRIENDID AND Visible_Message = 0);"; //Команда запроса MySqlCommand cmd = connection_async.CreateCommand(); cmd.CommandText = sql_cmd; //Добавляем параметры запроса MySqlParameter myID = new MySqlParameter("@MYID", MySqlDbType.Int32); myID.Value = IDuser; cmd.Parameters.Add(myID); MySqlParameter friendID = new MySqlParameter("@FRIENDID", MySqlDbType.Int32); friendID.Value = IDFriend; cmd.Parameters.Add(friendID); //Проверяем в БД непрочитанные нами сообщения using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { if (reader.HasRows) { while (reader.Read()) { Message friend_message = new Message(); friend_message.Message_ID = int.Parse(reader.GetString(0)); friend_message.Message_Text = reader.GetString(1); friend_message.Message_Date = reader.GetString(2); friend_message.backGround = (Brush)Application.Current.Resources["FriendMessageColor"]; friend_message.borderBrush = (Brush)Application.Current.Resources["FriendMessageColor"]; //Выполняет указанный делегат в оснвном потоке (т.к. к Control'у я не могу обратиться из этого потока) Dispatcher.Invoke(() => Message_List.Items.Add(friend_message)); //Если непрочитанные сообщения есть, то нужно отметить их прочитанными unreadMessage = true; } Dispatcher.Invoke(() => Message_List.ScrollIntoView(Message_List.Items[Message_List.Items.Count - 1])); } } //В зависимости от того, есть ли сообщения непрочитанные //Выполняем функцию отметки сообщений if (unreadMessage) { Mark_Read(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { //Закрываем соединение await connection_async.CloseAsync(); } //Приостанавливаем поток данной функции (снижает нагрузку на БД, ОЗУ, ЦП + 1,5 сек. не страшная задержка) System.Threading.Thread.Sleep(1500); } }