hubotでRedmineのチケット名を表示

チャットにRedmineのURLが貼られたらチケット名を表示するhubot-scriptを作りました。
Redmineには認証があるため通常のURLではBOTからはアクセスできません。

が、幸いな事にRedmineにはREST APIが存在します。

REST APIの詳細はこのへんで。
ちょっと古いかもしれませんが、大体同じです。

以下ソース。

# Description:
#   Get ticket title from Redmine Api.
#
# Commands:
#   http://redmine.hoge.com/issues/<ticket_id> - Get ticket title.

async = require 'async'

redmineUri = process.env.REDMINE_URI
redmineApiAccessKey = process.env.REDMINE_API_ACCESS_KEY

module.exports = (robot) ->
  robot.hear new RegExp(redimineUri + '/issues/[0-9]+', 'g'), (msg) ->
    getAsyncTicketName = (ticketId, i) ->
      (next) ->
        msg.http("#{redmineUri}/issues/#{ticketId}.json")
          .query(key: redmineApiAccessKey)
          .get() (err, res, body) ->
            if res.statusCode == 200 or res.statusCode == 304
              msg.send "=>##{ticketId} #{JSON.parse(body).issue.subject}"
            else
              msg.send "=>##{ticketId} ネーヨヽ(`Д´)ノ"
            next()
    task = []
    for url, i in msg.match
      ticketId = url.match /[0-9]+/g
      task.push getAsyncTicketName ticketId, i

    async.series task

使い方は事前に環境変数を設定するだけ。

$ export REDMINE_URI=http://redmine.hoge.com
$ export REDMINE_API_ACCESS_KEY=abcdefghijklmnopqrstuvwxyzabcdefghijklmn
$ hubot

これでチケット名取り放題ですわ。

追記 2013/07/25

1メッセージに複数のURLが入っていた場合に対処するためにasyncで順番通りmsg.sendするように修正