Web+DB PRESSとか読んでてhubotを使ったChatOps的なところが非常に興味深かったので
chatterで出来ないかなーと思ってadapterを探したものの
用途にマッチしたものが無かったので自分で作ってみました。(npmデビュー作w)
↓↓↓
hubotとは
hubotとはgithub社が開発したボットのフレームワークで外部サービス/インターフェースと連携可能なadapterと呼ばれるプラガブルなモジュールと
ボットの動作を規定するスクリプトによって様々なボットを簡単に開発することができます。
hubotに関してはこちらが詳しいので、ご参考ください↓
第1回 Hubotとは何か:GitHub社謹製! bot開発・実行フレームワーク「Hubot」|gihyo.jp … 技術評論社
チャットボットでチーム開発効率化入門(1):GitHub製フレームワークHubotの概要とインストール、チャットアプリと連携する基本的な使い方 (1⁄2) - @IT
で、今回はこのhubotのadapterを作り方とhubot-chatterの使い方を簡単に紹介します。
作り方の参考サイトはこちらが詳しいです↓
adapterの作成方法
hubotのadapterの作成方法ですが上記リンクの通り現時点(2014/10/26)では作成方法のドキュメント等がありません。
READMEの記載通り、ソースコードを読んで作っていく必要があります。
とはいえ、作り方は超簡単でsrcディレクトリ内にcoffeescriptでアダプタを書いてあげればOKです。
ざっくり書くとこんな感じ↓
{Robot, Adapter, TextMessage, Response} = require 'hubot'
# アダプターを継承
class HogeAdapter extends Adapter
run: ->
#ここで外部からデータを受け取ってscriptにデータを渡す。
send: (envelope, strings...) =>
#scriptからのレスポンスはここで受け取って、処理を行う。
reply: (envelope, strings...) ->
exports.use = (robot) ->
new HogeAdapter robot
hubotを起動すると指定したadapterのrunメソッドが実行されるので、
ここで外部からのデータを受け取ってscriptにデータを渡す処理を行います。
具体的には以下のようにMessage型のインスタンスをAdapterのreceiveメソッドに渡せばOK。
message = new TextMessage userId, messageBody, messageId
@receive message
adapterのreceiveメソッドに渡されるとscriptで書いたrobot.hearやrobot.respondが処理を受け取って
正規表現にマッチしたら指定したコールバック関数を実行する、という流れになります。
sendとreplyはhubotの実行スクリプトからのレスポンスを受け取ったときの処理になります。
hubot-chatterではここでFeedItemやFeedCommentを投稿しています。
ちなみにテストを書くときはhubotのbrain.coffeeでsetIntervalのループが動いている為に
setIntervalを止めるまではテストが終了しない状況になるので
適宜、setIntervalのintervalObjectを明示的に止める必要があります。
clearInterval robot.brain.saveInterval
hubotのテストコードの書き方はこちらを参考にしました→idobata/hubot-idobata
hubot-chatter
インストールはhubotのルートディレクトリでnpm installすればOKnpm install hubot-chatter
SOQLポーリングの場合は以下のように環境変数をセットして、アダプターを指定してhubotを起動するだけ。
export HUBOT_SFDC_USERNAME=test@example.com
export HUBOT_SFDC_PASSWORD=hogefuga
bin/hubot -a chatter
実際の動作は…
hubot pingと打つと
hubot君がPONGと返してくれます。
あと、FeedItemに対する投稿に対してデフォルトではFeedCommentで返すようにしています。
ユーザのフィードではなくてグループやレコードフィードに対する投稿にも対応してます。
hubot-chatterではSOQLのポーリングかStreamingAPIのどちらかを選択できます。
ChatterのオブジェクトをStreamingAPIで直接扱えないのでStreamingAPIを使う場合は
別途トリガを書く必要がありますが、SOQLのポーリングだとトリガやPushTopicの設定が不要なので
手軽にhubotでchatterを利用することが出来ます。
その半面、ポーリングする度にAPI消費するのでAPIコール数の上限を考慮する必要があります。
また、内部で発行しているSOQLの仕様上、NTPで実行サーバの時刻を正確にしておかないと
SOQLでうまく取得できないとかそういう問題もあったり…。
ということで、ガッツリ使いたい場合は即時応答でAPIコール数の消費が少ない
StreamingAPIのパターンをオススメします。
バグや使い方の質問がありましたらissueとかでご連絡いただけると泣いて喜びます!
npm公開の方法
今回初のnpmパッケージ公開だったので、備忘も兼ねて書いちゃいます。手順はこんな感じ↓
package.jsonにパッケージ情報を記載
npm publishでパッケージ公開
npm publishで初回はユーザ名/パスワードを聞かれて、登録していない場合はプロンプトで登録できちゃいます。
クレデンシャルはディスクにキャッシュされるっぽいので
二回目以降はpackage.jsonのversionを上げてpublishすればOKです。
あとは毎日npmのサイトでどれくらいダウンロードされているか見て一喜一憂するだけ!