UNPKG

umbot

Version:

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

109 lines (108 loc) 4.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getImageInDB = getImageInDB; exports.cardProcessing = cardProcessing; const Button_1 = require("./Button"); const API_1 = require("../API"); const utils_1 = require("../Base/utils"); const constants_1 = require("./constants"); /** * Получение токена, необходимого для отображения картинок в карточке ВК * @param controller Контроллер приложения * @param path Путь до картинки */ async function getImageInDB(controller, path) { return (0, utils_1.getImageToken)(path, constants_1.T_VK, controller, async (model) => { const api = new API_1.VkRequest(controller.appContext); const server = await api.photosGetMessagesUploadServer(controller.userId); if (!server?.upload_url) { return null; } const upload = await api.upload(server.upload_url, path); if (!upload?.photo) { return null; } const photo = await api.photosSaveMessagesPhoto(upload.photo, upload.server, upload.hash); if (photo?.[0]?.id) { model.imageToken = `photo${photo[0].owner_id}_${photo[0].id}`; if (await model.save(true)) { return model.imageToken; } } return null; }); } async function getElements(cardInfo, controller) { const elements = []; for (let i = 0; i < cardInfo.images.length; i++) { const image = cardInfo.images[i]; if (!image.imageToken && image.imageDir) { image.imageToken = await getImageInDB(controller, image.imageDir); } if (!image.imageToken) { return elements; } if (cardInfo.usedGallery) { const element = { title: image.title, description: image.desc, photo_id: image.imageToken.replace('photo', ''), }; const button = image.button?.getButtons(Button_1.buttonProcessing); if (button?.buttons?.length) { element.buttons = button.buttons.slice(0, 3); } elements.push(element); } else { const element = { title: image.title, description: image.desc, photo_id: image.imageToken.replace('photo', ''), }; const button = image.button?.getButtons(Button_1.buttonProcessing); /* * У карточки в любом случае должна быть хоть одна кнопка. * Максимальное количество кнопок 3 */ if (button?.one_time && button.buttons?.length) { element.buttons = button.buttons.slice(0, 3); element.action = { type: 'open_photo' }; elements.push(element); } } } return elements; } /** * Получает карточку для отображения в VK. * @param cardInfo Информация о карточке * @param controller Контроллер приложения * @returns {Promise<IVkCard | string[]>} Одна карточка, массив карточек или пустой массив, если нечего отобразить */ async function cardProcessing(cardInfo, controller) { const object = []; const countImage = cardInfo.images.length; if (countImage) { if (countImage === 1 || cardInfo.showOne) { 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) { object.push(cardInfo.images[0].imageToken); return object; } } else { const elements = await getElements(cardInfo, controller); if (elements.length) { return { type: 'carousel', elements, }; } } } return object; }