slackにHubotを導入(Heroku経由)

## はじめに

当社にもslackの波が今日きたっぽいので、さっそくGithubでみかけたHubot先輩を導入しようじゃないかと業務の隙を狙い撃ちして導入してみました。今回手順の参考にさせていただいたのは「<a href="http://memo.sanographix.net/post/88371442780">http://memo.sanographix.net/post/88371442780</a>」です。ありがとうございました。

## まずはローカルで動かしてみる

### 必要そうなもの

・nodeとnpm 
・githubのアカウント
・herokuのアカウント(コマンドラインツールも)

### nodeのインストール

atomエディタを入れた時に入れていたものを何かアンインストールしていたっぽいので、入れなおしました。
ダウンロードは → <a href="http://nodejs.org/download/">http://nodejs.org/download/</a>

```
$ node --version
v0.10.29

$ npm --version
1.4.14
```

### npmでhubotのインストール

hubotとbot氏にやることを書くのに使うらしいcoffee-scriptをインストールします。

```
$ npm install -g hubot coffee-script
coffee-script@1.7.1 C:UsersusernameAppDataRoamingnpmnode_modulescoffee-script
└── mkdirp@0.3.5

hubot@2.7.5 C:UsersusernameAppDataRoamingnpmnode_moduleshubot
├── log@1.4.0
├── optparse@1.0.4
├── scoped-http-client@0.9.8
├── coffee-script@1.6.3
└── express@3.3.4 (methods@0.0.1, fresh@0.1.0, mkdirp@0.3.5, cookie@0.1.0, cookie-signature@1.0.1, buffer-crc32@0.2.1, range-parser@0.0.4, send@0.1.3, debug@1.0.3, commander@1.2.0, connect@2.8.4)

$ hubot -v
2.7.5
```

### ローカルでhubot氏が動くようにテストしてみる

まずはbotを登録し、できたディレクトリへ移動

```
$ hubot --create XXXbot
Creating a hubot install at XXXbot
略

$ cd XXXbot
$ ls
Procfile              external-scripts.json scripts/
README.md             hubot-scripts.json
bin/                  package.json
```

とりあえず動くようになっているので、動かしてみる

```
$ bin/hubot
hubot@2.7.5 node_moduleshubot
├── optparse@1.0.4
├── log@1.4.0
├── scoped-http-client@0.9.8
├── coffee-script@1.6.3
└── express@3.3.4 (methods@0.0.1, range-parser@0.0.4, buffer-crc32@0.2.1, cookie-signature@1.0.1, fresh@0.1.0, cookie@0.1.0, mkdirp@0.3.5, debug@1.0.3, commander@1.2.0, send@0.1.3, connect@2.8.4)

hubot-scripts@2.5.15 node_moduleshubot-scripts
└── redis@0.8.4
Hubot> [Fri Jul 11 2014 17:48:10 GMT+0900 (東京 (標準時))] WARNING The HUBOT_AUTH_ADMIN environment variable not set
[Fri Jul 11 2014 17:48:12 GMT+0900 (東京 (標準時))] ERROR [Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED]
```

一番下にエラーっぽいのがでたの調べてみると「hubot-scripts.jsonから"redis-brain.coffee"を消せば良い」という神の声があったので、そうしてみたら確かに消えたのでまぁおっけもう一回起動してみる

```
$ bin/hubot
Hubot> hubot ping
Hubot> PONG
```
と返ってくるので多分生きてます。やったね。

### ちょっとアレンジしてみる。

botにつけた名前でお察しくださいなのだけど、10行目くらい？をちょっとだけいじった。

```
module.exports = (robot) ->
  robot.respond /PING$/i, (msg) ->
    msg.send "なんのようだなっしー！！！！"
```

で同じことしてみた。

```
$ bin/hubot
Hubot> hubot ping
Hubot> なんのようだなっしー
```

お察しください。

## heroku deployする

通信が必要なので、botを動かすためにherokuにdeployしてslackと連携できるようにしてあげます。
まずは、npmで一つインストールします。

```
$ npm install hubot-slack --save
hubot-slack@2.1.0 node_moduleshubot-slack
```

次にbotのディレクトリの中にあるProcfileに以下を記載

```
web: bin/hubot --adapter slack
```

この状態でgit addしてcommitします。
そしてgithubのリポジトリを作成しpushしてしまってください。

```
$ git init XXXbot
$ git add --all
$ git commit -m "first commit"
$ git remote add origin https://github.com/xxxxx/xxxxx.git
$ git push -u origin master
```

これでpush完了です。
つぎにherokuにdeployします。ログイン、区画作成、

```
$ heroku login
Authentication successful.
$ heroku create XXXXX
$ git push heroku master
```

続いてherokuのdyno？設定。この当たりは先駆者のもの丸パクリなので、あまりわかってないです。

