LoginSignup
20
11

More than 5 years have passed since last update.

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

Posted at

こんにちは、@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です。までご連絡頂けると嬉しいです。

20
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
11