【发布时间】:2019-11-18 08:33:05
【问题描述】:
如果我们选择 PromptDialog 则必须选择 PromptDialog 选项。是否必须选择选项?
如果不选择该选项,用户会要求新的查询,而 Bot 将根据新的查询做出响应。
简单来说,我们如何在没有选择选项的情况下忽略并接受新请求并通过 Bot 向用户提供答案?
【问题讨论】:
标签: c# .net azure botframework bots
如果我们选择 PromptDialog 则必须选择 PromptDialog 选项。是否必须选择选项?
如果不选择该选项,用户会要求新的查询,而 Bot 将根据新的查询做出响应。
简单来说,我们如何在没有选择选项的情况下忽略并接受新请求并通过 Bot 向用户提供答案?
【问题讨论】:
标签: c# .net azure botframework bots
您要查找的内容称为用户中断,每次用户向您的机器人发送消息时,您首先要检查的是,如果它是“中断” ”,或者是一个全新的消息。
如果是中断,你可以处理它,你可以开始一个新的对话,完成然后从用户离开的地方继续。
在此处查看机器人服务文档以获取 Handling User Interruption
【讨论】:
可以有两种方法:
方法 1: 使用'Handle Interruptions',但它是有代价的。它将检查用户发送的所有消息,无论是在对话框/提示中还是之外。 为任何文本提示输入的任何有用输入都可以匹配 switch 中的任何大小写,这可能会在此处结束对话。 此外,它可能会减慢进程
方法 2:(如果您只想对选择提示执行此操作)有一个验证功能可以附加到任何类型的提示。
假设CheckChoicePromptValidator是您选择的提示验证器。你可以在里面做这样的事情:
private async Task<bool> CheckChoicePromptValidator(PromptValidatorContext<FoundChoice> promptContext, CancellationToken cancellationToken)
{
if(promptContext.Recognized.Succeeded)
{
return await Task.FromResult(true);
}
else
{
var userInput = promptContext.Context.Activity.Text;
// You can use LUIS instead of switch case
switch(userInput.ToLower())
{
case "cancel":
case "quit":
case "reset":
await promptContext.Context.SendActivityAsync(MessageFactory.Text("Cancelling!"), cancellationToken);
var dc = await BotUtil.Dialogs.CreateContextAsync(promptContext.Context, cancellationToken);
await dc.CancelAllDialogsAsync(cancellationToken);
return await Task.FromResult(false);
}
}
}
它只会在用户输入选项以外的内容时处理中断。
【讨论】: