251 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* exported Script */
 | 
						||
 | 
						||
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.hook.id + '_\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: []
 | 
						||
            }
 | 
						||
        ]
 | 
						||
      }
 | 
						||
    };
 | 
						||
  },
 | 
						||
 | 
						||
 /* COMMENT ON COMMIT */
 | 
						||
commit_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 commit id ' + request.content.comment.commit_id +
 | 
						||
                ' - ' +  + '](' +
 | 
						||
                request.content.comment.html_url + ')**\n\n' +
 | 
						||
                request.content.comment.body;
 | 
						||
 | 
						||
    return {
 | 
						||
      content: {
 | 
						||
        attachments: [
 | 
						||
            {
 | 
						||
                thumb_url: user.avatar_url,
 | 
						||
                text: text,
 | 
						||
                fields: []
 | 
						||
            }
 | 
						||
        ]
 | 
						||
      }
 | 
						||
    };
 | 
						||
  },
 | 
						||
  /* END OF COMMENT ON COMMIT */
 | 
						||
 | 
						||
  /* PUSH TO REPO */
 | 
						||
  push(request) {
 | 
						||
    // Check if the commits array is empty
 | 
						||
    var commits = request.content.commits;
 | 
						||
    
 | 
						||
    // If commits is empty, use head_commit details
 | 
						||
    if (commits.length === 0 && request.content.head_commit) {
 | 
						||
        commits = [request.content.head_commit]; // Wrap head_commit in an array for uniform processing
 | 
						||
    }
 | 
						||
 | 
						||
    var multi_commit = "";
 | 
						||
    var is_short = true;
 | 
						||
    var changeset = 'Changeset';
 | 
						||
 | 
						||
    if (commits.length > 1) {
 | 
						||
        multi_commit = " [Multiple Commits]";
 | 
						||
        is_short = false;
 | 
						||
        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 {
 | 
						||
            output = a; // Ensure output is properly defined
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    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'
 | 
						||
      }
 | 
						||
    };
 | 
						||
  }
 | 
						||
}
 |