Bots Microsoft Bot Framework-主动消息,暂停当前对话框
我创建了一个简单的新闻机器人,它每24小时向用户发送一次更新。我已经创建了一个回调控制器,它处理来自外部服务的请求,处理resumptionCookie,然后向用户发送带有两个按钮的文章旋转木马。其中一个按钮打开浏览器窗口,另一个按钮应触发新对话框(选项对话框) 这个实现正确吗?当用户与新闻文章消息交互时,是否可以暂停任何活动对话框?例如,如果我正在浏览一个特定的对话框,然后突然收到一个新闻警报,是否可以暂停当前对话框,以允许用户更新警报选项(几乎就像新闻警报在正常对话框流之外),然后一旦完成,他们将返回上一个对话框。希望这个问题足够清楚。任何帮助都将不胜感激Bots Microsoft Bot Framework-主动消息,暂停当前对话框,bots,botframework,Bots,Botframework,我创建了一个简单的新闻机器人,它每24小时向用户发送一次更新。我已经创建了一个回调控制器,它处理来自外部服务的请求,处理resumptionCookie,然后向用户发送带有两个按钮的文章旋转木马。其中一个按钮打开浏览器窗口,另一个按钮应触发新对话框(选项对话框) 这个实现正确吗?当用户与新闻文章消息交互时,是否可以暂停任何活动对话框?例如,如果我正在浏览一个特定的对话框,然后突然收到一个新闻警报,是否可以暂停当前对话框,以允许用户更新警报选项(几乎就像新闻警报在正常对话框流之外),然后一旦完成,
public class CallbackController : ApiController
{
public async Task<IHttpActionResult> Post(ResumptionCookie resumptionCookie)
{
var activity = (Activity)resumptionCookie.GetMessage();
var reply = activity.CreateReply();
reply.Text = "We found 7 news articles that match your criteria";
reply.Attachments = new List<Attachment>
{
new ThumbnailCard
{
Buttons = new List<CardAction>
{
new CardAction(ActionTypes.OpenUrl, "BBC", null, "http://www.bbc.co.uk"),
new CardAction(ActionTypes.PostBack, "Update Options", null, "Update Options")
}
}.ToAttachment()
};
var client = new ConnectorClient(new Uri(activity.ServiceUrl));
await client.Conversations.ReplyToActivityAsync(reply);
return Ok(new { success = true });
}
}
公共类回调控制器:ApiController
{
公共异步任务发布(ResumptionCookie ResumptionCookie)
{
var activity=(activity)resumptionCookie.GetMessage();
var reply=activity.CreateReply();
reply.Text=“我们找到了7篇符合您标准的新闻文章”;
答复.附件=新列表
{
新拇指指甲卡
{
按钮=新列表
{
新的CardAction(ActionTypes.OpenUrl,“BBC”,null,“http://www.bbc.co.uk"),
新建CardAction(ActionTypes.PostBack,“更新选项”,null,“更新选项”)
}
}.ToAttachment()
};
var client=newconnectorclient(新Uri(activity.ServiceUrl));
等待client.Conversations.ReplyToActivityAsync(reply);
返回Ok(新的{success=true});
}
}
这是我的主要对话
[Serializable]
public class MainDialog : IDialog
{
public async Task StartAsync(IDialogContext context)
{
context.Wait(ProcessMessage);
}
private async Task ProcessMessage(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var response = await result;
if (response.Text.Equals("Update Options", StringComparison.OrdinalIgnoreCase))
{
context.Call(new OptionsDialog(), FinishMainDialog);
}
else
{
PromptDialog.Confirm(context, ProcessChoice, "Do you wish to continue?");
}
}
private async Task ProcessChoice(IDialogContext context, IAwaitable<bool> result)
{
var choice = await result;
if(choice)
{
context.Call(new DialogOne(), FinishMainDialog);
}
else
{
context.Done(true);
}
}
private async Task FinishMainDialog(IDialogContext context, IAwaitable<object> result)
{
context.Done(true);
}
}
[可序列化]
公共类main对话框:IDialog
{
公共异步任务StartAsync(IDialogContext上下文)
{
Wait(ProcessMessage);
}
专用异步任务ProcessMessage(IDialogContext上下文,IAwaitable结果)
{
var响应=等待结果;
if(response.Text.Equals(“更新选项”,StringComparison.OrdinalIgnoreCase))
{
调用(新选项对话框(),FinishMainDialog);
}
其他的
{
PromptDialog.Confirm(上下文,进程选项,“是否继续?”);
}
}
专用异步任务ProcessChoice(IDialogContext上下文,IAwaitable结果)
{
var选择=等待结果;
如果(选择)
{
调用(new DialogOne(),FinishMainDialog);
}
其他的
{
上下文。完成(true);
}
}
专用异步任务FinishMain对话框(IDialogContext上下文,IAwaitable结果)
{
上下文。完成(true);
}
}
这是我的频率对话框
[Serializable]
public class OptionsDialog : IDialog
{
public async Task StartAsync(IDialogContext context)
{
await context.PostAsync("You can update your to options here");
context.Wait(ProcessMessage);
}
public async Task ProcessMessage(IDialogContext context, IAwaitable<IMessageActivity> activity)
{
await context.PostAsync("Hello, World!");
context.Done(true);
}
}
[可序列化]
公共类选项对话框:IDialog
{
公共异步任务StartAsync(IDialogContext上下文)
{
wait context.PostAsync(“您可以在此处更新您的收件人选项”);
Wait(ProcessMessage);
}
公共异步任务ProcessMessage(IDialogContext上下文,IAwaitable活动)
{
等待上下文。PostAsync(“你好,世界!”);
上下文。完成(true);
}
}
收到通知时会发生什么情况?机器人失败了?或者?@BobSwager如果通知呈现正确,我的问题是当用户单击通知上的“更新选项”按钮时,我不确定是否正确处理了响应。您可以使用Emulator和debug。你可以看到你的流动。如果你陷入困境,那么写评论,我们会一起努力解决。