diff --git a/tools/rocketchat/webhooks/incomming/gihub.js b/tools/rocketchat/webhooks/incomming/gihub.js new file mode 100644 index 0000000..18c73ca --- /dev/null +++ b/tools/rocketchat/webhooks/incomming/gihub.js @@ -0,0 +1,217 @@ +/* + * vim: set syntax=javascript ts=2 sw=2 sts=2 et : + * JS script to handle incomming github webhooks + */ + +const getLabelsField = (labels) => { + let labelsArray = []; + labels.forEach(function(label) { + labelsArray.push(label.name); + }); + labelsArray = labelsArray.join(', '); + return { + title: 'Labels', + value: labelsArray, + short: labelsArray.length <= 40 + }; +}; + +const githubEvents = { + +/* + * event_name(request){ + * return { + * content: { + * text: 'response' + * } + * }; + * } + */ + + ping(request) { + return { + content: { + text: ':thumbsup: ' + request.content.zen + } + }; + }, + + issues(request) { + const user = request.content.sender; + const attachment = { + author_icon: 'https://cloud.githubusercontent.com/assets/51996/13893698/c047133c-ed2e-11e5-9233-13622bcb9b7b.png', + author_name: '#' + request.content.issue.number + ' - ' + request.content.issue.title, + author_link: request.content.issue.html_url, + fields: [] + }; + + if (request.content.issue.labels) { + attachment.fields.push(getLabelsField(request.content.issue.labels)); + } + + if (request.content.issue.assignee) { + attachment.fields.push({ + title: 'Assignee', + value: request.content.issue.assignee.login, + short: true + }); + } + + const actions = { + 'assigned': ':inbox_tray:', + 'unassigned': ':outbox_tray:', + 'opened': ':triangular_flag_on_post:', + 'closed': ':white_check_mark:', + 'reopened': ':triangular_flag_on_post:', + 'labeled': ':label:', + 'unlabeled': ':label:', + 'edited': ':pencil:' + }; + + const text = actions[request.content.action] + ' issue'; + + return { + content: { + icon_url: user.avatar_url, + alias: user.login, + text: text, + attachments: [attachment] + } + }; + }, + + issue_comment(request) { + const user = request.content.comment.user; + var attachment = { + author_icon: 'https://cloud.githubusercontent.com/assets/51996/13893698/c047133c-ed2e-11e5-9233-13622bcb9b7b.png', + author_name: '#' + request.content.issue.number + ' - ' + request.content.issue.title, + author_link: request.content.comment.html_url, + fields: [] + }; + + if (request.content.issue.labels) { + attachment.fields.push(getLabelsField(request.content.issue.labels)); + } + + if (request.content.issue.assignee) { + attachment.fields.push({ + title: 'Assignee', + value: request.content.issue.assignee.login, + short: true + }); + } + + const text = ':speech_balloon: ' + request.content.comment.body; + + return { + content: { + icon_url: user.avatar_url, + alias: user.login, + text: text, + attachments: [attachment] + } + }; + }, + + pull_request(request) { + const user = request.content.sender; + const attachment = { + author_icon: 'https://cloud.githubusercontent.com/assets/51996/13893698/c047133c-ed2e-11e5-9233-13622bcb9b7b.png', + author_name: '#' + request.content.pull_request.number + ' - ' + request.content.pull_request.title, + author_link: request.content.pull_request.html_url + }; + + let text = 'Pull request'; + switch (request.content.action) { + case 'assigned': + text += ' assigned to: ' + request.content.assignee.login; + break; + case 'unassigned': + text += ' unassigned of ' + request.content.assignee.login; + break; + case 'opened': + text += ' opened'; + break; + case 'closed': + if (request.content.pull_request.merged) { + text += ' merged'; + } else { + text += ' closed'; + } + break; + case 'reopened': + text += ' reopened'; + break; + case 'labeled': + text += ' added label: "' + request.content.label.name + '" '; + break; + case 'unlabeled': + text += ' removed label: "' + request.content.label.name + '" '; + break; + case 'synchronize': + text += ' synchronized'; + } + + return { + content: { + icon_url: user.avatar_url, + alias: user.login, + text: text, + attachments: [attachment] + } + }; + }, + + team_add(request) { + const team = request.content.team.name; + const permission = request.content.team.permission; + + return { + content: { + text: 'Team ' + team + ' with permissions ' + permission + ' added!' + } + }; + }, + + push(request) { + const committer = request.content.pusher.name; + const commits = request.content.commits; + + var atts = [] + for ( var i = 0 ; i < commits.length ; i++ ) { + var attachment = { + author_icon: 'https://cloud.githubusercontent.com/assets/51996/13893698/c047133c-ed2e-11e5-9233-13622bcb9b7b.png', + fields: [] + }; + + attachment.author_name = commits[i].author.name; + attachment.title_link = commits[i].url; + attachment.title = commits[i].message; + atts.push(attachment); + } + + return { + content: { + text: committer + ' pushed ' + commits.length + ' commit(s).', + attachments: atts + } + }; + } +}; + +class Script { + process_incoming_request({ request }) { + const header = request.headers['x-github-event']; + if (githubEvents[header]) { + return githubEvents[header](request); + } + + return { + error: { + success: false, + message: 'Unsupported method' + } + }; + } +} +