Skip to content

Instantly share code, notes, and snippets.

@khobbits
Last active August 11, 2016 12:02

Revisions

  1. khobbits revised this gist Aug 11, 2016. 1 changed file with 77 additions and 24 deletions.
    101 changes: 77 additions & 24 deletions gistfile1.js
    Original file line number Diff line number Diff line change
    @@ -196,40 +196,93 @@ const githubEvents = {
    };
    },
    */

    /* 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) {
    var commits = request.content.commits;
    var multi_commit = ""
    var is_short = true;
    var changeset = 'Changeset';
    if ( commits.length > 1 ) {
    var multi_commit = " [Multiple Commits]";
    var is_short = false;
    var changeset = changeset + 's';
    var output = [];
    }
    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 + ') - ' + commit.message;
    if ( commits.length > 1 ) {
    output.push( a );
    } else {
    var output = a;
    }
    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 );

    }

    if (commits.length > 1) {
    text += output.reverse().join('\n');
    } else {
    text += output;
    }
    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: {
    @@ -249,13 +302,13 @@ const githubEvents = {
    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") {
    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") {
    /*} 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;
    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;
  2. khobbits renamed this gist Aug 10, 2016. 1 changed file with 101 additions and 8 deletions.
    109 changes: 101 additions & 8 deletions gistfile1.txt → gistfile1.js
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,7 @@
    /* exported Script
    * Issue events (create, edit, close, reopen, assign, label, etc)
    * Issue comment events
    * Push events (singular and multiple commits)
    Issue events (create, edit, close, reopen, assign, label, etc)
    Issue comment events
    Push events (singular and multiple commits)
    */

    String.prototype.capitalizeFirstLetter = function() {
    @@ -23,14 +23,100 @@ const getLabelsField = (labels) => {

    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: {
    text: '_' + request.content.repository.full_name + '_\n' + ':thumbsup: ' + request.content.zen
    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;
    @@ -66,18 +152,21 @@ const githubEvents = {
    return {
    content: {
    icon_url: user.avatar_url,
    alias: user.login,
    attachments: [
    {
    thumb_url: user.avatar_url,
    text: text,
    fields: []
    }
    ]
    }
    };
    },
    */

    /* COMMENT ON EXISTING ISSUE */
    /*
    issue_comment(request) {
    const user = request.content.comment.user;
    @@ -95,16 +184,18 @@ const githubEvents = {
    return {
    content: {
    icon_url: user.avatar_url,
    alias: user.login,
    attachments: [
    {
    thumb_url: user.avatar_url,
    text: text,
    fields: []
    }
    ]
    }
    };
    },
    */

    /* PUSH TO REPO */
    push(request) {
    @@ -142,9 +233,10 @@ const githubEvents = {

    return {
    content: {
    icon_url: user.avatar_url,
    alias: user.login,
    attachments: [
    {
    thumb_url: user.avatar_url,
    text: text,
    fields: []
    }
    @@ -189,9 +281,10 @@ const githubEvents = {

    return {
    content: {
    icon_url: user.avatar_url,
    alias: user.login,
    attachments: [
    {
    thumb_url: user.avatar_url,
    text: text,
    fields: []
    }
  3. khobbits created this gist Aug 10, 2016.
    218 changes: 218 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,218 @@
    /* 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) {
    return {
    content: {
    text: '_' + request.content.repository.full_name + '_\n' + ':thumbsup: ' + request.content.zen
    }
    };
    },

    /* 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: {
    attachments: [
    {
    thumb_url: user.avatar_url,
    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: {
    attachments: [
    {
    thumb_url: user.avatar_url,
    text: text,
    fields: []
    }
    ]
    }
    };
    },

    /* PUSH TO REPO */
    push(request) {
    var commits = request.content.commits;
    var multi_commit = ""
    var is_short = true;
    var changeset = 'Changeset';
    if ( commits.length > 1 ) {
    var multi_commit = " [Multiple Commits]";
    var is_short = false;
    var changeset = changeset + 's';
    var output = [];
    }
    const user = request.content.sender;

    var text = '**Pushed to ' + "["+request.content.repository.full_name+"]("+request.content.repository.url+"):"
    + request.content.ref.split('/').pop() + "**\n\n";

    for (var i = 0; i < commits.length; i++) {
    var commit = commits[i];
    var shortID = commit.id.substring(0,7);
    var a = '[' + shortID + '](' + commit.url + ') - ' + commit.message;
    if ( commits.length > 1 ) {
    output.push( a );
    } else {
    var output = a;
    }
    }

    if (commits.length > 1) {
    text += output.reverse().join('\n');
    } else {
    text += output;
    }

    return {
    content: {
    attachments: [
    {
    thumb_url: user.avatar_url,
    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: {
    attachments: [
    {
    thumb_url: user.avatar_url,
    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'
    }
    };
    }
    }