From 1c33119e05fa1880238efb234b33ad12d2a59846 Mon Sep 17 00:00:00 2001 From: Jake Date: Sat, 6 Dec 2014 00:18:41 -0600 Subject: [PATCH] Cache caching for skins and renders' --- modules/config.example.js | 2 ++ modules/config.js | 3 +- modules/helpers.js | 60 +++++++++++++++++++++++++-------------- modules/networking.js | 21 ++++++++++++++ modules/renders.js | 11 +++++++ modules/skins.js | 10 +++++++ skins/renders/.gitkeep | 0 skins/skins/.gitkeep | 0 views/index.jade | 3 +- 9 files changed, 86 insertions(+), 24 deletions(-) create mode 100644 skins/renders/.gitkeep create mode 100644 skins/skins/.gitkeep diff --git a/modules/config.example.js b/modules/config.example.js index 37a8a56..ba58ec6 100644 --- a/modules/config.example.js +++ b/modules/config.example.js @@ -10,6 +10,8 @@ var config = { http_timeout: 1000, // ms until connection to mojang is dropped faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' + skins_dir: 'skins/skins/', // directory where skins are kept. should have trailing '/' + renders_dir: 'skins/renders', // Directory where rendered skins are kept. should have trailing '/' debug_enabled: false, // enables logging.debug default_scale: 6, // the scale of rendered avatars maximum_sale: 10 // the maximum scale of rendered avatars diff --git a/modules/config.js b/modules/config.js index e9eb39d..6a1aef8 100644 --- a/modules/config.js +++ b/modules/config.js @@ -8,9 +8,10 @@ var config = { cleaning_interval: 1800, // seconds interval: deleting images if disk size at limit cleaning_limit: 10240, // minumum required available KB on disk to trigger cleaning cleaning_amount: 50000, // amount of avatar (and their helm) files to clean - http_timeout: 1000, // ms until connection to mojang is dropped faces_dir: 'skins/faces/', // directory where faces are kept. should have trailing '/' helms_dir: 'skins/helms/', // directory where helms are kept. should have trailing '/' + skins_dir: 'skins/skins/', // directory where skins are kept. should have trailing '/' + renders_dir: 'skins/renders/', // Directory where rendered skins are kept. should have trailing '/' debug_enabled: true, // enables logging.debug default_scale: 6, // the scale of rendered avatars maximum_sale: 10 // the maximum scale of rendered avatars diff --git a/modules/helpers.js b/modules/helpers.js index 5964cdf..bf07cfe 100644 --- a/modules/helpers.js +++ b/modules/helpers.js @@ -160,19 +160,17 @@ exp.get_avatar = function(uuid, helm, size, callback) { exp.get_skin = function(uuid, callback) { logging.log(uuid + " skin request"); exp.get_image_hash(uuid, function(err, status, hash) { - if (hash) { - var skinurl = "http://textures.minecraft.net/texture/" + hash; - networking.get_skin(skinurl, function(err, img) { - if (err) { - logging.error("error while downloading skin"); - callback(err, hash, null); - } else { - callback(null, hash, img); - } + var skinpath = __dirname + "/../" + config.skins_dir + hash + ".png"; + if (fs.existsSync(skinpath)) { + logging.log("skin already exists, not downloading"); + skins.open_skin(hash, function(err, img) { + callback(err, hash, img); }); - } else { - callback(err, null, null); + return; } + networking.save_skin(uuid, hash, skinpath, function(err, img) { + callback(err, hash, img); + }); }); }; @@ -180,19 +178,37 @@ exp.get_skin = function(uuid, callback) { // callback contanis error, hash, image buffer exp.get_render = function(uuid, scale, helm, body, callback) { logging.log(uuid + " render request"); - exp.get_skin(uuid, function(err, hash, img) { - if (!img) { - callback(err, 0, hash, null); - return; - } - renders.draw_model(uuid, img, scale, helm, body, function(err, img) { - if (err) { + exp.get_image_hash(uuid, function(err, status, hash) { + exp.get_skin(uuid, function(err, hash, img) { + if (!hash) { callback(err, -1, hash, null); - } else if (!img) { - callback(null, 0, hash, null); - } else { - callback(null, 2, hash, img); + return; } + var renderpath = __dirname + "/../" + config.renders_dir + hash + "-" + scale + ".png"; + if (fs.existsSync(renderpath)) { + renders.open_render(hash, scale, function(err, img) { + callback(err, 1, hash, img); + }); + return; + } + if (!img) { + callback(err, 0, hash, null); + return; + } + renders.draw_model(uuid, img, scale, helm, body, function(err, img) { + if (err) { + callback(err, -1, hash, null); + } else if (!img) { + callback(null, 0, hash, null); + } else { + fs.writeFile(renderpath, img, 'binary', function(err){ + if (err) { + logging.log(err); + } + callback(null, 2, hash, img); + }); + } + }); }); }); }; diff --git a/modules/networking.js b/modules/networking.js index eec75d4..ec6bc75 100644 --- a/modules/networking.js +++ b/modules/networking.js @@ -141,4 +141,25 @@ exp.get_skin = function(url, callback) { }); }; +exp.save_skin = function(uuid, hash, outpath, callback) { + if (hash) { + var skinurl = "http://textures.minecraft.net/texture/" + hash; + exp.get_skin(skinurl, function(err, img) { + if (err) { + logging.error("error while downloading skin"); + callback(err, null); + } else { + fs.writeFile(outpath, img, 'binary', function(err){ + if (err) { + logging.log(err); + } + callback(null, img); + }) + } + }); + } else { + callback(null, null); + } +}; + module.exports = exp; \ No newline at end of file diff --git a/modules/renders.js b/modules/renders.js index ffa9e35..7660901 100644 --- a/modules/renders.js +++ b/modules/renders.js @@ -4,6 +4,8 @@ var helpers = require('./helpers'); var logging = require('./logging'); +var config = require('./config'); +var fs = require('fs'); var exp = {}; @@ -118,6 +120,15 @@ exp.draw_model = function(uuid, img, scale, helm, body, callback) { image.src = img; } +exp.open_render = function(hash, scale, callback) { + fs.readFile(__dirname + "/../" + config.renders_dir + hash + "-" + scale + ".png", function (err, buf) { + if (err) { + logging.error("error while opening skin file: " + err); + } + callback(err, buf); + }); +}; + function scale_image(imageData, context, d_x, d_y, scale) { var width = imageData.width; var height = imageData.height; diff --git a/modules/skins.js b/modules/skins.js index 0add75f..68b705b 100644 --- a/modules/skins.js +++ b/modules/skins.js @@ -1,6 +1,7 @@ var logging = require("./logging"); var lwip = require("lwip"); var fs = require("fs"); +var config = require("./config"); var exp = {}; @@ -93,4 +94,13 @@ exp.default_skin = function(uuid) { } }; +exp.open_skin = function(hash, callback) { + fs.readFile(__dirname + "/../" + config.skins_dir + hash + ".png", function (err, buf) { + if (err) { + logging.error("error while opening skin file: " + err); + } + callback(err, buf); + }); +}; + module.exports = exp; \ No newline at end of file diff --git a/skins/renders/.gitkeep b/skins/renders/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/skins/skins/.gitkeep b/skins/skins/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/views/index.jade b/views/index.jade index bf7aa9f..5cf2440 100644 --- a/views/index.jade +++ b/views/index.jade @@ -84,7 +84,8 @@ block content | #{domain}/renders/body/ mark.green id | The default parameter can also be used here. Using alex or steve will create a - | render with the same parameters. A custom image will not be rendered. + | render with the same parameters. A custom image will not be rendered. A UUID or username + | without a skin, will produce a render based on the input id, or the default parameter. | Using the helm parameter is also allowed, which will be overlayed onto the head. | The head render type will return only a render of the skin's head, while the | body render will return a render of the entire skin.