hubot-slackアダプタを今までv2.x系を使っていたんだけど、先月ぐらいに出てたv3系にアップデートした。
hubot-slack アダプタ v2 から v3 へ | 半月記が参考になった。

hubot-rss-readerがv3で動かない機能があったりしたのも直した。


結論

v3系は色々おかしい気がするのでまだv3にアップデートしないほうがいいと思う。
とにかく今v2のhubot integrationをslackで使ってるなら、設定画面から削除はしないほうがいい。消したらv3しか使えなくなる。

slackの設定

slackに新規にhubot integrationを追加するとv3じゃないと使えないようになっている。
今まで使っていたintegration消して、新しいintegration作ってつなげた。
新規作成時に、hubotにアカウントを設定されるようになった。

/invite @hubotとかして予めチャットメンバーに追加しておかなければならないが、そのかわりprivate roomに参加させられる。


アダプタv2とv3の違い

通信がHTTPからwebsocketになった。
hubot側がclientなので、外に丸見えのサーバーじゃなくてもbotが動かせるのは良いと思う。


エラーの内容が読めない

なんかエラー出力がtoString使ってるので[object Object]とか言われて何だかわからない。
[Sun Jan 11 2015 16:51:34 GMT+0900 (JST)] ERROR Received error [object Object]
これはプルリク送っておいた

mergeしてもらえればこういうエラーになるはず
[Sun Jan 11 2015 16:59:42 GMT+0900 (JST)] ERROR Received error {"code":-1,"msg":"slow down, too many messages..."}

マジで辛かったのは、これとbrainの爆発が同時に起こってて本当に何がなんだかわからなかった。

いきなりexitする

websocketが切断されたり、単にエラーが起こるだけでprocess.exitが呼ばれるのは豪快すぎる。

存在しないroomに送信しようとするとエラー起こってprocess.exitする。

そうじゃなくても連続でsendしたらclientが落ちてプロセスも落ちる。hubot-rss-readerはqueueを作って500msecごとにsendするようにした。

いきなりexitする件は#127で議論されていて、slackのサーバー側が返すエラーコードに応じて自動再接続するか処理を分岐したいらしい。


room名の頭に#が付けられない

robot.send {room: "#hoge"}, "こんにちは"
じゃだめで
robot.send {room: "news"}, "こんにちは"
とする必要がある。
自分が使ってたスクリプトも#つけてるのが結構あったので、ここでエラーになってた。#つけても大丈夫にするプルリク送っておいた


websocket接続するまでrobot.sendが無い


起動した時に通知を送るようにしている。
v2まではHTTPだったから、これでよかったけど
module.exports = (robot) ->

robot.send {room: "news"}, "Hubot、起動しました"

v3ではwebsocketが接続するまでrobot.send関数が存在しないので、sendが生えてくるまで待つようにした。
module.exports = (robot) ->

cid = setInterval ->
return if typeof robot?.send isnt 'function'
robot.send {room: "news"}, "Hubot、起動しました"
clearInterval cid
, 1000

hubotって、まずrobot.adapterがチャットサービスに接続してconnectedイベントをemitして、それを受けてからscripts以下のcoffeeやjsが読み込まれるはずなんだけど、slackアダプタはなぜかscripts読み込まれた後でもまだadapterが接続されてない。connectedとは一体何なのか。

これはhubot-slackの下で使われてるnode-slack-clientの問題だったので、プルリクしておいた