読者です 読者をやめる 読者になる 読者になる

MANA-DOT

PIXEL ART, PROGRAMING, ETC.

Hubotでbotの反応する部屋やユーザーに制限を設ける

CoffeeScript Hubot メモ

Hubotでbotの反応する部屋やユーザーに制限を設ける

少し前に slackでbotアカウントが作れるようになり、それまで IRC Gateway で動作させていたSlack上のbothubot-slack を利用したbotアカウントによるbotに乗り換えました。

ところでslack上でhubotを動かす場合、IRCと比べ次の2点が不便です。

  1. 必ずgeneralチャンネルに入ってしまうため、generalでの関係ない発言に反応してしまうおそれがある
  2. notice発言がないため、botbotに反応させない手段として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に書いてあります。)

今回は、

  1. 予め指定したadminユーザーならば無条件で反応
  2. 予め指定したOKなチャンネルでなければ反応しない
  3. ユーザー名にbotという文字列を含む場合は反応しない

というルールにしました(実際は配列の部分は node-config から取得するようにし、カスタマイズ可能にしてあります。)。

参考リンク