UNPKG

umbot

Version:

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

178 lines (177 loc) 8.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ViberAdapter = void 0; 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"); /** * Адаптер, обеспечивающий поддержку платформы Viber. Позволяет разрабатывать чат-ботов для Viber на TypeScript с использованием кросс-платформенного функционала: обработка текстовых запросов, работа с карточками и кнопками. * * Подключение адаптера не требует изменения существующей бизнес-логики: после интеграции * все команды и обработчики, написанные для umbot, автоматически становятся доступны для Viber. * Единый интерфейс позволяет одновременно использовать одну бизнес-логику для нескольких * платформ (Viber, VK, Алиса и др.) без дублирования кода. * * Этот адаптер автоматически обрабатывает входящие webhook`и от мессенджера Viber, * преобразует их в унифицированный формат фреймворка и формирует ответ, * совместимый с требованиями платформы. Подключается одной строкой и * не мешает работе других адаптеров (например, для Алисы или Маруси). * * Поддерживает: * - голосовые и текстовые запросы; * - карточки, кнопки; * * Подключается как любой другой адаптер: `bot.use(new ViberAdapter(token))`. * Несколько адаптеров могут работать одновременно — система сама выберет подходящий * на основе заголовков и структуры входящего запроса. * @example * ```ts * // Простейший бот для Viber, который отвечает на приветствие * import { Bot } from 'umbot'; * import { ViberAdapter } from 'umbot/plugins'; * * const bot = new Bot() * .use(new ViberAdapter('YOUR_VIBER_TOKEN')) * .addCommand('start', ['привет'], (_text, ctx) => { * ctx.text = 'Привет! Я твой первый бот для Viber'; * }); * * bot.start('localhost', 3000); * ``` * * @see Bot * @see BotController * @see BasePlatform */ class ViberAdapter extends Base_1.BasePlatform { platformName = constants_1.T_VIBER; isVoice = false; limit = 30; signatureName = 'x-viber-content-signature'; init(appContext) { super.init(appContext); if (this._token) { appContext.appConfig.tokens[this.platformName].token = this._token; } if (this._platformOptions?.viber_api_version) { appContext.appConfig.tokens[this.platformName].api_version = this._platformOptions .viber_api_version; } if (this._platformOptions?.viber_sender) { appContext.appConfig.tokens[this.platformName].sender = this._platformOptions .viber_sender; } } isPlatformOnQuery(query, headers) { if (headers?.['x-viber-content-signature']) { return true; } if (!query) { this.appContext?.logWarn(`ViberAdapter.isPlatformOnQuery(): ${Base_1.EMPTY_QUERY_ERROR}`); return false; } return (query.event !== undefined && query.timestamp !== undefined && query.message_token !== undefined); } async setQueryData(query, controller) { if (!this.appContext) { console.error(`ViberAdapter.setQueryData(): ${Base_1.EMPTY_CONTEXT_ERROR}`); return false; } if (!query) { controller.platformOptions.error = `ViberAdapter.setQueryData(): ${Base_1.EMPTY_QUERY_ERROR}`; return false; } controller.requestObject = query; if (query.message) { switch (query.event) { case 'conversation_started': if (query.user) { controller.userId = query.user.id; controller.userCommand = ''; controller.messageId = 0; this.appContext.appConfig.tokens[this.platformName].api_version = query.user.api_version || 2; this.setNlu(controller, query.sender.name); } return true; case 'message': controller.userId = query.sender.id; { const raw = query.message?.text ?? ''; controller.userCommand = raw.toLowerCase().trim(); controller.originalUserCommand = raw; } controller.messageId = query.message_token; this.appContext.appConfig.tokens[this.platformName].api_version = (query.sender .api_version || 2); this.setNlu(controller, query.sender.name); return true; } } return false; } async getContent(controller) { if (!controller.skipAutoReply) { const viberApi = new API_1.ViberRequest(controller.appContext); const params = {}; const keyboard = controller.isButtonsInit() ? controller.buttons.getButtons(Button_1.buttonProcessing) : null; if (keyboard) { params.keyboard = keyboard; params.keyboard.Type = 'keyboard'; } await viberApi.sendMessage(controller.userId, controller.appContext.appConfig.tokens[this.platformName].sender, controller.text, params); if (controller.isCardInit() && controller.card.images.length) { const res = controller.card.getCards(Card_1.cardProcessing, controller); if (Array.isArray(res) && res.length) { await viberApi.richMedia(controller.userId, res); } } if (controller.isSoundInit() && controller.sound.sounds.length) { await controller.sound.getSounds(controller.tts, Sound_1.soundProcessing, controller); } } return 'ok'; } /** * Заполняет данные о пользователе в NLU. * Разбивает полное имя на компоненты (username, first_name, last_name) * @param controller Контроллер приложения * @param userName Полное имя пользователя * @protected */ setNlu(controller, userName = '') { const name = userName.split(' '); const thisUser = { username: name[0] || null, first_name: name[1] || null, last_name: name[2] || null, }; controller.nlu.setNlu({ thisUser }); } static isVoice() { return false; } getQueryExample(query, userId) { return { event: 'message', message: { text: query, type: 'text', }, message_token: Date.now(), sender: { id: userId, name: 'local_name', api_version: 8, }, }; } } exports.ViberAdapter = ViberAdapter;