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 では [はい][いいえ] と表示されます。


