在发送第一条消息之前访问 user/conversation 状态
Accessing user/conversation state before sending first message
在 Bot Framework V4 中,it is explained 可以通过在 OnTurnAsync
中创建对话上下文来访问用户状态或对话状态
var dc = await Dialogs.CreateContextAsync(turnContext);
或在对话上下文中使用访问器class
var state = await HogehogeSettingAccessor.GetAsync(stepContext.Context);
但是,如何在向对话框发送消息之前访问它们?
我目前正在开发 Directline API 并希望在发送第一条消息之前参考语言设置(例如,如果书面语言与设置不匹配,则忽略用户输入)。
private async Task OnMessageReceive(SocketMessage socketMessage)
{
if (IsLanguageMatch(socketMessage)){
await channel.SendMessageAsync(response);
}
}
如何实现?
您可以让 OnTurnAsync 仅在满足您的条件时启动 first/main 对话框。
当用户第一次向机器人发送消息时,不会有任何活动的对话。您可以利用该条件并在那里添加您的条件,只有在满足两个条件时才启动对话框:
// 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"); }
}
}
另一种选择是将访问器对象发送到要使用它的对话框,并使用第一个对话框的瀑布步骤在满足验证时继续对话,否则结束对话。
瀑布步骤应如下所示:
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(); }
}
}
在 Bot Framework V4 中,it is explained 可以通过在 OnTurnAsync
var dc = await Dialogs.CreateContextAsync(turnContext);
或在对话上下文中使用访问器class
var state = await HogehogeSettingAccessor.GetAsync(stepContext.Context);
但是,如何在向对话框发送消息之前访问它们?
我目前正在开发 Directline API 并希望在发送第一条消息之前参考语言设置(例如,如果书面语言与设置不匹配,则忽略用户输入)。
private async Task OnMessageReceive(SocketMessage socketMessage)
{
if (IsLanguageMatch(socketMessage)){
await channel.SendMessageAsync(response);
}
}
如何实现?
您可以让 OnTurnAsync 仅在满足您的条件时启动 first/main 对话框。 当用户第一次向机器人发送消息时,不会有任何活动的对话。您可以利用该条件并在那里添加您的条件,只有在满足两个条件时才启动对话框:
// 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"); }
}
}
另一种选择是将访问器对象发送到要使用它的对话框,并使用第一个对话框的瀑布步骤在满足验证时继续对话,否则结束对话。
瀑布步骤应如下所示:
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(); }
}
}