hubot-slackでbotの発言にも反応させる

robot.hearではなぜかbotの発言に反応しなかったのでどうすれば良いのか調べて対応した。

結論から書くと、

hubot_slack = require 'hubot-slack'

robot.hear regex, callback
robot.listeners.push new hubot_slack.SlackBotListener(robot, regex, callback)

と書けば通常の発言にもbotの発言にも反応するようにできた。

検索するとrobot.adapter.client?.on?とかcatchAllで無理やりやってそうなのばっか引っかかったけど、このやり方のほうがベターだと思う。


なぜ反応しないのか調べてみると、

hubot/robot.coffee at e6102b252ae6b261284ee71c395ebbe8e6b82b89 · github/hubot · GitHub

robot.hearではTextListenerをpushしていて、

hubot/listener.coffee at e6102b252ae6b261284ee71c395ebbe8e6b82b89 · github/hubot · GitHub

TextListenerではTextMessageのみを対象としているが、

hubot-slack/slack.coffee at 02201d1f99cf4e9136ab3721386cffd74b1a5036 · slackhq/hubot-slack · GitHub

botの発言はSlackBotMessageとして表現されており、

hubot-slack/message.coffee at 02201d1f99cf4e9136ab3721386cffd74b1a5036 · slackhq/hubot-slack · GitHub

SlackBotMessageはTextMessageを継承していない。SlackTextMessageはTextMessageを継承している。 従って、通常の発言には反応するものも、botの発言には反応していないようだった。

hubot-slack/listener.coffee at 02201d1f99cf4e9136ab3721386cffd74b1a5036 · slackhq/hubot-slack · GitHub

hubot-slackのコードを見るとSlackBotListenerを使えって書いてあるので前述のように使えば良さそう。