我注意到使用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);
}
}
我是否错误地使用了提示,或者它是否是框架中的错误?
答案 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;
}