This commit is contained in:
jomo 2014-10-19 23:32:13 +02:00
commit adea3320bc
4 changed files with 73 additions and 69 deletions

4
app.js
View File

@ -14,8 +14,7 @@ var app = express();
app.set('views', path.join(__dirname, 'views')); app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade'); app.set('view engine', 'jade');
// uncomment after placing your favicon in /public app.use(favicon(__dirname + '/public/favicon.ico'));
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev')); app.use(logger('dev'));
app.use(bodyParser.json()); app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.urlencoded({ extended: false }));
@ -25,6 +24,7 @@ app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes); app.use('/', routes);
app.use('/avatars', avatars); app.use('/avatars', avatars);
// catch 404 and forward to error handler // catch 404 and forward to error handler
app.use(function(req, res, next) { app.use(function(req, res, next) {
var err = new Error('Not Found'); var err = new Error('Not Found');

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -9,6 +9,10 @@ var valid_uuid = /^[0-9a-f]{32}$/;
router.get('/:uuid/:size?', function(req, res) { router.get('/:uuid/:size?', function(req, res) {
var uuid = req.param('uuid'); var uuid = req.param('uuid');
var size = req.param('size') || 180; var size = req.param('size') || 180;
// Add temporary restriction to prevent app from crashing
if (size <= 0) {
size = 180;
}
console.log(uuid); console.log(uuid);
if (valid_uuid.test(uuid)) { if (valid_uuid.test(uuid)) {
var filename = uuid + ".png"; var filename = uuid + ".png";

134
skins.js
View File

@ -10,78 +10,78 @@ var lwip = require('lwip');
*/ */
function extract_face(inname, outname, callback) { function extract_face(inname, outname, callback) {
var outfile = fs.createWriteStream(outname); var outfile = fs.createWriteStream(outname);
lwip.open(inname, function(err, image) { lwip.open(inname, function(err, image) {
image.batch() image.batch()
.crop(8, 8, 15, 15) .crop(8, 8, 15, 15)
.writeFile(outname, function(err) { .writeFile(outname, function(err) {
callback(); callback();
}); });
}); });
} }
module.exports = { module.exports = {
get_profile: function(uuid, callback) { get_profile: function(uuid, callback) {
https.get("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid, function(res) { https.get("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid, function(res) {
if (res.statusCode == "204") { if (res.statusCode == "204") {
callback(null); callback(null);
return null; return null;
} }
res.on('data', function(d) { res.on('data', function(d) {
var profile = JSON.parse(d); var profile = JSON.parse(d);
if (profile.error) { if (profile.error) {
console.error(profile.error); console.error(profile.error);
callback(null); callback(null);
} else { } else {
callback(profile); callback(profile);
} }
}); });
}).on('error', function(e) { }).on('error', function(e) {
console.error(e); console.error(e);
}); });
}, },
skin_url: function(profile) { skin_url: function(profile) {
var url = null; var url = null;
if (profile && profile.properties) { if (profile && profile.properties) {
profile.properties.forEach(function(prop) { profile.properties.forEach(function(prop) {
if (prop.name == 'textures') { if (prop.name == 'textures') {
var json = Buffer(prop.value, 'base64').toString(); var json = Buffer(prop.value, 'base64').toString();
var props = JSON.parse(json); var props = JSON.parse(json);
url = props.textures.SKIN.url; url = props.textures.SKIN.url;
} }
}); });
} }
return url; return url;
}, },
skin_file: function(url, filename, callback) { skin_file: function(url, filename, callback) {
var tmpname = "skins/tmp/" + filename; var tmpname = "skins/tmp/" + filename;
var outname = "skins/" + filename; var outname = "skins/" + filename;
var tmpfile = fs.createWriteStream(tmpname); var tmpfile = fs.createWriteStream(tmpname);
http.get(url, function(res) { http.get(url, function(res) {
res.on('data', function(data) { res.on('data', function(data) {
tmpfile.write(data); tmpfile.write(data);
}).on('end', function() { }).on('end', function() {
tmpfile.end(); tmpfile.end();
extract_face(tmpname, outname, function() { extract_face(tmpname, outname, function() {
fs.unlink(tmpname, function(err) { // unlink = delete fs.unlink(tmpname, function(err) { // unlink = delete
if (err) console.error(err); if (err) console.error(err);
}); });
callback(); // outside unlink callback cause we don't have to wait until it's deleted callback(); // outside unlink callback cause we don't have to wait until it's deleted
}); });
}); });
}); });
}, },
resize_img: function(inname, size, callback) { resize_img: function(inname, size, callback) {
lwip.open("skins/" + inname, function(err, image) { lwip.open("skins/" + inname, function(err, image) {
image.batch() image.batch()
.resize(size, size, "nearest-neighbor") // nearest-neighbor doesn't blur .resize(size, size, "nearest-neighbor") // nearest-neighbor doesn't blur
.toBuffer('png', function(err, buffer) { .toBuffer('png', function(err, buffer) {
callback(buffer); callback(buffer);
}); });
}); });
} }
}; };