hubot-phabs
Version:
A hubot plugin for communication with a Phabricator instance.
194 lines (180 loc) • 6.42 kB
text/coffeescript
# Description:
# enable communication with Phabricator via Conduit api
#
# Dependencies:
#
# Configuration:
# PHABRICATOR_URL
# PHABRICATOR_API_KEY
#
# Commands:
# hubot phad projects
# hubot phad delete <project>
# hubot phad info <project>
# hubot phad refresh <project>
# hubot phad alias <project> as <alias>
# hubot phad forget <alias>
# hubot phad feed <project> to <room>
# hubot phad remove <project> from <room>
#
# Author:
# mose
Phabricator = require '../lib/phabricator'
moment = require 'moment'
path = require 'path'
module.exports = (robot) ->
robot.phab ?= new Phabricator robot, process.env
phab = robot.phab
data = robot.brain.data.phabricator
# hubot phad projects
robot.respond /phad (?:projects|list) *$/, (msg) ->
projects = Object.keys(data.projects).filter (i) ->
i isnt '*'
if projects.length > 0
msg.send "Known Projects: #{projects.join(', ')}"
else
msg.send 'There is no project.'
# hubot phad delete <project>
robot.respond /phad del(?:ete)? (.+) *$/, (msg) ->
project = msg.match[1]
phab.getPermission(msg.envelope.user, 'phadmin')
.then ->
if data.projects[project]?
delete data.projects[project]
for alias, proj of data.aliases
delete data.aliases[alias] if proj is project
msg.send "#{project} erased from memory."
else
msg.send "#{project} not found in memory."
.catch (e) ->
msg.send e
# hubot phad info|refresh <project>
robot.respond /phad (info|show|refresh) (.+) *$/, (msg) ->
refresh = (msg.match[1] is 'refresh')
project = msg.match[2]
phab.getProject(project, refresh)
.then (proj) ->
response = "'#{project}' is"
if proj.data.parent?
response += " '#{proj.data.parent}/#{proj.data.name}'"
else
response += " '#{proj.data.name}'"
if proj.aliases? and proj.aliases.length > 0
response += " (aka #{proj.aliases.join(', ')})"
else
response += ', with no alias'
if proj.data.feeds? and proj.data.feeds.length > 0
response += ", announced on #{proj.data.feeds.join(', ')}"
else
response += ', with no feed'
if proj.data.columns? and Object.keys(proj.data.columns).length > 0
response += ", columns #{Object.keys(proj.data.columns).join(', ')}"
else
response += ', and no columns'
if proj.data.parent?
response += " (child of #{proj.data.parent})"
response += '.'
msg.send response
.catch (e) ->
msg.send e
# hubot phad alias <project> as <alias>
robot.respond /phad alias (.+) as (.+)$/, (msg) ->
project = msg.match[1]
alias = msg.match[2]
phab.getPermission(msg.envelope.user, 'phadmin')
.then ->
phab.getProject(project)
.then (proj) ->
if data.aliases[alias]?
msg.send "The alias '#{alias}' already exists for project '#{data.aliases[alias]}'."
else
data.aliases[alias] = proj.data.name
msg.send "Ok, '#{proj.data.name}' will be known as '#{alias}'."
.catch (e) ->
msg.send e
# hubot phad forget <alias>
robot.respond /phad forget (.+)$/, (msg) ->
alias = msg.match[1]
phab.getPermission(msg.envelope.user, 'phadmin')
.then ->
if data.aliases[alias]
delete data.aliases[alias]
msg.send "Ok, the alias '#{alias}' is forgotten."
else
msg.send "Sorry, I don't know the alias '#{alias}'."
.catch (e) ->
msg.send e
# hubot phad feed <project> to <room>
robot.respond /phad feeds? (.+) to (.+)$/, (msg) ->
project = msg.match[1]
room = msg.match[2]
phab.getPermission(msg.envelope.user, 'phadmin')
.then ->
phab.getProject(project)
.then (proj) ->
data.projects[proj.data.name].feeds ?= [ ]
if room in data.projects[proj.data.name].feeds
msg.send "The feed from '#{proj.data.name}' to '#{room}' already exist."
else
data.projects[proj.data.name].feeds.push room
msg.send "Ok, '#{proj.data.name}' is now feeding '#{room}'."
.catch (e) ->
msg.send e
# hubot phad feedall to <room>
robot.respond /phad feedall to (.+)$/, (msg) ->
room = msg.match[1]
phab.getPermission(msg.envelope.user, 'phadmin')
.then ->
phab.getProject('*')
.then (proj) ->
data.projects['*'].feeds ?= [ ]
if room in data.projects['*'].feeds
msg.send "The catchall feed to '#{room}' already exist."
else
data.projects['*'].feeds.push room
msg.send "Ok, all feeds will be announced on '#{room}'."
# hubot phad remove <project> from <room>
robot.respond /phad remove (.+) from (.+)$/, (msg) ->
project = msg.match[1]
room = msg.match[2]
phab.getPermission(msg.envelope.user, 'phadmin')
.then ->
phab.getProject(project)
.then (proj) ->
data.projects[proj.data.name].feeds ?= [ ]
if room in data.projects[proj.data.name].feeds
idx = data.projects[proj.data.name].feeds.indexOf room
data.projects[proj.data.name].feeds.splice(idx, 1)
msg.send "Ok, The feed from '#{proj.data.name}' to '#{room}' was removed."
else
msg.send "Sorry, '#{proj.data.name}' is not feeding '#{room}'."
.catch (e) ->
msg.send e
# hubot phad removeall from <room>
robot.respond /phad removeall from (.+)$/, (msg) ->
room = msg.match[1]
phab.getPermission(msg.envelope.user, 'phadmin')
.then ->
phab.getProject('*')
.then (proj) ->
proj.data.feeds ?= [ ]
data.projects['*'].feeds ?= [ ]
if room in data.projects['*'].feeds
idx = data.projects['*'].feeds.indexOf room
data.projects['*'].feeds.splice(idx, 1)
msg.send "Ok, The catchall feed to '#{room}' was removed."
else
msg.send "Sorry, the catchall feed for '#{room}' doesn't exist."
# hubot phad columns <project>
robot.respond /phad columns (.+)$/, (msg) ->
project = msg.match[1]
phab.getPermission(msg.envelope.user, 'phadmin')
.then ->
phab.getProject(project)
.then (data) ->
if data.data.columns? and Object.keys(data.data.columns).length > 0
msg.send "Columns for #{project}: #{Object.keys(data.data.columns).join(', ')}"
else
msg.send "The project #{project} has no columns."
.catch (e) ->
msg.send e.message