- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否有适当的方式让机器人在 Direct Line channel 中开始与 PromptDialog.Choice
的对话?
我正在尝试一个丑陋的 hack,捕捉第一个 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 channel 中机器人不记得对话状态,当用户选择一个对话选项并发送他的第一条真实消息时,根对话再次从 PromptDialog.Choice< 开始
,所以它出现了两次。
更新
我从 Microsoft 找到了相关的博文:https://blog.botframework.com/2018/07/12/how-to-properly-send-a-greeting-message-and-common-issues-from-customers/
最佳答案
in Direct Line channel bot doesn't remember the dialog state and when user choose one of dialog options and send his first real message, root dialog starts again from the PromptDialog.Choice, so it appears twice.
我可以在我这边重现同样的问题,我发现当机器人和用户都被添加到对话中时,ConversationUpdate 处理程序将被执行。
要解决该问题,您可以引用以下代码示例。
在 MessagesController 中:
else if (message.Type == ActivityTypes.ConversationUpdate)
{
// Handle conversation state changes, like members being added and removed
// Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
// Not available in all channels
if (update.MembersAdded != null && update.MembersAdded.Any())
{
foreach (var newMember in update.MembersAdded)
{
if (newMember.Name == "{your_botid_here}")
{
IMessageActivity greetingMessage = Activity.CreateMessageActivity();
//...
//your code logic
//...
IMessageActivity dialogEntryMessage = Activity.CreateMessageActivity();
dialogEntryMessage.Recipient = message.Recipient;//to bot
dialogEntryMessage.From = message.From;//from user
dialogEntryMessage.Conversation = message.Conversation;
dialogEntryMessage.Text = "show choices";
dialogEntryMessage.Locale = "en-us";
dialogEntryMessage.ChannelId = message.ChannelId;
dialogEntryMessage.ServiceUrl = message.ServiceUrl;
dialogEntryMessage.Id = System.Guid.NewGuid().ToString();
dialogEntryMessage.ReplyToId = greetingMessage.Id;
await Conversation.SendAsync(dialogEntryMessage, () => new Dialogs.RootDialog());
}
}
}
}
在 RootDialog 中:
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
var activity = await result as Activity;
var mes = activity.Text.ToLower();
string[] choices = new string[] { "choice 1", "choice 2" };
if (Array.IndexOf(choices, mes) > -1)
{
await context.PostAsync($"You selected {mes}");
}
else if(mes == "show choices")
{
PromptDialog.Choice(context, resumeAfterPrompt, choices, "please choose an option.");
}
else
{
await context.PostAsync($"You sent {activity.Text} which was {length} characters.");
context.Wait(MessageReceivedAsync);
}
}
private async Task resumeAfterPrompt(IDialogContext context, IAwaitable<string> result)
{
string choice = await result;
await context.PostAsync($"You selected {choice}");
}
测试结果:
关于c# - 在 MS BotFramework 中使用 PromptDialog 开始对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51669311/
我正在尝试编写一个允许用户创建请求的机器人(例如。我想买一件 T 恤或我想修理我的电脑)。根据他们选择的请求,他们将被问及与该请求相关的一系列问题;这些问题与他们选择的请求直接相关。目前我正在尝试遍历
我正在寻找如何使用 IDialog 向用户显示选择和 PromtDialog.Choice方法。但是下面的代码示例没有显示选择。很难找到代码示例。寻求帮助。谢谢。 List BotOptions =
将 Microsoft.Bot.Builder NuGet 包从 3.5.5 更新到 3.5.8 后,下面代码段中的 OnOptionSelected 回调不再被调用(我收到“错误选择”响应对于每次点
我正在使用 IActivityLogger 来记录机器人和用户之间的对话。这里记录器正在记录所有消息,除了由 PromptDialog.Choice() 生成的文本 我已经测试了 PromptDial
是否有适当的方式让机器人在 Direct Line channel 中开始与 PromptDialog.Choice 的对话? 我正在尝试一个丑陋的 hack,捕捉第一个 ConversationUp
我需要让 Cortana 阅读我的所有提示,到目前为止,我设法让它说出简单的短语,如下例所示: [LuisIntent("Thanks")] public async Task Thanks(IDia
我正在创建一个 PromptDialog Choice,它填充我存储在数据库中的对象选项列表。但是,它只显示对象的类型而不是选项的名称。谁能建议我从数据库加载选项并将其与 PromptDialog 绑
我想在聊天窗口中提示带有"is"或“否”选项的问题, public class MessagesController : ApiController { public virtual asyn
Bot Framework 中的 PromptDialog.Choice 显示运行良好的选择列表。但是,我希望有一个选项可以取消/转义/退出对话框,并在列表中提供取消/转义/退出选项。 PromptD
Bot Framework 中的 PromptDialog.Choice 提供了许多运行良好的内置功能。但是,我希望能够拦截/覆盖匹配过程。 获得 PromptDialog.Choice 功能并能够接
在显示提示确认对话框之前,我从用户那里获得了一些输入。基于这些输入和 PromptDialog(是/否)选择,我必须做一些功能逻辑。 提示对话框 PromptDialog.Confirm(
我正在尝试使用虚假消息测试 IDialog 流程,因此: var toBot = new Message() { ConversationId
我是一名优秀的程序员,十分优秀!