renders.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. var logging = require("../logging");
  2. var helpers = require("../helpers");
  3. var renders = require("../renders");
  4. var config = require("../../config");
  5. var cache = require("../cache");
  6. var skins = require("../skins");
  7. var path = require("path");
  8. var fs = require("fs");
  9. // valid types: head, body
  10. // helmet is query param
  11. function handle_default(rid, scale, helm, body, img_status, userId, size, def, req, err, callback) {
  12. def = def || skins.default_skin(userId);
  13. if (def !== "steve" && def !== "alex") {
  14. if (helpers.id_valid(def)) {
  15. // clean up the old URL to match new image
  16. var parsed = req.url;
  17. delete parsed.query["default"];
  18. delete parsed.search;
  19. parsed.pathname = parsed.pathname.replace(userId, def);
  20. var newUrl = url.format(parsed);
  21. callback({
  22. status: img_status,
  23. redirect: newUrl,
  24. err: err
  25. });
  26. } else {
  27. callback({
  28. status: img_status,
  29. redirect: def,
  30. err: err
  31. });
  32. }
  33. } else {
  34. // handle steve and alex
  35. fs.readFile(path.join(__dirname, "..", "public", "images", def + "_skin.png"), function (fs_err, buf) {
  36. // we render the default skins, but not custom images
  37. renders.draw_model(rid, buf, scale, helm, body, function(render_err, def_img) {
  38. callback({
  39. status: img_status,
  40. body: def_img,
  41. type: "image/png",
  42. hash: def,
  43. err: render_err || fs_err || err
  44. });
  45. });
  46. });
  47. }
  48. }
  49. // GET render request
  50. module.exports = function(req, callback) {
  51. var raw_type = (req.url.path_list[1] || "");
  52. var rid = req.id;
  53. var body = raw_type === "body";
  54. var userId = (req.url.path_list[2] || "").split(".")[0];
  55. var def = req.url.query.default;
  56. var scale = parseInt(req.url.query.scale) || config.renders.default_scale;
  57. var helm = req.url.query.hasOwnProperty("helm");
  58. // check for extra paths
  59. if (req.url.path_list.length > 3) {
  60. callback({
  61. status: -2,
  62. body: "Invalid URL Path"
  63. });
  64. return;
  65. }
  66. // validate type
  67. if (raw_type !== "body" && raw_type !== "head") {
  68. callback({
  69. status: -2,
  70. body: "Invalid Render Type"
  71. });
  72. return;
  73. }
  74. if (scale < config.renders.min_scale || scale > config.renders.max_scale) {
  75. callback({
  76. status: -2,
  77. body: "Invalid Scale"
  78. });
  79. return;
  80. } else if (!helpers.id_valid(userId)) {
  81. callback({
  82. status: -2,
  83. body: "Invalid UserID"
  84. });
  85. return;
  86. }
  87. // strip dashes
  88. userId = userId.replace(/-/g, "");
  89. try {
  90. helpers.get_render(rid, userId, scale, helm, body, function(err, status, hash, image) {
  91. if (err) {
  92. logging.error(rid, err);
  93. if (err.code === "ENOENT") {
  94. // no such file
  95. cache.remove_hash(rid, userId);
  96. }
  97. }
  98. if (image) {
  99. callback({
  100. status: status,
  101. body: image,
  102. type: "image/png",
  103. hash: hash,
  104. err: err
  105. });
  106. } else {
  107. logging.log(rid, "image not found, using default.");
  108. handle_default(rid, scale, helm, body, status, userId, scale, def, req, err, callback);
  109. }
  110. });
  111. } catch(e) {
  112. logging.error(rid, "error:", e.stack);
  113. handle_default(rid, scale, helm, body, -1, userId, scale, def, req, e, callback);
  114. }
  115. };