Slackで新しく追加されたCustom Emojiを教えてくれるボットを作った

  • 7
    いいね
  • 0
    コメント

こんにちは、@hico_horiuchiです。
この記事はチャットボット Advent Calendar 2016の10日目です。

Slackは、今一番人気のチャットサービスですよね。
私も、大学時代は研究室にサークルにバイト、今は仕事やコミュニティ活動で毎日使っています。

Slackには、ユーザが独自の絵文字を追加できる「Custom Emoji」の機能があります。
slack-reaction-decomojiは、どこのチームでも使われている人気の絵文字ですよね。

私の入っているチームでは、「絵文字職人」と呼ばれる人がどんどん登録しているのですが、
Slackで通知されたりしないため、新しい絵文字が追加されても分からないことがほとんどです。
そこで、追加された絵文字を定期的に教えてくれるボットをHubotで実装したので紹介します。

changelog.png

Custom Emojiの一覧を取得する

SlackはAPIが充実しているので、Custom Emojiの一覧も簡単に取得できます。

Hubotの用Slackアダプタのhubot-slackでは、以下のようにしてAPIを呼び出せます。
(絵文字には別名が設定されていることがあるので、ここでは取り除いています。)

robot.adapter.client.web.emoji.list (err, info) ->
  if err?
    return console.log(err)
  unless info.ok
    return console.log(info.error)

  emoji_list = []

  for name, url of info.emoji
    if url.match(/^alias:/)
      continue
    emoji_list.push(name)

  console.log(emoji_list)

追加されたCustom Emojiを抽出する

node-cronを使って毎日0時にCustom Emojiのリストを取得し、hubot-redis-brainに保存しています。
簡単に配列の差分を取るために、関数型プログラミング用ライブラリのUnderscore.jsを使っています。

updateEmojiList = (emoji_list) ->
  robot.brain.set('slack-emoji-list', emoji_list)

changelogCron = new cronJob
  cronTime: '0 0 0 * * *'
  onTick: ->
    updateEmojiList(emoji_list)
  start: true
  timeZone: 'Asia/Tokyo'

Brainを更新する前に、取得したリストと保存されていたリストと比較することで、その日に追加された絵文字を抽出しています。

postChangelog = (channel_id, next_list) ->
  previous_list = robot.brain.get('slack-emoji-list') ? []

  diff = _.difference(next_list, previous_list)
  diff = diff.map (name) ->
    ":#{name}:"

  if diff.length is 0
    robot.send({ room: channel_id }, '今日追加された絵文字はないよ! 職人さん頑張って!')
  else
    msg =  "昨日追加された絵文字は *#{diff.length}個* です!\n"
    msg += "#{diff.slice(0, 10).join(' ')}#{' ...' if diff.length > 10}\n"
    robot.send({ room: channel_id }, msg)

今回開発したボットの紹介

今回開発した「Slackで新しく追加されたCustom Emojiを教えてくれるボット」はGitHubで公開しています。
使い方や、Herokuへのデプロイ方法をREADMEに書いているので、ぜひ使ってみて下さい!

追加されたCustom EmojiをWebで表示する機能も持っていたりします。

changelog_web.png

今後は、ボットに絵文字にしたい言葉やフォントなどを伝えると、バックエンドで生成してSlackに登録してくれる機能も付けたいです。
PythonやImageMagickを使ってテキスト絵文字を生成する実装が既にあるので、参考になりそうです。

Hubot×ChatOps勉強会の紹介

学生時代に大阪と神戸で開催したHubot×ChatOps勉強会を、東京でも開催したいと思っています。
第3回は2月上旬に田町で開催予定なので、発表して頂ける方は@hico_horiuchiです。までご連絡頂けると嬉しいです。