Я использую платформу бота для отображения карты героя.
Сценарий: я хочу отобразить список задач в пользовательском интерфейсе в виде карточек героев. У каждой задачи есть идентификатор, связанный с ней. Я не хочу, чтобы этот идентификатор отображался на карточке. когда пользователь выбирает карту, я хочу получить идентификатор связанной задачи в бэкэнде и сохранить в памяти, чтобы выполнять следующие действия, выполняя некоторые вызовы API на основе идентификатора.
Я показываю карту, используя приведенный ниже код. Но как отправить идентификатор и вернуть его при выборе карты. В элементе переменной есть поле с именем ID, я хочу связать его с карточкой, поэтому, когда нажимается кнопка «выбрать», я хочу захватить идентификатор в серверной части.
var card = new builder.HeroCard(session)
.title(element.name)
.subtitle(element.startTime)
.text(shortdesc)
.images([builder.CardImage.create(session, 'https://www.newstatesman.com/sites/all/themes/creative-responsive-theme/images/new_statesman_events.jpg')])
.buttons([
builder.CardAction.imBack(session, element.name, "Select")
]);
Полный код:
var restify = require('restify');
var builder = require('botbuilder');
const Request = require("request");
global.res = []
// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function() {
console.log('%s listening to %s', server.name, server.url);
});
// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
appId: process.env.MicrosoftAppId,
appPassword: process.env.MicrosoftAppPassword
});
// Listen for messages from users
server.post('/api/messages', connector.listen());
var inMemoryStorage = new builder.MemoryBotStorage();
// This is a bot that uses a waterfall technique to prompt users for input.
var bot = new builder.UniversalBot(connector, [
function(session) {
session.send("Hi , I can help you about about hotels and updates.");
builder.Prompts.text(session, "Can i know your name to get started ?");
},
function(session, results) {
session.dialogData.username = results.response;
var msg = 'Thanks ' + session.dialogData.username + ' For which area do you want me to check?'
builder.Prompts.text(session, msg);
},
function(session, results) {
session.dialogData.eventname = results.response;
let cards = [];
var uri = 'https://dummy/api/hotels/search/name/' + session.dialogData.hotelname
//I need to call my api to get the hotels based on the typed value and set it to the hero card?
Request.get(uri, (error, response, body) => {
if (error) {
return console.dir(error);
}
global.res = JSON.parse(body);
if (global.res.length != 0) {
name = global.res[0].name;
console.log(name);
//formulate the hotel details
var msg = new builder.Message(session);
msg.attachmentLayout(builder.AttachmentLayout.carousel)
//loop throught the result set and append to the msg attachment
global.res.forEach(function(element, index) {
console.log(element.name + " " + element.startTime);
var shortdesc = element.description.substring(0, 50);
shortdesc = shortdesc + '...'
var card = new builder.HeroCard(session)
.title(element.name)
.subtitle(element.startTime)
.text(shortdesc)
.images([builder.CardImage.create(session, 'https://www.newstatesman.com/sites/all/themes/creative-responsive-theme/images/new_statesman_events.jpg')])
.buttons([
builder.CardAction.imBack(session, element.name, "Select")
//want to collect the element.id but not show in UI.
]);
cards.push(card);
msg.attachments(cards)
});
//builder.Prompts.choice(session, msg, global.res);
builder.Prompts.text(session, "Please select from the following hotels");
session.send(msg)
} else {
}
});
},
function(session, results) {
session.dialogData.selectedevent = results.response;
var text = 'What details do you want to know for the ' + session.dialogData.selectedevent + ' hotel'
var msg = new builder.Message(session)
.text('text')
.suggestedActions(
builder.SuggestedActions.create(
session, [
builder.CardAction.imBack(session, "Parking", "Parking"),
builder.CardAction.imBack(session, "activities", "Activities")
]
));
builder.Prompts.text(session, text);
session.send(msg);
},
function(session, results) {
session.dialogData.selectedcondition = results.response;
if (session.dialogData.selectedcondition == 'Parking') {
//when parking i will pass the hotel id (element.id) to another api return them as cards
var msg = 'Parking is full for hotel ' + session.dialogData.selectedevent
session.send(msg);
session.endDialog();
} else {
var msg = 'Heavy traffic for hotel ' + session.dialogData.selectedevent
session.send(msg);
session.endDialog();
}
}
]).set('storage', inMemoryStorage); // Register in-memory storage