diff --git a/src/cf/CommonModules/БотОбщегоНазначения.xml b/src/cf/CommonModules/БотОбщегоНазначения.xml new file mode 100644 index 0000000..deecb85 --- /dev/null +++ b/src/cf/CommonModules/БотОбщегоНазначения.xml @@ -0,0 +1,23 @@ + + + + + БотОбщегоНазначения + + + ru + Бот общего назначения + + + + false + false + true + false + false + false + false + DontUse + + + \ No newline at end of file diff --git a/src/cf/CommonModules/БотОбщегоНазначения/Ext/Module.bsl b/src/cf/CommonModules/БотОбщегоНазначения/Ext/Module.bsl new file mode 100644 index 0000000..7132618 --- /dev/null +++ b/src/cf/CommonModules/БотОбщегоНазначения/Ext/Module.bsl @@ -0,0 +1,283 @@ +#Область ПрограммныйИнтерфейс + +Процедура ОбработкаКомандыБота(Тело) Экспорт + + МассивОбновленийТелеграм = ТелеграмОбщегоНазначения.ОбновленияТелеграм(Тело); + Для каждого ОбновлениеТелеграм Из МассивОбновленийТелеграм Цикл + ТелеграмОбщегоНазначения.СохранитьСообщениеВБазу(ОбновлениеТелеграм); + + ДанныеПользователя = РаботаСОбновлениямиВызовСервера.ПолучитьДанныеПользователя(ОбновлениеТелеграм.ИдЧата); + + Если ОбновлениеТелеграм.Свойство("ИдСообщения") Тогда + Если ОбновлениеТелеграм.Сообщение.text = "/start" Тогда + ОбработатьКомандуСтарт(ОбновлениеТелеграм); + ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/subscribe" Тогда + ОбработатьКомандуПодписки(ОбновлениеТелеграм); + ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/add" Тогда + ОбработатьКомандуДобавитьКонфигурацию(ОбновлениеТелеграм); + ИначеЕсли ОбновлениеТелеграм.Сообщение.text = "/delete" Тогда + ОбработатьКомандуУдалитьКонфигурацию(ОбновлениеТелеграм); + ИначеЕсли ДанныеПользователя <> Неопределено + И ДанныеПользователя.СтатусДиалога = Перечисления.ТелеграмСтатусДиалога.ОжиданиеВводаВерсии Тогда + ОбработатьВводВерсииКонфигурации(ОбновлениеТелеграм, ДанныеПользователя); + КонецЕсли; + ИначеЕсли ОбновлениеТелеграм.Свойство("ИдКоллбэка") <> Неопределено Тогда + Данные = ОбновлениеТелеграм.ДанныеКоллбэка; + Если СтрНачинаетсяС(Данные, XMLСтрока(Перечисления.ВидыДанныхКоллбэков.AddVersion)) Тогда + ДобавитьКонфигурациюВСписокОтслеживания(Данные, ОбновлениеТелеграм.ИдЧата); + ИначеЕсли СтрНачинаетсяС(Данные, XMLСтрока(Перечисления.ВидыДанныхКоллбэков.DeleteVersion)) Тогда + УдалитьКонфигурациюИзСпискаОтслеживания(Данные, ОбновлениеТелеграм.ИдЧата); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ДобавитьКонфигурациюВСписокОтслеживания(ТекстСообщения, ИдЧата) + + Команда = XMLСтрока(Перечисления.ВидыДанныхКоллбэков.AddVersion); + + Если НЕ СтрНачинаетсяС(ТекстСообщения, Команда) Тогда + Возврат; + КонецЕсли; + + ИмяКонфигурации = СокрЛП(Сред(ТекстСообщения, СтрДлина(Команда) + 1)); + + Конфигурация = РаботаСОбновлениямиВызовСервера.КонфигурацияПоИмени(ИмяКонфигурации); + + Если Конфигурация <> Неопределено Тогда + ТекстОтвета = СтрШаблон("Отлично, добавляем в список конфигурацию ""%1"".", Конфигурация.Наименование) + Символы.ПС + + Символы.ВК + Символы.ПС + + "Для корректного отслеживания обновлений нужно ввести версию конфигурации (четыре группы цифр, разделённых точками):" + + Символы.ПС + + "Например: 3.1.30.197"; + РаботаСОбновлениямиВызовСервера.УстановитьСтатусДиалога(ИдЧата, Перечисления.ТелеграмСтатусДиалога.ОжиданиеВводаВерсии, + ИмяКонфигурации); + ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета,,); + КонецЕсли; + +КонецПроцедуры + +Процедура УдалитьКонфигурациюИзСпискаОтслеживания(ТекстСообщения, ИдЧата) + + Команда = XMLСтрока(Перечисления.ВидыДанныхКоллбэков.DeleteVersion); + Если НЕ СтрНачинаетсяС(ТекстСообщения, Команда) Тогда + Возврат; + КонецЕсли; + + ИмяКонфигурации = СокрЛП(Сред(ТекстСообщения, СтрДлина(Команда) + 1)); + + Конфигурация = РаботаСОбновлениямиВызовСервера.КонфигурацияПоИмени(ИмяКонфигурации); + + Если Конфигурация <> Неопределено Тогда + + МенеджерЗаписи = РегистрыСведений.ОтслеживаниеВерсийКонфигураций.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Конфигурация = Конфигурация; + МенеджерЗаписи.ИдЧата = ИдЧата; + Попытка + МенеджерЗаписи.Удалить(); + ТекстОтвета = СтрШаблон("Конфигурация ""%1"" удалена из списка отслеживания", Конфигурация.Наименование); + Исключение + ТекстОтвета = "При удалении данных возникла ошибка"; + КонецПопытки; + + ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета,,); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработатьВводВерсииКонфигурации(ОбновлениеТелеграм, ДанныеПользователя) + + ИдЧата = ОбновлениеТелеграм.ИдЧата; + Версия = ОбновлениеТелеграм.Сообщение.text; + + Если НЕ ВерсияКонфигурацииКорректна(Версия) Тогда + ТекстОтвета = СтрШаблон("Вы ввели некорректный номер версии: %1%2Для корректного отслеживания обновлений нужно + |ввести версию конфигурации(четыре группы цифр, разделённых точками):Например: 3.1.30.197.", Версия, Символы.ПС); + ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета,,); + Возврат; + КонецЕсли; + + Конфигурация = РаботаСОбновлениямиВызовСервера.КонфигурацияПоИмени(ДанныеПользователя.ДополнительнаяИнформация); + Ответ = РаботаСОбновлениямиВызовСервера.АктуальнаяВерсияКонфигурации(Конфигурация, Версия); + + Если НЕ Ответ.Успех Тогда + ТекстОтвета = "При получении данных с сервера произошла ошибка"; + ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета,,); + Возврат; + КонецЕсли; + + АктуальнаяВерсия = Ответ["Тело"]["configurationUpdateResponse"]["configurationVersion"]; + + Если АктуальнаяВерсия = Неопределено Тогда + ТекстОтвета = СтрШаблон("Для указанной версии: %1 нет данных по актуальности", Версия); + ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета,,); + Возврат; + КонецЕсли; + + МенеджерЗаписи = РегистрыСведений.ОтслеживаниеВерсийКонфигураций.СоздатьМенеджерЗаписи(); + МенеджерЗаписи.Конфигурация = Конфигурация; + МенеджерЗаписи.ИдЧата = ИдЧата; + МенеджерЗаписи.ТекущаяВерсия = Версия; + МенеджерЗаписи.АктуальнаяВерсия = АктуальнаяВерсия; + Попытка + МенеджерЗаписи.Записать(); + РаботаСОбновлениямиВызовСервера.УстановитьСтатусДиалога(ИдЧата, Перечисления.ТелеграмСтатусДиалога.НачальноеСостояние, ""); + ТекстОтвета = СтрШаблон("Версия: %1 успешно добавлена", Версия); + Исключение + ТекстОтвета = "При сохранении данных возникла ошибка"; + КонецПопытки; + + ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета,,); + +КонецПроцедуры + +Функция ВерсияКонфигурацииКорректна(Версия) + + Попытка + РегулярноеВыражение = "^\d+\.\d+\.\d+\.\d+$"; + Возврат СтрПодобнаПоРегулярномуВыражению(Версия, РегулярноеВыражение); + Исключение + МассивГруппЦифр = СтрРазделить(Версия, "."); + Если МассивГруппЦифр.Количество() <> 4 Тогда + Возврат Ложь; + КонецЕсли; + Для Каждого ГруппаЦифрВерсии Из МассивГруппЦифр Цикл + Если Не ТолькоЦифрыВСтроке(ГруппаЦифрВерсии) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + КонецПопытки; + +КонецФункции + +Функция ТолькоЦифрыВСтроке(Знач Значение, Знач ПробелыЗапрещены = Истина) Экспорт + + Если ТипЗнч(Значение) <> Тип("Строка") Тогда + Возврат Ложь; + КонецЕсли; + + Если Не ПробелыЗапрещены Тогда + Значение = СтрЗаменить(Значение, " ", ""); + КонецЕсли; + + Если СтрДлина(Значение) = 0 Тогда + Возврат Истина; + КонецЕсли; + + // Если содержит только цифры, то в результате замен должна быть получена пустая строка. + // Проверять при помощи ПустаяСтрока нельзя, так как в исходной строке могут быть пробельные символы. + Возврат СтрДлина( + СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( + СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( + Значение, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9", "")) = 0; + +КонецФункции + + +Процедура ОбработатьКомандуСтарт(ОбновлениеТелеграм) + + ТекстОтвета = "Привет! Я бот, который поможет тебе следить за обновлениями конфигураций 1С." + Символы.ПС + + Символы.ВК + Символы.ПС + + "Что я умею:" + Символы.ПС + + "- Отслеживать новые релизы" + Символы.ПС + + "- Присылать уведомления о выходе обновлений" + Символы.ПС + + "- Показывать текущую версию" + Символы.ПС + + Символы.ВК + Символы.ПС + + "/subscribe - Список конфигураций для отслеживания" + Символы.ПС + + "/add - Добавить конфигурацию в список отслеживания" + Символы.ПС + + "/delete - Удалить конфигурацию из списка отслеживания"; + + ТелеграмМетодыВызовСервера.SendMessage(ОбновлениеТелеграм.ИдЧата, ТекстОтвета,,); + +КонецПроцедуры + +Процедура ОбработатьКомандуПодписки(ОбновлениеТелеграм) + + СписокКонфигураций = РаботаСОбновлениямиВызовСервера.СписокКонфигураций(ОбновлениеТелеграм.ИдЧата); + ТекстОтвета = ""; + + Если СписокКонфигураций.Количество() = 0 Тогда + ТекстОтвета = "Не удалось получить список конфигураций"; + Иначе + Для каждого ПунктМенюПодписки Из СписокКонфигураций Цикл + ТекстОтвета = ТекстОтвета + СтрШаблон("%1 %2%3", ?(ПунктМенюПодписки.Подписка, "[X]", "[ ]"), + ПунктМенюПодписки.Наименование,Символы.ПС); + КонецЦикла; + КонецЕсли; + + ТелеграмМетодыВызовСервера.SendMessage(ОбновлениеТелеграм.ИдЧата, ТекстОтвета,,); + +КонецПроцедуры + +Процедура ОбработатьКомандуДобавитьКонфигурацию(ОбновлениеТелеграм) + + ИдЧата = ОбновлениеТелеграм.ИдЧата; + Команда = XMLСтрока(Перечисления.ВидыДанныхКоллбэков.AddVersion); + + МассивРядов = МассивРядовСоСпискомКонфигураций(ИдЧата, Команда, Ложь); + Если МассивРядов = Неопределено Тогда + ТекстОтвета = "Не удалось получить список конфигураций"; + ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета); + КонецЕсли; + + Клавиатура = ТелеграмРаботаСКлавиатурой.КлавиатураВстроенная(МассивРядов); + ТекстОтвета = "Выберите нужную конфигурацию для отслеживания обновлений"; + ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета,, Клавиатура); + +КонецПроцедуры + +Процедура ОбработатьКомандуУдалитьКонфигурацию(ОбновлениеТелеграм) + + ИдЧата = ОбновлениеТелеграм.ИдЧата; + Команда = XMLстрока(Перечисления.ВидыДанныхКоллбэков.DeleteVersion); + + МассивРядов = МассивРядовСоСпискомКонфигураций(ИдЧата, Команда, Истина); + Если МассивРядов = Неопределено Тогда + ТекстОтвета = "Не удалось получить список конфигураций"; + ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета); + КонецЕсли; + + Клавиатура = ТелеграмРаботаСКлавиатурой.КлавиатураВстроенная(МассивРядов); + + ТекстОтвета = "Выберите нужную конфигурацию для отмены отслеживания обновлений"; + ТелеграмМетодыВызовСервера.SendMessage(ИдЧата, ТекстОтвета,, Клавиатура); + +КонецПроцедуры + + +Функция МассивРядовСоСпискомКонфигураций(ИдЧата, Команда, Подписка = Неопределено) + + СписокКонфигураций = РаботаСОбновлениямиВызовСервера.СписокКонфигураций(ИдЧата); + + Если СписокКонфигураций.Количество() = 0 Тогда + Возврат Неопределено; + Иначе + МассивРядов = Новый Массив; + Для каждого ПунктМенюПодписки Из СписокКонфигураций Цикл + Если Подписка = Неопределено + ИЛИ (Подписка И ПунктМенюПодписки.Подписка) + ИЛИ (НЕ Подписка И НЕ ПунктМенюПодписки.Подписка) Тогда + МассивКнопок = Новый Массив; + МассивКнопок.Добавить(ТелеграмРаботаСКлавиатурой.КнопкаКлавиатурыВстроенной( + ПунктМенюПодписки.Наименование + , + , + СтрШаблон("%1 %2", Команда, ПунктМенюПодписки.Имя) + )); + МассивРядов.Добавить(МассивКнопок); + КонецЕсли; + КонецЦикла; + Возврат МассивРядов; + КонецЕсли; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/src/cf/Configuration.xml b/src/cf/Configuration.xml index 91122ba..17ebb65 100644 --- a/src/cf/Configuration.xml +++ b/src/cf/Configuration.xml @@ -249,13 +249,14 @@ Обновления КартинкаБот HttpОбщегоНазначения + РаботаСОбновлениямиВызовСервера + РаботаСФайламиКлиентСервер ТелеграмМетодыВызовСервера ТелеграмОбщегоНазначения ТелеграмПовторноеИспользование - ТелеграмРегламент - РаботаСФайламиКлиентСервер ТелеграмРаботаСКлавиатурой - РаботаСОбновлениямиВызовСервера + ТелеграмРегламент + БотОбщегоНазначения HTTPСервис_Telegram ПроверкаОбновленийТелеграм ТелеграмТокен @@ -269,6 +270,8 @@ ЛогHttpЗапроса МетодHTTPЗапроса ТелеграмРежимРазметки + ТелеграмСтатусДиалога + ВидыДанныхКоллбэков РаботаССообщениями РаботаСОбновлениями ТелеграмСообщения diff --git a/src/cf/Enums/ВидыДанныхКоллбэков.xml b/src/cf/Enums/ВидыДанныхКоллбэков.xml new file mode 100644 index 0000000..2d2a1aa --- /dev/null +++ b/src/cf/Enums/ВидыДанныхКоллбэков.xml @@ -0,0 +1,67 @@ + + + + + + faee0c1e-a312-43c8-8af2-20618cc53904 + b6d6ee51-fdfe-47bd-bc31-3147751dc7fc + + + 268e63a6-adc9-4961-9d35-92c1ddc296e3 + 6e68fa9a-2345-462c-98d4-6c31908cb17b + + + 6bf0eedb-c7aa-4a05-ae0f-3900e6b21ff7 + 7947dc7b-96c2-4672-8ebe-c48dba063c3e + + + + ВидыДанныхКоллбэков + + + ru + Виды данных коллбэков + + + + false + + true + BothWays + + + + + + + + Auto + + + + + AddVersion + + + ru + Add version + + + + + + + + DeleteVersion + + + ru + Delete version + + + + + + + + \ No newline at end of file diff --git a/src/cf/Enums/ТелеграмСтатусДиалога.xml b/src/cf/Enums/ТелеграмСтатусДиалога.xml new file mode 100644 index 0000000..9a21e41 --- /dev/null +++ b/src/cf/Enums/ТелеграмСтатусДиалога.xml @@ -0,0 +1,67 @@ + + + + + + cf2bd22c-53f7-4ac4-b9cd-481d538fa00e + 6d902a2a-3f17-4fd5-b737-7026d967c7b8 + + + 8db25e5c-a1bf-4d76-aec6-db62437baabf + 70ab63bd-a1f5-4a77-9a44-aa12047391a8 + + + 392a66d6-1ea8-4044-b85f-a259b75aea29 + f4d001cd-6eda-4cf1-b3a4-124be40377dd + + + + ТелеграмСтатусДиалога + + + ru + Телеграм статус диалога + + + + false + + true + BothWays + + + + + + + + Auto + + + + + НачальноеСостояние + + + ru + Начальное состояние + + + + + + + + ОжиданиеВводаВерсии + + + ru + Ожидание ввода версии + + + + + + + + \ No newline at end of file diff --git a/src/cf/VERSION b/src/cf/VERSION index aed039b..b82891c 100644 --- a/src/cf/VERSION +++ b/src/cf/VERSION @@ -1,2 +1,2 @@  -6 +7