Edited at

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


参考