umbot
Version:
Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф
183 lines (182 loc) • 6.64 kB
JavaScript
"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;