From 90246ec1e5fc352df8667657827d9dc2a15d0068 Mon Sep 17 00:00:00 2001 From: codec Date: Thu, 17 Nov 2011 15:34:46 +0100 Subject: [PATCH] a script to interact with the JIRA REST API This script supports showing issue information, watchers, searching with JQL and saving JQL in the robot's brain. --- src/scripts/jira.coffee | 150 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 src/scripts/jira.coffee diff --git a/src/scripts/jira.coffee b/src/scripts/jira.coffee new file mode 100644 index 000000000..dd0fc5f9b --- /dev/null +++ b/src/scripts/jira.coffee @@ -0,0 +1,150 @@ +# Messing with the JIRA REST API +# +# - - Displays information about the ticket (if it exists) +# show watchers for - Shows watchers for the given issue +# search for - Search JIRA with JQL +# save filter as - Save JQL as filter in the brain +# use filter - Use a filter from the brain +# show filter(s) - Show all filters +# show filter - Show a specific filter + +class IssueFilters + constructor: (@robot) -> + @cache = [] + + @robot.brain.on 'loaded', => + @cache = @robot.brain.data.jqls + + add: (filter) -> + @cache.push filter + @robot.brain.data.jqls = @cache + + delete: (name) -> + result = [] + @cache.forEach (filter) -> + if filter.name isnt name + result.push filter + + @cache = result + @robot.brain.data.jqls = @cache + + get: (name) -> + result = null + + @cache.forEach (filter) -> + if filter.name is name + result = filter + + result + all: -> + return @cache + +class IssueFilter + constructor: (@name, @jql) -> + return {name: @name, jql: @jql} + +module.exports = (robot) -> + filters = new IssueFilters robot + + get = (msg, where, cb) -> + console.log(process.env.HUBOT_JIRA_URL + "/rest/api/latest/" + where) + authdata = new Buffer(process.env.HUBOT_JIRA_USER+':'+process.env.HUBOT_JIRA_PASSWORD).toString('base64') + + msg.http(process.env.HUBOT_JIRA_URL + "/rest/api/latest/" + where). + header('Authorization', 'Basic ' + authdata). + get() (err, res, body) -> + cb JSON.parse(body) + + watchers = (msg, issue, cb) -> + get msg, "issue/#{issue}/watchers", (watchers) -> + if watchers.errors? + return + + cb watchers.watchers.map((watcher) -> return watcher.displayName).join(", ") + + info = (msg, issue, cb) -> + get msg, "issue/#{issue}", (issues) -> + if issues.errors? + return + + issue = + key: issues.key + summary: issues.fields.summary.value + assignee: -> + if issues.fields.assignee.value != undefined + issues.fields.assignee.value.displayName + else + "no assignee" + status: issues.fields.status.value.name + fixVersion: -> + if issues.fields.fixVersions? and issues.fields.fixVersions.value != undefined + issues.fields.fixVersions.value.map((fixVersion) -> return fixVersion.name).join(", ") + else + "no fix version" + url: process.env.HUBOT_JIRA_URL + '/browse/' + issues.key + + cb "[#{issue.key}] #{issue.summary}. #{issue.assignee()} / #{issue.status}, #{issue.fixVersion()} <#{issue.url}>" + + search = (msg, jql, cb) -> + get msg, "search/?jql=#{escape(jql)}", (result) -> + if result.errors? + return + + cb "I found #{result.total} issues for your search" + result.issues.forEach (issue) -> + info msg, issue.key, (info) -> + cb info + + robot.respond /(show )?watchers (for )?(\w+-[0-9]+)/i, (msg) -> + if msg.message.user.id is robot.name + return + + watchers msg, msg.match[3], (text) -> + msg.send text + + robot.respond /search (for )?(.*)/i, (msg) -> + if msg.message.user.id is robot.name + return + + search msg, msg.match[2], (text) -> + msg.send "#{msg.message.user.id}: #{text}" + + robot.hear /(\w+-[0-9]+)/i, (msg) -> + if msg.message.user.id is robot.name + return + + info msg, msg.match[0], (text) -> + msg.send text + + robot.respond /save filter (.*) as (.*)/i, (msg) -> + filter = filters.get msg.match[2] + + if filter + filters.delete filter.name + msg.send "Updated filter #{filter.name} for you" + + filter = new IssueFilter msg.match[2], msg.match[1] + filters.add filter + + robot.respond /delete filter (.*)/i, (msg) -> + filters.delete msg.match[1] + + robot.respond /(use )?filter (.*)/i, (msg) -> + name = msg.match[2] + filter = filters.get name + + search msg, filter.jql, (text) -> + msg.send text + + robot.respond /(show )?filter(s)? ?(.*)?/i, (msg) -> + if filters.all().length == 0 + msg.send "Sorry, I don't remember any filters." + return + + if msg.match[3] == undefined + msg.send "I remember #{filters.all().length} filters" + filters.all().forEach (filter) -> + msg.send "#{filter.name}: #{filter.jql}" + else + filter = filters.get msg.match[3] + msg.send "#{filter.name}: #{filter.jql}" \ No newline at end of file