Add StackExchange integration

This commit is contained in:
Raphaël Pinson 2015-03-09 14:31:57 +01:00 committed by Lars Brinkhoff
parent 2fb5c72ec6
commit 900b482915
2 changed files with 51 additions and 0 deletions

View File

@ -14,6 +14,7 @@ console.log('http://[::1]:' + serverPort + '/try.html');
var domain = require('domain');
var request = require('request');
var fs = require('fs');
var zlib = require('zlib');
var LruCache = require('./lru-cache.js');
var badge = require('./badge.js');
var svg2img = require('./svg-to-img.js');
@ -4518,6 +4519,52 @@ cache(function(data, match, sendBadge, request) {
sendBadge(format, badgeData);
}));
// StackExchange integration.
camp.route(/^\/stackexchange\/([^\/]+)\/([^\/])\/([^\/]+)\.(svg|png|gif|jpg|json)$/,
cache(function(data, match, sendBadge, request) {
var site = match[1]; // eg, stackoverflow
var info = match[2]; // either `r`
var user = match[3]; // eg, 232250
var format = match[4];
var options = {
method: 'GET',
uri: 'https://api.stackexchange.com/2.2/users/'+user+'?site='+site,
encoding: null
}
var badgeData = getBadgeData(site, data);
request(options, function (err, res, buffer) {
if (err != null) {
badgeData.text[1] = 'inaccessible';
sendBadge(badgeData, format);
}
zlib.gunzip(buffer, function (err, body) {
try {
var data = JSON.parse(body.toString());
if (info === 'r') {
var reputation = data.items[0].reputation;
badgeData.text[1] = metric(reputation);
if (reputation === 0) {
badgeData.colorscheme = 'red';
} else if (reputation < 1000) {
badgeData.colorscheme = 'yellow';
} else if (reputation < 10000) {
badgeData.colorscheme = 'yellowgreen';
} else if (reputation < 20000) {
badgeData.colorscheme = 'green';
} else {
badgeData.colorscheme = 'brightgreen';
}
sendBadge(format, badgeData);
}
} catch (e) {
badgeData.text[1] = 'invalid';
sendBadge(format, badgeData);
}
});
})}
));
// Any badge.
camp.route(/^\/(:|badge\/)(([^-]|--)*?)-(([^-]|--)*)-(([^-]|--)+)\.(svg|png|gif|jpg)$/,
function(data, match, end, ask) {

View File

@ -742,6 +742,10 @@ Pixel-perfect &nbsp; Retina-ready &nbsp; Fast &nbsp; Consistent &nbsp; Hackable
<td><img src='/ansible/role/3078.svg' alt=''/></td>
<td><code>https://img.shields.io/ansible/role/3078.svg</code></td>
</tr>
<tr><th> StackExchange: </th>
<td><img src='/stackexchange/tex/r/951.svg' alt=''/></td>
<td><code>https://img.shields.io/stackexchange/tex/r/951.svg</code></td>
</tr>
</tbody></table>
<h2 id="your-badge"> Your Badge </h2>