Как передать значение в карту героя бот-фреймворка и не отображать его в пользовательском интерфейсе?

Я использую платформу бота для отображения карты героя.

Сценарий: я хочу отобразить список задач в пользовательском интерфейсе в виде карточек героев. У каждой задачи есть идентификатор, связанный с ней. Я не хочу, чтобы этот идентификатор отображался на карточке. когда пользователь выбирает карту, я хочу получить идентификатор связанной задачи в бэкэнде и сохранить в памяти, чтобы выполнять следующие действия, выполняя некоторые вызовы 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

person Community    schedule 20.03.2018    source источник
comment
Какой канал вы используете? Функция imBack / postBack поддерживается не на всех каналах.   -  person Mick    schedule 21.03.2018
comment
Я хочу это для интеграции с веб-сайтом   -  person    schedule 21.03.2018


Ответы (1)


Вы можете использовать второй параметр функции builder.CardAction.imBack(session: Session, msg: string, title?: TextType), в котором можно установить строковое значение, которое вы хотите отправить своему боту.

Пожалуйста, проверьте код из проблемы https://github.com/Microsoft/BotBuilder/issues/2715 < / а>:

bot.dialog('example', [
    (session, args, next) => {
      const choices = ['1','2','3']

      const cards = choices.map(item => {
        // return new builder.ThumbnailCard(session) // You can use thumbnails
        return new builder.HeroCard(session)
          .buttons([builder.CardAction.imBack(session, item, item)])
          .images([builder.CardImage.create(
            session, `http://via.placeholder.com/300x150?text=${item}`
          )])
      })

      const msg = new builder.Message(session)
        // .attachmentLayout(builder.AttachmentLayout.carousel) // This works
        .attachments(cards)
        .text('Choose a card')

      builder.Prompts.choice(session, msg, choices, {
        retryPrompt: msg
      })
    }, (session, args, next) => {
      session.send(args.response.entity)
      session.endDialogWithResult(args)
    }
  ])
person Gary Liu    schedule 21.03.2018
comment
Я пробовал то же самое, но это еще не работает ... сообщение все еще отображается в пользовательском интерфейсе. Я добавил полный код, любезно прошу, можете ли вы проверить то же самое - person ; 21.03.2018