UNPKG

umbot

Version:

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

149 lines (148 loc) 6.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.alisaCardButton = alisaCardButton; exports.getImageInDB = getImageInDB; exports.cardProcessing = cardProcessing; const index_1 = require("../../../index"); const Button_1 = require("./Button"); const API_1 = require("../API"); const utils_1 = require("../Base/utils"); const constants_1 = require("./constants"); /** * Возвращает кнопки для кнопок в нужном для Алисы виде * @param buttons Кнопки для отображения */ function alisaCardButton(buttons) { return (0, Button_1.buttonProcessing)(buttons, true); } /** * Получение токена, необходимого для отображения картинок в карточке Алисы * @param controller Контроллер приложения * @param path Путь до картинки */ async function getImageInDB(controller, path) { return (0, utils_1.getImageToken)(path, constants_1.T_ALISA, controller, async (model) => { const yImage = new API_1.YandexImageRequest(controller.appContext.appConfig.tokens[constants_1.T_ALISA]?.token, controller.platformOptions.appId, controller.appContext); const result = index_1.Text.isUrl(path) ? await yImage.downloadImageUrl(path) : await yImage.downloadImageFile(path); if (result?.id) { model.imageToken = result?.id; if (await model.save(true)) { return model.imageToken; } } return null; }); } /** * Получает элементы карточки для Алисы. * * Процесс работы: * 1. Определяет максимальное количество изображений: * - Для галереи: ALISA_MAX_GALLERY_IMAGES (7) * - Для списка: ALISA_MAX_IMAGES (5) * 2. Обрабатывает каждое изображение: * - Создает токен изображения, если его нет * - Добавляет кнопки (если не галерея) * - Ограничивает длину текста: * * Заголовок: 128 символов * * Описание: 256 символов * * @returns {Promise<IAlisaImage[]>} Массив элементов карточки */ async function _getItem(cardInfo, controller) { const items = []; const maxCount = cardInfo.usedGallery ? constants_1.ALISA_MAX_GALLERY_IMAGES : constants_1.ALISA_MAX_IMAGES; const images = cardInfo.images.slice(0, maxCount); for (let i = 0; i < images.length; i++) { const image = images[i]; let button = null; if (!cardInfo.usedGallery && image.button) { button = image.button.getButtons(alisaCardButton); if (!button?.text) { button = null; } } if (!image.imageToken) { if (image.imageDir) { image.imageToken = await getImageInDB(controller, image.imageDir); } } const item = { title: index_1.Text.resize(image.title, 128), }; if (!cardInfo.usedGallery) { item.description = index_1.Text.resize(image.desc, 256); } if (image.imageToken) { item.image_id = image.imageToken; } if (button && !cardInfo.usedGallery) { item.button = button; } items.push(item); } return items; } /** * Получает карточку для отображения в Алисе. * @param cardInfo Информация о карточке * @param controller Контроллер приложения * @returns {Promise<IAlisaBigImage | IAlisaItemsList | IAlisaImageGallery | null>} Одна карточка, массив карточек или пустой массив, если нечего отобразить */ async function cardProcessing(cardInfo, controller) { const countImage = cardInfo.images.length; if (countImage) { if (cardInfo.showOne) { if (!(cardInfo.title || cardInfo.images[0].title)) { return null; } if (!cardInfo.images[0].imageToken && cardInfo.images[0].imageDir) { // eslint-disable-next-line require-atomic-updates cardInfo.images[0].imageToken = await getImageInDB(controller, cardInfo.images[0].imageDir); } if (cardInfo.images[0].imageToken) { let button = cardInfo.images[0].button?.getButtons(alisaCardButton) || null; if (!button?.text) { button = cardInfo.buttons.getButtons(alisaCardButton); } const object = { type: constants_1.ALISA_CARD_BIG_IMAGE, image_id: cardInfo.images[0].imageToken, title: index_1.Text.resize(cardInfo.images[0].title || cardInfo.title, 128), description: index_1.Text.resize(cardInfo.images[0].desc || cardInfo.description, 256), }; if (button?.text) { object.button = button; } return object; } } else if (cardInfo.usedGallery) { const object = { type: 'ImageGallery', }; object.items = await _getItem(cardInfo, controller); return object; } else { const object = { type: constants_1.ALISA_CARD_ITEMS_LIST, header: { text: index_1.Text.resize(cardInfo.title || '', 64), }, }; object.items = await _getItem(cardInfo, controller); const btn = cardInfo.buttons.getButtons(alisaCardButton); if (btn?.text) { object.footer = { text: btn.text, button: btn, }; } return object; } } return null; }