如何在Microsoft Bot中重复一个选择提示?



我有一个使用NodeJS为用户创建的Microsoft Teams Bot,使用对话流获取一些数据。

constructor(id) {
super(id);
this.addDialog(
new WaterfallDialog(WATERFALL_DIALOG, [
this.getData1.bind(this),
this.getChoice.bind(this),
this.getData2.bind(this),
])
)
.addDialog(new TextPrompt(TEXT_PROMPT))
.addDialog(new ChoicePrompt(CHOICE_PROMPT));
this.initialDialogId = WATERFALL_DIALOG;
}
async getData1(stepContext) {
if (stepContext.context.activity.text) {
var name = stepContext.context.activity.text;
var result =  await axios({
method: 'get',
url: '<apiUrl>',
headers: {
"Accept": "application/json"
}
}).then(function(response) {
var data = response.data;
var cardButtons = [];
var cardText = "";

if (data.length > 0) {
data.forEach(element => {
cardButtons.push({
type: ActionTypes.ImBack,
title: element.name,
value: element.name
});
});
cardText = "Data for " + name  + ".";
} else {
cardText = "No Data Found.";
cardButtons = null;
}
var dataCard = CardFactory.heroCard("Data-I", null, cardButtons, {
text: cardText
});
return dataCard;
}).catch(error => {
console.log("Error > " + error);
});
if (result) {
await stepContext.context.sendActivity({attachments: [result]});
} else {
await stepContext.context.sendActivity("Sorry, it looks like something went wrong. Please try again.");
return await stepContext.endDialog();
}
const messageText = 'Select/Enter Data to View.';
const msg = MessageFactory.text(messageText, messageText, InputHints.ExpectingInput);
return await stepContext.prompt(TEXT_PROMPT, { prompt: msg });
} else {
await stepContext.context.sendActivity("Sorry, it looks like something went wrong. Please try again.");
return await stepContext.endDialog();
}
}
async getChoice(stepContext) {
return await stepContext.prompt(CHOICE_PROMPT, {
prompt: 'Please select the data2 options.',
choices: ChoiceFactory.toChoices(['Option A', 'Option B', 'Option C', 'Option D']),
style: ListStyle.heroCard
});
}
async getData2(stepContext) {
var dataChoice = null;
if (stepContext.result) {
dataChoice = stepContext.result
}
var result =  await axios({
method: 'get',
url: '<data2apiUrl>',
headers: {
'Accept': 'application/json',
'dataChoice': dataChoice
}
}).then(function (response) {
var data = response.data;
console.log("Data KPI > ", JSON.stringify(data));
var body = [];
if (data.length > 0) {
data.forEach(element => {
var header = {
"type": "Container",
"spacing": "medium",
"style": "emphasis",
"verticalContentAlignment": "center",
"items": [
{
"type": "TextBlock",
"text": element.fullTitle,
"size": "medium",
"horizontalAlignment": "center",
"weight": "bolder",
"wrap": true
}
]
}
body.push(body);
});
} else {
//Recall the Choice Prompt
}
var dataCard = CardFactory.adaptiveCard({
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.0",
"body": body
});
return dataCard;
}).catch(error => {
console.log("Error > " + error);
});
if (result) {
await stepContext.context.sendActivity({attachments: [result]});
} else {
await stepContext.context.sendActivity("Sorry, it looks like something went wrong. Please try again.");
}
return await stepContext.endDialog();
}

这就是我的对话流程。现在在getChoice(stepContext),如果我选择了一个我没有任何数据的选择,我希望bot再次调用getChoice(stepContext)步骤,而不是必须使用stepContext.endDialog()并从对话流的第一步(即getData1(stepContext))重复整个过程。

您可以使用Validators。看看这个例子。

.addDialog(new ChoicePrompt(SKILL_ACTION_PROMPT, this.skillActionPromptValidator))

/**
* This validator defaults to Message if the user doesn't select an existing option.
*/
async skillActionPromptValidator(promptContext) {
if (!promptContext.recognized.succeeded) {
promptContext.recognized.value = { value: SKILL_ACTION_MESSAGE };
}
return true;
}

看一下显示ChoicePrompt验证器的文档。

验证器,每次用户响应时将调用该验证器提示。如果验证器回复消息,则无需再重试提示符将被发送

最新更新