// OneScript: ./OInt/core/Modules/OPI_Telegram.os
// Lib: Telegram
// CLI: telegram

// MIT License

// Copyright (c) 2023 Anton Tsitavets

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

// https://github.com/Bayselonarrend/OpenIntegrations

// BSLLS:Typo-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnreachableCode-off
// BSLLS:CommentedCode-off
// BSLLS:UsingServiceTag-off
// BSLLS:NumberOfParams-off

//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content

// Раскомментировать, если выполняется OneScript
// #Использовать "../../tools"

#Область ПрограммныйИнтерфейс

#Область ПолучениеДанныхИНастройка

// Получить информацию о боте
// Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д.
//
// Параметры:
//  Токен - Строка - Токен бота - token
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПолучитьИнформациюБота(Знач Токен) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    URL   = "api.telegram.org/bot" + Токен + "/getMe";
    Ответ = OPI_Инструменты.Get(URL);

    Возврат Ответ;

КонецФункции

// Получить обновления
// Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме
//
// Параметры:
//  Токен    - Строка       - Токен бота                             - token
//  Таймаут  - Строка,Число - Время ожидания новых событий           - timeout
//  Смещение - Строка,Число - Смещение в списке получаемых сообщений - offset
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    URL   = "api.telegram.org/bot" + Токен + "/getUpdates";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);
    Возврат Ответ;

КонецФункции

// Установить Webhook
// Устанавливает URL обработчика событий бота для работы в режиме Webhook
//
// Параметры:
//  Токен - Строка - Токен бота                                      - token
//  URL   - Строка - Адрес обработки запросов от Telegram (с https:) - url
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры);

    URL   = "api.telegram.org/bot" + Токен + "/setWebHook";
    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Удалить Webhook
// Удаляет URL обработчика событий бота для работы в режиме Webhook
//
// Параметры:
//  Токен - Строка - Токен бота - token
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция УдалитьWebhook(Знач Токен) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    URL   = "api.telegram.org/bot" + Токен + "/deleteWebHook";
    Ответ = OPI_Инструменты.Get(URL);

    Возврат Ответ;

КонецФункции

// Скачать файл
// Скачивает файл с серверов Telegram
//
// Параметры:
//  Токен   - Строка - Токен                   - token
//  IDФайла - Строка - ID файла для скачивания - fileid
//
// Возвращаемое значение:
//  ДвоичныеДанные - данные файла
Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт

    Result = "result";

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);

    Параметры = Новый Структура("file_id", IDФайла);

    URL   = "api.telegram.org/bot" + Токен + "/getFile";
    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Путь = Ответ[Result]["file_path"];

    Если Не ЗначениеЗаполнено(Путь) Тогда
        Возврат Ответ;
    КонецЕсли;

    URL   = "api.telegram.org/file/bot" + Токен + "/" + Путь;
    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// ОбработатьДанные Telegram Mini App
// Обрабатывает данные TMA и опредеяет их достоверность
//
// Параметры:
//  СтрокаДанных - Строка - querry из Telegram.WebApp.initData
//  Токен        - Строка - Токен бота
//
// Возвращаемое значение:
//  Соответствие из Строка - Соответствие данных с результатом проверки в поле passed
Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных);

    СтрокаДанных    = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL);
    СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных);
    КлючСтрокой     = "WebAppData";
    Хэш             = "";
    КлючДвоичные    = ПолучитьДвоичныеДанныеИзСтроки(КлючСтрокой);

    Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен));

    ТЗнач = Новый ТаблицаЗначений;
    ТЗнач.Колонки.Добавить("Ключ");
    ТЗнач.Колонки.Добавить("Значение");

    Для Каждого Данные Из СтруктураДанных Цикл

        НоваяСтрока             = ТЗнач.Добавить();
        НоваяСтрока.Ключ        = Данные.Ключ;
        НоваяСтрока.Значение    = Данные.Значение;

    КонецЦикла;

    ТЗнач.Сортировать("Ключ");

    СоответствиеВозврата = Новый Соответствие;
    DCS                  = "";

    Для Каждого СтрокаТЗ Из ТЗнач Цикл

        Если СтрокаТЗ.Ключ <> "hash" Тогда
            DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС;
            СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение);
        Иначе
            Хэш = СтрокаТЗ.Значение;
        КонецЕсли;

    КонецЦикла;

    DCS     = Лев(DCS, СтрДлина(DCS) - 1);
    Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS));

    Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись);

    Если Финал = вРег(Хэш) Тогда
        Ответ  = Истина;
    Иначе
        Ответ  = Ложь;
    КонецЕсли;

    СоответствиеВозврата.Вставить("passed", Ответ);

    Возврат СоответствиеВозврата;

