serverstatus.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const net = require('net')
  2. /**
  3. * Retrieves the status of a minecraft server.
  4. *
  5. * @param {string} address The server address.
  6. * @param {number} port Optional. The port of the server. Defaults to 25565.
  7. * @returns {Promise.<Object>} A promise which resolves to an object containing
  8. * status information.
  9. */
  10. exports.getStatus = function(address, port = 25565){
  11. if(port == null || port == ''){
  12. port = 25565
  13. }
  14. if(typeof port === 'string'){
  15. port = parseInt(port)
  16. }
  17. return new Promise((resolve, reject) => {
  18. const socket = net.connect(port, address, () => {
  19. let buff = new Buffer([0xFE, 0x01])
  20. socket.write(buff)
  21. })
  22. socket.setTimeout(2500, () => {
  23. socket.end()
  24. reject({
  25. code: 'ETIMEDOUT',
  26. errno: 'ETIMEDOUT',
  27. address,
  28. port
  29. })
  30. })
  31. socket.on('data', (data) => {
  32. if(data != null && data != ''){
  33. let server_info = data.toString().split('\x00\x00\x00')
  34. const NUM_FIELDS = 6
  35. if(server_info != null && server_info.length >= NUM_FIELDS){
  36. resolve({
  37. online: true,
  38. version: server_info[2].replace(/\u0000/g, ''),
  39. motd: server_info[3].replace(/\u0000/g, ''),
  40. onlinePlayers: server_info[4].replace(/\u0000/g, ''),
  41. maxPlayers: server_info[5].replace(/\u0000/g,'')
  42. })
  43. } else {
  44. resolve({
  45. online: false
  46. })
  47. }
  48. }
  49. socket.end()
  50. })
  51. socket.on('error', (err) => {
  52. socket.destroy()
  53. reject(err)
  54. // ENOTFOUND = Unable to resolve.
  55. // ECONNREFUSED = Unable to connect to port.
  56. })
  57. })
  58. }