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" という入力を受信したらカウントをリセットします。返答メッセージの最初にカウント数を文章の頭につけています。
[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 を呼び出すように変更します。
[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 を実行します。
[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 に変更します。
[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 では [はい][いいえ] と表示されます。