- Добавил таймаут в вызовы http-методов - Общие модули приведены к требованиям стандарта
279 lines
15 KiB
Plaintext
279 lines
15 KiB
Plaintext
#Область ПрограммныйИнтерфейс
|
||
|
||
Функция ИдПоследнегоСообщения() Экспорт
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| ЕСТЬ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) + СмещениеСтандартногоВремени(ЧасовойПоясСеанса()) + ЮниксТайм;
|
||
|
||
КонецФункции
|
||
|
||
#КонецОбласти
|