当我调用context.Wait在LuisDialog意图处理程序中时,如何将消息转发回MessageReceived?

时间:2017-11-17 07:49:25

标签: botframework luis

我正在构建一个很好的小机器人,但是我正面临着一个我似乎无法摆脱的流量问题。我使用LuisDialog来解释用户的消息。在某个意图处理程序方法中,我在面板中显示一个带有“取消订阅”按钮的轮播,并调用context.Wait(Uitschrijven)来处理用户从轮播中选择的内容。

这意味着下一个传入的消息将触及此方法:

private async Task Uitschrijven(IDialogContext context,IAwaitable<IMessageActivity> result)
{
    ...
}

在这种方法中,我希望用户点击轮播中的按钮,该按钮将发送格式为"id:3"的消息。当然,用户只需键入一些其他新消息,而不是继续此流程。问题是,如果他们这样做,我的下一条消息是由我的'Uitschrijven'方法接收的,在那里它将无法正确处理。如何将其发回以由LuisDialog重新解释,以便匹配正确的意图?

理想情况下,我想从我的LuisDialog再次将消息转发给我的MessageReceived函数。

但是,Forward()方法需要一个resumeafter方法,我不需要。 还有EndConversation,但它只是在没有解释的情况下结束了对话。

有谁知道如何确保MessageReceived方法处理这些新邮件,以便用户能够在这种情况下继续使用?

2 个答案:

答案 0 :(得分:1)

这可能是Scorable的一个很好的用例。不过会有一些权衡。

您的用户只需输入&#34;取消订阅&#34;在任何时候点击一个按钮,回复/ imback值为&#34;取消订阅&#34;。您可以选择所需的任何文本作为识别值。这样,您的取消订阅逻辑将独立于任何其他逻辑运行,您将不会像现在一样陷入您的流程中。由于取消订阅事件将由全局处理程序(Scorable)处理,因此您可以像往常一样处理用户发送的任何其他消息,例如在LuisDialog中。

如果您不希望您的用户在任何时候取消订阅,此解决方案可能不适合您。在这种情况下,请将您的代码发布为@Ezequiel,以便我们更好地了解您的流程。这不是处理流量的唯一方法。

以下是一些要查看的信息:
Scorable Video

Scorable Blog

Scorable Blog

答案 1 :(得分:0)

我的理解是,您通过Luis对话框中存在的private async Task Uitschrijven(IDialogContext context,IAwaitable result)等方法接收用户的响应,如果传入的消息来自您的按钮,则需要处理它,但是如果消息是另一回事,你希望它回到同一个对话框的MessageReceived方法。如果这是正确的,你可以简单地做这样的事情:

private async Task Uitschrijven(IDialogContext context,IAwaitable result) 
{
    var message = await result;
    if( /* message matches what you're expecting from button */) 
    {
        // process message from button
    }
    else
    {
        // simply pass the IAwaitable to MessageReceived
        await MessageReceived(context, result);
    }
}

如果我正确理解了场景,这可能比使用Scorable的其他建议更好,因为有了一个可评价的,每条消息都会通过Unsubscribe scorable,并且这个逻辑可以在那些不合适的地方。

如果您认为这不能准确理解您的要求,请随时编辑您的问题,并提供更详细的说明!