从保存的对话中启动FormDialog

时间:2017-01-23 19:13:54

标签: botframework

这有点建立在主动用例示例的基础上,我有一个简单的用例:

  1. 当用户启动与bot的对话时 - 机器人保存活动对象
  2. 存在API端点
  3. 触发api端点时
  4. 检索活动对象,将其与 - 交换 - 并通过SendToConversationAsync将消息发送回用户。
  5. 是否可以通过某种方式检索或重新创建iDialogue对象来激活FormDialog,以便可以使用适当的表单触发context.Call,而不是仅向用户重放活动消息?

    我尝试过使用各种各样的东西,但没有任何东西出现在用户端;具体来说,我试过了

    await Conversation.SendAsync(message, () => new MakeSomeFormDialog());
    

    Chain.From(() => FormDialog.FromForm(SomeForm.BuildForm, FormOptions.PromptInStart));
    

    和交互式示例 -

    Task Interactive(IDialog form) where T : class 
    

    然而,我认为这个交互式的例子,但我认为这是试图发布到bot?

1 个答案:

答案 0 :(得分:0)

事实证明这是相当直接的。我向代表求助,我指出了正确的方向。

涵盖此案例的主动机器人示例位于https://github.com/MicrosoftDX/botFramework-proactiveMessages

特别是这段代码https://github.com/MicrosoftDX/botFramework-proactiveMessages/blob/master/csharp/startNewDialogWithPrompt/ConversationStarter.cs#L31

公共类ConversationStarter     {         //注意:当然你不想要这个。最终,您需要将其保存在某个表中         //将此作为静态变量意味着我们只能记住一个用户:)         public static string resumptionCookie;

    //This will interrupt the conversation and send the user to SurveyDialog, then wait until that's done 
    public static async Task Resume()
    {
        var message = ResumptionCookie.GZipDeserialize(resumptionCookie).GetMessage();
        var client = new ConnectorClient(new Uri(message.ServiceUrl));


        using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
        {
            var botData = scope.Resolve<IBotData>();
            await botData.LoadAsync(CancellationToken.None);
            var stack = scope.Resolve<IDialogStack>();

            //interrupt the stack
            var dialog =new SurveyDialog();
            stack.Call(dialog.Void<object, IMessageActivity>(), null);
            await stack.PollAsync(CancellationToken.None);

            //flush dialog stack
            await botData.FlushAsync(CancellationToken.None);

        }
    }
}

获取上下文并使用另一个对话框(可以是表单对话框)中断