diff --git a/.gitignore b/.gitignore index 84a789cfb..4f50762ac 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ OInt/coverage/coverage.xml OInt/coverage/stat.json *.ospx data.json +*.exe diff --git a/cli/app.os b/cli/app.os new file mode 100644 index 000000000..97000dfaa --- /dev/null +++ b/cli/app.os @@ -0,0 +1,250 @@ +#Использовать cmdline +#Использовать oint + +Процедура ОсновнойОбработчик() + + Парсер = Новый ПарсерАргументовКоманднойСтроки(); + + ДобавитьКомандуТелеграм(Парсер); + + Результат = Парсер.Разобрать(АргументыКоманднойСтроки); + ТекущаяКоманда = Результат["Команда"]; + + Если ТекущаяКоманда = Неопределено Тогда + ВывестиСправку(); + Иначе + ВыполнитьОбработкуКоманды(Результат); + КонецЕсли; + +КонецПроцедуры + +Процедура ВывестиСправку() + + Сообщить("-----------------------------------------------------", СтатусСообщения.Информация); + Сообщить(" + | + | _______ _____________ ___ _______ + | __ __ ___/__ _/_ / | / /___ __/ + | _ / / / __ / __ / __ / + | / /_/ / __/ / _ /| / _ / + | \____/ /___/ /_/ |_/ /_/ + | + | + | Добро пожаловать в OInt! + | + | Структура команд: + | OInt БИБЛИОТЕКА ""МЕТОД"" [Параметры] + | + | Вызов библиотеки без метода или метода без параметров возвращает справку + | Список доступных библиотек: telegram + |", СтатусСообщения.Внимание); + + Сообщить("Полную документацию можно найти по адресу: https://opi.neocities.org" + Символы.ПС, СтатусСообщения.Информация); + +КонецПроцедуры + +Процедура ВывестиСправкуПоПараметрам(Знач ТаблицаПараметров) + + Если ТаблицаПараметров.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ИмяМетода = ТаблицаПараметров[0].Метод; + ТекстСправки = ""; + + Сообщить(" + | ## Метод " + ИмяМетода , СтатусСообщения.Информация); + + Для Каждого ПараметрМетода Из ТаблицаПараметров Цикл + + ТекстСправки = ТекстСправки + + Символы.ПС + + " " + + ПараметрМетода["Параметр"] + + " - " + + ПараметрМетода["Описание"]; + + КонецЦикла; + + Сообщить(ТекстСправки + Символы.ПС, СтатусСообщения.Внимание); + +КонецПроцедуры + +Процедура ВывестиСправкуПоМетодам(Знач ТаблицаПараметров) + + ТаблицаПараметров.Свернуть("Метод"); + МассивМетодов = ТаблицаПараметров.ВыгрузитьКолонку("Метод"); + + Сообщить(" ## Доступные методы: " + Символы.ПС, СтатусСообщения.Информация); + + Для каждого Метод Из МассивМетодов Цикл + Сообщить(" - " + Метод + Символы.ПС, СтатусСообщения.Внимание); + КонецЦикла; + +КонецПроцедуры + +Процедура ВыполнитьОбработкуКоманды(Знач Данные) + + ТекущаяКоманда = Данные["Команда"]; + Вывод = ""; + + Попытка + + Если ТекущаяКоманда = "telegram" Тогда + + Вывод = ОбработкаКомандыТелеграм(Данные); + + Иначе + Сообщить("Неизвестная команда!", СтатусСообщения.ОченьВажное); + Возврат; + КонецЕсли; + + Если ТипЗнч(Вывод) = Тип("Структура") + Или ТипЗнч(Вывод) = Тип("Соответствие") + Или ТипЗнч(Вывод) = Тип("Массив") Тогда + + Вывод = OPI_Инструменты.JSONСтрокой(Вывод); + + КонецЕсли; + + Если ЗначениеЗаполнено(Вывод) Тогда + Сообщить(Вывод); + КонецЕсли; + + Исключение + + Если ЗначениеЗаполнено(Вывод) Тогда + Сообщить(Вывод); + Иначе + Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное); + Сообщить(Символы.ПС); + КонецЕсли; + + КонецПопытки; + +КонецПроцедуры + +#Область telegram + +Функция ОбработкаКомандыТелеграм(Знач Данные) + + Модуль = "OPI_Telegram"; + Параметры = Данные["ЗначенияПараметров"]; + Метод = Параметры["Метод"]; + Ответ = "<пустой возврат>"; + + ТаблицаПараметров = ПолучитьТаблицуПараметровТелеграм(); + + Если Не ЗначениеЗаполнено(Метод) Тогда + Сообщить(Символы.ПС + " ## Команда - telegram", СтатусСообщения.Информация); + ВывестиСправкуПоМетодам(ТаблицаПараметров); + Возврат ""; + КонецЕсли; + + ОтборКоманды = Новый Структура("МетодПоиска", вРег(Метод)); + ПараметрыМетода = ТаблицаПараметров.НайтиСтроки(ОтборКоманды); + ТекстВыполнения = ""; + + Если Параметры.Количество() = 1 Тогда + ВывестиСправкуПоПараметрам(ПараметрыМетода); + Возврат ""; + КонецЕсли; + + СтрокаВызова = Модуль + "." + Метод + "("; + Для Каждого НеобходимыйПараметр Из ПараметрыМетода Цикл + + ЗначениеПараметра = Параметры.Получить(НеобходимыйПараметр.Параметр); + + Если ЗначениеЗаполнено(ЗначениеПараметра) Тогда + + ТекстВыполнения = ТекстВыполнения + + Символы.ПС + + НеобходимыйПараметр.Имя + + " = """ + + ЗначениеПараметра + + """;"; + + СтрокаВызова = СтрокаВызова + НеобходимыйПараметр.Имя + ", "; + + Иначе + СтрокаВызова = СтрокаВызова + " , "; + КонецЕсли; + + КонецЦикла; + + СтрокаВызова = Лев(СтрокаВызова, СтрДлина(СтрокаВызова) - 2); + СтрокаВызова = СтрокаВызова + ");"; + СтрокаВызова = "Ответ = " + СтрокаВызова; + + ТекстВыполнения = ТекстВыполнения + Символы.ПС + СтрокаВызова; + + Выполнить(ТекстВыполнения); + + Возврат Ответ; + +КонецФункции + +Процедура ДобавитьКомандуТелеграм(Парсер) + + Команда = Парсер.ОписаниеКоманды("telegram"); + ТаблицаПараметров = ПолучитьТаблицуПараметровТелеграм(); + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "Метод"); + + ДобавитьПараметрыКоманды(Парсер, Команда, ТаблицаПараметров); + + Парсер.ДобавитьКоманду(Команда); + +КонецПроцедуры + +Функция ПолучитьТаблицуПараметровТелеграм() + + ТПМ = Новый ТаблицаЗначений(); + + ТПМ.Колонки.Добавить("Метод"); + ТПМ.Колонки.Добавить("МетодПоиска"); + ТПМ.Колонки.Добавить("Параметр"); + ТПМ.Колонки.Добавить("Имя"); + ТПМ.Колонки.Добавить("Описание"); + + ДобавитьПараметрМетода(ТПМ, "ОтправитьТекстовоеСообщение", "--token" , "Токен", "Токен бота"); + ДобавитьПараметрМетода(ТПМ, "ОтправитьТекстовоеСообщение", "--id" , "IDЧата", "ID целевого чата или чата и темы через * (IDЧата*IDТемы)"); + ДобавитьПараметрМетода(ТПМ, "ОтправитьТекстовоеСообщение", "--text" , "Текст", "Текст сообщения"); + ДобавитьПараметрМетода(ТПМ, "ОтправитьТекстовоеСообщение", "--keyboard", "Клавиатура", "JSON клавиатуры (необяз.)"); + + Возврат ТПМ; + +КонецФункции + +#КонецОбласти + +Процедура ДобавитьПараметрМетода(Таблица, Знач Метод, Знач Параметр, Знач Имя, Знач Описание) + + НовыйПараметр = Таблица.Добавить(); + НовыйПараметр.МетодПоиска = вРег(Метод); + НовыйПараметр.Метод = Метод; + НовыйПараметр.Параметр = Параметр; + НовыйПараметр.Имя = Имя; + НовыйПараметр.Описание = Описание; + +КонецПроцедуры + +Процедура ДобавитьПараметрыКоманды(Парсер, Команда, Знач ТаблицаПараметров); + + ТаблицаПараметров.Свернуть("Параметр"); + + МассивПараметров = ТаблицаПараметров.ВыгрузитьКолонку("Параметр"); + + Для Каждого Параметр Из МассивПараметров Цикл + Парсер.ДобавитьИменованныйПараметрКоманды(Команда, Параметр); + КонецЦикла; + +КонецПроцедуры + + +Попытка + ОсновнойОбработчик(); +Исключение + Сообщить(Символы.ПС + "!!! ОШИБКА: Проверьте корректность введенных данных" + Символы.ПС, СтатусСообщения.ОченьВажное); + Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС, СтатусСообщения.Важное); +КонецПопытки; +