slackでちょっとしたbotを動かしたい

仕事中に会議とかの司会がよくわからないタイミングで回ってくるのでbotに聞いたら返してくれるのを作りたいというのがやろっかなの大元。

とりあえず、動くまでになったけど色々と大変だったので備忘録として。

構成はSlack+Hubot。
`slack bot`で検索したらHubotが一番多かったからこれを利用。

#前提

* npm 使える（install済み）
* slack使う(slackよくわかんなくても大丈夫)
* herokuアカウント持ち
* herokuについてのある程度の理解(herokuの説明はしない)



#Slackで個人用のチームを作る

ちょっと前まではできなかったみたいだけど今は複数のチームを単一のslack内で管理できるのでみんなガンガン個人用とか立てるといいよ。
[Slack: Where work happens](https://slack.com/)
Create new teamする。

# Hubotの準備というか作成？

## 準備

楽そうなのでyoとgenerator-hubotをインストール

```
$ npm install -g yo generator-hubot
```

##作成

適当な場所にボットの名前でフォルダを作成（別にボットの名前じゃなくてもいいし名前はなんでもいい）

```
$ mkdir bot-name
$ cd bot-name
$ yo hubot
```

しばらくすると色々聞かれます。
Owner/Bot name/Descriptionは適当になんでもいいっす。
Bot adapterというのがどの環境というかアプリでボット使うか見たいなやつ。
defaultがcampfireになっていますが、今回はslackが対象なのでslackと入力。
これの説明がないHOWTO解説が多くて結局英語読んだよ！

```
? Owner tkatsura
? Bot name bot-name
? Description A simple helpful robot for your Company
? Bot adapter slack
```

終わったら、その場で`bin/hubot`すると対話型のコンソールに。
なんかそのままだと普通に改行されていないのでなんかやるたびにエンター押すといいよ。
最初入力見えねーし。

```
$ bin/hubot
bot-name> [Thu Feb 02 2017 07:00:02 GMT+0900 (JST)] WARNING Loading scripts from hubot-scripts.json is deprecated and will be removed in 3.0 (https://github.com/github/hubot-scripts/issues/1113) in favor of packages for each script.

Your hubot-scripts.json is empty, so you just need to remove it.
[Thu Feb 02 2017 07:00:02 GMT+0900 (JST)] ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s  | grep web-url | cut -d= -f2)`
[Thu Feb 02 2017 07:00:02 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379

bot-name> bot-name ping
bot-name> PONG

bot-name> exit
```

諸々エラーが出てますが、適切に対応してください。
`ERROR hubot-heroku-alive included`はherokuでの利用目的用のエラーなのでここではスルーするといいよ。

```
bot-name $ rm hubot-scripts.json 
bot-name $ git init
bot-name $ git add .
bot-name $ git commit -m 'first commit'
[master (root-commit) 299e0b0] first commit
 9 files changed, 388 insertions(+)
 create mode 100644 .editorconfig
 create mode 100644 .gitignore
 create mode 100644 Procfile
 create mode 100644 README.md
 create mode 100755 bin/hubot
 create mode 100644 bin/hubot.cmd
 create mode 100644 external-scripts.json
 create mode 100644 package.json
 create mode 100644 scripts/example.coffee
```

##herokuに展開

ボット名でherokuAppを作成(ここも別になんでもいいっす)

```
bot-name $ heroku create bot-name
Creating ⬢ bot-name... done
https://bot-name.herokuapp.com/ | https://git.heroku.com/bot-name.git
bot-name $ git push heroku master
...
Counting objects: 13, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (13/13), 5.92 KiB | 0 bytes/s, done.
Total 13 (delta 0), reused 0 (delta 0)
...
bot-name $ heroku open
```

画面に`Cannot GET /`が表示されていればここまでの工程は成功。

#slackのチームとの関連づけ

[App Directory | Slack](https://slack.com/apps)でHubotと検索すると出てくるやつに色々登録。
さっきチームを作った場合はすでにログインしてると思うのでそのまま`Add Configuration`するとBOTの名前なんにするんって聞かれる。
これは`yo hubot`で言うところのbot nameにするのがいいと思う。
![スクリーンショット 2017-02-02 7.32.20.png](https://qiita-image-store.s3.amazonaws.com/0/97116/a461a49f-2177-1229-9366-c5d247d26f57.png)
混乱しなくて済むし。

するとHubotに必要なAPIKEYとか色々出てくる。

#herokuへ諸々を設定　

APIKEYとか設定。
あとHUBOTはRedisを使うのでadd-on設定するの忘れてた。

```
$ heroku config:set HUBOT_SLACK_TOKEN=************************************
$ heroku addons:create redistogo:nano
```

色々調べたところこれだけでもいいっぽい？
他のだとTEAMとかBOTNAMEとか設定してたりするけど必要ないらしい。
ちゃんと英語読めばわかるかも。

そのほかにfreeでheroku使う場合は規定の時間の間だけ起動し続けられるように`HUBOT_HEROKU_KEEPALIVE_URL`を設定するといいらしい。
オプションとして`HUBOT_HEROKU_WAKEUP_TIME`(起きる時間)とか`HUBOT_HEROKU_SLEEP_TIME`(寝る時間)とか`HUBOT_HEROKU_KEEPALIVE_INTERVAL`(ノックするインターバルタイム:default:5分)とかを設定できるそうです。

そこらへんはご自由にどうぞ。

ここまですることですでにslackのチームにbotがユーザーとして招待されているはず。
適当なチャンネルに招待して、`bot-name ping`で`PONG`と返ってくれば成功。


#自分用に改変

ここまでが全部準備でここからが本番。
と言ってもあとは自由にして欲しいんだけど、入口だけ。

自分でボットの動きを作りたい場合は`scripts`フォルダ内に名前はなんでもいんだけど例えば`test.coffee`を作る。
ほかに特に設定は必要なくて勝手に読み込んでくれるのでスクリプトの内容だけを気にすればいい。
どう言う風に書いたらいいかは`scripts`フォルダ内にすでに`sample.coffee`があるのでそれのコメントアウトを外して見てどれがどう言う風に動いているかとか確認しながら改変していくといいかも。

```coffeescript:lunch.coffee
# Description:
#   今日のランチ何にするかランダムで出力してくれる

module.exports = (robot) ->
  lunch = ['らーめん','イタリアン','中華','カレー','うどん・そば','肉']
  robot.hear /lunch/i, (res) ->
    res.send res.random lunch
```

ちなみにローカルで一回確認できるのでエラーなどの確認はそのままローカル環境で確認するといいかも。
問題があればhubotと対話する前にエラーが出て進めない。

```
$ bin/hubot
bot-name> lunch
bot-name> ラーメン

bot-name> exit
```

OKの場合はこのままheroku環境にdeployすることでslackでも確認できる。

```
$ git add .
$ git commit -m 'Add lunch rand'
$ git push heroku master
```

これでおk。あとは好きにボットを調整してみるといい。
サンプルに結構色々のってるのでそれをちょっと改変するだけでもそれなりのものができると思う。