在发送第一条消息之前访问用户/会话状态

问题描述 投票:0回答:1

在Bot Framework V4中,it is explained可以通过在OnTurnAsync中创建对话框上下文来访问用户状态或会话状态

var dc = await Dialogs.CreateContextAsync(turnContext);

或在对话框上下文类中使用访问器

var state = await HogehogeSettingAccessor.GetAsync(stepContext.Context);

但是,如何在向对话框发送消息之前访问它们?

我目前正在开发Directline API,并希望在发送第一条消息之前参考语言设置(例如,如果书面语言与设置不匹配,则忽略用户输入)。

private async Task OnMessageReceive(SocketMessage socketMessage)
{
    if (IsLanguageMatch(socketMessage)){
        await channel.SendMessageAsync(response);
    }
}

我该如何实现这一目标?

c# botframework direct-line-botframework
1个回答
1
投票

您可以让OnTurnAsync启动第一个/主要对话框,仅满足您的条件。当用户第一次向机器人发送消息时,将不会有任何活动的对话框。您可以利用该条件并将其添加到那里,只有在满足以下条件时才启动Dialog:

 // Getting the bot accessor state you want to use   

LanguageAccessor languageAccessor = await _accessors.LanguageAccessor.GetAsync(turnContext, () => new LanguageAccessor(), cancellationToken);

    // Every step sends a response. If no dialog is active, no response is sent and turnContext.Responded is null
    //where turnContext.Activity.Text is the message sent by the user

 if (!turnContext.Responded && ((languageAccessor.property)turnContext.Activity.Text))

OnTurnAsync看起来像这样:

        public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
                {

                    if (turnContext.Activity.Type == ActivityTypes.Message)
                    {
        // Establish dialog state from the conversation state.
                        DialogContext dc = await _dialogs.CreateContextAsync(turnContext, cancellationToken);

                        // Get the user's info.
                       LanguageAccessor languageAccessor = await _accessors.LanguageAccessor.GetAsync(turnContext, () => new LanguageAccessor(), cancellationToken);

                        await _accessors.UserInfoAccessor.SetAsync(turnContext, userInfo, cancellationToken);

                        // Continue any current dialog.
                        DialogTurnResult dialogTurnResult = await dc.ContinueDialogAsync();    

                        // Every dialog step sends a response, so if no response was sent,
                        // then no dialog is currently active and the Else if is entered.

                        if (!turnContext.Responded && ((languageAccessor.property)turnContext.Activity.Text))
                        {

                            //This starts the MainDialog if there's no active dialog when the user sends a message
                            await dc.BeginDialogAsync(MainDialogId, null, cancellationToken);


                        }

                       //Else if the validation is not passed
                       else if (!turnContext.Responded && ! 
                       ((languageAccessor.property)turnContext.Activity.Text))
                          { await turnContext.SendActivityAsync("Thank you, see you next time"); }
                          }
            }

另一个选项是将访问者对象发送到您要使用它的对话框,并使用第一个Dialog的瀑布步骤,如果满足验证则继续对话,否则结束。

瀑布步骤应该如下所示:

     private async Task<DialogTurnResult> ValidationFirstStepAsync(
                WaterfallStepContext stepContext,
                CancellationToken cancellationToken = default(CancellationToken))
            {
                // Access the bot UserInfo accessor so it can be used to get state info.
                LanguageAccessor languageAccessor = await 
                _accessors.LanguageAccessor.GetAsync(stepContext.Context, null, 
                cancellationToken);

               if ((languageAccessor)stepContext.Context.Activity.Text)
               {             
                  await stepContext.Context.SendActivityAsync(
                            "Hi!");
                  return await stepContext.NextAsync();
               }
               else
               { 
                  await stepContext.Context.SendActivityAsync("Sorry, your language is not supported");
                  return await stepContext.EndDialogAsync(); }
               }
}
© www.soinside.com 2019 - 2024. All rights reserved.