Ruby
Slack

Slackでの集中力管理 – Slack API で複数のチャンネルを一斉にミュート・ミュート解除する ( Rubyの例 )

大問題

リアルタイムに見たいチャンネル


(この中間がないんだよ‥! 1日1回だけ見たいチャンネルとか)


ミュートするチャンネル

集中力管理は大問題。

大事なことなので二度書いた。さらっと流してほしくない。

同じ問題意識を持っている人は、ちゃんといるようだ。

これが「大きな問題」だと認識できないのは、そもそも僕らが、 膨大な集中力を奪われながら仕事をすることに、慣れきってしまっているから だと思う。

集中力の高まりには気づきやすいが、低下には気づきにくい。なぜならそもそも集中力が途切れているから。

解決 – Slack API を使えば良い

簡単に出来る!

ということを今日知った。

「えーぴーあい」という響きだけで怖がらないでほしい。手順に従えば初心者でもできるはず。

この記事の場合でいうと、Rubyの実行環境さえあれば。

Rubyスクリプトを使う例 ( slack-silencer )

  • 公開のRubyスクリプトがある。これを手元から叩くだけ。
    • APIにリクエストを送るだけの簡単な作り。1ファイル。
  • この slack-silencer を使う場合は「ミュートするチャンネル」の一覧は、全て slack-silencer で管理していく必要がある
    • 「Slackから直接チャンネルをミュートする」など、別の方法でのミュート・ミュート解除などはおこなわない ( slack-silencer をいちどでも使うと、全チャンネルのミュート状態が変更されてしまうため )

https://github.com/dopin/slack-silencer

スクリプトを取得

Githubレポジトリを clone するなりして、スクリプトを取ってくる。

git clone https://github.com/dopin/slack-silencer

Slack API の LegacyTokenを取得しておく

xoxp-*****-*****-*****-***** みたいなのを使う、

https://api.slack.com/custom-integrations/legacy-tokens

使用例

特定のチャンネルをミュートする

ミュートするチャンネルを引数に羅列する。

ここで指定していないチャンネルはすべてミュート解除されるので注意。

SLACK_API_TOKEN=xoxp-*****-***** slack-silencer/mute.rb inu saru kiji

特定チャンネルのミュートを解除する

  • 「ミュート解除」というアクションがあるわけではない。
  • 「ミュートするチャンネル」以外はすべて「ミュート解除」される。

なので inu だけミュート解除したい場合は、前記のリストから inu を外してスクリプトを叩く。 saru kiji は残しておく。

SLACK_API_TOKEN=xoxp-*****-***** slack-silencer/mute.rb saru kiji

全チャンネルでミュート解除

元のミュート状態には戻せないっぽいので注意。

SLACK_API_TOKEN=xoxp-*****-***** slack-silencer/mute.rb

ユースケース

  • ずっとミュートするチャンネル
  • 1日1回ミュート解除するチャンネル

をリスト管理して、特定の時間にスクリプトを叩いて、ミュート状態を切り替える。

Mac の cron などに登録しておけば、自動で叩いてくれて、いい感じになるはず。あとは時間設定をうまく調整すれば。

願い

Slackなどのチャットツールでは、ユーザーにおける「集中力の管理」が本当に大事だと思っている。
そもそもチャットツールというのは、人の集中力を妨害するもの、気を散らすものだという宿命を背負っているので。

なぜSlack公式で対応していないんだろう? と思うぐらい、本質的な問題だと思っている。

大事なことに集中する―気が散るものだらけの世界で生産性を最大化する科学的方法

image.png

ところで Ruby スクリプトの中身はこんな感じ

特別なことはやっていない。

普通に自分が使いやすいように改造もできそう。

#!/usr/bin/env ruby

require 'json'
require 'net/http'
require 'uri'

def get_channels(token:)
  url = URI.parse "https://slack.com/api/channels.list?token=#{token}"
  res = Net::HTTP.get url
  json = JSON.parse res
end

def mute_channels_ids(token:, channels: [])
  ch = get_channels token: token
  ch_ids = {}
  ch['channels'].select{ |c| c['is_channel'] && c['is_member'] && !c['is_archived'] }
                .map{ |c| ch_ids[c['name']] = c['id'] }
  ids = channels.map { |a| ch_ids[a] }
  ids
end

def request_mute(token:, channel_ids: nil)
  url = URI.parse "https://slack.com/api/users.prefs.set?token=#{token}"
  Net::HTTP.post_form url, { name: 'muted_channels', value: channel_ids.join(',') }
end


if __FILE__ == $0
  token = ENV['SLACK_API_TOKEN']
  abort 'Please set SLACK_API_TOKEN' if token.nil?
  if ARGV.nil?
    request_mute(token: token)
  else
    ids = mute_channels_ids token: token, channels: ARGV
    request_mute token: token, channel_ids: ids
  end
end

https://github.com/dopin/slack-silencer/commit/f0f4bda3a26a9cc0601e7c0069df0c2465e114ee#diff-57969c40c290f6267a2782157fcfd30a

参考