Edited at

Microsoft Bot Framework v3.0 からはじめるBOT開発: Yes/No ダイアログを表示する - Dialog(2)

More than 3 years have passed since last update.

Microsoft Bot Framework (V3.0) のテンプレートをそのまま動かしてみる、その次にコミュニケーションのプロセスを扱う Dialog で基本的なメッセージの送受信をコーディングしました。今回はそれを応用して、メッセージ数をカウントするプロセスを作成します。

基本的な Dialog を使ったメッセージ送受信に会話数のカウントを追加します。「X番目にYという質問をする/確認する」というフローを入れたいなど、現在何メッセージ目なのかカウントしたい場合に使えます。またメッセージダイアログ(Yes/No)を表示し、入力された操作の確認を行います。


Microsoft Bot Framework v3.0 からはじめるBOT開発: 最初の一歩編

Microsoft Bot Framework v3.0 からはじめるBOT開発: コミュニケーションの基本クラス Dialog(1)



Dialog を使ったメッセージ送受信(下準備)

開発環境の準備は Bot Framework を使うための開発環境 から。

Visual Studio テンプレートから新規 BOT アプリケーションの作成~下準備 で Bot Framework テンプレートを使う準備を行い、Dialog を使った単純なメッセージの受信、返信 の通り、MessageController.cs を編集します。


メッセージ数をカウントする (その1)


メッセージ数のカウント

返答を作成する EcoDialog クラスの代わりに、下記のように EchoCountDialog というクラスを追加します。count でメッセージ数をカウントしておき、返答文を作るときにカウントを増やします(this.count++)。"reset" という入力を受信したらカウントをリセットします。返答メッセージの最初にカウント数を文章の頭につけています。


MessagesController.cs

[Serializable]

public class EchoCountDialog : IDialog<object>
{
protected int count = 1;
public async Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
}
public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var message = await argument;
if (message.Text == "reset")
{
await context.PostAsync($"会話数をリセットします");
this.count = 1;
}
else
{
await context.PostAsync(string.Format("{0}:{1}って言ったね。", this.count++, message.Text));
}
context.Wait(MessageReceivedAsync);
}
}

メッセージの送受信を行う Post でも EchoCountDialog を呼び出すように変更します。


MessageController.cs

[ResponseType(typeof(void))]

public virtual async Task<HttpResponseMessage> Post ([FromBody] Activity activity)
{
if (activity != null)
{
if (activity.GetActivityType()==ActivityTypes.Message)
{
//await Conversation.SendAsync(activity, () => new EchoDialog());
await Conversation.SendAsync(activity, () => new EchoCountDialog());
}
else
{
HandleSystemMessage(activity);
}
}
return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
}


Emulatorで動作確認(その1)

Botアプリケーションのローカル実行とエミュレーターによるアクセス を参照して、Visual Studio から F5 でビルド&デバック実行を開始し、Bot Framework Channel Emulator からメッセージを送信します。

メッセージ数が返答の頭に表示され、"reset" と送信するとカウントがリセットされるのを確認してください。


メッセージ数をカウントする (その2): リセット時に確認メッセージを表示する

その1 では "reset" を受信すると即リセットを行いますが、その2では確認メッセージを表示して可否を確認します。

Microsoft.Bot.Builder.Dialogs.PromptDialog で Yes/No ダイアログを表示し、Yes または No の選択をもとに ResetCountAsync を実行します。


MessagesController.cs

[Serializable]

public class EchoCountDialog2 : IDialog<object>
{
protected int count = 1;
public async Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
}
public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var message = await argument;
if (message.Text == "reset")
{
PromptDialog.Confirm(context, ResetCountAsync, "リセットしますか?");
}
else
{
await context.PostAsync(string.Format("{0}:{1}って言ったね。", this.count++, message.Text));
context.Wait(MessageReceivedAsync);
}
}
public async Task ResetCountAsync(IDialogContext context, IAwaitable<bool> argument)
{
var confirm = await argument;
if (confirm)
{
this.count = 1;
await context.PostAsync("会話数をリセットしました。");
}
else
{
await context.PostAsync("会話数リセットを中止しました。");
}
context.Wait(MessageReceivedAsync);
}
}

Post からの呼び出しも EchoCountDialog2 に変更します。


MessageController.cs

[ResponseType(typeof(void))]

public virtual async Task<HttpResponseMessage> Post ([FromBody] Activity activity)
{
if (activity != null)
{
if (activity.GetActivityType()==ActivityTypes.Message)
{
//await Conversation.SendAsync(activity, () => new EchoDialog());
//await Conversation.SendAsync(activity, () => new EchoCountDialog());
await Conversation.SendAsync(activity, () => new EchoCountDialog2());
}
else
{
HandleSystemMessage(activity);
}
}
return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
}


Emulatorで動作確認(その2)

今回は "Reset" と送信すると、確認ダイアログが表示されます。Emulator の右上にある Locale はデフォルトで OS の言語に設定されている(はず)、Locale:ja-jp では [はい][いいえ] と表示されます。

Locale:en-us など英語に設定すると、確認ダイアログは [Yes][No] になります。