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の問題だったので、
プルリクしておいた。