UNPKG

umbot

Version:

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

149 lines (148 loc) 6.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MaxAdapter = void 0; const index_1 = require("../../../index"); const API_1 = require("../API"); const Base_1 = require("../Base/Base"); const Button_1 = require("./Button"); const Card_1 = require("./Card"); const Sound_1 = require("./Sound"); const constants_1 = require("./constants"); /** * Адаптер, обеспечивающий поддержку платформы MAX. Позволяет разрабатывать чат-ботов для мессенджера MAX на TypeScript с использованием кросс-платформенного функционала: обработка текстовых запросов, работа с карточками и кнопками. * * Подключение адаптера не требует изменения существующей бизнес-логики: после интеграции * все команды и обработчики, написанные для umbot, автоматически становятся доступны для MAX. * Единый интерфейс позволяет одновременно использовать одну бизнес-логику для нескольких * платформ (MAX, VK, Алиса и др.) без дублирования кода. * * Этот адаптер автоматически обрабатывает входящие webhook`и от мессенджера MAX, * преобразует их в унифицированный формат фреймворка и формирует ответ, * совместимый с требованиями платформы. Подключается одной строкой и * не мешает работе других адаптеров (например, для Алисы или Маруси). * * Поддерживает: * - голосовые и текстовые запросы; * - карточки, кнопки; * * Подключается как любой другой адаптер: `bot.use(new MaxAdapter(token))`. * Несколько адаптеров могут работать одновременно — система сама выберет подходящий * на основе заголовков и структуры входящего запроса. * @example * ```ts * // Простейший бот для MAX, который отвечает на приветствие * import { Bot } from 'umbot'; * import { MaxAdapter } from 'umbot/plugins'; * * const bot = new Bot() * .use(new MaxAdapter('YOUR_MAX_TOKEN')) * .addCommand('start', ['привет'], (_text, ctx) => { * ctx.text = 'Привет! Я твой первый бот для MAX'; * }); * * bot.start('localhost', 3000); * ``` * * @see Bot * @see BotController * @see BasePlatform */ class MaxAdapter extends Base_1.BasePlatform { platformName = constants_1.T_MAX_APP; isVoice = false; limit = 30; init(appContext) { super.init(appContext); if (this._token) { appContext.appConfig.tokens[this.platformName].token = this._token; } } isPlatformOnQuery(query, headers) { if (headers?.['x-max-signature']) { return true; } if (!query) { this.appContext?.logWarn(`MaxAdapter.isPlatformOnQuery(): ${Base_1.EMPTY_QUERY_ERROR}`); return false; } return !!(query.update_type && query.message.body); } async setQueryData(query, controller) { if (this.appContext) { if (query) { controller.requestObject = query; if (query.update_type === 'message_created') { if (query.message !== undefined) { const object = query.message; controller.userId = object.sender.user_id; const raw = object.body.text ?? ''; controller.userCommand = raw.toLowerCase().trim(); controller.originalUserCommand = raw.trim(); controller.messageId = object.body.seq; controller.payload = object.body.attachments || null; const thisUser = { username: object.sender.username, first_name: object.sender.first_name || null, last_name: object.sender.last_name || null, }; controller.nlu.setNlu({ thisUser }); return true; } return false; } else { controller.platformOptions.error = 'MaxAdapter:setQueryData(): Некорректный тип данных!'; } } else { controller.platformOptions.error = `MaxAdapter:setQueryData(): ${Base_1.EMPTY_QUERY_ERROR}`; } } else { console.error(`MaxAdapter:setQueryData(): ${Base_1.EMPTY_CONTEXT_ERROR}`); } return false; } async getContent(controller) { if (!controller.skipAutoReply) { const keyboard = controller.isButtonsInit() ? controller.buttons.getButtons(Button_1.buttonProcessing) : null; const params = {}; if (keyboard) { params.keyboard = keyboard; } if (controller.isCardInit() && controller.card.images.length) { params.attachments = await controller.card.getCards(Card_1.cardProcessing, controller); } if (controller.isSoundInit() && controller.sound.sounds.length) { const attach = await controller.sound.getSounds(controller.tts, Sound_1.soundProcessing, controller); params.attachments = [...(attach || []), ...(params.attachments || [])]; } const maxApi = new API_1.MaxRequest(controller.appContext); await maxApi.messagesSend(controller.userId, index_1.Text.resize(controller.text, 4096), params); } return 'ok'; } static isVoice() { return false; } getQueryExample(query, userId, count) { return { update_type: 'message_created', message: { sender: { user_id: +userId, }, body: { text: query, seq: count, mid: '', }, }, }; } } exports.MaxAdapter = MaxAdapter;