hubot をつかって idobata 用のBOTを作っていた。 heroku にホスティングして HTTPアクセスをすると idobata へメッセージが流れるようにしたい。
最終目的は CircleCI から WebHooks に登録しておいて、ビルドが終了したら通知したい、だったりするけど今回はそこはおいておく。
チャットへメッセージを送るには robot#send
を呼べばよくて、第1引数が envelope で 第2引数以降が文字列。
idobata-adapter の場合は第1引数の message.data.room_id に投稿する ROOM_ID が必要になる。
robot.send_room 'hogehoge'
みたいな感じに投稿できるようにメソッドを加えるならこんな感じになった。
ROOM_ID = process.env.HUBOT_IDOBATA_DEFAULT_ROOM_ID
module.exports = (robot) ->
robot.send_room = (msg) ->
envelope = { message: { data: {room_id: ROOM_ID } } }
@send envelope, msg
ROOM_ID を取得しないといけないので、登録したBOTに room_id
を返すような機能を追加しました。
robot.respond /ROOM_ID/i, (msg) ->
room_id = msg.message.data.room_id
robot.logger.debug room_id
msg.send room_id
ROOM_ID がわかったら 環境変数 HUBOT_IDOBATA_DEFAULT_ROOM_ID を設定しておく。
あとは robot.router.get
とか robot.router.post
をつかって処理を作成すればいよい。
robot.router.post "/hubot/ping", (req, res) ->
robot.send_room 'pong'
ローカルで実行する場合は 8080 ポート。 heroku へは push するだけで使える。
/hubot/ping にアクセスするとチャットに pong と書き込みがされます。
hubot 自体のソースコードはそんなに長くないので、いじりながらソースよめばなんとか使えるようになりそうでした。
補足
robot.respond とか、使った場合は コールバック引数 msg があるのでこいつの send
を利用するだけでチャットにかきこみができる。
msg は Response クラスのインスタンスでサーバからうけとった情報を message プロパティに保存されてて、この情報で envelope.message から取り出せる。
send: (strings...) ->
@robot.adapter.send @envelope, strings...
@robot.adapter.send へいくので、それぞれの adapter の send メソッドをみてみればいい。
前述しているけど、idobataの場合は
send: (envelope, strings...) ->
@_postMessage string, envelope.message.data.room_id for string in strings
となってて message.data.room_id が必要なことがわかる。
試したコードの全体をはっとく。 script ディレクトリに保存しておけばよいだけです。
ROOM_ID = process.env.HUBOT_IDOBATA_DEFAULT_ROOM
module.exports = (robot) ->
robot.send_room = (msg) ->
@send { message: { data: {room_id: ROOM_ID } } }, msg
robot.respond /ROOM_ID/i, (msg) ->
room_id = msg.message.data.room_id
robot.logger.debug room_id
msg.send room_id
robot.router.post "/hubot/circle", (req, res) ->
robot.send_room "finished build"
/hubot/circle
を CircleCI から叩かせるつもり。
req
に CircleCI からの情報がはいってくるので、ちょっと料理する予定。