BotKitをHerokuでSlackに繋げるまで

この記事では BotKit を扱ってみます。
Node の準備や Heroku の準備は [HubotをHerokuでSlackに繋げるまで](http://qiita.com/chibi929/items/79161111dee411000411) の記事を参考にしてください。

個人的には Hubot よりも BotKit のほうが好き！
coffee script が良くわからないというのがあるかもしれませんが・・・

# Slack の準備

Hubot を使うときは `Hubot` という SlackApps をインストールしましたが、
BotKit では `Bots` というものを使います。

実際はどちらもトークンを発行するだけなのでどっちでもいい気がする・・・

## Bots の登録

https://my.slack.com/services/new/bot
ここから登録できます。

この辺は Hubot と同じです。

### Bots の名前を決める

![20170319212847.png](https://qiita-image-store.s3.amazonaws.com/0/53393/8e2276be-4911-3042-e67f-1a772aeb6e3a.png)

### Bots の設定をする

![20170319212931.png](https://qiita-image-store.s3.amazonaws.com/0/53393/b5a925f7-9e6c-0864-08a1-6e49d8eb6cd2.png)

Bots のアイコンなども変更できますが、今回は面倒だったのでそのまま保存です。

# BotKit の準備と設定

BotKit の準備には、

- npm でモジュールをインストールする方法
- git でサンプルを含んだプロジェクトをクローンする方法

の2種類あるようです。

## git close でサンプルプロジェクトを取得

```bash
$ git clone git@github.com:howdyai/botkit.git
$ cd botkit/
$ npm install
```

これだけで準備完了

### 動作確認

```bash
$ token=xoxb-********************************* node slack_bot.js
```

![20170319213338.png](https://qiita-image-store.s3.amazonaws.com/0/53393/cf7b6927-efd5-5ca6-547d-47feecb0c171.png)

### 動かしたソースコード

```js:slack_bot.js
～略～
controller.hears(['hello', 'hi'], 'direct_message,direct_mention,mention', function(bot, message) {

    bot.api.reactions.add({
        timestamp: message.ts,
        channel: message.channel,
        name: 'robot_face',
    }, function(err, res) {
        if (err) {
            bot.botkit.log('Failed to add emoji reaction :(', err);
        }
    });


    controller.storage.users.get(message.user, function(err, user) {
        if (user && user.name) {
            bot.reply(message, 'Hello ' + user.name + '!!');
        } else {
            bot.reply(message, 'Hello.');
        }
    });
});
～略～
```

1. 1つ目のブロックでリアクションを付ける。
2. 2つ目のブロックでメッセージを投げる。
    - if文は、何で後者のほうに入ったのかわからない。
    - ユーザー名とか持ってそうなのだが・・・

## npm でモジュールをインストール

こちらはサンプルのソースコードは付いていません。
ということで、余計なモジュールもインストールしていない最小構成になります。

```bash
mkdir hoge
cd hoge
npm init -y
npm install -S botkit
```

### BotKitの最小構成サンプル

せっかくなのでやっておきましょう。
タッカラプトポッポルンガプピリットパロ！

先ほどクローンで実行した `slack_bot.js` を参考に最小構成を作りました。

```js:example.js
if (!process.env.token) {
  console.log('Error: Specify token in environment');
  process.exit(1);
}

var Botkit = require('botkit');
var controller = Botkit.slackbot({
  debug: false
});

var bot = controller.spawn({
  token: process.env.token
}).startRTM();

controller.hears(['タッカラプトポッポルンガプピリットパロ'], 'direct_message,direct_mention,mention', function(bot, message) {
  bot.reply(message, ':polunga:');
});
```

### 動作確認

```bash
$ token=xoxb-********************************* node example.js
```

![20170319214415.png](https://qiita-image-store.s3.amazonaws.com/0/53393/35f7793e-aab0-865a-0ff6-0a7dd9b9e5ef.png)

夢の神　来た！

先ほどのクローンしたサンプル付きのものとは異なり、
`hi` や `hello` は登録されていないので反応していません。

そもそも英語じゃ合言葉が違うので出てきませんね。

# Heroku との連携

## Procfile 作成

[HubotをHerokuでSlackに繋げるまで](http://qiita.com/chibi929/items/79161111dee411000411) では Yoeman さんが、雛形を用意してくれていたので、
Procfile もありました。今回は真似して自分で作成です。

```:Procfile
web: node example.js
```

## Heroku へデプロイ

ここは Hubot の時と同じように実施

```bash
$ git init
$ heroku git:remote -a {HEROKU_APP_NAME}

$ git add .
$ git commit -m "First commit."
$ git push heroku master
```

## Heroku への設定

```bash
$ heroku config:add token=xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ heroku config
token: xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

## 動作確認

```bash
$ heroku restart
```

![20170319220958.png](https://qiita-image-store.s3.amazonaws.com/0/53393/205eb5cc-9774-b0b2-e609-19ac77f757b5.png)

わかりやすいようにコードを少し変えてHerokuへデプロイしました。
リアクション付けました。

```diff:example.js
if (!process.env.token) {
  console.log('Error: Specify token in environment');
  process.exit(1);
}

var Botkit = require('botkit');
var controller = Botkit.slackbot({
  debug: false
});

var bot = controller.spawn({
  token: process.env.token
}).startRTM();

controller.hears(['タッカラプトポッポルンガプピリットパロ'], 'direct_message,direct_mention,mention', function(bot, message) {
+ bot.api.reactions.add({
+   timestamp: message.ts,
+   channel: message.channel,
+   name: 'polunga'
+ }, function(err, res) {
+   if (err) {
+     bot.botkit.log('Failed to add emoji reaction :(', err);
+   }
+ });
  
  bot.reply(message, ':polunga:');
});
```