avatars.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. var helpers = require('../modules/helpers');
  2. var router = require('express').Router();
  3. var config = require('../modules/config');
  4. var skins = require('../modules/skins');
  5. /* GET avatar request. */
  6. router.get('/:uuid', function(req, res) {
  7. var uuid = req.params.uuid;
  8. var size = req.query.size || config.default_size;
  9. var def = req.query.default;
  10. var helm = req.query.hasOwnProperty('helm');
  11. var start = new Date();
  12. // Prevent app from crashing/freezing
  13. if (size <= config.min_size || size > config.max_size) {
  14. // "Unprocessable Entity", valid request, but semantically erroneous:
  15. // https://tools.ietf.org/html/rfc4918#page-78
  16. res.status(422).send("422 Invalid size");
  17. return;
  18. } else if (!helpers.uuid_valid(uuid)) {
  19. res.status(422).send("422 Invalid UUID");
  20. return;
  21. }
  22. try {
  23. helpers.get_avatar(uuid, helm, size, function(err, status, image) {
  24. console.log(uuid + " - " + status);
  25. if (err) {
  26. console.error(err);
  27. if (image) {
  28. console.warn("error occured, image found anyway");
  29. sendimage(200, status, image);
  30. } else {
  31. handle_404(def);
  32. }
  33. } else if (status == 1 || status == 2) {
  34. sendimage(200, status == 1, image);
  35. } else if (status == 3) {
  36. handle_404(def);
  37. } else {
  38. console.error("unexpected error/status");
  39. console.error("error: " + err);
  40. console.error("status: " + status);
  41. handle_404(def);
  42. }
  43. });
  44. } catch(e) {
  45. console.error("Error!");
  46. console.error(e);
  47. res.status(500).send("500 Internal server error");
  48. }
  49. function handle_404(def) {
  50. if (def == "alex" || def == "steve") {
  51. skins.resize_img("public/images/" + def + ".png", size, function(err, image) {
  52. sendimage(404, true, image);
  53. });
  54. } else {
  55. res.status(404).send('404 Not found');
  56. }
  57. }
  58. function sendimage(status, local, image) {
  59. res.writeHead(status, {
  60. 'Content-Type': 'image/png',
  61. 'Cache-Control': 'max-age=' + config.browser_cache_time + ', public',
  62. 'Response-Time': new Date() - start,
  63. 'X-Storage-Type': local ? 'local' : 'downloaded'
  64. });
  65. res.end(image);
  66. }
  67. });
  68. module.exports = router;