hubot-slackアダプタ v3の中で使われているnode-slack-clientを見ていたら、slackで発言に星を付けた時に通知が来ていたのでそれを別のroomに流すようにしてみた。

slackには自分のstarを見る画面はあっても他人のstarを見れる画面がない。API使ってstars.listが取れるけど、starまとめ的なページを作るにはユーザの数だけ定期的にクロールしなきゃだめなのかー・・・と思ってたけど、hubotにサーバープッシュされて来ていた。



starsというroomをあらかじめ作って、hubotを/inviteしておく必要ある
https://gist.github.com/shokai/e52dd7fdd5d2592878b0

# Description:
# notify "star_added" event for slack.com
#
# Author:
# @shokai

debug = require('debug')('hubot:slack-star')

module.exports = (robot) ->

robot.adapter.client?.on? 'raw_message', (msg) ->
return unless msg.type is 'star_added'
debug msg
return unless msg.item.message.permalink
user = robot.adapter.client.getUserByID msg.user
text = ":star: @#{user.name} added star #{msg.item.message.permalink}"
debug text
robot.send {room: 'stars'}, text
raw_messageイベントは、node-slack-clientがサーバーからwebsocketでJSONを受信してparseしてすぐemitされる。
これは通常のSlackのAPI(HTTPで使うやつ)ではなくhubot用のwebsocketので、一方通行に受信してるだけなので、こっちからslackに送信できるのはbotの発言命令だけのようだ。hubotにstarつけさせたり、発言を削除したりはできない。

getUserByIDはnode-slack-client内部でcacheされてるので呼び出しまくっても問題ない。

もしstar通知が多くて邪魔になってきたら、3人以上starした発言、とかで通知するroom作ったりしてみようかな