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