Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
malwaredllc
GitHub Repository: malwaredllc/byob
Path: blob/master/web-gui/buildyourownbotnet/assets/js/jquery-terminal/scripts/contributors.js
1293 views
1
#!/usr/bin/env node
2
3
var https = require('https');
4
var path = require('path');
5
var fs = require('fs');
6
var argv = require('optimist').argv;
7
var request = require('request');
8
9
10
function split_equal(array, length) {
11
var result = [];
12
var len = array.length;
13
if (len < length) {
14
return [array];
15
} else if (length < 0) {
16
throw new Error("split_equal: length can't be negative");
17
}
18
for (var i = 0; i < len; i += length) {
19
result.push(array.slice(i, i + length));
20
}
21
return result;
22
}
23
24
function get(url, query) {
25
var options = {
26
url: url,
27
qs: query,
28
headers: {
29
'User-Agent': 'Node.js'
30
}
31
};
32
if (argv.auth) {
33
var [user,pass] = argv.auth.split(':');
34
options.auth = {
35
user,
36
pass
37
};
38
}
39
//return;
40
return new Promise(function(resolve, reject) {
41
request(options, function(error, res, body) {
42
if (res.statusCode == 200) {
43
resolve(JSON.parse(body));
44
} else if (+res.headers['x-ratelimit-remaining'] == 0) {
45
var date = new Date(+res.headers['x-ratelimit-reset']*1000);
46
reject('Rate limit util ' + date);
47
} else {
48
reject('Error code ' + res.statusCode);
49
}
50
});
51
});
52
}
53
54
function get_file(filename) {
55
return new Promise(function(resolve, reject) {
56
fs.readFile(filename, function(err, data) {
57
if (err) {
58
reject(err);
59
} else {
60
resolve(JSON.parse(data.toString()));
61
}
62
});
63
});
64
}
65
66
function get_api(argv) {
67
var user = argv.u;
68
var repo = argv.r;
69
var path = '/repos/' + user + '/' + repo + '/contributors';
70
var query = {
71
"per_page": 100
72
};
73
if (argv.t) {
74
query['access_token'] = argv.t;
75
}
76
return get('https://api.github.com' + path, query).then(function(contributors) {
77
return Promise.all(contributors.map(function(contributor) {
78
var path = contributor.url.replace(/https:\/\/[^\/]+/, '');
79
return get('https://api.github.com' + path, query).then(function(user) {
80
if (user.name || user.login) {
81
var object = {
82
name: user.name || user.login
83
};
84
if (user.email) {
85
object.email = user.email;
86
}
87
if (user.blog) {
88
object.url = user.blog;
89
} else {
90
object.url = "https://github.com/" + user.login
91
}
92
object.avatar = contributor.avatar_url;
93
object.login = user.login;
94
return object;
95
}
96
});
97
}).filter(Boolean));
98
});
99
}
100
101
102
if ((argv.f && argv.m) || (argv.u && argv.r)) {
103
(argv.f ? get_file(argv.f) : get_api(argv)).then(function(contributors) {
104
if (argv.m) {
105
var split = split_equal(contributors, 7);
106
var align = new Array(split[0].length + 1).join('| :---: ') + ' |';
107
var rows = split.map(function(list) {
108
return '| ' + list.map(function(contributor) {
109
return '[<img src="' + contributor.avatar + '" width="100px;"/>' +
110
'<br /><sub>' + contributor.name + '</sub>](' +
111
contributor.url + ')<br>[commits](https://github.com/jcubic' +
112
'/jquery.terminal/commits?author=' + contributor.login + ')';
113
}).join(' | ') + ' |';
114
});
115
rows.splice(1, 0, align);
116
console.log(rows.join('\n'));
117
} else {
118
console.log(JSON.stringify(contributors, null, 2));
119
}
120
}).catch(function(error) {
121
console.log('ERROR: ' + error);
122
});
123
} else {
124
var script = path.basename(process.argv[1]);
125
console.log('usage: \n' + script + '-u <user> -r <repo> ' +
126
'[--auth githubUsername:githubPassword] [-m]\n' +
127
script + ' -f <json filename> -m');
128
}
129
130