GitHubのメンションをDMで教えてくれるボット

この記事はボット・クローラー Advent Calendar 2016の14日目です。

今回はGitHubのメンションをSlackのDMで教えてくれるボットを紹介します。

弊社でのボット

弊社ではHubotをHeroku上で動かしています。以前にもこのブログで紹介しました。

http://blog.matchingood.com/entry/2016/11/29/201114blog.matchingood.com

メンションをDMで教えてくれる機能は初期から用意していました。理由は弊社の開発フローでGitHubの存在が大きくなったのですぐにGitHub上での更新を知る必要が出てきたからです。

http://blog.matchingood.com/entry/2016/11/08/142906blog.matchingood.com

特にメンションはSlackでDMで伝えてくれると開発用のチャンネルの通知を出さないようにしていても通知してくれるのでとても便利であることは明らかでした。

コード

プルリクエストへのレビューコメントのhookに対するコードは簡単に書くと以下のような感じです。

users =
  'takuseno': 'seno'

module.exports = (robot) ->
  robot.router.post "/github/pr/review", (req, response) ->
    data = req.body
    action = data.action
    path = data.comment.path
    user = data.comment.user.login
    url = data.pull_request.html_url
    number = data.pull_request.number
    title = data.pull_request.title
    repo = data.pull_request.head.repo.name
    body = data.comment.body

    if action != 'created'
      response.end ''
      return

    attachment =
      content:
        fallback: body
        pretext: path
        mrkdwn_in: ["text", "pretext", "fields"]
        color: "#f1c40f"
        author_name: users[user]
        title: "\##{number} #{title}"
        title_link: url
        text: body

    mentions = body.match /@(\S+)\s*/
    if mentions?
      for index, name of mentions
        if users[name]?
          userId = users[name]
          robot.adapter.client.openDM userId, (data) ->
            attachment.channel = userId
            robot.emit "slack.attachment", attachment

  response.end ''

ポイントは上記のコードではusersGitHubのユーザー名とslackのユーザー名の対応表を入れておいて、コメントを正規表現でメンションを探してslackに投げているところです。

あとは、DMの見た目を良くするためにattachmentというのを使っています。slackのattachment自体は以下に載っています。

api.slack.com

実際の感じ

f:id:takuseno:20161213174233p:plain

これでGitHub上でのコミュニケーションがよりスムーズになりました!