ごった煮

色々な事を書いてます

Botからのメッセージをよりリッチにする その1

Bot BuilderにActionという概念が実装されたのでそれについてまとめます。

初めに

Bot Builderの新しい機能としてActionsという概念が追加されました。(ver 1.1.0)

このActionを使えば Botとの会話をよりリッチなものに進化することができます。

今回はまず、公式のサンプルを触ってみます。(テキスト周りはわかりやすいように日本語のものに差し替えています)

サンプルの内容

今回のサンプルは、FormFlowのような設問形式の会話をこのActionsを使って実現するものです。

実装してみる

設問を表示する

まずBotからのメッセージを設問形式にしてみます。

今回は、設問を生成するのに使用するモデルと設問を実際に返すコントローラの2つになります。

モデルは以下のようなシンプルなモデルです。

    public class flavor
    {
        public string Flavor { get; set; }
        public string Message { get; set; }
        public flavor(string flavor, string message)
        {
            Flavor = flavor;
            Message = message;
        }
    }

アイスクリームのフレーバーと略称を保持するモデルです。

次にコントローラです。

        public async Task Post([FromBody]Message message)
        {
            List choices = new List();
            choices.Add(new flavor("チョコレート", "チョコ"));
            choices.Add(new flavor("ヴァニラアイス", "ヴァニラ"));
            choices.Add(new flavor("チョコミント", "ミント"));

            var replayMessage = message.CreateReplyMessage();
            replayMessage.Language = "ja-JP";

            if(message.Type == "Message")
            {
                replayMessage.Text = "好きなアイスの種類を選んでください";
                var messageOptions = new Attachment();

                messageOptions.Actions = new List();
                foreach (var choice in choices)
                {
                    messageOptions.Actions.Add(new Microsoft.Bot.Connector.Action(title: choice.Flavor, message: choice.Message));
                }

                replayMessage.Attachments = new List();
                replayMessage.Attachments.Add(messageOptions);
                return replayMessage;
            }

            return message;
        }

これを実行すると以下の図のようにとりあえず設問を返すBotになります。

image

これだとまだ選択肢を選択できないので次に選択肢を選ぶ機能を実装します。

選択肢を選ぶ

ここでは、選択肢を選ぶ機能を実装します。

全部実装すると以下のような感じになります。

public async Task Post([FromBody]Message message)
        {
            List choices = new List();
            choices.Add(new flavor("チョコレート", "チョコ"));
            choices.Add(new flavor("ヴァニラアイス", "ヴァニラ"));
            choices.Add(new flavor("チョコミント", "ミント"));

            var replayMessage = message.CreateReplyMessage();
            replayMessage.Language = "ja-JP";

            if(message.Type == "Message")
            {
                flavor icResult = choices.
                    Where(p => p.Message == message.Text.Trim().ToUpper()).
                    Union(choices.Where(q => q.Flavor.ToUpper() == message.Text.ToUpper())).FirstOrDefault();

                if(icResult != null)
                {
                    replayMessage.Text = $"I Love {icResult.Flavor} too!";
                }
                else
                {
                    replayMessage.Text = "好きなアイスの種類を選んでください";
                    var messageOptions = new Attachment();


                    messageOptions.Actions = new List();
                    foreach (var choice in choices)
                    {
                        messageOptions.Actions.Add(new Microsoft.Bot.Connector.Action(title: choice.Flavor, message: choice.Message));
                    }

                    replayMessage.Attachments = new List();
                    replayMessage.Attachments.Add(messageOptions);
                }

                return replayMessage;
            }

            return message;
        }

このコードでは、LINQで設問のタイトルにあたるものかメッセージにあたるものが送られてきた場合にI love ほげ too !と返すサンプルです。

実行して選択すると以下のような感じです。

image

チョコというメッセージとヴァニラアイスというメッセージを適切にハンドリングできています。

次にこれが該当しない文字列の場合は、再度設問を表示します。

image

hogehogeの場合は、これらのテキストに該当しないため設問を再度返しています。

まとめ

このようにActionオブジェクトを使うことによってメッセージの幅を広げることができるというざっくりした概要を書きました。

今回はサンプルを使用しましたが、次回は次はもう少し踏み込んだ内容を書いていこうかと思います。