Frameworkでの開発で基本となる「Dialog」についてレッツモリモリ行きましょう。あたりを参考にしてます。Bot開発を初めてする場合は、VSの開発テンプレートとEmulatorに関する事前準備をします。Environment検証した環境は以下です。Overview項番2で説明する機能に対して、項番4~項番6の異なる方法でBotを作ってみます。単純なEchoBot最初は、何か入力したらそれを返すBotを作ります。VSで、新しいプロジェクト作成→右上の検索でbotを入力してBotAppricationを選択します。プロジェクト名は、「DialogDemo」にしました。WebAPIのプロジェクトができました。(個人的な趣味で)お決まりのDialogsというフォルダを追加しました。その中にSimpleEchoDialogクラスを追加しました。SimpleEchoDIalogクラスは、おきまりのSerializableAttributeがついており(これ大事)、IDialogインターフェースを実装し、メソッドをさらりと書きます。次は、Botの呼び出し元となるWebAPIのコントローラーのコードを書いていきます。プロジェクトを作成すると、MessagesControllerができています。ここのコードを以下のようにざっくり変更しましょう。Botのメッセージのやりとりは、Activityクラスが中心となります。Activityクラスについては、本家ドキュメントに概要が書いてあります。メッセージを受けとると、28行目でDoSomethingAsyncメソッドを呼んで、Botの処理をするようにしています。Dialogを使うときの基本的な方法として、Conversation.SendAsyncメソッドで処理をします。詳しくは本家ドキュメントにて。先ほどSimpleEchoDIalogクラスはIDialogが実装されているので、インスタンス化したところでStartAsyncメソッドが実行されます。デバッグしてEmulatorから何か入力してみましょう。ほい、想像通りな動作です。同じ動きをするボットをいくつかのパターンで実装します。共通部品をつくっておきますこのあと、何かと同じコードを書くので、Utility的なクラスを書いておきます。カウンターをインクリメント/リセットするメソッド、Botが返答するメッセージのメソッドを書いています。その1機能は、前述したとおりです。ここでは、ソリューションエクスプローラーのDialogsフォルダの下にStateEchoDialogクラスを作り、以下コードを実装しました。StateEchoDialogクラスにはお決まりのSerializableAttributeがついています。カウンターは、StateEchoDialogクラスのprivateメンバー変数_countで保持しています。StartAsyncメソッドでカウンターを初期化(0にセット)し、MessageReceivedAsyncメソッドを実行します。MessageReceivedAsyncメソッドの中では、第2引数のargumentからクライアントのデータをとることができます。25行目のifで、クライアントが入力した文字列が「reset」かどうかを判定します。[機能1]、[機能2]は、35行目で実装しています。[機能3]のリセット処理は、27行目のPromptDialog.Confirmからです。「reset」入力後にリセットを本当にするかの確認は、PromptDialog.Confirmの機能で行います。はい/いいえの応答後、44行目のAfterResetAsyncメソッドでリセットするしないの処理を行います。MessagesControllerクラスのDoSomethingAsyncメソッドは、以下のように変更します。これで実行すると、無事に動きます。会話をしたカウントもちゃんと取れています。ところで余談ですが、resetと入力したときに今回書いたクラスに変わらないことありますか?コードを変更してデバッグしても、私の環境では古いコードを認識したままってのが頻繁におきます....。そんなときはEmulatorを再起動するか、古いコード(今回だとSimpleEchoDIalogクラス)を全部コメントアウトすると、ちゃんと動きます。同様の機能をCommandDialogを使って実装してみます。ソリューションエクスプローラーのDialogsフォルダの下にEchoCommandDialogクラスを追加し、以下のコードを書きます。ここからは、会話回数のカウンターをWebService側で保持するのではなく、会話のコンテキスト側で保持するようにします。Frameworkの内容を参考にしています。ここでは、UserDataのcountというKeyのValueに会話の回数を保存しました。DialogSampleUtilクラスのIncrementCountメソッド(DialogSampleUtil.csの7行目)とResetCountメソッド(DialogSampleUtil.csの15行目)がその処理になります。Frameworkに記載があるようにStateを保持するプロパティとそのSet/Getメソッドが用意されています。用途に応じて使い方を検討するところですね。[機能1][機能2]は、33行目からのOnDefaultで処理しています。35行目のDialogSampleUtil.IncrementCountメソッドでUserDataに現在のカウントを取得して1つプラスし、37行目でメッセージを返答しています。[機能3]は、15~32行目の処理です。MessagesControllerクラスのDoSomethingAsyncメソッドは、以下のように変更します。これでデバッグ実行しても同じように動きます。resetした時にクラス名が更新されていることは注意してください。次は、本命(?)のChainを使ってみます。本家のドキュメントでは以下を参考にしました。ChainsソリューションエクスプローラーのDialogsフォルダの下にEchoChainDialogクラスを追加し、以下のコードを書きます。Chainは、Switchで入力されたメッセージに応じて処理を分岐させています。[機能1][機能2]のエコーを返す処理は、36行目のDefaultCaseの辺りです。[機能3]のリセット処理は、12行目。主要な処理は上記の例同様DialogSampleUtilクラスの処理を使っています。34行目は、「help」と入力されたときの処理を冗談半分に作りました。MessagesControllerクラスのDoSomethingAsyncメソッドは、以下のように変更します。デバッグで実装するとちゃんとうごきますね。今日はここまでですね。呼ぶ際の実装メモです。保存する前回、ステート管理の概要を整理したので今回は実装編です。当ブログに掲載されている情報は、必ずしも正確性や安全性を保証するものではありません。掲載された内容によって生じた損害等の一切の責任を負いかねます。当ブログに掲載されている情報は個人の見解であり、所属する団体・組織は一切関係ありません。スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。