КонецФункции

#КонецОбласти

#Область ОтправкаДанных

// Отправить текстовое сообщение
// Отправляет текстовое сообщение в чат или канал
//
// Параметры:
//  Токен       - Строка       - Токен бота                                        - token
//  IDЧата      - Строка,Число - ID целевого чата или IDЧата*IDТемы                - chat
//  Текст       - Строка       - Текст сообщения                                   - text
//  Клавиатура  - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка    - Строка       - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
//  IDВходящего - Строка,Число - ID сообщения на которое надо ответить             - reply
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьТекстовоеСообщение(Знач Токен
    , Знач IDЧата
    , Знач Текст
    , Знач Клавиатура = ""
    , Знач Разметка = "Markdown"
    , Знач IDВходящего = 0) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка);

    Строка_ = "Строка";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"         , Разметка   , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("text"               , Текст      , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_markup"       , Клавиатура , "СтрокаФайла", Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_to_message_id", IDВходящего, Строка_      , Параметры);

    ДобавитьИдентификаторЧата(IDЧата, Параметры);

    URL   = "api.telegram.org/bot" + Токен + "/sendMessage";
    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Отправить картинку
// Отправляет картинку в чат или канал
//
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  Картинка   - ДвоичныеДанные,Строка - Файл картинки                             - picture
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьКартинку(Знач Токен
    , Знач IDЧата
    , Знач Текст
    , Знач Картинка
    , Знач Клавиатура = ""
    , Знач Разметка = "Markdown") Экспорт

    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка);

КонецФункции

// Отправить видео
// Отправляет видео в чат или канал
//
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  Видео      - ДвоичныеДанные,Строка - Файл видео                                - video
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьВидео(Знач Токен
    , Знач IDЧата
    , Знач Текст
    , Знач Видео
    , Знач Клавиатура = ""
    , Знач Разметка = "Markdown") Экспорт

    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка);

КонецФункции

// Отправить аудио
// Отправляет аудиофайл в чат или канал
//
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  Аудио      - ДвоичныеДанные,Строка - Файл аудио                                - audio
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьАудио(Знач Токен
    , Знач IDЧата
    , Знач Текст
    , Знач Аудио
    , Знач Клавиатура = ""
    , Знач Разметка = "Markdown") Экспорт

    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка);

КонецФункции

// Отправить документ
// Отправляет документ в чат или канал
//
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  Документ   - ДвоичныеДанные,Строка - Файл документа                            - doc
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2)        - parsemode
//  ИмяФайла   - Строка - Отображаемое имя файла c расширением, если необходимо    - filename
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьДокумент(Знач Токен
    , Знач IDЧата
    , Знач Текст
    , Знач Документ
    , Знач Клавиатура = ""
    , Знач Разметка = "Markdown"
    , Знач ИмяФайла = "") Экспорт

    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка, ИмяФайла);

КонецФункции

// Отправить гифку
// Отправляет гифку в чат или канал
//
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  Гифка      - ДвоичныеДанные,Строка - Файл гифки                                - gif
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьГифку(Знач Токен
    , Знач IDЧата
    , Знач Текст
    , Знач Гифка
    , Знач Клавиатура = ""
    , Знач Разметка = "Markdown") Экспорт

    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка);

