commodore-github-bot
Version:
A hubot script to list and recurrently remind you about open pull requests and pull request assignments.
111 lines (96 loc) • 3.83 kB
text/coffeescript
Config = require "../config"
Octokat = require "octokat"
Utils = require "../utils"
PullRequest = require "./pullrequest"
url = require "url"
crypto = require "crypto"
octo = new Octokat
token: Config.github.token
rootUrl: Config.github.url
class Webhook
constructor: () ->
.router.post "/hubot/github-events", (req, res) =>
return unless req.body?
hmac = crypto.createHmac "sha1", Config.github.webhook.secret if Config.github.webhook.secret
if hmac and hubSignature = req.headers["x-hub-signature"]
hmac.update JSON.stringify req.body
signature = "sha1=#{hmac.digest "hex"}"
unless signature is hubSignature
return .logger.error "Github Webhook Signature did not match, aborting"
event = req.body
if req.headers["x-github-event"] is "pull_request_review"
event
else if req.body.pull_request
event
res.send 'OK'
onPullRequest: (event) ->
switch event.action
when "assigned"
event
when "review_requested"
event
onPullRequestReviewAction: (event) ->
return unless event.action is "edited" or event.action is "submitted"
return unless event.pull_request?.user?.url?
user = null
sender = null
Utils.lookupUserWithGithub(octo.fromUrl(event.pull_request.user.url))
.then (u) ->
user = u
Utils.lookupUserWithGithub(octo.fromUrl(event.sender.url))
.then (s) ->
sender = s
.catch (error) ->
Utils.robot.logger.error "Github Webhook: Unable to find webhook sender #{event.sender.login}"
.then ->
PullRequest.fromUrl event.pull_request.url
.then (pr) ->
pr.creator = user
.emit "GithubPullRequestReviewed", pr, sender
.catch (error) ->
Utils.robot.logger.error "Github Webhook: Unable to find user to send notification to #{event.pull_request.user.login}"
Utils.robot.logger.error error
Utils.robot.logger.error error.stack
onPullRequestAssignment: (event) ->
return unless event.assignee?.url?
user = null
sender = null
Utils.lookupUserWithGithub(octo.fromUrl(event.assignee.url))
.then (u) ->
user = u
Utils.lookupUserWithGithub(octo.fromUrl(event.sender.url))
.then (s) ->
sender = s
.catch (error) ->
Utils.robot.logger.error "Github Webhook: Unable to find webhook sender #{event.sender.login}"
.then ->
PullRequest.fromUrl event.pull_request.url
.then (pr) ->
pr.assignee = user
.emit "GithubPullRequestAssigned", pr, sender
.catch (error) ->
Utils.robot.logger.error "Github Webhook: Unable to find user to send notification to #{event.assignee.login}"
Utils.robot.logger.error error
Utils.robot.logger.error error.stack
onPullRequestReviewRequested: (event) ->
return unless event.requested_reviewer?.url?
user = null
sender = null
Utils.lookupUserWithGithub(octo.fromUrl(event.requested_reviewer.url))
.then (u) ->
user = u
Utils.lookupUserWithGithub(octo.fromUrl(event.sender.url))
.then (s) ->
sender = s
.catch (error) ->
Utils.robot.logger.error "Github Webhook: Unable to find webhook sender #{event.sender.login}"
.then ->
PullRequest.fromUrl event.pull_request.url
.then (pr) ->
pr.requested_reviewer = user
.emit "GithubPullRequestReviewRequested", pr, sender
.catch (error) ->
Utils.robot.logger.error "Github Webhook: Unable to find user to send notification to #{event.requested_reviewer.login}"
Utils.robot.logger.error error
Utils.robot.logger.error error.stack
module.exports = Webhook