avatars.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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/:size?', function(req, res) {
  9. var uuid = req.param('uuid');
  10. var size = req.param('size') || config.default_size;
  11. var def = req.query.default;
  12. var start = new Date();
  13. // Prevent app from crashing/freezing
  14. if (size <= config.min_size || size > config.max_size) {
  15. // "Unprocessable Entity", valid request, but semantically erroneous:
  16. // https://tools.ietf.org/html/rfc4918#page-78
  17. res.status(422).send("422 Invalid size");
  18. return;
  19. } else if (!helpers.uuid_valid(uuid)) {
  20. res.status(422).send("422 Invalid UUID");
  21. return;
  22. }
  23. try {
  24. helpers.get_avatar(uuid, size, function(err, status, image) {
  25. if (err) {
  26. console.error(err);
  27. handle_404(def);
  28. } else if (status == 1 || status == 2) {
  29. var time = new Date() - start;
  30. sendimage(200, time, 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. var time = new Date() - start;
  44. sendimage(404, time, image);
  45. });
  46. } else {
  47. res.status(404).send('404 Not found');
  48. }
  49. }
  50. function sendimage(status, time, image) {
  51. res.writeHead(status, {
  52. 'Content-Type': 'image/png',
  53. 'Cache-Control': 'max-age=' + config.browser_cache_time + ', public',
  54. 'Response-Time': time,
  55. 'X-Storage-Type': 'local'
  56. });
  57. res.end(image);
  58. }
  59. });
  60. module.exports = router;