Slackにスレッド機能を追加する

**追記**

スレッド機能、正式リリースされたようです。この記事の役目も終わり。めでたしめでたし。

http://japan.zdnet.com/article/35095198/

---

Slackにスレッド機能を追加してみました。
レポジトリはGithubに置いているので、cloneしてherokuの環境にpushするだけ(とちょっとした環境変数の設定)で動きます。
https://github.com/KeitaMoromizato/slack-thread

Slackにスレッド機能を追加するというよく分からない事を言ってるようですが、結構効果的なので試してみてはどうでしょうか。

## Slackの問題点
Slackを使っていると、よく次のような問題にぶち当たります。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/52054/08409d8d-8c57-3a76-674d-bf2c98056c7c.png)

確認したいこと・共有したいことがあったのに別のトピックによって埋もれてしまう。逆に、別のトピックが走っていたので埋もれてはいけないと思い投稿を躊躇ってしまう。本当によくあります。

解決方法としてはチャネルを細かくわけてコミュニケーションを分散させることも出来ます。が、これも情報が分散してしまったり、結局どのチャネルに投稿していいか分からなくなったり、１０数個のチャネルを見るのが面倒になったりと問題が山積み。

## そこでスレッド機能です
そんな問題を抱えている方のためにスレッド機能を作りました。実際は「チャネルをより細かくした」チャネルです。Slackのチャネルを「タスクが出来るたびに作っては消すもの」として捉えると、情報の管理・やりとりが非常にシンプルになります。

