Files
tg_bot_1c/src/cf/CommonModules/ТелеграмОбщегоНазначения/Ext/Module.bsl
kashey 296b6a5bc3 Рефакторинг общих модулей по замечаниям Sonarqube
- Добавил таймаут в вызовы http-методов
- Общие модули приведены к требованиям стандарта
2025-06-09 17:08:13 +03:00

279 lines
15 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#Область ПрограммныйИнтерфейс
Функция ИдПоследнегоСообщения() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(МАКСИМУМ(ТелеграмСообщения.ИдСообщения), 0) КАК ИдСообщения
|ИЗ
| РегистрСведений.ТелеграмСообщения КАК ТелеграмСообщения";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат ВыборкаДетальныеЗаписи.ИдСообщения;
КонецЕсли;
Возврат 0;
КонецФункции
// Получить обновления, пришедшие от вебхука и сохранить в базу
Процедура ОбработатьИСохранитьОбновленияТелеграм(ТелоЗапроса) Экспорт
ДанныеОбновления = HttpОбщегоНазначенияВызовСервера.СтрокаJsonВОбъект(ТелоЗапроса);
Если ДанныеОбновления = Неопределено Тогда
Возврат;
КонецЕсли;
Если ЭтоМассивОбновлений(ДанныеОбновления) Тогда
МассивОбновлений = ДанныеОбновления["result"];
Для каждого Обновление Из МассивОбновлений Цикл
ПараметрыСообщения = СтруктураСообщенияТелеграм(Обновление);
СохранитьСообщениеВБазу(ПараметрыСообщения);
КонецЦикла;
ИначеЕсли ЭтоОдиночноеОбновление(ДанныеОбновления) Тогда
ПараметрыСообщения = СтруктураСообщенияТелеграм(ДанныеОбновления);
СохранитьСообщениеВБазу(ПараметрыСообщения);
КонецЕсли;
КонецПроцедуры
Функция ОбновленияТелеграм(ТелоЗапроса) Экспорт
Если ТипЗнч(ТелоЗапроса) = Тип("Соответствие") Тогда
ДанныеОбновления = ТелоЗапроса;
ИначеЕсли ТипЗнч(ТелоЗапроса) = Тип("Строка") Тогда
ДанныеОбновления = HttpОбщегоНазначенияВызовСервера.СтрокаJsonВОбъект(ТелоЗапроса);
Иначе
Возврат Неопределено;
КонецЕсли;
МассивСообщенийТелеграм = Новый Массив;
Если ДанныеОбновления = Неопределено Тогда
Возврат МассивСообщенийТелеграм;
КонецЕсли;
Если ЭтоМассивОбновлений(ДанныеОбновления) Тогда
МассивОбновлений = ДанныеОбновления["result"];
Для каждого Обновление Из МассивОбновлений Цикл
ПараметрыСообщения = СтруктураСообщенияТелеграм(Обновление);
МассивСообщенийТелеграм.Добавить(ПараметрыСообщения)
КонецЦикла;
ИначеЕсли ЭтоОдиночноеОбновление(ДанныеОбновления) Тогда
Если ДанныеОбновления.Получить("message") <> Неопределено Тогда
ПараметрыСообщения = СтруктураСообщенияТелеграм(ДанныеОбновления);
ИначеЕсли ДанныеОбновления.Получить("callback_query") <> Неопределено Тогда
ПараметрыСообщения = СтруктураКоллбэкЗапроса(ДанныеОбновления);
КонецЕсли;
МассивСообщенийТелеграм.Добавить(ПараметрыСообщения)
КонецЕсли;
Возврат МассивСообщенийТелеграм;
КонецФункции
Функция СтруктураСообщенияТелеграм(Обновление)
ДанныеСообщения = Обновление["message"];
ПараметрыСообщения = Новый Структура;
ПараметрыСообщения.Вставить("ИдСообщения", Обновление["update_id"]);
Автор = АвторСообщения(ДанныеСообщения["from"]);
ПараметрыСообщения.Вставить("Автор", Автор);
НовоеСообщение = ТелеграмСообщение(ДанныеСообщения, Автор);
ПараметрыСообщения.Вставить("Сообщение", НовоеСообщение);
ПараметрыСообщения.Вставить("Дата", ТекущаяДатаСеанса());
ИдЧата = ДанныеСообщения["chat"]["id"];
ПараметрыСообщения.Вставить("ИдЧата", ИдЧата);
Возврат ПараметрыСообщения;
КонецФункции
Функция СтруктураКоллбэкЗапроса(Обновление)
ДанныеСообщения = Обновление["callback_query"];
ПараметрыСообщения = Новый Структура;
ПараметрыСообщения.Вставить("ИдКоллбэкЗапроса", Обновление["update_id"]);
Автор = АвторСообщения(ДанныеСообщения["from"]);
ПараметрыСообщения.Вставить("Автор", Автор);
Если ДанныеСообщения.Получить("message") <> Неопределено Тогда
НовоеСообщение = ТелеграмСообщение(ДанныеСообщения["message"], Автор);
ПараметрыСообщения.Вставить("Сообщение", НовоеСообщение);
КонецЕсли;
ПараметрыСообщения.Вставить("Дата", ТекущаяДатаСеанса());
ИдЧата = Автор.id;
ПараметрыСообщения.Вставить("ИдЧата", ИдЧата);
ДанныеКоллбэка = ДанныеСообщения["data"];
ПараметрыСообщения.Вставить("ДанныеКоллбэка", ДанныеКоллбэка);
Возврат ПараметрыСообщения;
КонецФункции
Процедура СохранитьСообщениеВБазу(СтруктураСообщения) Экспорт
МенеджерЗаписи = РегистрыСведений.ТелеграмСообщения.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(МенеджерЗаписи, СтруктураСообщения);
МенеджерЗаписи.Записать();
КонецПроцедуры
Функция ПолучитьФайлССервераТелеграм(ПутьКФайлуНаСервере) Экспорт
АдресРесурса = СтрШаблон("file/bot%1/%2", ТелеграмПовторноеИспользование.ТелеграмТокен(), ПутьКФайлуНаСервере);
Соединение = Новый HTTPСоединение("api.telegram.org",443,,,, 15, Новый ЗащищенноеСоединениеOpenSSL);
Возврат HttpОбщегоНазначенияВызовСервера.ВыполнитьGetЗапрос(Соединение, АдресРесурса,, Истина);
КонецФункции
Функция ДанныеДокументаПоИд(ИдДокумента) Экспорт
Ответ = ТелеграмМетодыВызовСервера.GetFile(ИдДокумента);
Если Ответ.Успех И Ответ.Тело.Получить("result") <> Неопределено Тогда
Возврат ПолучитьФайлССервераТелеграм(Ответ.Тело["result"]["file_path"]);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ЭтоМассивОбновлений(СоответствиеОбновления)
Результат = СоответствиеОбновления.Получить("ok");
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция ЭтоОдиночноеОбновление(СоответствиеОбновления)
ИдОбновления = СоответствиеОбновления.Получить("update_id");
Сообщение = СоответствиеОбновления.Получить("message");
КоллбэкЗапрос = СоответствиеОбновления.Получить("callback_query");
Если ИдОбновления <> Неопределено И (Сообщение <> Неопределено ИЛИ КоллбэкЗапрос <> Неопределено) Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция АвторСообщения(СоответствиеОт)
Если СоответствиеОт.Получить("id") = Неопределено Тогда
Возврат Справочники.ТелеграмПользователь.НеОпределен;
КонецЕсли;
Автор = Справочники.ТелеграмПользователь.НайтиПоРеквизиту("id", СоответствиеОт["id"]);
Если Не ЗначениеЗаполнено(Автор) Тогда
НовыйПользователь = Справочники.ТелеграмПользователь.СоздатьЭлемент();
НовыйПользователь.Наименование = СоответствиеОт["first_name"];
НовыйПользователь.id = СоответствиеОт["id"];
НовыйПользователь.last_name = СоответствиеОт["last_name"];
НовыйПользователь.username = СоответствиеОт["username"];
НовыйПользователь.Записать();
Автор = НовыйПользователь.Ссылка;
КонецЕсли;
Возврат Автор;
КонецФункции
Функция ТелеграмСообщение(СообщениеДляОбработки, Автор)
ИдСообщения = СообщениеДляОбработки.Получить("message_id");
Если ИдСообщения = Неопределено Тогда
Возврат Справочники.ТелеграмСообщение.ПустаяСсылка();
КонецЕсли;
ИтоговоеСообщение = Справочники.ТелеграмСообщение.НайтиПоРеквизиту("id", ИдСообщения);
Если НЕ ЗначениеЗаполнено(ИтоговоеСообщение) Тогда
НовоеСообщение = Справочники.ТелеграмСообщение.СоздатьЭлемент();
НовоеСообщение.Наименование = "Сообщение № " + ИдСообщения + " от " + Автор;
НовоеСообщение.id = ИдСообщения;
НовоеСообщение.Автор = Автор;
Если СообщениеДляОбработки.Получить("text") <> Неопределено Тогда
НовоеСообщение.text = СообщениеДляОбработки["text"];
КонецЕсли;
Если СообщениеДляОбработки.Получить("document") <> Неопределено Тогда
НовоеСообщение.document = СформироватьДокумент(СообщениеДляОбработки["document"]);
КонецЕсли;
НовоеСообщение.date = TimeStampToDate(СообщениеДляОбработки["date"]);
НовоеСообщение.Записать();
ИтоговоеСообщение = НовоеСообщение.Ссылка;
КонецЕсли;
Возврат ИтоговоеСообщение;
КонецФункции
Функция СформироватьДокумент(СоответствиеДокумент)
ИдДокумента = СоответствиеДокумент.Получить("file_unique_id");
Если ИдДокумента = Неопределено Тогда
Возврат Справочники.ТелеграмДокумент.ПустаяСсылка();
КонецЕсли;
ИтоговыйДокумент = Справочники.ТелеграмДокумент.НайтиПоРеквизиту("id", ИдДокумента);
Если НЕ ЗначениеЗаполнено(ИтоговыйДокумент) Тогда
НовыйДокумент = Справочники.ТелеграмДокумент.СоздатьЭлемент();
НовыйДокумент.Наименование = СоответствиеДокумент["file_name"];
НовыйДокумент.id = ИдДокумента;
НовыйДокумент.file_name = СоответствиеДокумент["file_name"];
НовыйДокумент.mime_type = СоответствиеДокумент["mime_type"];
НовыйДокумент.file_size = СоответствиеДокумент["file_size"];
ДанныеДокумента = ДанныеДокументаПоИд(СоответствиеДокумент["file_id"]);
Если ДанныеДокумента <> Неопределено Тогда
НовыйДокумент.ДанныеФайла = Новый ХранилищеЗначения(ДанныеДокумента);
КонецЕсли;
НовыйДокумент.Записать();
ИтоговыйДокумент = НовыйДокумент.Ссылка;
КонецЕсли;
Возврат ИтоговыйДокумент;
КонецФункции
Функция TimeStampToDate(ЮниксТайм)
Возврат Дата(1970,1,1,1,0,0) + СмещениеСтандартногоВремени(ЧасовойПоясСеанса()) + ЮниксТайм;
КонецФункции
#КонецОбласти