facebook
我使用 MS Bot Framework 的机器人在通道和emulator
通道上都陷入了无限循环向用户发送消息的问题。
我的机器人有一个 "root" ,有点像菜单,根据用户的选择IDialog
调用其他几个s。IDialog
子对话框以这种方式调用:
...
else if (response.Text == MainOptions[2])
{
await context.Forward(new InfoCounterDialog(), ChildDialogComplete,
response, CancellationToken.None);
}
...
response
是IMessageActivity
用户发送的;ChildDialogComplete
是一种重新构建主菜单并以这些行结束的方法:
.
await context.PostAsync(restartPrompt);
context.Wait(MainScreenSelectionReceived);
除了这个非常短的对话框之外,所有对话框都可以正常工作,这会导致无限循环 - 机器人会一次又一次地发送此消息,直到我停止 Web 应用程序。
namespace XXXX
{
[Serializable]
public class InfoCounterDialog : IDialog
{
public async Task StartAsync(IDialogContext context)
{
var hourNow = DateTime.Now.Hour;
var openNow = "";
if (hourNow >= 7)
{
openNow = "It is open now and will close at midnight.";
}
else
{
openNow = "It is closed now and will open at 7:00";
}
var card = HeroCardUtils.CardWithImageAndMiscButtons(
"Our information counter can help!",
"It's located in Shop 081, Level 3 in Building 2. " + openNow,
"http://www.[image URL here].jpg",
new[] { "More Details" },
new[] { ActionTypes.OpenUrl },
new[] { "[webpage URL here]" }
);
await BotUtils.SendCardToChat(context, card);
context.Done(this);
}
}
}
如果你想知道什么SendCardToChat
是:
public async static Task SendCardToChat(IDialogContext context, HeroCard card)
{
var activity = context.MakeMessage();
activity.Attachments = HeroCardUtils.CardToAttachments(card);
await context.PostAsync(activity);
}
回顾一下:
- 我正在使用另一个对话框启动一个对话框
context.Forward()
- 该对话框应该向用户显示一条消息并立即终止,无需用户额外输入
- 相反,它不断发送“我们的信息柜台可以提供帮助!” 消息无限。
我最好的猜测是子对话以某种方式将用户的初始消息返回给对话,这会一次又一次地触发相同的对话。但这不应该发生,孩子IDialog
不应该向对话发送任何内容,除了HeroCard
我创建的。
或者,也许我正在寻找错误的方向,而 Bot Framework 只是不支持IDialog
s 做某事并立即终止而没有context.Wait()
?