Skip to content

Instantly share code, notes, and snippets.

@khobbits
Last active August 11, 2016 12:02
Show Gist options
  • Save khobbits/a61ac19e07b95f14e9385633ccb2fa6f to your computer and use it in GitHub Desktop.
Save khobbits/a61ac19e07b95f14e9385633ccb2fa6f to your computer and use it in GitHub Desktop.
/* exported Script
Issue events (create, edit, close, reopen, assign, label, etc)
Issue comment events
Push events (singular and multiple commits)
*/
String.prototype.capitalizeFirstLetter = function() {
return this.charAt(0).toUpperCase() + this.slice(1);
}
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 = {
ping(request) {
if (typeof request.content.repository == "undefined") {
return {
content: {
text: '_' + request.content.organization.description + '_\n' + ':thumbsup: ' + request.content.zen
}
};
} else {
return {
content: {
text: '_' + request.content.repository.full_name + '_\n' + ':thumbsup: ' + request.content.zen
}
};
}
},
/* member */
member(request) {
const user = request.content.sender;
const action = request.content.action.capitalizeFirstLetter();
const text = '_' + request.content.repository.full_name + '_\n' +
'**[' + action + ' member ​@' + request.content.member.login +
"**" + '](' +
request.content.member.html_url + ')';
return {
content: {
icon_url: user.avatar_url,
alias: user.login,
attachments: [
{
text: text,
fields: []
}
]
}
};
},
/* membership */
membership(request) {
const user = request.content.sender;
const action = request.content.action.capitalizeFirstLetter();
const text = '_' + request.content.organization.login + '/' + request.content.team.name + '_\n' +
'**[' + action + ' member ​@' + request.content.member.login +
"**" + '](' +
request.content.member.html_url + ')\n\nPermission Level: ' + request.content.team.permission;
return {
content: {
icon_url: user.avatar_url,
alias: user.login,
attachments: [
{
text: text,
fields: []
}
]
}
};
},
/* repository */
repository(request) {
const user = request.content.sender;
const action = request.content.action.capitalizeFirstLetter();
const text = '_' + request.content.repository.full_name + '_\n' +
'**[' + action + ' repo ' + request.content.repository.name +
"**" + '](' +
request.content.repository.html_url + ')';
return {
content: {
icon_url: user.avatar_url,
alias: user.login,
attachments: [
{
text: text,
fields: []
}
]
}
};
},
/* NEW OR MODIFY ISSUE */
/*
issues(request) {
const user = request.content.sender;
if (request.content.action == "opened" || request.content.action == "reopened" || request.content.action == "edited") {
var body = request.content.issue.body;
} else if (request.content.action == "labeled") {
var body = "Current labels: " + getLabelsField(request.content.issue.labels).value;
} else if (request.content.action == "assigned" || request.content.action == "unassigned") {
// Note that the issues API only gives you one assignee.
var body = "Current assignee: " + request.content.issue.assignee.login;
} else if (request.content.action == "closed") {
if (request.content.issue.closed_by) {
var body = "Closed by: " + request.content.issue.closed_by.login;
} else {
var body = "Closed.";
}
} else {
return {
error: {
success: false,
message: 'Unsupported issue action'
}
};
}
const action = request.content.action.capitalizeFirstLetter();
const text = '_' + request.content.repository.full_name + '_\n' +
'**[' + action + ' issue ​#' + request.content.issue.number +
' - ' + request.content.issue.title + "**" + '](' +
request.content.issue.html_url + ')\n\n' +
body;
return {
content: {
icon_url: user.avatar_url,
alias: user.login,
attachments: [
{
text: text,
fields: []
}
]
}
};
},
*/
/* COMMENT ON EXISTING ISSUE */
/*
issue_comment(request) {
const user = request.content.comment.user;
if (request.content.action == "edited") {
var action = "Edited comment ";
} else {
var action = "Comment "
}
const text = '_' + request.content.repository.full_name + '_\n' +
'**[' + action + ' on issue ​#' + request.content.issue.number +
' - ' + request.content.issue.title + '](' +
request.content.comment.html_url + ')**\n\n' +
request.content.comment.body;
return {
content: {
icon_url: user.avatar_url,
alias: user.login,
attachments: [
{
text: text,
fields: []
}
]
}
};
},
*/
/* Create branch/tag */
create(request) {
const user = request.content.sender;
var text = '**Created new ' + request.content.ref_type + ": ["+request.content.repository.full_name+"]("+request.content.repository.url+"):"
+ request.content.ref.split('/').pop() + "**";
return {
content: {
icon_url: user.avatar_url,
alias: user.login,
attachments: [
{
text: text,
fields: []
}
]
}
};
},
/* Delete branch/tag */
delete(request) {
const user = request.content.sender;
var text = '**Deleted ' + request.content.ref_type + ": ["+request.content.repository.full_name+"]("+request.content.repository.url+"):"
+ request.content.ref.split('/').pop() + "**";
return {
content: {
icon_url: user.avatar_url,
alias: user.login,
attachments: [
{
text: text,
fields: []
}
]
}
};
},
/* PUSH TO REPO */
push(request) {
const user = request.content.sender;
var commits = request.content.commits;
var text = '**Pushed to ' + "["+request.content.repository.full_name+"]("+request.content.repository.url+"):"
+ request.content.ref.split('/').pop() + "**\n\n";
var output = [];
if (commits.length == 0 && request.content.head_commit != null) {
commits.push(request.content.head_commit);
text += 'Set tag/branch reference to:' + "\n";
} else if (commits.length == 0) {
text += 'Set tag/branch reference to: ' + request.content.after;
}
for (var i = 0; i < commits.length; i++) {
var commit = commits[i];
var shortID = commit.id.substring(0,7);
var a = '[' + shortID + '](' + commit.url + ') - ';
var commitMessages = commit.message.split('\n')
if (commits.length > 1) {
a += commitMessages.shift();
}
else if (commitMessages.length > 5) {
a += commitMessages.shift();
a += "...";
}
else {
a += commit.message;
}
output.push( a );
}
text += output.reverse().slice(0,4).join('\n');
if (output.length > 4) {
text += "\n(+" + (output.length - 4) + ' commits)';
}
text += "\n[Diff/Full Changes]("+request.content.compare+")"
return {
content: {
icon_url: user.avatar_url,
alias: user.login,
attachments: [
{
text: text,
fields: []
}
]
}
};
}, // End Github Push
/* NEW PULL REQUEST */
pull_request(request) {
const user = request.content.sender;
if (request.content.action == "opened" || request.content.action == "reopened" /*|| request.content.action == "edited" || request.content.action == "synchronize"*/) {
var body = request.content.pull_request.body;
/*} else if (request.content.action == "labeled") {
var body = "Current labels: " + getLabelsField(request.content.pull_request.labels).value;
} else if (request.content.action == "assigned" || request.content.action == "unassigned") {
// Note that the issues API only gives you one assignee.
var body = "Current assignee: " + request.content.pull_request.assignee.login;*/
} else if (request.content.action == "closed") {
if (request.content.pull_request.merged) {
var body = "Merged by: " + request.content.pull_request.merged_by.login;
} else {
var body = "Closed.";
}
} else {
return {
error: {
success: false,
message: 'Unsupported pull request action'
}
};
}
const action = request.content.action.capitalizeFirstLetter();
const text = '_' + request.content.repository.full_name + '_\n' +
'**[' + action + ' pull request ​#' + request.content.pull_request.number +
' - ' + request.content.pull_request.title + "**" + '](' +
request.content.pull_request.html_url + ')\n\n' +
body;
return {
content: {
icon_url: user.avatar_url,
alias: user.login,
attachments: [
{
text: text,
fields: []
}
]
}
};
},
};
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'
}
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment