PromptDialog.Choice()的消息处理不正确?

时间:2017-07-27 09:47:14

标签: c# botframework

我注意到使用PromptDialog.Choice()主动开始对话并没有按预期工作,并且想知道我做错了什么或者是否是机器人框架中的问题。

我在root对话框中使用提示符如下:

public async Task StartAsync(IDialogContext context)
{
    PromptDialog.Choice(...);
}

问题是对于根对话框,多条消息到达。至少有两个“对话更新”消息,一个用于添加机器人,另一个用于添加用户。

提示对话框将这些解释为答案,当然它们与可用的提示选项不匹配。因此,提示对话框再次尝试再次显示自己。因此,我总是会在会话开始时获得多个提示。

我将其跟踪到dialog中的消息处理程序,并看到它没有检查消息类型。作为一种解决方法,我创建了自己的提示对话框,忽略了所有非消息类型的活动,现在它按预期工作:

[Serializable]
public class CustomPromptDialog : PromptChoice<string>
{
    public CustomPromptDialog(string title, params string [] buttons) : base(
        new PromptOptions<string>(prompt: title, retry: "", tooManyAttempts: "", options: new List<string>(buttons), attempts: 2, promptStyler: null))
    {
    }

    protected async override Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> message)
    {
        var activity = await message;

       // This is what is IMHO missing in the built-in version.
        if(activity.Type != ActivityTypes.Message)
        {
            return;
        }

        await base.MessageReceivedAsync(context, message);
    }
}

我是否错误地使用了提示,或者它是否是框架中的错误?

1 个答案:

答案 0 :(得分:0)

正如评论中所述,您的案例的解决方案是仅在收到PromptChoice加入对话的通知时才启动包含user的对话框。

对于这种情况,您可以检查MemberAdded消息中的conversationUpdate信息,并仅在添加的成员不是机器人时启动对话,也就是说成员的ID不相等到机器人的ID,message.Recipient.Id

private Activity HandleSystemMessage(Activity message)
{
    if (message.Type == ActivityTypes.ConversationUpdate)
    {
        if (message.MembersAdded.Any(o => o.Id != message.Recipient.Id))
        {
            // Your PromptChoiceDialog here        
        }
    }
    return message;
}