こんにちは、@hico_horiuchiです。
この記事はチャットボット Advent Calendar 2016の10日目です。
Slackは、今一番人気のチャットサービスですよね。
私も、大学時代は研究室にサークルにバイト、今は仕事やコミュニティ活動で毎日使っています。
Slackには、ユーザが独自の絵文字を追加できる「Custom Emoji」の機能があります。
slack-reaction-decomojiは、どこのチームでも使われている人気の絵文字ですよね。
私の入っているチームでは、「絵文字職人」と呼ばれる人がどんどん登録しているのですが、
Slackで通知されたりしないため、新しい絵文字が追加されても分からないことがほとんどです。
そこで、追加された絵文字を定期的に教えてくれるボットをHubotで実装したので紹介します。
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で表示する機能も持っていたりします。
今後は、ボットに絵文字にしたい言葉やフォントなどを伝えると、バックエンドで生成してSlackに登録してくれる機能も付けたいです。
PythonやImageMagickを使ってテキスト絵文字を生成する実装が既にあるので、参考になりそうです。
Hubot×ChatOps勉強会の紹介
学生時代に大阪と神戸で開催したHubot×ChatOps勉強会を、東京でも開催したいと思っています。
第3回は2月上旬に田町で開催予定なので、発表して頂ける方は@hico_horiuchiです。までご連絡頂けると嬉しいです。