我正在构建一个很好的小机器人,但是我正面临着一个我似乎无法摆脱的流量问题。我使用LuisDialog来解释用户的消息。在某个意图处理程序方法中,我在面板中显示一个带有“取消订阅”按钮的轮播,并调用context.Wait(Uitschrijven)
来处理用户从轮播中选择的内容。
这意味着下一个传入的消息将触及此方法:
private async Task Uitschrijven(IDialogContext context,IAwaitable<IMessageActivity> result)
{
...
}
在这种方法中,我希望用户点击轮播中的按钮,该按钮将发送格式为"id:3"
的消息。当然,用户只需键入一些其他新消息,而不是继续此流程。问题是,如果他们这样做,我的下一条消息是由我的'Uitschrijven'方法接收的,在那里它将无法正确处理。如何将其发回以由LuisDialog重新解释,以便匹配正确的意图?
理想情况下,我想从我的LuisDialog再次将消息转发给我的MessageReceived
函数。
但是,Forward()方法需要一个resumeafter方法,我不需要。 还有EndConversation,但它只是在没有解释的情况下结束了对话。
有谁知道如何确保MessageReceived
方法处理这些新邮件,以便用户能够在这种情况下继续使用?
答案 0 :(得分:1)
这可能是Scorable的一个很好的用例。不过会有一些权衡。
您的用户只需输入&#34;取消订阅&#34;在任何时候点击一个按钮,回复/ imback值为&#34;取消订阅&#34;。您可以选择所需的任何文本作为识别值。这样,您的取消订阅逻辑将独立于任何其他逻辑运行,您将不会像现在一样陷入您的流程中。由于取消订阅事件将由全局处理程序(Scorable)处理,因此您可以像往常一样处理用户发送的任何其他消息,例如在LuisDialog中。
如果您不希望您的用户在任何时候取消订阅,此解决方案可能不适合您。在这种情况下,请将您的代码发布为@Ezequiel,以便我们更好地了解您的流程。这不是处理流量的唯一方法。
以下是一些要查看的信息:
Scorable Video
答案 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,并且这个逻辑可以在那些不合适的地方。
如果您认为这不能准确理解您的要求,请随时编辑您的问题,并提供更详细的说明!