当我在 LuisDialog 意图处理程序中调用 context.Wait 时,如何将消息转发回 MessageReceived?
How can I forward a message back to MessageReceived when I've called context.Wait in a LuisDialog intent handler?
我正在构建一个小型机器人,运行良好,但我面临一个我似乎无法摆脱的流程问题。我使用解释用户消息的 LuisDialog。在某个意图处理程序方法中,我在面板中显示带有 'Unsubscribe' 按钮的轮播,并调用 context.Wait(Uitschrijven)
来处理用户从轮播中进行的选择。
这意味着下一条传入消息将命中此方法:
private async Task Uitschrijven(IDialogContext context,IAwaitable<IMessageActivity> result)
{
...
}
在这种方法中,我希望用户点击轮播中的按钮,这将发送格式类似于 "id:3"
的消息。当然,用户可以只键入一些其他的新消息而不是继续这个流程。问题是,如果他们这样做,我的 'Uitschrijven' 方法会收到下一条消息,在那里它不会被正确处理。我怎样才能将它发回以供 LuisDialog 重新解释,以便匹配正确的意图?
理想情况下,我想将消息从我的 LuisDialog 再次转发到我的 MessageReceived
函数。
但是,Forward() 方法需要一个我不需要的 resumeafter 方法。
还有 EndConversation,但它只是在没有解释的情况下结束对话。
有谁知道如何确保这些新消息将由 MessageReceived
方法处理,以便用户能够在这种情况下继续?
这可能是 Scorable 的一个很好的用例。不过会有一些折衷。
您的用户只需随时键入 "unsubscribe" 或单击 postback/imback 值为 "unsubscribe" 的按钮。您可以选择任何您想要的文本作为识别值。这样,您的退订逻辑将 运行 独立于任何其他逻辑,并且您不会像现在这样陷入流程。由于取消订阅事件将由全局处理程序 (Scorable) 处理,您可以像往常一样处理用户发送的任何其他消息,在您的情况下是在 LuisDialog 中。
如果您不希望您的用户能够在任何时候取消订阅,此解决方案可能不适合您。在这种情况下,请按照@Ezequiel 的要求 post 您的代码,以便我们更好地理解您的流程。这不是处理流程的唯一方法。
这里有一些信息可供查看:
Scorable Video
我的理解是,您正在通过 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 的其他建议更好,因为使用 Scorable,每条消息都会 运行 通过 Unsubscribe scorable,并且此逻辑可能可以在不合适的地方触发
如果您觉得这不是对您的要求的准确理解,请随时编辑您的问题,提供更多明确的细节!
我正在构建一个小型机器人,运行良好,但我面临一个我似乎无法摆脱的流程问题。我使用解释用户消息的 LuisDialog。在某个意图处理程序方法中,我在面板中显示带有 'Unsubscribe' 按钮的轮播,并调用 context.Wait(Uitschrijven)
来处理用户从轮播中进行的选择。
这意味着下一条传入消息将命中此方法:
private async Task Uitschrijven(IDialogContext context,IAwaitable<IMessageActivity> result)
{
...
}
在这种方法中,我希望用户点击轮播中的按钮,这将发送格式类似于 "id:3"
的消息。当然,用户可以只键入一些其他的新消息而不是继续这个流程。问题是,如果他们这样做,我的 'Uitschrijven' 方法会收到下一条消息,在那里它不会被正确处理。我怎样才能将它发回以供 LuisDialog 重新解释,以便匹配正确的意图?
理想情况下,我想将消息从我的 LuisDialog 再次转发到我的 MessageReceived
函数。
但是,Forward() 方法需要一个我不需要的 resumeafter 方法。 还有 EndConversation,但它只是在没有解释的情况下结束对话。
有谁知道如何确保这些新消息将由 MessageReceived
方法处理,以便用户能够在这种情况下继续?
这可能是 Scorable 的一个很好的用例。不过会有一些折衷。
您的用户只需随时键入 "unsubscribe" 或单击 postback/imback 值为 "unsubscribe" 的按钮。您可以选择任何您想要的文本作为识别值。这样,您的退订逻辑将 运行 独立于任何其他逻辑,并且您不会像现在这样陷入流程。由于取消订阅事件将由全局处理程序 (Scorable) 处理,您可以像往常一样处理用户发送的任何其他消息,在您的情况下是在 LuisDialog 中。
如果您不希望您的用户能够在任何时候取消订阅,此解决方案可能不适合您。在这种情况下,请按照@Ezequiel 的要求 post 您的代码,以便我们更好地理解您的流程。这不是处理流程的唯一方法。
这里有一些信息可供查看:
Scorable Video
我的理解是,您正在通过 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 的其他建议更好,因为使用 Scorable,每条消息都会 运行 通过 Unsubscribe scorable,并且此逻辑可能可以在不合适的地方触发
如果您觉得这不是对您的要求的准确理解,请随时编辑您的问题,提供更多明确的细节!