Posted at

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

More than 1 year has passed since last update.

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