КонецФункции

// Отправить группу медиафайлов
// Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video
//
// Примечание:
// Соответствие файлов: Ключ - Файл, Значение - один из типов медиа
//
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  СоответствиеФайлов - Соответствие из Строка - Коллекция файлов  - media - JSON файлов или путь к .json
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьМедиагруппу(Знач Токен
    , Знач IDЧата
    , Знач Текст
    , Знач СоответствиеФайлов
    , Знач Клавиатура = ""
    , Знач Разметка = "Markdown") Экспорт

    // СоответствиеФайлов
    // Ключ - Файл, Значение - Тип
    // Типы: audio, document, photo, video
    // Нельзя замешивать разные типы!

    Строка_ = "Строка";

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);

    OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);

    URL             = "api.telegram.org/bot" + Токен + "/sendMediaGroup";
    Медиа           = Новый Массив;
    Параметры       = Новый Структура;

    ДобавитьИдентификаторЧата(IDЧата, Параметры);
    ПреобразоватьФайлыВМедиа(СоответствиеФайлов, Текст, Медиа);

    OPI_Инструменты.ДобавитьПоле("parse_mode"  , Разметка  , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("caption"     , Текст     , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("media"       , Медиа     , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);

    Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СоответствиеФайлов, "mixed");

    Возврат Ответ;

КонецФункции

// Отправить местоположение
// Отправляет местоположение по географической широте и долготе в чат или канал
//
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Широта     - Строка,Число          - Географическая широта                     - lat
//  Долгота    - Строка,Число          - Географическая долгота                    - long
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт

    Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);

    URL = "api.telegram.org/bot" + Токен + "/sendLocation";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"  , "Markdown" , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("latitude"    , Широта     , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("longitude"   , Долгота    , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "СтрокаФайла", Параметры);

    ДобавитьИдентификаторЧата(IDЧата, Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Отправить контакт
// Отправляет контакт с именем и номером телефона
//
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Имя        - Строка                - Имя контакта                              - name
//  Фамилия    - Строка                - Фамилия контакта                          - surname
//  Телефон    - Строка                - Телефон контакта                          - phone
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт

    Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);

    URL = "api.telegram.org/bot" + Токен + "/sendContact";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"  , "Markdown", Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("first_name"  , Имя       , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("last_name"   , Фамилия   , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("phone_number", Телефон   , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);

    ДобавитьИдентификаторЧата(IDЧата, Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Отправить опрос
// Отправляет опрос с вариантами ответа
//
// Параметры:
//  Токен         - Строка                - Токен бота                                 - token
//  IDЧата        - Строка,Число          - ID целевого чата или IDЧата*IDТемы         - chat
//  Вопрос        - Строка                - Вопрос опроса                              - question
//  МассивОтветов - Массив из Строка      - Массив вариантов ответа                    - options
//  Анонимный     - Булево                - Анонимность опроса                         - anonymous
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов);

    OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный);

    URL = "api.telegram.org/bot" + Токен + "/sendPoll";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown"   , "Строка"     , Параметры);
    OPI_Инструменты.ДобавитьПоле("question"  , Вопрос       , "Строка"     , Параметры);
    OPI_Инструменты.ДобавитьПоле("options"   , МассивОтветов, "СтрокаФайла", Параметры);

    Параметры.Вставить("is_anonymous", ?(Анонимный, 1, 0));
    ДобавитьИдентификаторЧата(IDЧата, Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Переслать сообщение
// Пересылает сообщение между чатами или в рамках одного чата
//
// Параметры:
//  Токен         - Строка       - Токен бота                         - token
//  IDОригинала   - Строка,Число - ID оригинального сообщения         - message
//  ОткудаID      - Строка,Число - ID чата оригинального сообщения    - from
//  КудаID        - Строка,Число - ID целевого чата или IDЧата*IDТемы - to
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОригинала);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(ОткудаID);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(КудаID);

    URL = "api.telegram.org/bot" + Токен + "/forwardMessage";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("from_chat_id", ОткудаID   , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("message_id"  , IDОригинала, "Строка", Параметры);

    ДобавитьИдентификаторЧата(КудаID, Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Сформировать клавиатуру по массиву кнопок
// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели
//
// Параметры:
//  МассивКнопок  - Массив из Строка - Массив кнопок                                        - buttons
//  ПодСообщением - Булево           - Клавиатура под сообщением или на нижней панели       - under
//  ОднаПодОдной  - Булево           - Истина > кнопки выводятся в столбик, Ложь > в строку - column
//
// Возвращаемое значение:
//  Строка -  JSON клавиатуры
Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок
    , Знач ПодСообщением = Ложь
    , Знач ОднаПодОдной = Истина) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением);
    OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной);
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);

    Если ОднаПодОдной Тогда
        Строки = СоздатьВысокуюКлавиатуру(МассивКнопок);
    Иначе
        Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок);
    КонецЕсли;

    Если ПодСообщением Тогда
        СтруктураПараметра = Новый Структура("inline_keyboard,rows"    , Строки, 1);
    Иначе
        СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина);
    КонецЕсли;

    Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра);

    Возврат Клавиатура;

