如何使用MS bot框架在bot中创建多个对话框,以便bot记住哪个对话框正在进行中

时间:2016-08-10 03:58:44

标签: c# botframework

我使用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中存在某种内置函数来存储关于用户的数据,例如它最后与之交互的对话类型。

1 个答案:

答案 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