hubot-phabs
Version:
A hubot plugin for communication with a Phabricator instance.
267 lines (232 loc) • 7.52 kB
text/coffeescript
# Description:
# requests Phabricator Conduit api
#
# Dependencies:
#
# Configuration:
# PHABRICATOR_URL
# PHABRICATOR_API_KEY
# PHABRICATOR_BOT_PHID
#
# Author:
# mose
querystring = require 'querystring'
moment = require 'moment'
class Phabricator
constructor: (, env) ->
= env.PHABRICATOR_URL
= env.PHABRICATOR_API_KEY
= env.PHABRICATOR_BOT_PHID
ready: (msg) ->
msg.send 'Error: Phabricator url is not specified' if not
msg.send 'Error: Phabricator api key is not specified' if not
return false unless ( and )
true
phabGet: (msg, query, endpoint, cb) ->
body = querystring.stringify(query)
msg.http(process.env.PHABRICATOR_URL)
.path("api/#{endpoint}")
.get(body) (err, res, payload) ->
json_body = null
if res?
switch res.statusCode
when 200
if res.headers['content-type'] is 'application/json'
json_body = JSON.parse(payload)
else
json_body = {
result: { },
error_code: 'ENOTJSON',
error_info: 'api did not deliver json'
}
else
json_body = {
result: { },
error_code: res.statusCode,
error_info: "http error #{res.statusCode}"
}
else
json_body = {
result: { },
error_code: err.code,
error_info: err.message
}
cb json_body
withUser: (msg, user, cb) ->
if is true
id = user.phid
if id
cb(id)
else
email = user.email_address or user.pagerdutyEmail
unless email
if msg.message.user.name is user.name
msg.send "Sorry, I can't figure out your email address :( " +
'Can you tell me with `.phab me as you@yourdomain.com`?'
else
msg.send "Sorry, I can't figure #{user.name} email address. " +
"Can you help me with .phab #{user.name} = <email>"
return
query = {
'emails[0]': email,
'api.token':
}
msg, query, 'user.query', (json_body) ->
unless json_body['result']['0']?
msg.send "Sorry, I cannot find #{email} :("
return
user.phid = json_body['result']['0']['phid']
cb user.phid
withUserByPhid: (robot, phid, cb) ->
if phid?
user = null
for k of robot.brain.data.users
thisphid = robot.brain.data.users[k].phid
if thisphid? and thisphid is phid
user = robot.brain.data.users[k]
break
if user?
cb user
else
query = {
'phids[0]': phid,
'api.token':
}
robot, query, 'user.query', (json_body) ->
if json_body['result']['0']?
cb { name: json_body['result']['0']['userName'] }
else
cb { name: 'unknown' }
else
cb { name: 'nobody' }
taskInfo: (msg, id, cb) ->
if is true
query = {
'task_id': id,
'api.token':
}
msg, query, 'maniphest.info', (json_body) ->
cb json_body
fileInfo: (msg, id, cb) ->
if is true
query = {
'id': id,
'api.token':
}
msg, query, 'file.info', (json_body) ->
cb json_body
pasteInfo: (msg, id, cb) ->
if is true
query = {
'ids[0]': id,
'api.token':
}
msg, query, 'paste.query', (json_body) ->
cb json_body
createTask: (msg, phid, title, cb) ->
if is true
url =
apikey =
bot_phid =
phabGet =
msg, msg.message.user, (userPhid) ->
query = {
'transactions[0][type]': 'title',
'transactions[0][value]': "#{title}",
'transactions[1][type]': 'description',
'transactions[1][value]': "(created by #{msg.message.user.name} on irc)",
'transactions[2][type]': 'subscribers.add',
'transactions[2][value][0]': "#{userPhid}",
'transactions[3][type]': 'subscribers.remove',
'transactions[3][value][0]': "#{bot_phid}",
'api.token': apikey,
}
if phid.match /PHID-PROJ-/
query['transactions[4][type]'] = 'projects.add'
query['transactions[4][value][]'] = "#{phid}"
else
query['transactions[4][type]'] = 'column'
query['transactions[4][value]'] = "#{phid}"
phabGet msg, query, 'maniphest.edit', (json_body) ->
cb json_body
createPaste: (msg, title, cb) ->
if is true
url =
apikey =
bot_phid =
phabGet =
msg, msg.message.user, (userPhid) ->
query = {
'transactions[0][type]': 'title',
'transactions[0][value]': "#{title}",
'transactions[1][type]': 'text',
'transactions[1][value]': "(created by #{msg.message.user.name} on irc)",
'transactions[2][type]': 'subscribers.add',
'transactions[2][value][0]': "#{userPhid}",
'transactions[3][type]': 'subscribers.remove',
'transactions[3][value][0]': "#{bot_phid}",
'api.token': apikey,
}
phabGet msg, query, 'paste.edit', (json_body) ->
cb json_body
recordPhid: (msg, id) ->
msg.message.user.lastTask = moment().utc()
msg.message.user.lastPhid = id
retrievePhid: (msg) ->
expires_at = moment(msg.message.user.lastTask).add(5, 'minutes')
if msg.message.user.lastPhid? and moment().utc().isBefore(expires_at)
msg.message.user.lastPhid
else
null
updateStatus: (msg, id, status, cb) ->
if is true
query = {
'id': id,
'status': status,
'comments': "status set to #{status} by #{msg.message.user.name}",
'api.token': ,
}
msg, query, 'maniphest.update', (json_body) ->
cb json_body
updatePriority: (msg, id, priority, cb) ->
if is true
priorities = {
'unbreak': 100,
'broken': 100,
'need triage': 90,
'none': 90,
'unknown': 90,
'low': 25,
'normal': 50,
'high': 80,
'urgent': 80,
'wish': 0
}
query = {
'id': id,
'priority': priorities[priority],
'comments': "priority set to #{priority} by #{msg.message.user.name}",
'api.token': ,
}
msg, query, 'maniphest.update', (json_body) ->
cb json_body
assignTask: (msg, tid, userphid, cb) ->
if is true
query = {
'objectIdentifier': "T#{tid}",
'transactions[0][type]': 'owner',
'transactions[0][value]': "#{userphid}",
'api.token': ,
}
msg, query, 'maniphest.edit', (json_body) ->
cb json_body
listTasks: (msg, projphid, cb) ->
if is true
query = {
'projectPHIDs[0]': "#{projphid}",
'status': 'status-open',
'api.token': ,
}
msg, query, 'maniphest.query', (json_body) ->
cb json_body
module.exports = Phabricator