Bot Builder SDK (Node.js) の botbuilder-core
パッケージには、ActivityHandler という、ボットのイベントハンドラ部分の実装を簡略化するためのライブラリが含まれています。
ボットの世界では、「Activity」はひとつのメッセージの処理単位のことを示しています。
この Activity をうまくハンドルするためのクラスだから ActivityHandler
という名前が付けられているんですね。
ここでは、独自のボットクラス (MyBot
) を、ActivityHandler
を利用せずに実装した場合と、利用して実装した場合で比較してみたいと思います。
ActivityHandler を使わない場合
例えば、下記のように BotFrameworkAdapter
で受信したイベントの処理を MyBot.onTurn()
に委譲するとします。
このイベントは、ユーザからメッセージを送られたときだけでなく、ユーザがチャットに参加したとき (ConversationUpdate
) などにも発生するため、MyBot.onTurn()
の実装の中でアクティビティタイプを見て分岐処理を行わなければなりません。
このあたりの分岐処理を簡潔にしてくれるのが ActivityHandler
クラスです。
ActivityHandler を使う場合
下記は、ActivityHandler
を利用したボット実装の例です。
onMessage()
メソッドを使って通常メッセージのハンドラを登録し、onConversationUpdate()
メソッドを使って会話更新時のハンドラを登録します。
Microsoft のサンプルコードでは、onMessage()
のパラメータとしてラムダ式をそのまま渡しているものが多いのですが、ネストが深くなってしまうので、上記のようにメソッド化しておいた方がよいでしょう。
あとは、BotFrameworkAdapter
でアダプタで受信したイベントを、ActivityHandler.run()
に渡してやれば、アクティビティタイプに従って適切なハンドラを呼び出してくれます。
ちなみに、ここでは ActivityHandler
クラスを継承する形でボットクラスを実装していますが、ActivityHandler
をそのままインスタンス化して使用することもできます。
全体のコード
ActivityHandler
を使ったボットプログラムの全体のコードを示します。
ローカルでのテスト用なので、Azure 上のボットサービスとして動作させるための設定などは省略しています。
関連記事