KazIgu SandBox

作るぜー

hubot-slackでのメンション

Others

アダプタがv2からv3に変わってメンション周りが変更されて面倒だったのでメモ

ユーザー名からメンション

これはとても簡単
ユーザー名がhogeとかなら<@hoge>でいい
でもusernameがhoge.fooとかだとちゃんとメンション効かない
そういう時はidでメンション送らせるのがいいと思う

idからメンション

<@>はidを渡しても使えるっぽい
slackbotのidはUSLACKBOTらしいのでそれを例にすると<@USLACKBOT>みたいな感じ

でもidは普段見えないから取得しなきゃいけない
ユーザーの情報はrobot.brain.data.usersに入ってるので

Users = robot.brain.data.users
for key of Users
  if 'hoge.foo' == Users[key].name
    return Users[key].id

とかすればユーザー名からidを取得できる
そいつを使って

Users = robot.brain.data.users

getUserId = (name) ->
  for key of Users
    if name == Users[key].name
      return Users[key].id

こんなの用意して<@#{getUserId(hoge.foo)}>とかするといい

Utilにしとこう

どうせメンションとかよく使うので僕は./scripts内にこんな感じファイルをutil.coffeeとか名前付けて用意してる

ensureImageExtension = (url) ->
  ext = url.split('.').pop()
  if /(png|jpe?g|gif)/i.test(ext)
    url
  else
    "#{url}#.png"


Robot = (robot) ->
  Util = {}
  Users = robot.brain.data.users
  delete Users.USLACKBOT

  Util.getUsers = ->
    return Users

  Util.getUserId = (name) ->
    for key of Users
      if name == Users[key].name
        return Users[key].id

  Util.imageMe = (msg, query, animated, faces, cb) ->
    cb = animated if typeof animated == 'function'
    cb = faces if typeof faces == 'function'
    q = v: '1.0', rsz: '8', q: query, safe: 'active'
    q.imgtype = 'animated' if typeof animated is 'boolean' and animated is true
    q.imgtype = 'face' if typeof faces is 'boolean' and faces is true
    msg.http('http://ajax.googleapis.com/ajax/services/search/images')
      .query(q)
      .get() (err, res, body) ->
        images = JSON.parse(body)
        images = images.responseData?.results
        if images?.length > 0
          image = msg.random images
          cb ensureImageExtension image.unescapedUrl

  robot.util = Util

module.exports = Robot

そんでmain.coffee

require './util.coffee'
module.exports = (robot) ->
  mention = (name) ->
    return "<@#{robot.util.getUserId(name)}>:"

  robot.hear /hogehoge/, (msg) ->
    msg.send "#{mention(msg.message.user.name)}\nhogehoge"

みたいな感じ

まとめ

飽きたのでまとめるまでもなく〆ます