КонецФункции

#КонецОбласти

#Область Администрирование

// Бан
// Банит пользователя в выбранном чате
//
// Параметры:
//  Токен          - Строка       - Токен бота                         - token
//  IDЧата         - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
//  IDПользователя - Строка,Число - ID целевого пользователя           - user
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт

    Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    URL = "api.telegram.org/bot" + Токен + "/banChatMember";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown"    , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата        , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("user_id"   , IDПользователя, Строка_, Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Разбан
// Разбанивает забаненного ранее пользователя
//
// Параметры:
//  Токен          - Строка       - Токен бота                         - token
//  IDЧата         - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
//  IDПользователя - Строка,Число - ID целевого пользователя           - user
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт

    Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    URL = "api.telegram.org/bot" + Токен + "/unbanChatMember";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"    , "Markdown"    , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"       , IDЧата        , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("user_id"       , IDПользователя, Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("only_if_banned", Ложь          , "Булево", Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Создать ссылку-приглашение
// Создает ссылку для вступления в закрытый чат
//
// Параметры:
//  Токен              - Строка         - Токен бота                                               - token
//  IDЧата             - Строка,Число   - ID целевого чата или IDЧата*IDТемы                       - chat
//  Заголовок          - Строка         - Заголовок приглашения                                    - title
//  ДатаИстечения      - Дата           - Дата окончания жизни ссылки (безсрочно, если не указано) - expire
//  ЛимитПользователей - Число          - Лимит пользователей (бесконечно, если не указано)        - limit
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция СоздатьСсылкуПриглашение(Знач Токен
    , Знач IDЧата
    , Знач Заголовок = ""
    , Знач ДатаИстечения = ""
    , Знач ЛимитПользователей = 0) Экспорт

    Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"    , "Markdown"        , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"       , IDЧата            , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("name"          , Заголовок         , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("member_limit"  , ЛимитПользователей, Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("expire_date"   , ДатаИстечения     , "Дата"  , Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Закрепить сообщение
// Закрепляет сообщение в шапке чата
//
// Параметры:
//  Токен       - Строка       - Токен                 - token
//  IDЧата      - Строка,Число - ID целевого чата      - chat
//  IDСообщения - Строка,Число - ID целевого сообщения - message
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт

    Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    URL = "api.telegram.org/bot" + Токен + "/pinChatMessage";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"          , "Markdown" , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"             , IDЧата     , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("message_id"          , IDСообщения, Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("disable_notification", Ложь       , "Булево", Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Открепить сообщение
// Открепляет сообщение в шапке чата
//
// Параметры:
//  Токен       - Строка       - Токен бота            - token
//  IDЧата      - Строка,Число - ID целевого чата      - chat
//  IDСообщения - Строка,Число - ID целевого сообщения - message
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт

    Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата     , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, Строка_, Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Получить число участников
// Получает общее число участников чата
//
// Параметры:
//  Токен  - Строка       - Токен бота       - token
//  IDЧата - Строка,Число - ID целевого чата - chat
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата     , "Строка", Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Удалить сообщение
// Удаляет указанное сообщение из чата или канала
//
// Параметры:
//  Токен       - Строка       - Токен                    - token
//  IDЧата      - Строка,Число - ID целевого чата         - chat
//  IDСообщения - Строка,Число - ID удаляемого сообщения  - message
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция УдалитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    URL = "api.telegram.org/bot" + Токен + "/deleteMessage";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата     , "Строка", Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);
    Возврат Ответ;

КонецФункции

#КонецОбласти

#Область РаботаСТемамиФорума

// Получить список иконок-аватаров
// Получает соответствие ID Emoji для установки в качестве иконок тем форума
//
// Параметры:
//  Токен - Строка - Токен - token
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji
Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    Result    = "result";
    URL       = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers";
    Ответ     = OPI_Инструменты.Get(URL);
    Иконки    = Ответ[Result];

    Если Не ЗначениеЗаполнено(Иконки) Тогда
        Возврат Ответ;
    КонецЕсли;

    Коллекция = Новый Соответствие;

    Для Каждого Иконка Из Иконки Цикл
        Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]);
    КонецЦикла;

    Возврат Коллекция;

КонецФункции

// Создать тему форума
// Создает новую тему в группе с включенным функционалом тем
//
// Параметры:
//  Токен     - Строка       - Токен                            - token
//  IDЧата    - Строка,Число - ID чата создания темы            - forum
//  Заголовок - Строка       - Заголовок темы                   - title
//  IDИконки  - Строка       - См. ПолучитьСписокИконокАватаров - icon
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт

    Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки);

КонецФункции

// Изменить тему форума
// Создает новую тему в группе с включенным функционалом тем
//
// Параметры:
//  Токен     - Строка       - Токен                            - token
//  IDЧата    - Строка,Число - ID чата создания темы            - forum
//  IDТемы    - Строка,Число - ID темы                          - topic
//  Заголовок - Строка       - Новый заголовок                  - title
//  IDИконки  - Строка       - См. ПолучитьСписокИконокАватаров - icon
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ИзменитьТемуФорума(Знач Токен
    , Знач IDЧата
    , Знач IDТемы
    , Знач Заголовок = Неопределено
    , Знач IDИконки = Неопределено) Экспорт

    Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы);
КонецФункции

// Закрыть тему форума
// Закрывает тему для новых сообщений
//
// Параметры:
//  Токен  - Строка       - Токен        - token
//  IDЧата - Строка,Число - ID чата темы - forum
//  IDТемы - Строка,Число - ID темы      - topic
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт

    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы);

КонецФункции

// Открыть тему форума
// Повторно открывает ранее закрытую тему форума
//
// Параметры:
//  Токен  - Строка       - Токен        - token
//  IDЧата - Строка,Число - ID чата темы - forum
//  IDТемы - Строка,Число - ID темы      - topic
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт

    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы);

