mirror of
https://github.com/azures04/crafatar.git
synced 2026-05-06 11:00:39 +02:00
❤️ eslint
This commit is contained in:
14
lib/cache.js
14
lib/cache.js
@@ -22,7 +22,7 @@ function connect_redis() {
|
||||
}
|
||||
redis.on("ready", function() {
|
||||
logging.log("Redis connection established.");
|
||||
if(process.env.HEROKU) {
|
||||
if (process.env.HEROKU) {
|
||||
logging.log("Running on heroku, flushing redis");
|
||||
redis.flushall();
|
||||
}
|
||||
@@ -43,7 +43,7 @@ function update_file_date(rid, skin_hash) {
|
||||
fs.exists(path, function(exists) {
|
||||
if (exists) {
|
||||
var date = new Date();
|
||||
fs.utimes(path, date, date, function(err){
|
||||
fs.utimes(path, date, date, function(err) {
|
||||
if (err) {
|
||||
logging.error(rid, "Error:", err.stack);
|
||||
}
|
||||
@@ -81,7 +81,7 @@ exp.info = function(callback) {
|
||||
}
|
||||
});
|
||||
obj.versions = [];
|
||||
if( obj.redis_version ){
|
||||
if (obj.redis_version) {
|
||||
obj.redis_version.split(".").forEach(function(num) {
|
||||
obj.versions.push(+num);
|
||||
});
|
||||
@@ -98,7 +98,7 @@ exp.info = function(callback) {
|
||||
// callback: error
|
||||
exp.update_timestamp = function(rid, userId, hash, temp, callback) {
|
||||
logging.log(rid, "cache: updating timestamp");
|
||||
sub = temp ? (config.local_cache_time - 60) : 0;
|
||||
var sub = temp ? (config.local_cache_time - 60) : 0;
|
||||
var time = new Date().getTime() - sub;
|
||||
// store userId in lower case if not null
|
||||
userId = userId && userId.toLowerCase();
|
||||
@@ -121,15 +121,15 @@ exp.save_hash = function(rid, userId, skin_hash, cape_hash, callback) {
|
||||
// store userId in lower case if not null
|
||||
userId = userId && userId.toLowerCase();
|
||||
if (skin_hash === undefined) {
|
||||
redis.hmset(userId, "c", cape_hash, "t", time, function(err){
|
||||
redis.hmset(userId, "c", cape_hash, "t", time, function(err) {
|
||||
callback(err);
|
||||
});
|
||||
} else if (cape_hash === undefined) {
|
||||
redis.hmset(userId, "s", skin_hash, "t", time, function(err){
|
||||
redis.hmset(userId, "s", skin_hash, "t", time, function(err) {
|
||||
callback(err);
|
||||
});
|
||||
} else {
|
||||
redis.hmset(userId, "s", skin_hash, "c", cape_hash, "t", time, function(err){
|
||||
redis.hmset(userId, "s", skin_hash, "c", cape_hash, "t", time, function(err) {
|
||||
callback(err);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
var logging = require("./logging");
|
||||
var config = require("./config");
|
||||
var cache = require("./cache");
|
||||
var path = require("path");
|
||||
var df = require("node-df");
|
||||
var fs = require("fs");
|
||||
|
||||
var redis = cache.get_redis();
|
||||
var exp = {};
|
||||
|
||||
// does nothing
|
||||
function nil() {}
|
||||
|
||||
// compares redis' used_memory with cleaning_redis_limit
|
||||
// callback: error, true|false
|
||||
function should_clean_redis(callback) {
|
||||
@@ -15,7 +19,7 @@ function should_clean_redis(callback) {
|
||||
callback(err, false);
|
||||
} else {
|
||||
try {
|
||||
//logging.debug(info.toString());
|
||||
// logging.debug(info.toString());
|
||||
logging.debug("used mem:" + info.used_memory);
|
||||
var used = parseInt(info.used_memory) / 1024;
|
||||
logging.log("RedisCleaner:", used + "KB used");
|
||||
@@ -31,7 +35,7 @@ function should_clean_redis(callback) {
|
||||
// callback: error, true|false
|
||||
function should_clean_disk(callback) {
|
||||
df({
|
||||
file: __dirname + "/../" + config.faces_dir,
|
||||
file: path.join(__dirname, "..", config.faces_dir),
|
||||
prefixMultiplier: "KiB",
|
||||
isDisplayPrefixMultiplier: false,
|
||||
precision: 2
|
||||
@@ -67,25 +71,29 @@ exp.run = function() {
|
||||
logging.error(err);
|
||||
} else if (clean) {
|
||||
logging.warn("DiskCleaner: Disk limit reached! Cleaning images now");
|
||||
var facesdir = __dirname + "/../" + config.faces_dir;
|
||||
var helmdir = __dirname + "/../" + config.helms_dir;
|
||||
var renderdir = __dirname + "/../" + config.renders_dir;
|
||||
var skindir = __dirname + "/../" + config.skins_dir;
|
||||
fs.readdir(facesdir, function (err, files) {
|
||||
for (var i = 0, l = Math.min(files.length, config.cleaning_amount); i < l; i++) {
|
||||
var filename = files[i];
|
||||
if (filename[0] !== ".") {
|
||||
fs.unlink(facesdir + filename, nil);
|
||||
fs.unlink(helmdir + filename, nil);
|
||||
fs.unlink(skindir + filename, nil);
|
||||
var facesdir = path.join(__dirname, "..", config.faces_dir);
|
||||
var helmdir = path.join(__dirname, "..", config.helms_dir);
|
||||
var renderdir = path.join(__dirname, "..", config.renders_dir);
|
||||
var skindir = path.join(__dirname, "..", config.skins_dir);
|
||||
fs.readdir(facesdir, function (readerr, files) {
|
||||
if (!readerr) {
|
||||
for (var i = 0, l = Math.min(files.length, config.cleaning_amount); i < l; i++) {
|
||||
var filename = files[i];
|
||||
if (filename[0] !== ".") {
|
||||
fs.unlink(path.join(facesdir, filename), nil);
|
||||
fs.unlink(path.join(helmdir, filename), nil);
|
||||
fs.unlink(path.join(skindir, filename), nil);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
fs.readdir(renderdir, function (err, files) {
|
||||
for (var j = 0, l = Math.min(files.length, config.cleaning_amount); j < l; j++) {
|
||||
var filename = files[j];
|
||||
if (filename[0] !== ".") {
|
||||
fs.unlink(renderdir + filename, nil);
|
||||
fs.readdir(renderdir, function (readerr, files) {
|
||||
if (!readerr) {
|
||||
for (var j = 0, l = Math.min(files.length, config.cleaning_amount); j < l; j++) {
|
||||
var filename = files[j];
|
||||
if (filename[0] !== ".") {
|
||||
fs.unlink(renderdir + filename, nil);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -95,6 +103,4 @@ exp.run = function() {
|
||||
});
|
||||
};
|
||||
|
||||
function nil () {}
|
||||
|
||||
module.exports = exp;
|
||||
module.exports = exp;
|
||||
@@ -22,4 +22,4 @@ var config = {
|
||||
log_time: true, // set to false if you use an external logger that provides timestamps
|
||||
};
|
||||
|
||||
module.exports = config;
|
||||
module.exports = config;
|
||||
105
lib/helpers.js
105
lib/helpers.js
@@ -1,9 +1,10 @@
|
||||
var networking = require("./networking");
|
||||
var logging = require("./logging");
|
||||
var renders = require("./renders");
|
||||
var config = require("./config");
|
||||
var cache = require("./cache");
|
||||
var skins = require("./skins");
|
||||
var renders = require("./renders");
|
||||
var path = require("path");
|
||||
var fs = require("fs");
|
||||
|
||||
// 0098cb60-fa8e-427c-b299-793cbd302c9a
|
||||
@@ -24,13 +25,13 @@ function store_skin(rid, userId, profile, cache_details, callback) {
|
||||
if (!err && url) {
|
||||
var skin_hash = get_hash(url);
|
||||
if (cache_details && cache_details.skin === skin_hash) {
|
||||
cache.update_timestamp(rid, userId, skin_hash, false, function(err) {
|
||||
callback(err, skin_hash);
|
||||
cache.update_timestamp(rid, userId, skin_hash, false, function(cache_err) {
|
||||
callback(cache_err, skin_hash);
|
||||
});
|
||||
} else {
|
||||
logging.log(rid, "new skin hash:", skin_hash);
|
||||
var facepath = __dirname + "/../" + config.faces_dir + skin_hash + ".png";
|
||||
var helmpath = __dirname + "/../" + config.helms_dir + skin_hash + ".png";
|
||||
var facepath = path.join(__dirname, "..", config.faces_dir, skin_hash + ".png");
|
||||
var helmpath = path.join(__dirname, "..", config.helms_dir, skin_hash + ".png");
|
||||
fs.exists(facepath, function(exists) {
|
||||
if (exists) {
|
||||
logging.log(rid, "skin already exists, not downloading");
|
||||
@@ -73,25 +74,25 @@ function store_cape(rid, userId, profile, cache_details, callback) {
|
||||
if (!err && url) {
|
||||
var cape_hash = get_hash(url);
|
||||
if (cache_details && cache_details.cape === cape_hash) {
|
||||
cache.update_timestamp(rid, userId, cape_hash, false, function(err) {
|
||||
callback(err, cape_hash);
|
||||
cache.update_timestamp(rid, userId, cape_hash, false, function(cache_err) {
|
||||
callback(cache_err, cape_hash);
|
||||
});
|
||||
} else {
|
||||
logging.log(rid, "new cape hash:", cape_hash);
|
||||
var capepath = __dirname + "/../" + config.capes_dir + cape_hash + ".png";
|
||||
var capepath = path.join(__dirname, "..", config.capes_dir, cape_hash + ".png");
|
||||
fs.exists(capepath, function(exists) {
|
||||
if (exists) {
|
||||
logging.log(rid, "cape already exists, not downloading");
|
||||
callback(null, cape_hash);
|
||||
} else {
|
||||
networking.get_from(rid, url, function(img, response, err) {
|
||||
if (err || !img) {
|
||||
logging.error(rid, err.stack);
|
||||
callback(err, null);
|
||||
networking.get_from(rid, url, function(img, response, net_err) {
|
||||
if (net_err || !img) {
|
||||
logging.error(rid, net_err.stack);
|
||||
callback(net_err, null);
|
||||
} else {
|
||||
skins.save_image(img, capepath, function(err) {
|
||||
skins.save_image(img, capepath, function(skin_err) {
|
||||
logging.debug(rid, "cape saved");
|
||||
callback(err, cape_hash);
|
||||
callback(skin_err, cape_hash);
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -171,23 +172,23 @@ function store_images(rid, userId, cache_details, type, callback) {
|
||||
}
|
||||
} else {
|
||||
// no error and we have a profile (if it's a uuid)
|
||||
store_skin(rid, userId, profile, cache_details, function(err, skin_hash) {
|
||||
if (err && !skin_hash) {
|
||||
store_skin(rid, userId, profile, cache_details, function(store_err, skin_hash) {
|
||||
if (store_err && !skin_hash) {
|
||||
// an error occured, not caching. we can try in 60 seconds
|
||||
callback_for(userId, "skin", err, null);
|
||||
callback_for(userId, "skin", store_err, null);
|
||||
} else {
|
||||
cache.save_hash(rid, userId, skin_hash, null, function(cache_err) {
|
||||
callback_for(userId, "skin", (err || cache_err), skin_hash);
|
||||
callback_for(userId, "skin", (store_err || cache_err), skin_hash);
|
||||
});
|
||||
}
|
||||
});
|
||||
store_cape(rid, userId, profile, cache_details, function(err, cape_hash) {
|
||||
if (err && !cape_hash) {
|
||||
store_cape(rid, userId, profile, cache_details, function(store_err, cape_hash) {
|
||||
if (store_err && !cape_hash) {
|
||||
// an error occured, not caching. we can try in 60 seconds
|
||||
callback_for(userId, "cape", (err), cape_hash);
|
||||
callback_for(userId, "cape", (store_err), cape_hash);
|
||||
} else {
|
||||
cache.save_hash(rid, userId, undefined, cape_hash, function(cache_err) {
|
||||
callback_for(userId, "cape", (err || cache_err), cape_hash);
|
||||
callback_for(userId, "cape", (store_err || cache_err), cape_hash);
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -217,7 +218,10 @@ exp.id_valid = function(userId) {
|
||||
// 3: "checked" - profile re-downloaded (was too old), but it has either not changed or has no skin
|
||||
exp.get_image_hash = function(rid, userId, type, callback) {
|
||||
cache.get_details(userId, function(err, cache_details) {
|
||||
var cached_hash = (cache_details !== null) ? (type === "skin" ? cache_details.skin : cache_details.cape) : null;
|
||||
var cached_hash = null;
|
||||
if (cache_details !== null) {
|
||||
cached_hash = type === "skin" ? cache_details.skin : cache_details.cape;
|
||||
}
|
||||
if (err) {
|
||||
callback(err, -1, null);
|
||||
} else {
|
||||
@@ -232,12 +236,12 @@ exp.get_image_hash = function(rid, userId, type, callback) {
|
||||
} else {
|
||||
logging.log(rid, "userId not cached");
|
||||
}
|
||||
store_images(rid, userId, cache_details, type, function(err, new_hash) {
|
||||
if (err) {
|
||||
store_images(rid, userId, cache_details, type, function(store_err, new_hash) {
|
||||
if (store_err) {
|
||||
// we might have a cached hash although an error occured
|
||||
// (e.g. Mojang servers not reachable, using outdated hash)
|
||||
cache.update_timestamp(rid, userId, cached_hash, true, function(err2) {
|
||||
callback(err2 || err, -1, cache_details && cached_hash);
|
||||
callback(err2 || store_err, -1, cache_details && cached_hash);
|
||||
});
|
||||
} else {
|
||||
var status = cache_details && (cached_hash === new_hash) ? 3 : 2;
|
||||
@@ -259,8 +263,8 @@ exp.get_image_hash = function(rid, userId, type, callback) {
|
||||
exp.get_avatar = function(rid, userId, helm, size, callback) {
|
||||
exp.get_image_hash(rid, userId, "skin", function(err, status, skin_hash) {
|
||||
if (skin_hash) {
|
||||
var facepath = __dirname + "/../" + config.faces_dir + skin_hash + ".png";
|
||||
var helmpath = __dirname + "/../" + config.helms_dir + skin_hash + ".png";
|
||||
var facepath = path.join(__dirname, "..", config.faces_dir, skin_hash + ".png");
|
||||
var helmpath = path.join(__dirname, "..", config.helms_dir, skin_hash + ".png");
|
||||
var filepath = facepath;
|
||||
fs.exists(helmpath, function(exists) {
|
||||
if (helm && exists) {
|
||||
@@ -285,16 +289,17 @@ exp.get_avatar = function(rid, userId, helm, size, callback) {
|
||||
// callback: error, skin hash, image buffer
|
||||
exp.get_skin = function(rid, userId, callback) {
|
||||
exp.get_image_hash(rid, userId, "skin", function(err, status, skin_hash) {
|
||||
var skinpath = __dirname + "/../" + config.skins_dir + skin_hash + ".png";
|
||||
// FIXME: err is not used / handled
|
||||
var skinpath = path.join(__dirname, "..", config.skins_dir, skin_hash + ".png");
|
||||
fs.exists(skinpath, function(exists) {
|
||||
if (exists) {
|
||||
logging.log(rid, "skin already exists, not downloading");
|
||||
skins.open_skin(rid, skinpath, function(err, img) {
|
||||
callback(err, skin_hash, img);
|
||||
skins.open_skin(rid, skinpath, function(skin_err, img) {
|
||||
callback(skin_err, skin_hash, img);
|
||||
});
|
||||
} else {
|
||||
networking.save_texture(rid, skin_hash, skinpath, function(err, response, img) {
|
||||
callback(err, skin_hash, img);
|
||||
networking.save_texture(rid, skin_hash, skinpath, function(net_err, response, img) {
|
||||
callback(net_err, skin_hash, img);
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -317,11 +322,11 @@ exp.get_render = function(rid, userId, scale, helm, body, callback) {
|
||||
callback(err, -1, skin_hash, null);
|
||||
return;
|
||||
}
|
||||
var renderpath = __dirname + "/../" + config.renders_dir + skin_hash + "-" + scale + "-" + get_type(helm, body) + ".png";
|
||||
var renderpath = path.join(__dirname, "..", config.renders_dir, [skin_hash, "-", scale, "-", get_type(helm, body)].join("-") + ".png");
|
||||
fs.exists(renderpath, function(exists) {
|
||||
if (exists) {
|
||||
renders.open_render(rid, renderpath, function(err, img) {
|
||||
callback(err, 1, skin_hash, img);
|
||||
renders.open_render(rid, renderpath, function(render_err, rendered_img) {
|
||||
callback(render_err, 1, skin_hash, rendered_img);
|
||||
});
|
||||
return;
|
||||
} else {
|
||||
@@ -329,15 +334,15 @@ exp.get_render = function(rid, userId, scale, helm, body, callback) {
|
||||
callback(err, 0, skin_hash, null);
|
||||
return;
|
||||
}
|
||||
renders.draw_model(rid, img, scale, helm, body, function(err, img) {
|
||||
if (err) {
|
||||
callback(err, -1, skin_hash, null);
|
||||
} else if (!img) {
|
||||
renders.draw_model(rid, img, scale, helm, body, function(draw_err, drawn_img) {
|
||||
if (draw_err) {
|
||||
callback(draw_err, -1, skin_hash, null);
|
||||
} else if (!drawn_img) {
|
||||
callback(null, 0, skin_hash, null);
|
||||
} else {
|
||||
fs.writeFile(renderpath, img, "binary", function(err) {
|
||||
if (err) {
|
||||
logging.error(rid, err.stack);
|
||||
fs.writeFile(renderpath, drawn_img, "binary", function(fs_err) {
|
||||
if (fs_err) {
|
||||
logging.error(rid, fs_err.stack);
|
||||
}
|
||||
callback(null, 2, skin_hash, img);
|
||||
});
|
||||
@@ -356,19 +361,19 @@ exp.get_cape = function(rid, userId, callback) {
|
||||
callback(err, null, null);
|
||||
return;
|
||||
}
|
||||
var capepath = __dirname + "/../" + config.capes_dir + cape_hash + ".png";
|
||||
var capepath = path.join(__dirname, "..", config.capes_dir, cape_hash + ".png");
|
||||
fs.exists(capepath, function(exists) {
|
||||
if (exists) {
|
||||
logging.log(rid, "cape already exists, not downloading");
|
||||
skins.open_skin(rid, capepath, function(err, img) {
|
||||
callback(err, cape_hash, img);
|
||||
skins.open_skin(rid, capepath, function(skin_err, img) {
|
||||
callback(skin_err, cape_hash, img);
|
||||
});
|
||||
} else {
|
||||
networking.save_texture(rid, cape_hash, capepath, function(err, response, img) {
|
||||
networking.save_texture(rid, cape_hash, capepath, function(net_err, response, img) {
|
||||
if (response && response.statusCode === 404) {
|
||||
callback(err, cape_hash, null);
|
||||
callback(net_err, cape_hash, null);
|
||||
} else {
|
||||
callback(err, cape_hash, img);
|
||||
callback(net_err, cape_hash, img);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -376,4 +381,4 @@ exp.get_cape = function(rid, userId, callback) {
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = exp;
|
||||
module.exports = exp;
|
||||
@@ -39,7 +39,7 @@ if (config.debug_enabled || process.env.DEBUG === "true") {
|
||||
log("DEBUG", arguments);
|
||||
};
|
||||
} else {
|
||||
exp.debug = function(){};
|
||||
exp.debug = function() {};
|
||||
}
|
||||
|
||||
module.exports = exp;
|
||||
@@ -29,16 +29,31 @@ function extract_url(profile, type) {
|
||||
return url;
|
||||
}
|
||||
|
||||
// helper method that calls `get_username_url` or `get_uuid_url` based on the +usedId+
|
||||
// +userId+ is used for usernames, while +profile+ is used for UUIDs
|
||||
function get_url(rid, userId, profile, type, callback) {
|
||||
if (userId.length <= 16) {
|
||||
// username
|
||||
exp.get_username_url(rid, userId, type, function(err, url) {
|
||||
callback(err, url || null);
|
||||
});
|
||||
} else {
|
||||
exp.get_uuid_url(profile, type, function(url) {
|
||||
callback(null, url || null);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// exracts the skin URL of a +profile+ object
|
||||
// returns null when no URL found (user has no skin)
|
||||
exp.extract_skin_url = function(profile) {
|
||||
return extract_url(profile, 'SKIN');
|
||||
return extract_url(profile, "SKIN");
|
||||
};
|
||||
|
||||
// exracts the cape URL of a +profile+ object
|
||||
// returns null when no URL found (user has no cape)
|
||||
exp.extract_cape_url = function(profile) {
|
||||
return extract_url(profile, 'CAPE');
|
||||
return extract_url(profile, "CAPE");
|
||||
};
|
||||
|
||||
// performs a GET request to the +url+
|
||||
@@ -99,7 +114,11 @@ exp.get_from = function(rid, url, callback) {
|
||||
exp.get_username_url = function(rid, name, type, callback) {
|
||||
exp.get_from(rid, mojang_urls[type] + name + ".png", function(body, response, err) {
|
||||
if (!err) {
|
||||
callback(err, response ? (response.statusCode === 404 ? null : response.headers.location) : null);
|
||||
if (response) {
|
||||
callback(err, response.statusCode === 404 ? null : response.headers.location);
|
||||
} else {
|
||||
callback(err, null);
|
||||
}
|
||||
} else {
|
||||
callback(err, null);
|
||||
}
|
||||
@@ -146,21 +165,6 @@ exp.get_cape_url = function(rid, userId, profile, callback) {
|
||||
});
|
||||
};
|
||||
|
||||
// helper method that calls `get_username_url` or `get_uuid_url` based on the +usedId+
|
||||
// +userId+ is used for usernames, while +profile+ is used for UUIDs
|
||||
function get_url(rid, userId, profile, type, callback) {
|
||||
if (userId.length <= 16) {
|
||||
//username
|
||||
exp.get_username_url(rid, userId, type, function(err, url) {
|
||||
callback(err, url || null);
|
||||
});
|
||||
} else {
|
||||
exp.get_uuid_url(profile, type, function(url) {
|
||||
callback(null, url || null);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// download the +tex_hash+ image from the texture server
|
||||
// and save it in the +outpath+ file
|
||||
// callback: error, response, image buffer
|
||||
@@ -172,11 +176,11 @@ exp.save_texture = function(rid, tex_hash, outpath, callback) {
|
||||
logging.error(rid, "error while downloading texture");
|
||||
callback(err, response, null);
|
||||
} else {
|
||||
fs.writeFile(outpath, img, "binary", function(err) {
|
||||
if (err) {
|
||||
logging.error(rid, "error:", err.stack);
|
||||
fs.writeFile(outpath, img, "binary", function(fs_err) {
|
||||
if (fs_err) {
|
||||
logging.error(rid, "error:", fs_err.stack);
|
||||
}
|
||||
callback(err, response, img);
|
||||
callback(fs_err, response, img);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
215
lib/renders.js
215
lib/renders.js
@@ -8,34 +8,50 @@ var Canvas = require("canvas");
|
||||
var Image = Canvas.Image;
|
||||
var exp = {};
|
||||
|
||||
// scales an image from the +imagedata+ onto the +context+
|
||||
// scaled by a factor of +scale+ with options +d_x+ and +d_y+
|
||||
function scale_image(imageData, context, d_x, d_y, scale) {
|
||||
var width = imageData.width;
|
||||
var height = imageData.height;
|
||||
context.clearRect(0, 0, width, height); // Clear the spot where it originated from
|
||||
for (var y = 0; y < height; y++) { // height original
|
||||
for (var x = 0; x < width; x++) { // width original
|
||||
// Gets original colour, then makes a scaled square of the same colour
|
||||
var index = (x + y * width) * 4;
|
||||
context.fillStyle = "rgba(" + imageData.data[index + 0] + ", " + imageData.data[index + 1] + ", " + imageData.data[index + 2] + ", " + imageData.data[index + 3] + ")";
|
||||
context.fillRect(d_x + x * scale, d_y + y * scale, scale, scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// draws the helmet on to the +skin_canvas+
|
||||
// using the skin from the +model_ctx+ at the +scale+
|
||||
exp.draw_helmet = function(skin_canvas, model_ctx, scale) {
|
||||
//Helmet - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 40*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale);
|
||||
//Helmet - Right
|
||||
model_ctx.setTransform(1,0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 32*scale, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale);
|
||||
//Helmet - Top
|
||||
model_ctx.setTransform(-1,0.5,1,0.5,0,0);
|
||||
model_ctx.scale(-1,1);
|
||||
model_ctx.drawImage(skin_canvas, 40*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale);
|
||||
// Helmet - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 40 * scale, 8 * scale, 8 * scale, 8 * scale, 10 * scale, 13 / 1.2 * scale, 8 * scale, 8 * scale);
|
||||
// Helmet - Right
|
||||
model_ctx.setTransform(1, 0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 32 * scale, 8 * scale, 8 * scale, 8 * scale, 2 * scale, 3 / 1.2 * scale, 8 * scale, 8 * scale);
|
||||
// Helmet - Top
|
||||
model_ctx.setTransform(-1, 0.5, 1, 0.5, 0, 0);
|
||||
model_ctx.scale(-1, 1);
|
||||
model_ctx.drawImage(skin_canvas, 40 * scale, 0, 8 * scale, 8 * scale, -3 * scale, 5 * scale, 8 * scale, 8 * scale);
|
||||
};
|
||||
|
||||
// draws the head on to the +skin_canvas+
|
||||
// using the skin from the +model_ctx+ at the +scale+
|
||||
exp.draw_head = function(skin_canvas, model_ctx, scale) {
|
||||
//Head - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 8*scale, 8*scale, 8*scale, 8*scale, 10*scale, 13/1.2*scale, 8*scale, 8*scale);
|
||||
//Head - Right
|
||||
model_ctx.setTransform(1,0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 0, 8*scale, 8*scale, 8*scale, 2*scale, 3/1.2*scale, 8*scale, 8*scale);
|
||||
//Head - Top
|
||||
model_ctx.setTransform(-1,0.5,1,0.5,0,0);
|
||||
model_ctx.scale(-1,1);
|
||||
model_ctx.drawImage(skin_canvas, 8*scale, 0, 8*scale, 8*scale, -3*scale, 5*scale, 8*scale, 8*scale);
|
||||
// Head - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 8 * scale, 8 * scale, 8 * scale, 8 * scale, 10 * scale, 13 / 1.2 * scale, 8 * scale, 8 * scale);
|
||||
// Head - Right
|
||||
model_ctx.setTransform(1, 0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 0, 8 * scale, 8 * scale, 8 * scale, 2 * scale, 3 / 1.2 * scale, 8 * scale, 8 * scale);
|
||||
// Head - Top
|
||||
model_ctx.setTransform(-1, 0.5, 1, 0.5, 0, 0);
|
||||
model_ctx.scale(-1, 1);
|
||||
model_ctx.drawImage(skin_canvas, 8 * scale, 0, 8 * scale, 8 * scale, -3 * scale, 5 * scale, 8 * scale, 8 * scale);
|
||||
};
|
||||
|
||||
// draws the body on to the +skin_canvas+
|
||||
@@ -44,84 +60,84 @@ exp.draw_head = function(skin_canvas, model_ctx, scale) {
|
||||
exp.draw_body = function(rid, skin_canvas, model_ctx, scale) {
|
||||
if (skin_canvas.height === 32 * scale) {
|
||||
logging.debug(rid, "uses old skin format");
|
||||
//Left Leg
|
||||
//Left Leg - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.scale(-1,1);
|
||||
model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, -16*scale, 34.4/1.2*scale, 4*scale, 12*scale);
|
||||
// Left Leg
|
||||
// Left Leg - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.scale(-1, 1);
|
||||
model_ctx.drawImage(skin_canvas, 4 * scale, 20 * scale, 4 * scale, 12 * scale, -16 * scale, 34.4 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
|
||||
//Right Leg
|
||||
//Right Leg - Right
|
||||
model_ctx.setTransform(1,0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 0*scale, 20*scale, 4*scale, 12*scale, 4*scale, 26.4/1.2*scale, 4*scale, 12*scale);
|
||||
//Right Leg - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, 8*scale, 34.4/1.2*scale, 4*scale, 12*scale);
|
||||
// Right Leg
|
||||
// Right Leg - Right
|
||||
model_ctx.setTransform(1, 0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 0 * scale, 20 * scale, 4 * scale, 12 * scale, 4 * scale, 26.4 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
// Right Leg - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 4 * scale, 20 * scale, 4 * scale, 12 * scale, 8 * scale, 34.4 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
|
||||
//Arm Left
|
||||
//Arm Left - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.scale(-1,1);
|
||||
model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, -20*scale, 20/1.2*scale, 4*scale, 12*scale);
|
||||
//Arm Left - Top
|
||||
model_ctx.setTransform(-1,0.5,1,0.5,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, 0, 16*scale, 4*scale, 4*scale);
|
||||
// Arm Left
|
||||
// Arm Left - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.scale(-1, 1);
|
||||
model_ctx.drawImage(skin_canvas, 44 * scale, 20 * scale, 4 * scale, 12 * scale, -20 * scale, 20 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
// Arm Left - Top
|
||||
model_ctx.setTransform(-1, 0.5, 1, 0.5, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 44 * scale, 16 * scale, 4 * scale, 4 * scale, 0, 16 * scale, 4 * scale, 4 * scale);
|
||||
|
||||
//Body
|
||||
//Body - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 20*scale, 20*scale, 8*scale, 12*scale, 8*scale, 20/1.2*scale, 8*scale, 12*scale);
|
||||
// Body
|
||||
// Body - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 20 * scale, 20 * scale, 8 * scale, 12 * scale, 8 * scale, 20 / 1.2 * scale, 8 * scale, 12 * scale);
|
||||
|
||||
//Arm Right
|
||||
//Arm Right - Right
|
||||
model_ctx.setTransform(1,0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 40*scale, 20*scale, 4*scale, 12*scale, 0, 16/1.2*scale, 4*scale, 12*scale);
|
||||
//Arm Right - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, 4*scale, 20/1.2*scale, 4*scale, 12*scale);
|
||||
//Arm Right - Top
|
||||
model_ctx.setTransform(-1,0.5,1,0.5,0,0);
|
||||
model_ctx.scale(-1,1);
|
||||
model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale);
|
||||
// Arm Right
|
||||
// Arm Right - Right
|
||||
model_ctx.setTransform(1, 0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 40 * scale, 20 * scale, 4 * scale, 12 * scale, 0, 16 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
// Arm Right - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 44 * scale, 20 * scale, 4 * scale, 12 * scale, 4 * scale, 20 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
// Arm Right - Top
|
||||
model_ctx.setTransform(-1, 0.5, 1, 0.5, 0, 0);
|
||||
model_ctx.scale(-1, 1);
|
||||
model_ctx.drawImage(skin_canvas, 44 * scale, 16 * scale, 4 * scale, 4 * scale, -16 * scale, 16 * scale, 4 * scale, 4 * scale);
|
||||
} else {
|
||||
logging.debug(rid, "uses new skin format");
|
||||
//Left Leg
|
||||
//Left Leg - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 20*scale, 52*scale, 4*scale, 12*scale, 12*scale, 34.4/1.2*scale, 4*scale, 12*scale);
|
||||
// Left Leg
|
||||
// Left Leg - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 20 * scale, 52 * scale, 4 * scale, 12 * scale, 12 * scale, 34.4 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
|
||||
//Right Leg
|
||||
//Right Leg - Right
|
||||
model_ctx.setTransform(1,0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 0, 20*scale, 4*scale, 12*scale, 4*scale, 26.4/1.2*scale, 4*scale, 12*scale);
|
||||
//Right Leg - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 4*scale, 20*scale, 4*scale, 12*scale, 8*scale, 34.4/1.2*scale, 4*scale, 12*scale);
|
||||
// Right Leg
|
||||
// Right Leg - Right
|
||||
model_ctx.setTransform(1, 0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 0, 20 * scale, 4 * scale, 12 * scale, 4 * scale, 26.4 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
// Right Leg - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 4 * scale, 20 * scale, 4 * scale, 12 * scale, 8 * scale, 34.4 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
|
||||
//Arm Left
|
||||
//Arm Left - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 36*scale, 52*scale, 4*scale, 12*scale, 16*scale, 20/1.2*scale, 4*scale, 12*scale);
|
||||
//Arm Left - Top
|
||||
model_ctx.setTransform(-1,0.5,1,0.5,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 36*scale, 48*scale, 4*scale, 4*scale, 0, 16*scale, 4*scale, 4*scale);
|
||||
// Arm Left
|
||||
// Arm Left - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 36 * scale, 52 * scale, 4 * scale, 12 * scale, 16 * scale, 20 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
// Arm Left - Top
|
||||
model_ctx.setTransform(-1, 0.5, 1, 0.5, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 36 * scale, 48 * scale, 4 * scale, 4 * scale, 0, 16 * scale, 4 * scale, 4 * scale);
|
||||
|
||||
//Body
|
||||
//Body - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 20*scale, 20*scale, 8*scale, 12*scale, 8*scale, 20/1.2*scale, 8*scale, 12*scale);
|
||||
// Body
|
||||
// Body - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 20 * scale, 20 * scale, 8 * scale, 12 * scale, 8 * scale, 20 / 1.2 * scale, 8 * scale, 12 * scale);
|
||||
|
||||
//Arm Right
|
||||
//Arm Right - Right
|
||||
model_ctx.setTransform(1,0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 40*scale, 20*scale, 4*scale, 12*scale, 0, 16/1.2*scale, 4*scale, 12*scale);
|
||||
//Arm Right - Front
|
||||
model_ctx.setTransform(1,-0.5,0,1.2,0,0);
|
||||
model_ctx.drawImage(skin_canvas, 44*scale, 20*scale, 4*scale, 12*scale, 4*scale, 20/1.2*scale, 4*scale, 12*scale);
|
||||
//Arm Right - Top
|
||||
model_ctx.setTransform(-1,0.5,1,0.5,0,0);
|
||||
model_ctx.scale(-1,1);
|
||||
model_ctx.drawImage(skin_canvas, 44*scale, 16*scale, 4*scale, 4*scale, -16*scale, 16*scale, 4*scale, 4*scale);
|
||||
// Arm Right
|
||||
// Arm Right - Right
|
||||
model_ctx.setTransform(1, 0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 40 * scale, 20 * scale, 4 * scale, 12 * scale, 0, 16 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
// Arm Right - Front
|
||||
model_ctx.setTransform(1, -0.5, 0, 1.2, 0, 0);
|
||||
model_ctx.drawImage(skin_canvas, 44 * scale, 20 * scale, 4 * scale, 12 * scale, 4 * scale, 20 / 1.2 * scale, 4 * scale, 12 * scale);
|
||||
// Arm Right - Top
|
||||
model_ctx.setTransform(-1, 0.5, 1, 0.5, 0, 0);
|
||||
model_ctx.scale(-1, 1);
|
||||
model_ctx.drawImage(skin_canvas, 44 * scale, 16 * scale, 4 * scale, 4 * scale, -16 * scale, 16 * scale, 4 * scale, 4 * scale);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -146,9 +162,9 @@ exp.draw_model = function(rid, img, scale, helm, body, callback) {
|
||||
var model_ctx = model_canvas.getContext("2d");
|
||||
var skin_ctx = skin_canvas.getContext("2d");
|
||||
|
||||
skin_ctx.drawImage(image,0,0,64,original_height);
|
||||
//Scale it
|
||||
scale_image(skin_ctx.getImageData(0,0,64,original_height), skin_ctx, 0, 0, scale);
|
||||
skin_ctx.drawImage(image, 0, 0, 64, original_height);
|
||||
// Scale it
|
||||
scale_image(skin_ctx.getImageData(0, 0, 64, original_height), skin_ctx, 0, 0, scale);
|
||||
if (body) {
|
||||
exp.draw_body(rid, skin_canvas, model_ctx, scale);
|
||||
}
|
||||
@@ -179,20 +195,5 @@ exp.open_render = function(rid, renderpath, callback) {
|
||||
});
|
||||
};
|
||||
|
||||
// scales an image from the +imagedata+ onto the +context+
|
||||
// scaled by a factor of +scale+ with options +d_x+ and +d_y+
|
||||
function scale_image(imageData, context, d_x, d_y, scale) {
|
||||
var width = imageData.width;
|
||||
var height = imageData.height;
|
||||
context.clearRect(0,0,width,height); //Clear the spot where it originated from
|
||||
for(var y = 0; y < height; y++) { // height original
|
||||
for(var x = 0; x < width; x++) { // width original
|
||||
//Gets original colour, then makes a scaled square of the same colour
|
||||
var index = (x + y * width) * 4;
|
||||
context.fillStyle = "rgba(" + imageData.data[index+0] + "," + imageData.data[index+1] + "," + imageData.data[index+2] + "," + imageData.data[index+3] + ")";
|
||||
context.fillRect(d_x + x*scale, d_y + y*scale, scale, scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = exp;
|
||||
module.exports = exp;
|
||||
48
lib/skins.js
48
lib/skins.js
@@ -14,9 +14,9 @@ exp.extract_face = function(buffer, outname, callback) {
|
||||
} else {
|
||||
image.batch()
|
||||
.crop(8, 8, 15, 15) // face
|
||||
.writeFile(outname, function(err) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
.writeFile(outname, function(write_err) {
|
||||
if (write_err) {
|
||||
callback(write_err);
|
||||
} else {
|
||||
callback(null);
|
||||
}
|
||||
@@ -34,23 +34,25 @@ exp.extract_helm = function(rid, facefile, buffer, outname, callback) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
} else {
|
||||
lwip.open(facefile, function(err, face_img) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
lwip.open(facefile, function(open_err, face_img) {
|
||||
if (open_err) {
|
||||
callback(open_err);
|
||||
} else {
|
||||
face_img.toBuffer("png", { compression: "none" }, function(err, face_buffer) {
|
||||
skin_img.crop(40, 8, 47, 15, function(err, helm_img) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
face_img.toBuffer("png", { compression: "none" }, function(buf_err, face_buffer) {
|
||||
// FIXME: buf_err is not handled
|
||||
skin_img.crop(40, 8, 47, 15, function(crop_err, helm_img) {
|
||||
if (crop_err) {
|
||||
callback(crop_err);
|
||||
} else {
|
||||
face_img.paste(0, 0, helm_img, function(err, face_helm_img) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
face_img.paste(0, 0, helm_img, function(img_err, face_helm_img) {
|
||||
if (img_err) {
|
||||
callback(img_err);
|
||||
} else {
|
||||
face_helm_img.toBuffer("png", {compression: "none"}, function(err, face_helm_buffer) {
|
||||
face_helm_img.toBuffer("png", {compression: "none"}, function(buf_err2, face_helm_buffer) {
|
||||
// FIXME: buf_err2 is not handled
|
||||
if (face_helm_buffer.toString() !== face_buffer.toString()) {
|
||||
face_helm_img.writeFile(outname, function(err) {
|
||||
callback(err);
|
||||
face_helm_img.writeFile(outname, function(write_err) {
|
||||
callback(write_err);
|
||||
});
|
||||
} else {
|
||||
logging.log(rid, "helm img == face img, not storing!");
|
||||
@@ -77,7 +79,8 @@ exp.resize_img = function(inname, size, callback) {
|
||||
} else {
|
||||
image.batch()
|
||||
.resize(size, size, "nearest-neighbor") // nearest-neighbor doesn't blur
|
||||
.toBuffer("png", function(err, buffer) {
|
||||
.toBuffer("png", function(buf_err, buffer) {
|
||||
// FIXME: buf_err is not handled
|
||||
callback(null, buffer);
|
||||
});
|
||||
}
|
||||
@@ -96,11 +99,11 @@ exp.default_skin = function(uuid) {
|
||||
// that can be compacted to counting the LSBs of every 4th byte in the UUID
|
||||
// an odd sum means alex, an even sum means steve
|
||||
// XOR-ing all the LSBs gives us 1 for alex and 0 for steve
|
||||
var lsbs_even = parseInt(uuid[07], 16) ^
|
||||
var lsbs_even = parseInt(uuid[ 7], 16) ^
|
||||
parseInt(uuid[15], 16) ^
|
||||
parseInt(uuid[23], 16) ^
|
||||
parseInt(uuid[31], 16);
|
||||
return lsbs_even ? "alex" : "steve";
|
||||
return lsbs_even ? "alex" : "steve";
|
||||
}
|
||||
};
|
||||
|
||||
@@ -120,14 +123,15 @@ exp.open_skin = function(rid, skinpath, callback) {
|
||||
// write the image +buffer+ to the +outpath+ file
|
||||
// callback: error
|
||||
exp.save_image = function(buffer, outpath, callback) {
|
||||
logging.error("outpath:" + outpath);
|
||||
lwip.open(buffer, "png", function(err, image) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
} else {
|
||||
image.batch()
|
||||
.writeFile(outpath, function(err) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
.writeFile(outpath, function(write_err) {
|
||||
if (write_err) {
|
||||
callback(write_err);
|
||||
} else {
|
||||
callback(null);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
var logging = require ("../lib/logging");
|
||||
var logging = require("../lib/logging");
|
||||
var cleaner = require("../lib/cleaner");
|
||||
var config = require("../lib/config");
|
||||
var cluster = require("cluster");
|
||||
|
||||
Reference in New Issue
Block a user