skins.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. var http = require('http');
  2. var https = require('https');
  3. var fs = require('fs');
  4. var lwip = require('lwip');
  5. /*
  6. * Skin retrieval methods are based on @jomo's CLI Crafatar implementation.
  7. * https://github.com/jomo/Crafatar
  8. */
  9. function extract_face(inname, outname, callback) {
  10. var outfile = fs.createWriteStream(outname);
  11. lwip.open(inname, function(err, image) {
  12. image.batch()
  13. .crop(8, 8, 15, 15)
  14. .writeFile(outname, function(err) {
  15. callback();
  16. });
  17. });
  18. }
  19. module.exports = {
  20. get_profile: function(uuid, callback) {
  21. https.get("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid, function(res) {
  22. if (res.statusCode == "204") {
  23. callback(null);
  24. return null;
  25. }
  26. res.on('data', function(d) {
  27. var profile = JSON.parse(d);
  28. if (profile.error) {
  29. console.error(profile.error);
  30. callback(null);
  31. } else {
  32. callback(profile);
  33. }
  34. });
  35. }).on('error', function(e) {
  36. console.error(e);
  37. });
  38. },
  39. skin_url: function(profile) {
  40. var url = null;
  41. if (profile && profile.properties) {
  42. profile.properties.forEach(function(prop) {
  43. if (prop.name == 'textures') {
  44. var json = Buffer(prop.value, 'base64').toString();
  45. var props = JSON.parse(json);
  46. url = props.textures.SKIN.url;
  47. }
  48. });
  49. }
  50. return url;
  51. },
  52. skin_file: function(url, filename, callback) {
  53. var tmpname = "skins/tmp/" + filename;
  54. var outname = "skins/" + filename;
  55. var tmpfile = fs.createWriteStream(tmpname);
  56. http.get(url, function(res) {
  57. res.on('data', function(data) {
  58. tmpfile.write(data);
  59. }).on('end', function() {
  60. tmpfile.end();
  61. extract_face(tmpname, outname, function() {
  62. fs.unlink(tmpname, function(err) { // unlink = delete
  63. if (err) console.error(err);
  64. });
  65. callback(); // outside unlink callback cause we don't have to wait until it's deleted
  66. });
  67. });
  68. });
  69. },
  70. resize_img: function(inname, size, callback) {
  71. lwip.open("skins/" + inname, function(err, image) {
  72. image.batch()
  73. .resize(size, size, "nearest-neighbor") // nearest-neighbor doesn't blur
  74. .toBuffer('png', function(err, buffer) {
  75. callback(buffer);
  76. });
  77. });
  78. }
  79. };