/// <summary> /// Сохраняет входящие и исходящие сообщения в базу данных /// </summary> /// <param name="message">Сообщение</param> /// <param name="direct">Направление</param> private void SaveMessageToDB(TelegramMessage message, string direct) { if (sqlConnection != null) { SQLiteCommand cmd = sqlConnection.CreateCommand(); cmd.CommandText = "INSERT INTO messages (direct, message_id, parent_id, user_id, chat_id, username, first_name, last_name, text, date) " + "VALUES (@direct, @message_id, @parent_id, @user_id, @chat_id, @username, @first_name, @last_name, @text, @date);"; cmd.Parameters.AddWithValue("@direct", direct); cmd.Parameters.AddWithValue("@message_id", message.message_id); cmd.Parameters.AddWithValue("@parent_id", (message.reply_to_message != null) ? message.reply_to_message.message_id : 0); cmd.Parameters.AddWithValue("@user_id", message.from.id); cmd.Parameters.AddWithValue("@chat_id", message.chat.id); cmd.Parameters.AddWithValue("@username", message.from.username); cmd.Parameters.AddWithValue("@first_name", message.from.first_name); cmd.Parameters.AddWithValue("@last_name", message.from.last_name); cmd.Parameters.AddWithValue("@text", (message.text != null) ? message.text : ""); cmd.Parameters.AddWithValue("@date", message.date); try { Logger.Debug(tmSettings, "sql start insert", false, mutLogger); cmd.ExecuteNonQuery(); Logger.Debug(tmSettings, "sql insert ok", false, mutLogger); } catch (SQLiteException ex) { Logger.Debug(tmSettings, "sql ins error: " + ex.Message.ToString(), true, mutLogger); } } }
/// <summary> /// Возвращает текст команды /// </summary> /// <param name="message">Сообщение, для которого надо получить вышестоящую команду</param> private string GetTextOfRootCommand(TelegramMessage message) { string commandText = ""; List <string> commandParams = new List <string>(); commandParams.Add(message.text); MessageTDB msg = null; Int64 parent_id = message.reply_to_message.message_id; while (parent_id > 0) { msg = GetMessageFromDB(parent_id, message.from.id, message.chat.id); if (msg == null) { parent_id = 0; } else if (msg.ParentID > 0) { parent_id = msg.ParentID; if (msg.Direct == "in") { commandParams.Add(msg.Text); } } else { parent_id = 0; commandText = msg.Text; } } string param = ""; int i = commandParams.Count - 1; while (0 <= i) { param += commandParams[i]; if (0 < i) { param += ","; } i--; } if (!String.IsNullOrEmpty(param)) { commandText += " " + param; } return(commandText); }
/// <summary> /// Разбирает полученное сообщение и определяет, что с ним делать /// <PARAM name="message">Сообщение TelegramMessage</PARAM> /// </summary> private void listener_CheckMessage(TelegramMessage message) { SaveMessageToDB(message, "in"); if (message.text == null) { SendMessage(message.chat.id, "Неизвестная команда"); } else { string username = message.from.username; string text = ""; string param = ""; if (message.reply_to_message != null) { // Это ответ на начальное сообщение, значит команда содержится в предыдущем, а в текущем идут параметры text = GetTextOfRootCommand(message); } else { text = message.ToString(); } text = text.ToLower(); param = extractParamForCommand(text, out text); // Фильтрация пользователей if (tmSettings.AllowableUser(username)) { if (text == "/start" || text == "/help" || text == "/settings") { // Запрошен список команд SendMessage(message.chat.id, tmSettings.GetCommands(username), tmSettings.GetKeyboardCommands(username)); } else if (text == "/screen") { // Запрошен скриншот всей области экрана if (tmSettings.AllowToGetScreenshot(username)) { string fileName = getScreenShot(); SendPhoto(message.chat.id, fileName); File.Delete(fileName); } else { SendMessage(message.chat.id, "У вас нет доступа к данной команде"); } } else { object cmd = tmSettings.GetCommandByName(text); if (cmd != null) { // Запрошена команда из списка if (!messageOrder.ContainsKey(message.message_id)) { Command cur_command = (Command)cmd; if (tmSettings.AllowableUserForCommand(username, cur_command)) { TelegramCommand tCommand = new TelegramCommand(); tCommand.Message = message; tCommand.Command = cur_command; tCommand.Parameters = param; messageOrder.Add(message.message_id, tCommand); BackgroundWorker executer = new BackgroundWorker(); executer.WorkerSupportsCancellation = true; executer.DoWork += new DoWorkEventHandler(ExecuteCommand); executer.RunWorkerAsync(tCommand); } else { SendMessage(message.chat.id, "У вас нет доступа к данной команде"); } } } else { // unknow command SendMessage(message.chat.id, "Неизвестная команда"); } } } else { SendMessage(message.chat.id, "У вас нет доступа к данному боту"); } } }