КонецФункции

// Удалить тему форума
// Удаляет тему форума
//
// Параметры:
//  Токен  - Строка       - Токен        - token
//  IDЧата - Строка,Число - ID чата темы - forum
//  IDТемы - Строка,Число - ID темы      - topic
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт

    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы);

КонецФункции

// Скрыть главную тему форума
// Скрывает главную тему форума
//
// Параметры:
//  Токен  - Строка       - Токен        - token
//  IDЧата - Строка,Число - ID чата темы - forum
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт

    Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина);

КонецФункции

// Показать главную тему форума
// Показывает ранее скрытую главную тему форума
//
// Параметры:
//  Токен  - Строка       - Токен        - token
//  IDЧата - Строка,Число - ID чата темы - forum
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт

    Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь);

КонецФункции

// Изменить имя главной темы форума
// Изменяет имя главной темы форума
//
// Параметры:
//  Токен     - Строка       - Токен                   - token
//  IDЧата    - Строка,Число - ID чата темы            - forum
//  Заголовок - Строка       - Новое имя главной темы  - title
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата   , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("name"   , Заголовок, "Строка", Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Очистить список закрепленных сообщений темы
// Очищает список закрепленных сообщений в теме форума
//
// Параметры:
//  Токен  - Строка       - Токен                               - token
//  IDЧата - Строка,Число - ID чата темы                        - forum
//  IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic
//
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы);

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("chat_id"          , IDЧата, "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);

    Если ЗначениеЗаполнено(IDТемы) Тогда
        Метод = "/unpinAllForumTopicMessages";
    Иначе
        Метод = "/unpinAllGeneralForumTopicMessages";
    КонецЕсли;

    URL   = "api.telegram.org/bot" + Токен + Метод;
    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ОтправитьФайл(Знач Токен
    , Знач IDЧата
    , Знач Текст
    , Знач Файл
    , Знач Вид
    , Знач Клавиатура
    , Знач Разметка
    , Знач ИмяФайла = "")

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);

    OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);

    Если Не ЗначениеЗаполнено(ИмяФайла) Тогда
        ИмяФайла = ПреобразоватьДанныеФайла(Файл, Вид, "");
    Иначе
        OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
    КонецЕсли;

    ИмяФайла = Вид + "|" + ИмяФайла;

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"  , Разметка  , "Строка"     , Параметры);
    OPI_Инструменты.ДобавитьПоле("caption"     , Текст     , "Строка"     , Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);

    ДобавитьИдентификаторЧата(IDЧата, Параметры);

    СоответствиеФайлов = Новый Соответствие;
    СоответствиеФайлов.Вставить(ИмяФайла, Файл);

    Метод = ОпределитьМетодОтправки(Вид);
    URL   = "api.telegram.org/bot" + Токен + Метод;
    Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СоответствиеФайлов, "mixed");

    Возврат Ответ;

