Slackにハッシュタグ的な「ゆるく情報をまとめる方法」のソースコードを公開しました

## まえがき
以前、会社のブログに [Slackにハッシュタグ的な「ゆるく情報をまとめる方法」が欲しかった話 \- コネヒト開発者ブログ](http://tech.connehito.com/entry/2016/05/17/170626)という話を書きました。  
これについて、ちょっとしたきっかけと、JS勉強したい欲が交差したので再発明をしつつ、ソフトウェア自体も手軽に使えるようにしてみました。

「botkit-hashtag」と名付けました。
https://github.com/o0h/botkit-hashtag

## TL;DR
* Botkitのmiddlewareとして、npmからインストールして利用可能です
* まだ **v0.0.x** としている通り、最低限動くかなぁ・・・程度です。動かないかもしれない
* sample-appとしてDeploy to Herokuボタンを付けているので、「bot作ったことない」「JS読めない」という人でも使えます。多分

## About
「Slackの中での情報流通について、いわゆるフローだけでなく、ストック型の情報発信・摂取もできたらどのような体験になるか」という個人的な興味と、「それを実験するなら、"よく見慣れていた形" で "よく慣れた使い方とのギャップを少なくして" 利用可能である必要がある」という課題がありました。  
そこから「ハッシュタグみたいな感じで、発言にシンボルをつけたら、後で遡れる」という発想に流れ着きます。

具体的には、 「 `#_tag` という形式で発言すると」「そのtagに対応する専用チャンネルが自動的に作成され、投稿内容が複写される」というものです。  
これで、Slackでの通常のコミュニケーション = フロー型のやりとりから大きな逸脱もなく、かつ特定トピックに関すアーカイブ性を高めるような機能が実現されると考えています。

背景については、冒頭に記載したブログ記事にて言及がありますので、そちらをご参照ください。


## Demo
### チャンネルの作成・発言の蓄積
* listenするbotのいるチャンネルで、 `#_tag 好きな内容` という形式で発言をしてください
    * 現状、先頭へのhashtagの付与を想定しています。
* hashtagのチャンネルに、発言がコピーされます
* また、hashtagのチャンネルがなければ自動で新規にチャンネルが作成されますが、チャンネル作成が生じた場合には当該発言に対してスレッド内部でreplyが来ます。

![Kapture 2018-10-15 at 0.08.07.gif](https://qiita-image-store.s3.amazonaws.com/0/941/b7af9896-af20-83bb-504b-b178cd7e09ec.gif)

### チャンネルの出力
* `@bot dump #_hashtag` という形式でdirect_mentionを送ることで、そのhashtagのチャンネルの内容をコンパクトに一括出力することができます
    * 出力されるのは、botによる発言に限定されます
* 末尾に `${num}h` と付与することで、今から何分まで遡って取得するかを指定できます


![Kapture 2018-10-15 at 0.14.25.gif](https://qiita-image-store.s3.amazonaws.com/0/941/2943244a-7725-e36b-975a-bf2b7847e377.gif)

### 行動記録・日報
* 「ログを取り出す」機能を応用した、「行動記録・取得」機能があります
* `#___ 何かしらの内容` という記法で、発言者専用の「ログチャンネル」に発言を残すことができます
    * 発話者に応じて、 `#_mylog_アカウント名` というチャンネルを作成しています
    * `_` は3つです
* `@bot dump #___` と打つことで、ログの出力ができます。
![Kapture 2018-10-15 at 1.46.21.gif](https://qiita-image-store.s3.amazonaws.com/0/941/7b43bdb3-704f-c3eb-fb3a-40ac13cbcee9.gif)

また、この機能はエン・ジャパンさんの記事でも紹介していただいたものになります。  
https://employment.en-japan.com/engineerhub/entry/2017/06/30/110000#bot18

基本的な使い方は以上となります。  
※ README等も、次第に整備していく予定です・・


## Requirements
* botのtokenが必要です
* **admin権限のある、user typeのtoken** が必要です
    * これは、チャンネルの自動的な作成を行うためです

tokenの取得については、 https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21 などに。  
この記事ではスコープ外とします。

## Install (via Deploy to Heroku)
※Herokuアカウントを予め作成しておいてください。
https://signup.heroku.com/

「Deploy to Heroku」という機能があり、これは「ブラウザ上で、ボタン1つで、新規アプリケーション作成& GitHub上からコードを持ってきてデプロイできる」というものです。  
botkit-hashtagのexample的に「実際にbotkitに組み込んでみた」までをやっているレポジトリであるbotkit-hashtag-sample-appも、Deploy to Herokuに対応を行っています。

[o0h/botkit\-hashtag\-sample\-app: botkit\-hashtag playground](https://github.com/o0h/botkit-hashtag-sample-app)

利用手順を、step-by-stepで紹介していきます。

1. botkit-hashtag-sample-appのレポジトリを開き、「Deploy to Heroku」ボタンをクリックしてください
    * ![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/30c36cb7-6019-e5ab-f931-7386eb036dad.png)
2. アプリメーション名、 admin/botそれぞれのトークン、 タイムゾーンを入力して `Deploy App` をクリックしてください
    * ![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/489e8959-80c1-df6c-bdfe-a3a857ffd504.png)  
3. しばらくお待ち下さい・・・
    * deploy完了しても自動的に画面が遷移したりはしませんので、あしからず・・


これでデプロイ完了です (!)。Deploy to Herokuすごいですね。。。  
利用したいチャンネルに、botをinviteして動作を確認してください。


## Install (as npm module)
npmにも登録をしてあります。

https://www.npmjs.com/package/botkit-hashtag

1. npm install 
    * `npm i botkit-hashtag`
2. 環境変数の登録
    * SLACK_TOKEN: bot用token
    * SLACK_ADMIN_TOKEN: user typeのtoken(channels:create scopeの権限を持つもの)
3. controllerへの登録(下記スニペット参考)
    * `sample-app` はHeroku動作用に少し特殊な事をしていますが、概ね参考になると思います。<br>https://github.com/o0h/botkit-hashtag-sample-app/blob/master/src/index.js


```js
const controller = botkit.slackbot({ debug: process.env.DEBUG })
require('botkit-hashtag')(controller)
```


----

まだまだ未整備な部分もありますが、githubで feedbackなどを頂けたら大変嬉しいです。コードやドキュメントの類も、ゆるゆると整えていくつもりです。

最後に、社内で実際に利用していて抱えている問題なども放出しておきます。


* チャンネルがカジュアルに増えすぎる。反乱する
    * 量によっては。定期的にarchive/deleteするなどの対策が必要
* 日報用に行動記録入れてたけど実はbotが落ちていた。気づかなかった・・
    * 社内版だと、記録成功時にbotからreactions.addを打つようにしているのですが、それはそれで activitが溢れるので悩ましいなと・・
* 行動記録は、時刻だけではなくそれぞれの所要時間を表示したい

他にも、もっと色々な使い方をすることで今までには無かった視点からのアイディアも出てくるのかもしれません。