Bot框架:阅读对话的传出消息

时间:2017-02-07 12:02:02

标签: c# botframework

有没有办法使用Conversation以便将发送给用户的IMessageActivity返回给调用者而不是发送回用户uri?
我想要完成的是处理自己的传入和传出消息,虽然我可以创建一个要提供给Conversation对象的活动,但我无法读取并使用IMessageActivity回复。

更具体地说,我想知道我是否可以替换

Conversation.SendAsync(IMessageActivity, Func<IDialog<object>>);

有一些东西让我处理回复。

谢谢。

1 个答案:

答案 0 :(得分:0)

回复应由传递给SendAsync方法的对话框处理。

在对话框中,您通常会有一个接收上下文和用户发送的消息的方法。例如:

public async virtual Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
   var message = await result;
}

在对话框的StartAsync方法中,您必须将此方法设置为用户向机器人发送消息后将调用的方法

public async Task StartAsync(IDialogContext context)
{
    context.Wait(this.MessageReceivedAsync);
}

然后,由您决定在收到消息后该做什么。

您要使用PromptDialog,例如确认一个?您可以,只需实例化对话框,调用它并使用ResumeAfter<bool>方法获得结果。

PromptDialog.Confirm(context, ResumeAfterPrompt, "prompt dialogue", "retry dialog", 3);

private async Task ResumeAfterPrompt(IDialogContext context, IAwaitable<bool> result)
{
    try
    {
        // try get user response
        bool response = await result;

        await context.PostAsync($"You said: {result}");
    }
    catch (TooManyAttemptsException)
    {
        // handle error
    }

   // wait for another message from the user. Could be the same method or a new one following the same signature.
   context.Wait(this.MessageReceivedAsync);
}

您想使用FormFlow吗?您也可以实例化FormDialog并在您定义的ResumeAfter<T>方法中获得结果。

使用多个对话框时,它总是相同的模式(提示和表单是对话框!):调用对话框,在ResumeAfter方法中获取结果并等待新的用户消息。

所有这些概念都得到了很好的解释,并在Multi-Dialogs sample中得到了证明。阅读自述文件和代码库,您将了解我的解释。该示例显示了提示,FormFlow,自定义对话框等。Here还有一些详细信息。