```
$ heroku ps:scale web=1
$ heroku addons:add rediscloud
Adding rediscloud on XXXbot... failed
 !    Please verify your account to install this add-on plan
 !    For more information, see https://devcenter.heroku.com/categories/billing
 !    Verify now at https://heroku.com/verify
```

 エラーがでて萎え萎え。要は、クレカ登録herokuでしてなってことらしいです。
 で、クレカ登録を怯えながらしたあとサイド実行

```
$ heroku addons:add rediscloud
Adding rediscloud on XXXbot... done, v4 (free)
Use `heroku addons:docs rediscloud` to view documentation.
```

あっさり通る。

最後に、authやslackで使うための環境変数をheroku先輩に突っ込みます。

### slack用のデータを登録

Slackの「Configure Integrations」でHubotを登録するとauthのための情報と使うherokuのアドレスを登録する画面が出てきます。
herokuのアドレスを入力しsaveします。そしてそのslack用のデータをherokuのコマンドで登録してあげると完了です。

```
$ heroku config:add HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ heroku config:add HUBOT_SLACK_TEAM=teamname
$ heroku config:add HUBOT_SLACK_BOTNAME=botname
$ heroku config:add HEROKU_URL=http://xxx.herokuapp.com
```

### 実験

これで作業完了で、slackを見てみると特に変化はなくmemberの中にもいないのですが、@でbot名にpingすると反応が帰ってきます。
やったー。

## 追記

ちょっと調べたらメッセージを増やすのは簡単にできそうだったので、ping.coffee のところに「hi/bye/omikuji/ぬるぽ」を追加してみました。

### ぬるぽ

ぬるぽは以下のものが個人的に最強でした。感謝。
https://gist.github.com/vexus2/94f1d666485931a8c9c6

### hiの感じ
```
  robot.hear /HI$/i, (msg) ->
    msg.send msg.random ["なんのようだなっしー！！！！", "梨汁ブシャー！！！！", "気安く声かけるななっしー", "業務中です,話しかけないでください", "ふなふなふなふな、ひゃっはー！！！", "こんにちはなっしー", "なんか用があるなっしーか？", "ひゃっはー", "ふなふなふぁいやー"]
  
```

### byeの感じ

```
  
  robot.hear /BYE$/i, (msg) ->
    msg.send msg.random ["お疲れ様でしたなっしー！！", "今日のあんたはよく働いたなっしー！！", "帰ってゆっくり寝るなっしー！！"]
```
### omikujiの感じ

```
  robot.hear /OMIKUJI$/i, (msg) ->
    msg.send msg.random ["大吉なっしー!! 後ろから刺されないように気をつけるなっし。", "中吉なっしー!! いい方だけど油断するなよなっしー", "小吉なっしー!! まぁそこそこなっしねードンマイ", "吉なっしー!! ドンマイ！", "末吉なっしー!! 世も末なっしー", "凶なっしー...とりあえず顔を洗ってこいなっしー"]
```

そんな感じで、たぶんスクリプトを分けて書くべきだと思うので今回は取り急ぎというやつでした。そちらも調べて登録するようにしたいと思います。

### Timezoneの設定(2014/08/25 追記)

herokuのlogでタイムゾーンが何やらおかしいような感じがしたので、設定を追加しました。
heroku loginが済んでいる状態で

```
$ heroku config:add TZ=Asia/Tokyo
Setting config vars and restarting xxx... done, v20
TZ: Asia/Tokyo
```

### cronで定期的にbotにつぶやかせる(2014/08/25 追記)

時間が空いてしまったのでうろ覚えなのですが、cronで発言させるようにいたしました。
[node-cron](https://github.com/ncb000gt/node-cron)なるものを用いました、感謝。秒があるところがわぉですが、時間はlinuxのcron的に設定です。

```console.sh
$ npm install cron
```

npmでnode-cronを使えるようにしてから、下記の様なものcoffee scriptファイルをbotのscriptsディレクトリに放り投げでdeploy。

```cron.coffee
# Description:
#   Utility commands surrounding Hubot uptime.
#
# Commands:
#   cron configs
#

cronJob = require('cron').CronJob

module.exports = (robot) ->
  cronTest = new cronJob('0 57 16 * * 1', () =>
    envelope = room: "#roomname"
    robot.send envelope, "ここにメッセージを突っ込みます。"
  )
  cronTest.start()
```

現在は3つくらいの設定でbotに定期実行させています。

## 最後に

一応~~今後いろいろ昨日というか mtgの時間ぐらいは自動で投げ込めるようにできたらと思います~~ cronで投げ込むことくらいはできるようになりました。。

インストールとかもろもろ30分ぐらいで（既にherokuとgithubをつかっていたので）できたので、さくっと出来て楽しめるので良いすなー。

### もう一個最後に

このままだとただのパクリなので、bot先輩のお仕事を追加したら追記していこうと思います。