4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-08-04

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 では [はい][いいえ] と表示されます。
メッセージ数のカウント(Yes/No 確認ダイアログ(日本語))

Locale:en-us など英語に設定すると、確認ダイアログは [Yes][No] になります。
メッセージ数のカウント(Yes/No 確認ダイアログ(英語))

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?