Я изучаю версию 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 в том смысле, что для работы им нужны две константы. Так что я немного потерян здесь. Прошу вас указать мне правильное направление.
Спасибо, Паван.