使用 MS BotFramework 中的 PromptDialog 开始对话

是否有适当的方式让机器人PromptDialog.Choice在 Direct Line 频道中开始对话?


我正在尝试通过捕获拳头ConversationUpdate活动并从用户创建假消息来初始化对话框的丑陋技巧,如下所示:


IMessageActivity greetingMessage = Activity.CreateMessageActivity();

greetingMessage.From = message.Recipient;//from bot

greetingMessage.Recipient = userAccount;//to user

greetingMessage.Conversation = message.Conversation;

greetingMessage.Text = "Hello, I am a bot";

greetingMessage.Locale = "en-us";

greetingMessage.Id = Guid.NewGuid().ToString();


await connector.Conversations.SendToConversationAsync((Activity)greetingMessage);


IMessageActivity dialogEntryMessage = Activity.CreateMessageActivity();

dialogEntryMessage.Recipient = message.Recipient;//to bot

dialogEntryMessage.From = message.From;//from user

dialogEntryMessage.Conversation = message.Conversation;

dialogEntryMessage.Text = "any text";

dialogEntryMessage.Locale = "en-us";

dialogEntryMessage.ChannelId = message.ChannelId;

dialogEntryMessage.ServiceUrl = message.ServiceUrl;

dialogEntryMessage.Id = Guid.NewGuid().ToString();

dialogEntryMessage.ReplyToId = greetingMessage.Id;


await Conversation.SendAsync(dialogEntryMessage, () => new Dialogs.RootDialog());

哪里message来的ConversationUpdate消息。在 RootDialog 中,我以PromptDialog.Choice.


它在模拟器中工作,但在 Direct Line 通道机器人中不记得对话状态,当用户选择一个对话选项并发送他的第一条真实消息时,根对话再次从 开始PromptDialog.Choice,因此它出现两次。


更新


我从微软找到了一篇相关的博文:https ://blog.botframework.com/2018/07/12/how-to-properly-send-a-greeting-message-and-common-issues-from-customers/


茅侃侃
浏览 138回答 1
1回答

郎朗坤

在 Direct Line 通道机器人不记得对话状态,当用户选择一个对话选项并发送他的第一条真实消息时,根对话框再次从 PromptDialog.Choice 开始,所以它出现了两次。我可以在我这边重现相同的问题,并且我发现将 bot 和用户添加到对话时将执行ConversationUpdate处理程序。为了解决这个问题,您可以参考以下代码示例。在消息控制器中:else if (message.Type == ActivityTypes.ConversationUpdate){&nbsp; &nbsp; // Handle conversation state changes, like members being added and removed&nbsp; &nbsp; // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info&nbsp; &nbsp; // Not available in all channels&nbsp; &nbsp; if (update.MembersAdded != null && update.MembersAdded.Any())&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; foreach (var newMember in update.MembersAdded)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (newMember.Name == "{your_botid_here}")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IMessageActivity greetingMessage = Activity.CreateMessageActivity();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //your code logic&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IMessageActivity dialogEntryMessage = Activity.CreateMessageActivity();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialogEntryMessage.Recipient = message.Recipient;//to bot&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialogEntryMessage.From = message.From;//from user&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialogEntryMessage.Conversation = message.Conversation;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialogEntryMessage.Text = "show choices";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialogEntryMessage.Locale = "en-us";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialogEntryMessage.ChannelId = message.ChannelId;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialogEntryMessage.ServiceUrl = message.ServiceUrl;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialogEntryMessage.Id = System.Guid.NewGuid().ToString();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialogEntryMessage.ReplyToId = greetingMessage.Id;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await Conversation.SendAsync(dialogEntryMessage, () => new Dialogs.RootDialog());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}在 RootDialog 中:private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result){&nbsp; &nbsp; var activity = await result as Activity;&nbsp; &nbsp; var mes = activity.Text.ToLower();&nbsp; &nbsp; string[] choices = new string[] { "choice 1", "choice 2" };&nbsp; &nbsp; if (Array.IndexOf(choices, mes) > -1)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; await context.PostAsync($"You selected {mes}");&nbsp; &nbsp; }&nbsp; &nbsp; else if(mes == "show choices")&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; PromptDialog.Choice(context, resumeAfterPrompt, choices, "please choose an option.");&nbsp; &nbsp; }&nbsp; &nbsp; else&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; await context.PostAsync($"You sent {activity.Text} which was {length} characters.");&nbsp; &nbsp; &nbsp; &nbsp; context.Wait(MessageReceivedAsync);&nbsp; &nbsp; }}private async Task resumeAfterPrompt(IDialogContext context, IAwaitable<string> result){&nbsp; &nbsp; string choice = await result;&nbsp; &nbsp; await context.PostAsync($"You selected {choice}");}测试结果:
打开App,查看更多内容
随时随地看视频慕课网APP