mirror of
				https://github.com/reality/dbot.git
				synced 2025-10-29 23:27:32 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			193 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * Module Name: Github 
 | |
|  * Description: Retrieves interesting Github information
 | |
|  */
 | |
| var request = require('request'),
 | |
|     exec = require('child_process').exec;
 | |
| 
 | |
| var github = function(dbot) {
 | |
|     this.api = {
 | |
|         "githubStatus": function(callback){
 | |
|             var reqUrl = "https://status.github.com/api/last-message.json";
 | |
|             request({"url": reqUrl, "headers": {"User-Agent": this.config.useragent}}, function(error, response, body) {
 | |
|                 callback(JSON.parse(body));
 | |
|             });
 | |
|         }
 | |
|     };
 | |
| 
 | |
| 
 | |
|     var commands = {
 | |
|         '~repocount': function(event) {
 | |
|             var reqUrl = "https://api.github.com/users/" + event.params[1] + "/repos";
 | |
|             request({"url": reqUrl, "headers": {"User-Agent": this.config.useragent}}, function(error, response, body) {
 | |
|                 if(response.statusCode == "200") {
 | |
|                     var result = JSON.parse(body);
 | |
|                     event.reply(dbot.t("repocount",{"user": event.params[1], "count": result.length}));
 | |
|                 } else {
 | |
|                     event.reply(dbot.t("usernotfound"));
 | |
|                }
 | |
|            });
 | |
|         },
 | |
|         '~repo': function(event) {
 | |
|             var repo = event.params[1];
 | |
|             if (typeof repo == 'undefined') {
 | |
|                 repo = this.config.defaultrepo;
 | |
|             }
 | |
| 
 | |
|             var reqUrl = "https://api.github.com/";
 | |
|             reqUrl += "repos/" + repo;
 | |
|             request({"url": reqUrl, "headers": {"User-Agent": this.config.useragent}}, function(error, response, body) {
 | |
| 
 | |
|                 var data = JSON.parse(body);
 | |
|                 if (data["fork"]) {
 | |
|                    event.reply(dbot.t("forkedrepo",data)); 
 | |
|                 } else {
 | |
|                     event.reply(dbot.t("unforkedrepo",data));
 | |
|                 }
 | |
|                 // TODO: move this shizz into an api call
 | |
|                 var longurl = "http://github.com/" + repo;
 | |
|                 event.reply(dbot.t('location')+" "+longurl);
 | |
|             });
 | |
|         }, 
 | |
|         '~gstatus': function(event) {
 | |
|             data = this.api.githubStatus(function(data){
 | |
|                 event.reply(dbot.t("status"+data["status"]));
 | |
|                 event.reply(data["body"]);
 | |
|             }.bind(this));
 | |
|         },
 | |
|         '~milestone': function(event) {
 | |
|             var repo = this.config.defaultrepo; 
 | |
|             var name = event.params[1];
 | |
|             if (event.params[2]){
 | |
|                 repo = name;
 | |
|                 name = event.params[2];
 | |
|             }
 | |
|             var reqUrl = "https://api.github.com/repos/";
 | |
|             reqUrl += repo + "/milestones";
 | |
| 
 | |
|             request({"url": reqUrl, "headers":{"User-Agent": this.config.useragent}}, function(error, response, body) {
 | |
|                 var data = JSON.parse(body);
 | |
|                 for (var section in data) {
 | |
|                     var milestone = data[section];
 | |
|                     if (milestone["title"] == name){
 | |
|                         var str = "Milestone " + milestone["title"];
 | |
|                         var progress = milestone["closed_issues"] / (milestone["open_issues"] + milestone["closed_issues"]);
 | |
|                         progress = Math.round(progress*100);
 | |
|                         var bar = "[";
 | |
|                         for (var i = 10; i < 100; i += 10) {
 | |
|                             if  ((progress/i) > 1) {
 | |
|                                 bar += "█";
 | |
|                             } else {
 | |
|                                 bar += " ";
 | |
|                             }
 | |
|                         }
 | |
|                         bar += "]";
 | |
|                         str += " is " + bar + progress + "% complete";
 | |
| 
 | |
|                         event.reply(str);
 | |
|                         break;
 | |
|                     }
 | |
|                 }
 | |
|            });
 | |
|         }, 
 | |
|         '~repocount': function(event) {
 | |
|         // TODO: add handling for non existent user
 | |
|             var reqUrl = "https://api.github.com/users/" + event.params[1] + "/repos";
 | |
|             request({"url": reqUrl,"headers": { "User-Agent": this.config.useragent}}, function(error, response, body) {
 | |
|             var result = JSON.parse(body);
 | |
|             event.reply(event.params[1] + " has " + result.length + " public repositories.");
 | |
|             });
 | |
|         },
 | |
|         '~grate': function(event) {
 | |
|             request.get({"url":"https://api.github.com/rate_limit", "headers":{"User-Agent": this.config.useragent}}, function(error, response, body) {
 | |
|                 var data = JSON.parse(body);
 | |
|                 if (data.message){
 | |
|                     event.reply(data.message);
 | |
|                 } else {
 | |
|                     event.reply(data.rate.remaining + " requests of " + data.rate.limit + " remaining.");
 | |
|                 }
 | |
|             });
 | |
|         },
 | |
|         '~issue': function(event) {
 | |
|             var repo, issue, randflag;
 | |
|             if (isNaN(event.params[1]) && event.params[1]){ // if ~issue foo/bar
 | |
|                 repo = event.params[1];
 | |
|                 issue = event.params[2];
 | |
|             } else {
 | |
|                 repo = this.config.defaultrepo;
 | |
|                 issue = event.params[1];
 | |
|             }
 | |
| 
 | |
|             if (issue == "*" || issue == "random" || issue == "0") {
 | |
|                 issue = "";
 | |
|                 randflag = true;
 | |
|             } else if (!issue) { // issue is undefined
 | |
|                 issue = "";
 | |
|             } else {
 | |
|                 issue = "/" + issue; // got to be a better way
 | |
|             }
 | |
|             
 | |
|             var reqUrl = "https://api.github.com/repos/" + repo + "/issues" +
 | |
|                 issue + "?sort=" + this.config.sortorder;
 | |
|             request.get({"url": reqUrl, headers: { "User-Agent": this.config.useragent}}, function(error,response, body) {
 | |
|                 if (response.statusCode == "200") {
 | |
|                     var data = JSON.parse(body);
 | |
|                     if (!issue){
 | |
|                         if (randflag) {
 | |
|                             data = data[Math.floor(Math.random() * data.length)];
 | |
|                         } else {
 | |
|                             data = data[0];
 | |
|                         }
 | |
|                     }
 | |
|                     if (_.has(data["pull_request"], "html_url")){
 | |
|                         data["pull_request"] = " with code";
 | |
|                     } else {
 | |
|                         data["pull_request"] = "";
 | |
|                     }
 | |
|                     if (data["state"]=="open") {
 | |
|                         data["state"] = "\u000303" + data["state"];
 | |
|                     } else {
 | |
|                         data["state"] = "\u000304" + data["state"];
 | |
|                     }
 | |
|                     var labels = "";
 | |
|                     for (var i=0; i < data["labels"].length; i++) { // for-in doesn't like me
 | |
|                         var color = "\u0003" + (parseInt(data["labels"][i]["color"],16) % 15);
 | |
|                         labels += " " + color + data["labels"][i]["name"];
 | |
|                     }
 | |
|                     data["label"] = labels;
 | |
|                     event.reply(dbot.t("issue",data));
 | |
|                     event.reply(data["html_url"]);
 | |
|                 } else {
 | |
|                     event.reply(dbot.t("issuenotfound"));
 | |
|                 }
 | |
|             });
 | |
|        },
 | |
|        '~commits': function(event) {
 | |
|             exec("git rev-list --all | wc -l", function(error, stdout, stderr) {
 | |
|                 stdout = stdout.trim();
 | |
|                 request({"url":"http://numbersapi.com/" + stdout + "?fragment&default=XXX"}, function(error, response, body){
 | |
|                     if (body != "XXX"){
 | |
|                         event.reply(dbot.t("commitcountfun",{"fact": body, "count": stdout}));
 | |
|                     } else {
 | |
|                         // nothing fun about the number, let's try the year
 | |
|                         request({"url":"http://numbersapi.com/" + stdout + "/year?fragment&default=XXX"}, function(error, response, body){
 | |
|                             if (body != "XXX"){
 | |
|                                 event.reply(dbot.t("commitcountyear",{"fact": body, "count": stdout}));
 | |
|                             } else {
 | |
|                                 event.reply(dbot.t("commitcountboring",{"count": stdout}));
 | |
|                             }
 | |
|                         });
 | |
|                     }
 | |
|                });
 | |
|             });
 | |
|         }
 | |
|     };
 | |
|     this.commands = commands;
 | |
| 
 | |
|     this.on = 'PRIVMSG';
 | |
| };
 | |
| 
 | |
| exports.fetch = function(dbot) {
 | |
|     return new github(dbot);
 | |
| };
 | 
