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として表現されており、
SlackBotMessageはTextMessageを継承していない。SlackTextMessageはTextMessageを継承している。 従って、通常の発言には反応するものも、botの発言には反応していないようだった。
hubot-slackのコードを見るとSlackBotListenerを使えって書いてあるので前述のように使えば良さそう。