また、[この記事](http://qiita.com/KeitaMoromizato/items/8d56951f7e6fa57f9a93)で説明したように、Slackはストック型サービスと組み合わせるとより便利になります。今回は情報のストック先としてQiitaTeamを利用しています。

説明し辛いので動きを見て行きましょう。

## 機能説明
最初に環境設定を行う必要があるのですが、イメージを付けるために運用の流れから。__以降に示す環境設定を完了してから__動かしてください。

1. メインで使っているチャネルにbotを招待する
2. まとまって話したいトピックが出てきたら```thread```コマンドでスレッドを作成する
3. 会話が完了したら```exit```コマンドでスレッドをアーカイブ。会話の内容は自動的にQiitaTeamに投稿される


### 1.botを登録する
まずはメインで使っているチャネルにbotを招待しましょう。チャネル上で`invite`コマンドを実行します。

```
/invite thread-bot
```

![12.png](https://qiita-image-store.s3.amazonaws.com/0/52054/1dbd36ac-25fb-a430-bd4b-c2576c3b6adb.png)

### 2.スレッドを作る
スレッドを作るには`thread`コマンドを作ります。スレッド名は英数字しか使えないので注意。

```
> thread <thread_name>
```

![13.png](https://qiita-image-store.s3.amazonaws.com/0/52054/920026bb-4183-681f-3a46-72a2deac4440.png)


するとチャネルが作られます(プレフィクスとして現在のスレッド名がつきます)。今後はそのチャネルで会話を進めましょう。

![14.png](https://qiita-image-store.s3.amazonaws.com/0/52054/2b1f5820-fad0-775a-c896-db63cbc68f59.png)

### 3.スレッドをアーカイブする
スレッドでの会話が終了したらスレッドをアーカイブします。アーカイブしたスレッドの内容はQiita Teamに投稿されるので、タイトルとタグを付けます。これ、__メインのチャネルでは実行しないように注意してください__。作成されたスレッドで実行しましょう。間違ってアーカイブしてしまっても戻せますが。

```
> exit <title> [tag, ...]
``` 

![18.png](https://qiita-image-store.s3.amazonaws.com/0/52054/1c880504-680b-e993-a4cf-e8c71538d663.png)

アーカイブが完了すると元のスレッド(`thread`コマンドを実行したスレッド)にまとめへのリンクが投稿されます。

![16.png](https://qiita-image-store.s3.amazonaws.com/0/52054/21f234b8-efcc-a697-1d0c-a678978dee7c.png)

QiitaTeamにはこんな感じで投稿されます。共同編集になっているのでだれでも整形できます。

![19.png](https://qiita-image-store.s3.amazonaws.com/0/52054/8a7648d9-2a66-f272-6286-bdec732156e0.png)

## メリット
このシステムを使うと以下のメリットがあります

### 情報がごちゃごちゃにならない
１つのチャネルで複数の会話が同時進行で流れることがなくなるので、適切なコミュニケーションが取れます。

### 手軽
Slackのテキストエリアだけで操作が出来るので楽です。

### 情報をストックできる
Slackのようなフロー型サービスは情報の保存に向きません。話の内容が一段落したら、QiitaTeamにストックすることで情報の検索性が増します。

## 環境設定
では実際に自分のプロジェクトで使っているSlackに適用する方法を見て行きましょう。

### 1.heroku環境構築
[ここ](https://github.com/KeitaMoromizato/slack-thread)からレポジトリをcloneしてきて下さい。カスタマイズ不要で使えますが、独自の変更を加えたい方は`/scripts/slack.coffee`を変更してください。

```
$ heroku create <App Name>
$ git push heroku master
$ heroku ps:scale web=1
```

### 2.Slack->Hubot用tokenの取得
[ここ](http://qiita.com/KeitaMoromizato/items/0ee11d795d18a49538d8)を参考にHubot用tokenを取得します。

### 3.Hubot->Slack用tokenの取得
Slack APIを使用するためにまずはアプリケーションを登録します。以下にアクセスして[Create a new application]を選択。
https://api.slack.com/applications

必要な項目を入力します。URL/Redirect URIはheroku環境のURLで。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/52054/57ea112d-9db2-e7ea-fa11-0d0b18130709.png)

アプリの作成に完了したら(1)Client IDと(2)Client Secretをメモ。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/52054/670fa815-1d1b-06f1-4f9f-2e9301ad46b0.png)

認証コードを取得するために以下のURLにアクセスします。

```
https://slack.com/oauth/authorize?client_id=(1)xxxxxxxxxxxx&scope=read,post,identify

```

URLに(3)コードがついて返ってきます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/52054/5a1ae483-e7d4-a9a9-aee7-c0c5c0b19437.png)

tokenを取得するため以下のURLに(1)Client ID、(2)Client Secret、(3)コードを設定してアクセス

```
https://slack.com/api/oauth.access?client_id=(1)xxxxxx&client_secret=(2)xxxxxx&code=(3)xxxxx&pretty=1
```

アクセスTokenが取得できました！

![6.png](https://qiita-image-store.s3.amazonaws.com/0/52054/ce31bf7a-69b2-10e5-b8b7-d3085f79eee8.png)

### 4.QiitaTokenの取得
QiitaのTokenは設定画面から簡単に作成出来ます。以下にアクセスして「新しいトークンを発行する」を選択。
https://qiita.com/settings/applications

今回はQiitaTeamしか使わないので、write_qiita_teamのスコープのみ設定します。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/52054/2f2a01a6-0340-ed3b-7e55-73a7e103381c.png)

[発行する]を押してtokenを発行しましょう。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/52054/d4d5987c-657c-7afa-782f-51fae965949c.png)

### 5.token設定
必要なtokenがすべて揃ったのでheroku環境へ設定します。

```
$ heroku config:set HUBOT_SLACK_TOKEN=xxxxxxx
$ heroku config:set QIITA_TEAM_ID=xxxxxx(QiitaTeamのURLの最初)
$ heroku config:set QIITA_TEAM_TOKEN=xxxxxxxxxxx
$ heroku config:set SLACK_API_TOKEN=xxxxxxxxxxxx
$ heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s  | grep web_url | cut -d= -f2)

$ heroku restart
```

これで環境設定は完了です！たぶん動くはず...

## 最後に
Slackを使い始めた当初、会話がごちゃごちゃになってしまうのが嫌でタスクベースでスレッドを作っては捨てるチャットサービスを作ろうかと、ちょっとだけ考えてました。しかしSlackのIntegrationを使っているうちにドンドンはまってしまい、あれ？もしかしてSlackでもやりたかったことはできるんじゃないの？ということで作ってみました。

いやーSlack便利ですわー