Browse Source

Cache caching for skins and renders'

Jake 10 năm trước cách đây
mục cha
commit
1c33119e05

+ 2 - 0
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

+ 2 - 1
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

+ 38 - 22
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);
+          });
+        }
+      });
     });
   });
 };

+ 21 - 0
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;

+ 11 - 0
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;

+ 10 - 0
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;

+ 0 - 0
skins/renders/.gitkeep


+ 0 - 0
skins/skins/.gitkeep


+ 2 - 1
views/index.jade

@@ -84,7 +84,8 @@ block content
           | #{domain}/renders/body/
           mark.green id
         | The <b>default</b> 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 <b>default</b> parameter.
         | Using the <b>helm</b> parameter is also allowed, which will be overlayed onto the head.
         | The <b>head</b> render type will return only a render of the skin's head, while the
         | <b>body</b> render will return a render of the entire skin.