КонецФункции

Функция УправлениеТемойФорума(Знач Токен
    , Знач IDЧата
    , Знач Заголовок = Неопределено
    , Знач IDИконки  = Неопределено
    , Знач IDТемы    = "")

    Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("name"                , Заголовок, Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"             , IDЧата   , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("icon_custom_emoji_id", IDИконки , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("message_thread_id"   , IDТемы   , Строка_, Параметры);

    Если ЗначениеЗаполнено(IDТемы) Тогда
        Метод  = "/editForumTopic";
    Иначе
        Метод  = "/createForumTopic";
    КонецЕсли;

    Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры);

    Возврат Ответ;

КонецФункции

Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "")

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);

    Если ЗначениеЗаполнено(IDТемы) Тогда
        Форум = "Forum";
    Иначе
        Форум = "GeneralForum";
    КонецЕсли;

    Метод     = ОпределитьМетодУправленияФорумом(Статус, Форум);

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("chat_id"          , IDЧата, "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);

    URL   = "api.telegram.org/bot" + Токен + Метод;
    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть)

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть);

    Если Скрыть Тогда
        Метод = "/hideGeneralForumTopic";
    Иначе
        Метод = "/unhideGeneralForumTopic";
    КонецЕсли;

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры);

    URL   = "api.telegram.org/bot" + Токен + Метод;
    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум)

    Открыть = 1;
    Закрыть = 2;
    Удалить = 3;

    Если Статус      = Открыть Тогда
        Метод        = "/reopen" + Форум + "Topic";
    ИначеЕсли Статус = Закрыть Тогда
        Метод        = "/close" + Форум + "Topic";
    ИначеЕсли Статус = Удалить Тогда
        Метод        = "/deleteForumTopic";
    Иначе
        ВызватьИсключение "Некорректный статус управления форумом";
    КонецЕсли;

    Возврат Метод;

