我有一个简单的机器人,它可以监听facebook事件的触发(不是消息),当它收到触发时,它应该启动一个新的Dialog(RegisterPledgeDialog),并将其推送到堆栈。但我不知道怎么做?
public class DialogBot<T> : ActivityHandler where T : Dialog
protected override async Task OnEventAsync(ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
{
// How do i start a new Dialog and push it to the top of an exiting dialog stack?
// The code below is what I tried. It starts the new Dialog but doesn't return to it after the turn
var set = new DialogSet();
set.Add(_pledgeDialog);
DialogContext dc = new DialogContext(set , turnContext, new DialogState());
await dc.BeginDialogAsync(nameof(RegisterPledgeDialog), null, cancellationToken);
}
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
Logger.LogInformation("Running dialog with Message Activity.");
await Dialog.RunAsync(turnContext, _conversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken);
}
有两件事。
它没有返回对话框的原因是: OnMessageActivity
在用户响应时被触发,并调用了 Dialog.RunAsync
在你的主对话框上。
对话框不能被动态地添加到机器人中。它们必须在构造函数中添加,然后用 BeginDialogAsync()
.
我建议:
Dialog.Run
,而不是BeginDialogActivity.Type === ActivityTypes.Event
以及其他任何你需要的条件)。然后 它称之为 BeginDialog
. 请务必使用 AddDialog
在这个对话框的构造函数中。