Пример #1
0
        /// <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, "У вас нет доступа к данному боту");
                }
            }
        }
Пример #2
0
        /// <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();
        }