umbot
Version:
Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф
109 lines (108 loc) • 4.32 kB
JavaScript
;
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;
}