avatars.js 1.8 KB

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