Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавление параметров для отправки в telegram #31

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Описание.Имя("messenger")
.Версия("2.0.8")
.Версия("2.0.9")
.ЗависитОт("json")
.ВключитьФайл("readme.md")
.ВключитьФайл("src")
Expand Down
13 changes: 11 additions & 2 deletions src/Мессенджер_v2.os
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,14 @@
// Сообщение - Строка - Текст отправляемого сообщения
// ТемаСообщения - Строка - Тема сообщения, воспринимается не всеми транспортами
// ТипСообщения - Строка - Тип сообщения, воспринимается не всеми транспортами
// ДополнительныеПараметры - Струкутра дополнительных параметров, иницициализированная на этапе приложения
//
Процедура ОтправитьСообщение(ИмяТранспорта, Адресат, Сообщение, ТемаСообщения = "", ТипСообщения = "") Экспорт
Процедура ОтправитьСообщение(ИмяТранспорта,
Адресат,
Сообщение,
ТемаСообщения = "",
ТипСообщения = "",
Знач ДополнительныеПараметры = Неопределено) Экспорт

Транспорт = Неопределено;
Если Не Транспорты.Свойство(ИмяТранспорта, Транспорт) Тогда
Expand All @@ -50,7 +56,10 @@

КонецЕсли;

ДополнительныеПараметры = Новый Структура;
Если ДополнительныеПараметры = Неопределено Тогда
ДополнительныеПараметры = Новый Структура;
КонецЕсли;

ДополнительныеПараметры.Вставить("ТемаСообщения", ТемаСообщения);
ДополнительныеПараметры.Вставить("ТипСообщения", ТипСообщения);
Транспорт.ОтправитьСообщение(Адресат, Сообщение, ДополнительныеПараметры);
Expand Down
90 changes: 89 additions & 1 deletion src/Транспорты/ТранспортТелеграм.os
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,15 @@

КонецЕсли;

// При отпралке сообщений с parse_mode HTML, Markdown или MarkdownV2
// необходимо дополнительно экранировать сообщение

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В PR 34 отпала необходимость экранивания.
Все параметры убраны в тело post-запроса.

// детали экранирования описаны https://core.telegram.org/bots/api#formatting-options
ТекстСообщения = СтрЗаменить(Сообщение, Символы.ПС, "%0A");

ПараметрыСообщения = Новый Структура("chat_id, text", Адресат, ТекстСообщения);

ОпределитьТипСообщения(ДополнительныеПараметры, ПараметрыСообщения);
ЗаполнитьДоступныеПараметры(ДополнительныеПараметры, ПараметрыСообщения);

Попытка
ОтветHTTP = ВызватьМетодTelegramAPI("sendMessage", ПараметрыСообщения);
Expand Down Expand Up @@ -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",
ВернутьПеревод(ДополнительныеПараметры.ОтключитьУведомление));
КонецЕсли;

// Защищает содержимое отправленного сообщения от пересылки и сохранения
Если ДополнительныеПараметры.Свойство("ЗащищенныйКонтент") Тогда
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Неплохо бы документировать, какие вообще "дополнительные параметры" возможны. А лучше сделать не структуру, а специальный класс со всеми свойствами:

ДопСвойства = Новый ПараметрыОтправки();
ДопСвойства.ЗащищенныйКонтент = Истина;

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кстати, внутрь этого класса можно будет инкапсулировать и "вернуть перевод" и сами английские параметры фактической отправки. Получится Json = ПараметрыОтправки.СвойстваСообщения()

Copy link
Author

@8095tores 8095tores Apr 27, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

имеется ввиду сделать отдельный класс для всех Транспортов и инициализировать его на этапе использования библиотеки?
Чтобы было что-то подобное:
Мессенджер = Новый Мессенджер();
Мессенджер.ИнициализироватьТранспорт("telegram", СтруктураАутентификации);
ДопСвойства = Новый ПараметрыОтправки();
ДопСвойства.ЗащищенныйКонтент = Истина;
Мессенджер.ОтправитьСообщение("telegram", ИдентификаторКанала, Сообщение, ДопСвойства);

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я имел в виду, что Структура для пользователя библиотеки это черный ящик. Что в нее можно класть? Какие свойства поймет библиотека? Без залезания в код - не выяснить. Нужна или документация или класс с явными свойствами вместо Структуры.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ок.
попробую перекрутить

ПараметрыСообщения.Вставить("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";
КонецЕсли;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////

ПараметрыАвторизации = Неопределено;