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

# 大問題

リアルタイムに見たいチャンネル
↓
↓
(この中間がないんだよ‥！ 1日1回だけ見たいチャンネルとか)
↓
↓
ミュートするチャンネル

# 集中力管理は大問題。

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

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

- [Slackにより断片化した集中タイムを取り戻すための、Bot開発 - Qiita](https://qiita.com/icoxfog417/items/0f9f1f6855ed17ceed4b)
- [集中できる時間にやるべきこと - Qiita](https://qiita.com/102rebecca/items/8970d6ea461f1d9cee1e)
  - `最近ではSlackなどのチャットを用いた開発現場が当たり前になっていると聞きます。私の会社でもチャットツールが導入されていますが、通知の内容を確認していると、意識がそちらに行ってしまい、集中が切れてしまいます。`
- [チャットやマルチタスクは生産性を40%下げるので依存しない方が良い：はたらきたい。：オルタナティブ・ブログ](http://blogs.itmedia.co.jp/sabe0524/2013/08/40-623f.html)

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

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

# 解決 – 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](https://qiita-image-store.s3.amazonaws.com/0/89618/e9852615-ced7-de61-c208-442d1516dfdd.png)


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

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

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

```rb
#!/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

# 参考

- [Slackに気を取られすぎる問題とその解決 - 無理しない感じ](https://hogesuke.hateblo.jp/entry/slack-problem)
  - 記事は 2015年のものだが、2018年11月現在でも動作した。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->