Как определить, к какой адаптивной карте относятся входные данные пользователя? - PullRequest
0 голосов
/ 15 марта 2020

Я изучаю версию Bot Framework V4 и реализовал простой пример. Я бы попросил пользователя ввести два числа с помощью адаптивной карты, и как только он нажмет на операцию отправки, я просто добавлю их и отправлю пользователю ответ, вычисленную сумму. Теперь я хотел бы расширить это дальше. Я также хочу добавить опцию умножения тоже. Я прилагаю приведенный ниже код для справки:

// ++PDIT: Documentation can be found here:https://docs.microsoft.com/en-us/javascript/api/botbuilder-core/turncontext?view=botbuilder-ts-latest#activity
// ++PDIT: Adaptive Cards Schema: https://adaptivecards.io/explorer/

const restify = require('restify');
const botbuilder = require('botbuilder');

// ++PDIT: Add the reference to the AdaptorCards' JSON here.
const InputNumbersCard = require('./resources/InputNumbers.json');

// Create bot adapter, which defines how the bot sends and receives messages.
// ++PDIT: If the adapter is fed with an empty appId and appPassword, then the
// processActivity would be treated as a conversation/dialog via an Emulator. 
var adapter = new botbuilder.BotFrameworkAdapter({
    appId: process.env.MicrosoftAppId,
    appPassword: process.env.MicrosoftAppPassword
});

// Create HTTP server.
let server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
    console.log(`\n${server.name} listening to ${server.url}`);
    console.log(`\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator`);
});

// Listen for incoming requests at /api/messages.
server.post('/api/messages', (req, res) => {
    // Use the adapter to process the incoming web request into a TurnContext object.
    // ++PDIT: TurnContext object represents the bot's 'turn', in a conversation flow.
    adapter.processActivity(req, res, async (turnContext) => {
        // Do something with this incoming activity!

        if ( turnContext.activity.type === 'message' ) {
            // ++PDIT: Get the user's utterance here
            const utterance = turnContext.activity.text;

            // ++PDIT: 'postBack' - Upon submitting an activity dialog, the information
            // stored by the user actually gets stored on the adaptive card itself.
            if( turnContext.activity.channelData.postBack ) {
              // AdaptiveCard submit operation.
              var number1 = turnContext.activity.value.firstNumber;
              var number2 = turnContext.activity.value.secondNumber;

              var sum = Number(number1) + Number(number2);
              await turnContext.sendActivity( 'The sum of the entered numbers is ' + sum );
            }
            else {
              if ( utterance === 'add' || utterance === 'multiply' ) {
                  // send a reply
                  await turnContext.sendActivity( {
                    text: `Here is an Adaptive Card for entering the two number that you want to ${utterance}:`,
                    attachments:[botbuilder.CardFactory.adaptiveCard(InputNumbersCard)] 
                  });
              }
              else {
                  // send a reply
                  await turnContext.sendActivity(`I heard you say '${ utterance }'. I am yet to learn that skill!.`);
              }
            }
        }
    });
});

Моя адаптивная карта выглядит следующим образом:

{
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "type": "AdaptiveCard",
    "version": "1.0",
    "body": [
      {
        "type": "TextBlock",
        "text": "Enter the numbers that you would like to add"
      },
      {
        "type": "Input.Text",
        "id": "firstNumber",
        "placeholder": "What is your first number?"
      },
      {
        "type": "Input.Text",
        "id": "secondNumber",
        "placeholder": "What is your second number?"
      }
    ],
    "actions": [
      {
        "type": "Action.Submit",
        "title": "Action"        
      }
    ]
}

Я прочитал, что когда пользователь нажимает кнопку отправки, переменная turnContext.activity.channelData.postBack будет истинным. Но мой вопрос заключается в следующем: как мне понять, что введенные пользователем данные на самом деле предназначены для операции «добавить» или для «множественной» операции? Я использую одну адаптивную карту, как вы можете видеть, поскольку сложение и умножение - это просто generic c в том смысле, что для работы им нужны две константы. Так что я немного потерян здесь. Прошу вас указать мне правильное направление.

Спасибо, Паван.

...