Microsoft Bot Framework - 主动消息,暂停当前对话框

时间:2017-04-19 19:50:04

标签: bots botframework

我创建了一个简单的新闻机器人,每24小时向用户发送一次更新。我创建了一个回调控制器,它处理来自外部服务的请求,处理resumptionCookie,然后向用户发送带有两个按钮的文章轮播。其中一个按钮打开浏览器窗口,另一个按钮应触发一个新对话框(OptionsDialog)。

此实施是否正确?当用户与新闻文章消息交互时,是否可以暂停任何活动对话框?例如,如果我正在通过一个特定的对话框,那么突然我得到一个新闻提醒,是否可以暂停当前对话框,允许用户更新提醒的选项(几乎就像新闻提醒一样)在正常的对话流程之外),一旦他们完成,他们将返回上一个对话框。希望这个问题很清楚。任何帮助将不胜感激。

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 });
    }
}

这是我的主对话框

[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);
    }
}

这是我的频率对话框

[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);
    }
}

0 个答案:

没有答案