SlackでHubotへの問いかけを特定のprivate channelに限定させる方法


概要

全社でslackの1Team利用をすることになったりして、誰でも自由に問いかけたらまずいコマンドがhubotにある場合、自チームのメンバーが入っているprivate channelに当該hubotのコマンド受け付けを限定させる方法の簡易版です。

この記事でできること

  • public/privateを問わずにチャンネルに対してhubotの問いかけ許可を与えられる
  • hubotに対して特定ユーザがダイレクトメッセージで問いかけができる(その他のユーザはできない)
  • 問いかけを全チャンネル許可へ切り替えられる

この記事でできないこと

  • チャンネル内で特定のユーザだけがhubotへ問いかけれる
  • 限定させるチャンネルをチャンネル名で指定すること
  • hubotのデフォルトコマンドへの問いかけ制限

手順

以下の修正をhubotに対して行います。

チャンネルのroom値を取得

プライベートチャンネルは普通にやるとチャンネル名が取得できない(undefinded)ので、
まずはチャンネルのroom値(おそらく9桁大文字英数字)を取得する以下のようなコマンドを、hubotに追加します。

room.coffee
# Description:
#   チャンネルのroomの値を取得する。取得した値はアクセス制御に利用する。
#
# Commands:
#   hubot room - チャンネルのroomの値を取得

module.exports = (robot) ->
  robot.respond /room/, (msg) ->
      msg.send "#{msg.envelope.room}"

このコマンドをhubotを利用したいチャンネルで実行すると、そのチャンネルのroom値が取得できます。
ダイレクトメッセージでhubotに対してこのコマンドを実行した場合もroom値が取得できるため、
この値を使って開発ユーザのダイレクトメッセージは許可させることもできます。

コマンドの実行制限処理

次に実行に対して制限をかけたいhubotコマンドに対して、以下の記述を追加します。

コマンド名.coffee
permitted_rooms = process.env.HUBOT_PERMITTED?.split(',') || []

permitted = (room) ->
  room in permitted_rooms || 'ALL' in permitted_rooms

module.exports = (robot) ->
  robot.respond /コマンド名 (.*)/, (msg) ->
    # 許可しないチャンネルでは実行禁止
    unless permitted msg.envelope.room
      return

    # ここからこのコマンドでやりたい処理を書く
    # ...

Hubotの起動コマンド

HUBOT_PERMITTEDの変数に許可するチャンネルのroom値をカンマ連結で設定します。
制限をかけなくても良くなった場合はALLを指定して起動してください。

起動コマンド
# 問いかけ可能なチャンネル(ユーザ)を限定させる場合
HUBOT_PERMITTED=ルームID1,ルームID2,Hubotに直接DMしたときの値 HUBOT_SLACK_TOKEN=Slackのトークン ./bin/hubot --adapter slack

# 全てのチャンネルで問いかけを許可する場合
HUBOT_PERMITTED=ALL HUBOT_SLACK_TOKEN=Slackのトークン ./bin/hubot --adapter slack

※注意:HUBOT_PERMITTEDを指定してhubotを起動する前に、一度roomコマンドが有効な状態でhubotを起動させ、room値を取得する必要があります。

簡易版を脱するには?

groups.listの中にはプライベートチャンネルのチャンネル名も全て入っているので、この情報を使ってチャンネル名とIDの一覧を作れば、チャンネル名指定からIDを逆引きして、制御することが可能だと思います。
頑張りたい人は是非こちらで頑張ってみてください!(私はいいです)

参考