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