HubotでSlackのEmoji Reactionを付ける


こんばんは，2015年もあと1時間を切りましたね．
親戚宅で紅白を見ていたら，μ'sの登場で気不味くなった[@hico_horiuchi](https://twitter.com/hico_horiuchi)です．

先日の記事で紹介しましたが，[Botkit](http://howdy.ai/botkit/)ではSlackのEmoji Reactionを簡単に付けられます．

  - [BotkitのConversationでプルリクをマージする - Qiira](http://qiita.com/hiconyan/items/feb4f08068e00c8d13b9)

ふと思い付いたので，Hubotで同じことを出来ないか試してみました．

## reactions.add method

Slack APIに，Emoji Reactionを付けるメソッドがありました．
Botkitでは，このAPIをそのまま呼び出しているようです．
(というか， `botkit/lib/Slack_web_api.js` をそのまま使った方が早そう…．)

  - [reactions.add method | Slack](https://api.slack.com/methods/reactions.add)
  - [botkit/Slack_web_api.js at master · howdyai/botkit](https://github.com/howdyai/botkit/blob/master/lib/Slack_web_api.js#L181#L183)

`/api/reactions.add` に，以下のパラメタをPOSTすれば良いみたい．

  - トークン( `HUBOT_SLACK_TOKEN` を使えそう)
  - Reactionを付けるメッセージのチャンネルとタイムスタンプ

## hubot-scriptを書いてみる

Emoji Reactionを付けるhubot-scriptを書いてみます．
今回は「gj」「GJ」のメッセージに :thumbsup: のEmojiを付けます．

```coffeescript:scripts/reactions.coffee
# Description                                                                                                           
#   SlackのEmoji Reactionを付与                                                                                         
#                                                                                                                       
# Configuration:                                                                                                        
#   HUBOT_SLACK_TOKEN 

request = require('request')

module.exports = (robot) ->
  addReactions = (msg, name) ->
    options = {
      url: 'https://slack.com/api/reactions.add'
      qs: {
        'token': process.env.HUBOT_SLACK_TOKEN
        'name': name                                                                                                    
        'channel': msg.message.rawMessage.channel
        'timestamp': msg.message.rawMessage.ts
      }
    }
    request.post options, (err, res, body) ->
      if err? or res.statusCode isnt 200
        robot.logger.error("Failed to add emoji reaction #{JSON.stringify(err)}")

  robot.hear /^gj|GJ$/i, (msg) ->
    addReactions(msg, 'thumbsup')
```

単純に[request](https://github.com/request/request)を使ってWeb APIを呼び出しています．
`channel` と `timestamp` は，Hubotが受け取った `msg` を解析して発見しました．
(それぞれ `C1234567890` と `1234567890.123456` いう形式なので，注意が必要です．)

![hubot_add-reactions.gif](https://qiita-image-store.s3.amazonaws.com/0/58742/5eddcd75-c91e-2bf9-ae6f-60bf95c1e59d.gif "hubot_add-reactions.gif")

このような感じで，HubotがEmoji Reactionを付けているのが分かります．

## (比較) BotkitでEmoji Reactionを付ける

[botkit/bot.js](https://github.com/howdyai/botkit/blob/master/bot.js#L81#L91)より，一部改変して抜粋しています．

```javascript:bot.js
controller.hears(['gj', 'GJ'], 'message_received', function(bot, message) {
  bot.api.reactions.add({
    timestamp: message.ts,
    channel: message.channel,
    name: 'thumbsup',
  }, function(err, res) {
    if (err) {
      bot.botkit.log('Failed to add emoji reaction ', JSON.stringify(err));
    }
  });
};
```

## まとめ

HubotからもSlack APIを呼び出すことでEmoji Reactionを付けられました．
このようなSlack特有(Adapterのサポート外)の機能は，Botkitの方に分がありそうですね．

本当はGitHub Integrationの通知にEmoji Reactionを付けたかったのですが，
Hubotでは他のBotからの通知は `robot.hear` で取得できないようです…．
(「Pull request closed:」とかに :thumbsup: を付けたかった．)

Botkitの登場で来年のChatOps界隈はどうなるのか，楽しみですね．
それではみなさん，良いお年を．