/// <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, "У вас нет доступа к данному боту"); } } }
/// <summary> /// Обработчик для BackgroundWorker, который обрабатывает команды /// </summary> private void ExecuteCommand(object sender, DoWorkEventArgs e) { TelegramCommand tCommand = (TelegramCommand)e.Argument; if (tCommand.Command.Type == commandTypes.command1C) { // Запуск команды в базе 1С V8Connector connector = new V8Connector(tCommand.Command, tCommand.Parameters, tmSettings); connector.TelegramUserName = tCommand.Message.from.username; connector.TelegramFirstName = tCommand.Message.from.first_name; connector.TelegramLastName = tCommand.Message.from.last_name; Logger.Debug(tmSettings, "Запуск команды " + tCommand.Command.ID + " на выполнение", false, mutLogger); // Создание ComConnector и выполнение кода команды V8Answer result = connector.Execute(mutLogger); Logger.Debug(tmSettings, "Команда " + tCommand.Command.ID + " выполнена", false, mutLogger); if (connector.Success) { Int64 reply_to_message_id = (result.Dialog) ? tCommand.Message.message_id : 0; if (!String.IsNullOrEmpty(result.Text)) { SendMessage(tCommand.Message.chat.id, result.Text, "", reply_to_message_id); } if (!String.IsNullOrEmpty(result.FileName)) { SendDocument(tCommand.Message.chat.id, result.FileName); } if (String.IsNullOrEmpty(result.Text) && String.IsNullOrEmpty(result.FileName)) { SendMessage(tCommand.Message.chat.id, "Команда выполнена"); } } else { SendMessage(tCommand.Message.chat.id, "Ошибка при выполнении команды"); } result = null; connector.Dispose(); } else { // Запуск команды OneScript Logger.Debug(tmSettings, "Запуск команды oscript " + tCommand.Command.ID + " на выполнение", false, mutLogger); StringBuilder output = new StringBuilder(); System.Diagnostics.Process oscript = new Process(); if (String.IsNullOrEmpty(tmSettings.OScriptPath)) { oscript.StartInfo.FileName = "oscript"; } else { if (File.Exists(tmSettings.OScriptPath)) { oscript.StartInfo.FileName = tmSettings.OScriptPath; } else { SendMessage(tCommand.Message.chat.id, "oscript не найден по указанному пути"); Logger.Debug(tmSettings, "oscript не найден по указанному пути: " + tmSettings.OScriptPath, true, mutLogger); } } if (!String.IsNullOrEmpty(oscript.StartInfo.FileName)) { oscript.StartInfo.Arguments = "\"" + tCommand.Command.ConnectionString + "\""; if (!String.IsNullOrEmpty(tCommand.Parameters)) { string oscParam = tCommand.Parameters.Trim().Replace(' ', '_').Replace(',', ' '); oscript.StartInfo.Arguments += " " + oscParam; } oscript.StartInfo.UseShellExecute = false; oscript.StartInfo.RedirectStandardOutput = true; oscript.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(866); oscript.StartInfo.CreateNoWindow = true; try { oscript.Start(); } catch (Exception ex) { SendMessage(tCommand.Message.chat.id, "Ошибка при выполнении команды"); Logger.Debug(tmSettings, "Ошибка при выполнении команды oscript: " + ex.Message, true, mutLogger); } string curString = ""; bool dialog = false; string resFile = ""; while (!oscript.StandardOutput.EndOfStream) { curString = oscript.StandardOutput.ReadLine(); if (curString.StartsWith("Результат_Файл") && String.IsNullOrEmpty(resFile)) { resFile = curString.Substring(15).Trim(); if (resFile.StartsWith("=")) { resFile = resFile.Substring(2).Trim(); continue; } else { resFile = ""; } } if (curString == "ДиалогСПараметрами") { dialog = true; } else { output.AppendLine(curString); } } Int64 reply_to_message_id = (dialog) ? tCommand.Message.message_id : 0; if (0 < output.Length || !String.IsNullOrEmpty(resFile)) { if (0 < output.Length) { SendMessage(tCommand.Message.chat.id, output.ToString(), "", reply_to_message_id); } if (!String.IsNullOrEmpty(resFile)) { SendDocument(tCommand.Message.chat.id, resFile); } } else { SendMessage(tCommand.Message.chat.id, "Команда выполнена"); } Logger.Debug(tmSettings, "Команда oscript" + tCommand.Command.ID + " выполнена", false, mutLogger); } } messageOrder.Remove(tCommand.Message.message_id); tCommand = null; ((BackgroundWorker)sender).CancelAsync(); ((BackgroundWorker)sender).Dispose(); GC.WaitForPendingFinalizers(); GC.Collect(); }