КонецФункции

Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок)

    Строки = Новый Массив;

    Для Каждого Кнопка Из МассивКнопок Цикл
        Кнопки = Новый Массив;
        Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
        Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
        Строки.Добавить(Кнопки);
    КонецЦикла;

    Возврат Строки;

КонецФункции

Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок)

    Строки = Новый Массив;
    Кнопки = Новый Массив;

    Для Каждого Кнопка Из МассивКнопок Цикл
        Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
        Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
    КонецЦикла;

    Строки.Добавить(Кнопки);

    Возврат Строки;

КонецФункции

Функция ОпределитьМетодОтправки(Знач Вид)

    Если Вид      = "photo" Тогда
        Метод     = "/sendPhoto";
    ИначеЕсли Вид = "video" Тогда
        Метод     = "/sendVideo";
    ИначеЕсли Вид = "audio" Тогда
        Метод     = "/sendAudio";
    ИначеЕсли Вид = "animation" Тогда
        Метод     = "/sendAnimation";
    Иначе
        Метод     = "/sendDocument";
    КонецЕсли;

    Возврат Метод;

КонецФункции

Функция ПреобразоватьДанныеФайла(Файл, Вид, Счетчик)

    ИмяФайла = "";

    Если ТипЗнч(Файл) = Тип("Строка") И Вид = "document" Тогда

        ТекущийФайл = Новый Файл(Файл);
        ИмяФайла    = ТекущийФайл.Имя;

    КонецЕсли;

    Если Не ЗначениеЗаполнено(ИмяФайла) Тогда
        ИмяФайла = Вид + Строка(Счетчик);

        Если Вид     = "animation" Тогда
            ИмяФайла = ИмяФайла + ".gif";
        КонецЕсли;

    КонецЕсли;

    OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);

    Возврат ИмяФайла;

КонецФункции

Процедура ПреобразоватьФайлыВМедиа(СоответствиеФайлов, Текст, Медиа)

    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);

    Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда
        // !OInt ВызватьИсключение("Не удалось получить информацию из json медиа!");
        Возврат;
    КонецЕсли;

    ВременноеСоответствие = Новый Соответствие;
    Счетчик               = 0;

    Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл

        ТекущиеДанные = ТекущийФайл.Ключ;
        ТипМедиа      = ТекущийФайл.Значение;

        ИмяМедиа = ПреобразоватьДанныеФайла(ТекущиеДанные, ТипМедиа, Счетчик);

        ВременноеСоответствие.Вставить(ИмяМедиа + "|" + ИмяМедиа, ТекущиеДанные);

        СтруктураМедиа = Новый Структура;
        СтруктураМедиа.Вставить("type" , ТипМедиа);
        СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа);

        Если Счетчик = 0 Тогда
            СтруктураМедиа.Вставить("caption", Текст);
        КонецЕсли;

        Медиа.Добавить(СтруктураМедиа);

        Счетчик = Счетчик + 1;

    КонецЦикла;

    Медиа              = OPI_Инструменты.JSONСтрокой(Медиа);
    СоответствиеФайлов = ВременноеСоответствие;

КонецПроцедуры

Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры)

    IDЧата     = OPI_Инструменты.ЧислоВСтроку(IDЧата);
    МассивЧата = СтрРазделить(IDЧата, "*", Ложь);

    Если МассивЧата.Количество() > 1 Тогда

        IDЧата = МассивЧата[0];
        IDТемы = МассивЧата[1];

        Параметры.Вставить("message_thread_id", IDТемы);

    КонецЕсли;

    Параметры.Вставить("chat_id", IDЧата);

КонецПроцедуры

#КонецОбласти
