我使用MS Bot Framework和C#构建一个可以处理3个对话框的机器人。每个对话框都是使用FormDialog和FormBuilder构建的,如下所示:
internal static IDialog<OrderDialogForm> BuildDialog()
{
return Chain.From(() => FormDialog.FromForm(BuildForm));
}
当您第一次与机器人交谈时,它会让您选择三个对话框中的一个,例如&#34;填写订单&#34;,&#34;输入您的用户个人资料&#34;,&#34;获得支持&#34;,
一旦用户选择,例如&#34;填写订单&#34;,机器人就会启动相应的对话框。
显然,用户应该继续回答对话框内的问题,直到对话结束。
但每次用户发送消息时,都会将其传递给API控制器中的此方法:
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
从这里开始,机器人需要决定当前正在进行的三个对话框中的哪一个,并继续该对话框。
我该怎么做,记住当前正在进行的对话以及用户的每条新消息,继续该对话而不是将用户返回到主屏幕?
我的想法是创建某种全局变量或存储在其他地方的记录,可能在数据库中。该记录将包含此用户当前与bot一起使用的当前对话框的类型。每次机器人收到消息时,它都会查询数据库以发现用户的最后一次交互是与OrderDialog进行的,因此程序代码可以决定继续使用OrderDialog。但它似乎很慢并且可能在Bot Framework中存在某种内置函数来存储关于用户的数据,例如它最后与之交互的对话类型。
答案 0 :(得分:1)
使用Bot State Service https://docs.botframework.com/en-us/csharp/builder/sdkreference/stateapi.html
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
// Detect if this is a Message activity
if (activity.Type == ActivityTypes.Message)
{
// Get any saved values
StateClient sc = activity.GetStateClient();
BotData userData = sc.BotState.GetPrivateConversationData(
activity.ChannelId, activity.Conversation.Id, activity.From.Id);
var boolProfileComplete = userData.GetProperty<bool>("ProfileComplete");
if (!boolProfileComplete)
{
// Call our FormFlow by calling MakeRootDialog
await Conversation.SendAsync(activity, MakeRootDialog);
}
else
{
// Get the saved profile values
var FirstName = userData.GetProperty<string>("FirstName");
var LastName = userData.GetProperty<string>("LastName");
var Gender = userData.GetProperty<string>("Gender");
// Tell the user their profile is complete
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("Your profile is complete.\n\n");
sb.Append(String.Format("FirstName = {0}\n\n", FirstName));
sb.Append(String.Format("LastName = {0}\n\n", LastName));
sb.Append(String.Format("Gender = {0}", Gender));
// Create final reply
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
Activity replyMessage = activity.CreateReply(sb.ToString());
await connector.Conversations.ReplyToActivityAsync(replyMessage);
}
}
else
{
// This was not a Message activity
HandleSystemMessage(activity);
}
// Send response
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
示例来自: 使用Microsoft Bot Framework简介FormFlow http://aihelpwebsite.com/Blog/EntryId/8/Introduction-To-FormFlow-With-The-Microsoft-Bot-Framework