少し前に slackでbotアカウントが作れるようになり、それまで IRC Gateway で動作させていたSlack上のbotを hubot-slack を利用したbotアカウントによるbotに乗り換えました。
ところでslack上でhubotを動かす場合、IRCと比べ次の2点が不便です。
- 必ずgeneralチャンネルに入ってしまうため、generalでの関係ない発言に反応してしまうおそれがある
- notice発言がないため、botをbotに反応させない手段としてnotice発言を利用できない
そこで、特定の条件でbotの発言を抑制するスクリプトを書きました。
コード
_ = require 'lodash' module.exports = (robot) -> robot.hear /.*/, (msg) -> if _.contains ['manaten', 'some_admin_user'], msg.envelope.user.name return unless _.contains ['ok_room_1', 'ok_room_2'], msg.envelope.room msg.finish() if /bot/.test msg.envelope.user.name msg.finish()
こんなかんじのスクリプトを 1_room_limit.coffee
のような名前でscripts下に配置します。
解説
スクリプトはアルファベット順に読まれるので(参照: hubot/scripting.md)、他のどのスクリプトよりも先に読まれる名前をつけます。
これで他のスクリプトより先にこのスクリプトが呼ばれることになるため、
.*
ですべての発言をhearし、条件に当てはまる場合は msg.finish()
を呼び以後のlistenerが反応しないようにします。
(msg.finish()
についてはドキュメントが殆ど無いですが、CHANGELOGに書いてあります。)
今回は、
- 予め指定したadminユーザーならば無条件で反応
- 予め指定したOKなチャンネルでなければ反応しない
- ユーザー名にbotという文字列を含む場合は反応しない
というルールにしました(実際は配列の部分は node-config から取得するようにし、カスタマイズ可能にしてあります。)。