UNPKG

umbot

Version:

Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф

183 lines (182 loc) 6.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MaxRequest = void 0; const index_1 = require("../../../index"); const constants_1 = require("../Max/constants"); const constants_2 = require("./constants"); /** * Базовый URL для всех методов Max API */ const MAX_API_ENDPOINT = 'https://platform-api.max.ru/'; /** * Класс для взаимодействия с API Max * Предоставляет методы для отправки сообщений, загрузки файлов * @see (https://dev.max.ru/docs-api) Смотри тут */ class MaxRequest { /** * Экземпляр класса для выполнения HTTP-запросов * */ #request; /** * Текст последней возникшей ошибки * */ #error; /** * Токен доступа к Max API */ token; /** * Флаг для прямой передачи содержимого файла * По умолчанию: false */ isAttachContent; /** * Контекст приложения. */ #appContext; /** * Создает экземпляр класса для работы с API ВКонтакте * Устанавливает токен из конфигурации приложения, если он доступен */ constructor(appContext) { this.#request = new index_1.Request(appContext); this.#request.maxTimeQuery = 5500; this.isAttachContent = false; this.token = null; this.#error = null; this.#request.post = {}; this.#appContext = appContext; if (appContext.appConfig.tokens[constants_1.T_MAX_APP]?.token) { this.initToken(appContext.appConfig.tokens[constants_1.T_MAX_APP].token); } } /** * Инициализирует токен доступа к MAX API * @param token Токен доступа к MAX API */ initToken(token) { this.token = token; } /** * Устанавливает токен доступа к MAX API * @param accessToken * @protected */ #setAccessToken(accessToken) { if (!this.#request.header) { this.#request.header = {}; } this.#request.header.Authorization = accessToken; this.#request.post ??= {}; this.#request.post.access_token = this.token; } /** * Выполняет вызов метода MAX API * @param method Название метода MAX API * @returns Результат выполнения метода или null при ошибке */ async call(method) { if (this.token) { this.#request.header = null; this.#setAccessToken(this.token); const data = await this.#request.send(MAX_API_ENDPOINT + method); if (data.status && data.data) { return data.data; } this.#error = data; this.#log(data.err); } else { this.#log((0, constants_2.getErrorToken)(constants_1.T_MAX_APP, 'call')); } return null; } /** * Загружает файл на сервера Max * @param file Путь к файлу или его содержимое * @param type Тип загружаемого файла * @returns Информация о загруженном файле или null при ошибке */ async upload(file, type) { if (this.token) { this.#request.attach = file; this.#request.isAttachContent = this.isAttachContent; this.#request.header = index_1.Request.HEADER_FORM_DATA; this.#request.post ??= {}; this.#request.post.type = type; this.#setAccessToken(this.token); const data = await this.#request.send(MAX_API_ENDPOINT + 'uploads'); if (data.status && data.data) { return data.data; } this.#log(data.err); } else { this.#log((0, constants_2.getErrorToken)(constants_1.T_MAX_APP, 'upload')); } return null; } /** * Отправляет сообщение пользователю или в чат * @param peerId Идентификатор получателя: * @param message Текст сообщения * @param params Дополнительные параметры: * @returns Информация об отправленном сообщении или null при ошибке */ async messagesSend(peerId, message, params = null) { const method = 'messages'; this.#request.post = { user_id: peerId, text: message, }; if (params) { if (params.attachments || params.keyboard) { const attachment = []; if (params.attachments !== undefined) { if (Array.isArray(params.attachments)) { attachment.push(...params.attachments); } else { attachment.push(params.attachments); } params.attachments = undefined; } if (params.keyboard !== undefined) { attachment.push({ type: 'inline_keyboard', payload: params.keyboard, }); params.keyboard = undefined; } this.#request.post.attachments = attachment; } if ((0, index_1.keysCount)(params)) { this.#request.post = { ...params, ...this.#request.post }; } } return await this.call(method); } /** * Регистрирует событие для получения уведомлений о новых сообщениях в MAX * @param url */ subscriptions(url) { this.#request.post = { url, }; return this.call('subscriptions'); } /** * Записывает информацию об ошибках в лог-файл * @param error Текст ошибки для логирования */ #log(error = '') { this.#appContext.logError((0, constants_2.getErrorMsg)(error, 'MaxRequest', this.#request.url), { error: this.#error, }); } } exports.MaxRequest = MaxRequest;