UNPKG

umbot

Version:

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

141 lines (140 loc) 5.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 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 marusiaCardButton(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_MARUSIA, controller, async (model) => { const mImage = new API_1.MarusiaRequest(controller.appContext); const uploadLink = await mImage.marusiaGetPictureUploadLink(); if (!uploadLink) { return null; } const upload = await mImage.upload(uploadLink.picture_upload_link, path); if (!upload) { return null; } const picture = await mImage.marusiaSavePicture(upload.photo, upload.server, upload.hash); if (picture?.photo_id) { model.imageToken = picture.photo_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 images = cardInfo.images.slice(0, constants_1.MARUSIA_MAX_IMAGES); for (let i = 0; i < images.length; i++) { const image = images[i]; let button = image.button?.getButtons(marusiaCardButton) || null; 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), }; 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<IMarusiaButtonCard | IMarusiaItemsList | IMarusiaBigImage | 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(marusiaCardButton) || null; if (!button?.text) { button = cardInfo.buttons.getButtons(marusiaCardButton) || null; } const object = { type: constants_1.MARUSIA_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 { const object = { type: constants_1.MARUSIA_CARD_ITEMS_LIST, header: { text: index_1.Text.resize(cardInfo.title || '', 64), }, }; object.items = await _getItem(cardInfo, controller); const btn = cardInfo.buttons.getButtons(marusiaCardButton); if (btn?.text) { object.footer = { text: btn.text, button: btn, }; } return object; } } return null; }