diff --git a/packagedef b/packagedef index b8b8dae..3b65527 100644 --- a/packagedef +++ b/packagedef @@ -1,5 +1,5 @@ Описание.Имя("messenger") - .Версия("2.0.8") + .Версия("2.0.9") .ЗависитОт("json") .ВключитьФайл("readme.md") .ВключитьФайл("src") diff --git "a/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200_v2.os" "b/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200_v2.os" index faab4e6..a77032f 100644 --- "a/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200_v2.os" +++ "b/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200_v2.os" @@ -40,8 +40,14 @@ // Сообщение - Строка - Текст отправляемого сообщения // ТемаСообщения - Строка - Тема сообщения, воспринимается не всеми транспортами // ТипСообщения - Строка - Тип сообщения, воспринимается не всеми транспортами +// ДополнительныеПараметры - Струкутра дополнительных параметров, иницициализированная на этапе приложения // -Процедура ОтправитьСообщение(ИмяТранспорта, Адресат, Сообщение, ТемаСообщения = "", ТипСообщения = "") Экспорт +Процедура ОтправитьСообщение(ИмяТранспорта, + Адресат, + Сообщение, + ТемаСообщения = "", + ТипСообщения = "", + Знач ДополнительныеПараметры = Неопределено) Экспорт Транспорт = Неопределено; Если Не Транспорты.Свойство(ИмяТранспорта, Транспорт) Тогда @@ -50,7 +56,10 @@ КонецЕсли; - ДополнительныеПараметры = Новый Структура; + Если ДополнительныеПараметры = Неопределено Тогда + ДополнительныеПараметры = Новый Структура; + КонецЕсли; + ДополнительныеПараметры.Вставить("ТемаСообщения", ТемаСообщения); ДополнительныеПараметры.Вставить("ТипСообщения", ТипСообщения); Транспорт.ОтправитьСообщение(Адресат, Сообщение, ДополнительныеПараметры); diff --git "a/src/\320\242\321\200\320\260\320\275\321\201\320\277\320\276\321\200\321\202\321\213/\320\242\321\200\320\260\320\275\321\201\320\277\320\276\321\200\321\202\320\242\320\265\320\273\320\265\320\263\321\200\320\260\320\274.os" "b/src/\320\242\321\200\320\260\320\275\321\201\320\277\320\276\321\200\321\202\321\213/\320\242\321\200\320\260\320\275\321\201\320\277\320\276\321\200\321\202\320\242\320\265\320\273\320\265\320\263\321\200\320\260\320\274.os" index c425a2e..08fddfa 100644 --- "a/src/\320\242\321\200\320\260\320\275\321\201\320\277\320\276\321\200\321\202\321\213/\320\242\321\200\320\260\320\275\321\201\320\277\320\276\321\200\321\202\320\242\320\265\320\273\320\265\320\263\321\200\320\260\320\274.os" +++ "b/src/\320\242\321\200\320\260\320\275\321\201\320\277\320\276\321\200\321\202\321\213/\320\242\321\200\320\260\320\275\321\201\320\277\320\276\321\200\321\202\320\242\320\265\320\273\320\265\320\263\321\200\320\260\320\274.os" @@ -73,10 +73,15 @@ КонецЕсли; + // При отпралке сообщений с parse_mode HTML, Markdown или MarkdownV2 + // необходимо дополнительно экранировать сообщение + // детали экранирования описаны https://core.telegram.org/bots/api#formatting-options ТекстСообщения = СтрЗаменить(Сообщение, Символы.ПС, "%0A"); + ПараметрыСообщения = Новый Структура("chat_id, text", Адресат, ТекстСообщения); ОпределитьТипСообщения(ДополнительныеПараметры, ПараметрыСообщения); + ЗаполнитьДоступныеПараметры(ДополнительныеПараметры, ПараметрыСообщения); Попытка ОтветHTTP = ВызватьМетодTelegramAPI("sendMessage", ПараметрыСообщения); @@ -166,13 +171,96 @@ ДополнительныеПараметры.Свойство("ТипСообщения") Тогда ТипСообщения = НРег(ДополнительныеПараметры.ТипСообщения); Если ТипСообщения = "html" Тогда - ПараметрыСообщения.Вставить("parse_mode", "html"); + ПараметрыСообщения.Вставить("parse_mode", "HTML"); ИначеЕсли ТипСообщения = "markdown" или ТипСообщения = "md" Тогда ПараметрыСообщения.Вставить("parse_mode", "Markdown"); + ИначеЕсли ТипСообщения = "markdown2" или ТипСообщения = "md2" Тогда + ПараметрыСообщения.Вставить("parse_mode", "MarkdownV2"); + Иначе + Если ЗначениеЗаполнено(ТипСообщения) Тогда + Сообщение = СтрШаблон("Передан неподдерживаемый тип сообщения %1", ТипСообщения); + Сообщить(Сообщение); + КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры + +// ЗаполнитьДоступныеПараметры +// Метод заполнения ддоступных параметров отправки сообщения +// Описаны по ссылке https://core.telegram.org/bots/api#sendmessage +// +// Параметры: +// ДополнительныеПараметры - Структура - Набор дополнительных параметров +// ПараметрыСообщения - Структура - Набор параметров сообщения +// +Процедура ЗаполнитьДоступныеПараметры(ДополнительныеПараметры, ПараметрыСообщения) + + Если НЕ ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда + Возврат; + КонецЕсли; + + // Отключает предварительный просмотр ссылок в этом сообщении + Если ДополнительныеПараметры.Свойство("ОтключитьПрепросмотр") Тогда + ПараметрыСообщения.Вставить("disable_web_page_preview", + ВернутьПеревод(ДополнительныеПараметры.ОтключитьПрепросмотр)); + КонецЕсли; + + // Отправляет сообщение молча. Пользователи получат уведомление без звука. + Если ДополнительныеПараметры.Свойство("ОтключитьУведомление") Тогда + ПараметрыСообщения.Вставить("disable_notification", + ВернутьПеревод(ДополнительныеПараметры.ОтключитьУведомление)); + КонецЕсли; + + // Защищает содержимое отправленного сообщения от пересылки и сохранения + Если ДополнительныеПараметры.Свойство("ЗащищенныйКонтент") Тогда + ПараметрыСообщения.Вставить("protect_content", + ВернутьПеревод(ДополнительныеПараметры.ЗащищенныйКонтент)); + КонецЕсли; + + // Если сообщение является ответом, ID исходного сообщения + Если ДополнительныеПараметры.Свойство("СообщениеОснование") Тогда + ПараметрыСообщения.Вставить("reply_to_message_id", ДополнительныеПараметры.СообщениеОснование); + КонецЕсли; + + // Установить true, если сообщение должно быть отправлено, даже если указанное в reply_to_message_id не найдено + Если ДополнительныеПараметры.Свойство("РазрешитьОтправкуБезОснования") Тогда + ПараметрыСообщения.Вставить("allow_sending_without_reply", + ВернутьПеревод(ДополнительныеПараметры.РазрешитьОтправкуБезОснования)); + КонецЕсли; + + // Сериализованный в формате JSON список специальных сущностей, + // которые появляются в тексте сообщения, который можно указать вместо parse_mode. + // https://core.telegram.org/bots/api#messageentity + Если ДополнительныеПараметры.Свойство("ДополнительныеСущности") Тогда + ПараметрыСообщения.Вставить("entities", + ДополнительныеПараметры.ДополнительныеСущности); + КонецЕсли; + + // Дополнительные возможности интерфейса. Сериализованный объект JSON + // для встроенной клавиатуры, настраиваемой клавиатуры для ответов, инструкций по + // удалению клавиатуры для ответов или принудительному ответу пользователя. + // https://core.telegram.org/bots/api#inlinekeyboardmarkup + // https://core.telegram.org/bots/api#replykeyboardmarkup + // https://core.telegram.org/bots/api#replykeyboardremove + // https://core.telegram.org/bots/api#forcereply + Если ДополнительныеПараметры.Свойство("ПараметрыОтвета") Тогда + ПараметрыСообщения.Вставить("reply_markup", + ДополнительныеПараметры.ПараметрыОтвета); + КонецЕсли; + +КонецПроцедуры // ЗаполнитьДоступныеПараметры() + + +Функция ВернутьПеревод(ВходящееЗначение) + Если ВходящееЗначение = Истина Тогда + Возврат "true"; + ИначеЕсли ВходящееЗначение = Ложь Тогда + Возврат "false"; + Иначе + Возврат "null"; + КонецЕсли; +КонецФункции /////////////////////////////////////////////////////////////////////////////////////////////// ПараметрыАвторизации = Неопределено;