UNPKG

ping-minecraft

Version:

A minecraft server ping & query tool

107 lines (93 loc) 2.52 kB
/** * ping-minecraft * * ping.mjs * * (c) 2022 Wany * * @summary Minecraft server ping * @author Wany <sung@wany.io> */ import { ips } from '@wanyne/dns'; import IP from '@wanyne/ip'; import mp from 'minecraft-protocol'; /** * @async * @function ping * @desc Minecraft ping * @param {string} host * @param {number} port default 25565 max 65535 * @param {number} timeout default 2000 */ async function ping(host, port = 25565, options = {}) { let timeout = options.timeout || 2000; let filterBogon = options.filterBogon || false; let dnsServer = options.dnsServer; let version = options.version; const result = { error: undefined, type: 'ping/minecraft', host: host, ip: '', port: port, version: { name: '', protocol: 0, }, description: '', players: { current: 0, max: 0, sample: [], }, favicon: '', time: 0, }; host = host.toLowerCase(); result.host = host; const ipsa = await ips(host, dnsServer); const ip = ipsa?.[0]; result.ip = ip; if (filterBogon && new IP(ip).isBogon()) { result.error = 'EBOGONIP'; result.status = 'error'; return result; } port = Math.max(1, Math.min(65535, port * 1 || 25565)); result.port = port; const timestamp = new Date().getTime(); return new Promise((resolve, reject) => { const timer = setTimeout(() => { result.error = 'ETIMEDOUT'; resolve(result); }, timeout).unref(); mp.ping({ host: host, port: port, version: version, }) .then((res) => { clearTimeout(timer); res?.remote?.ip ? (result.ip = res?.remote?.ip) : null; if (result.ip && filterBogon && new IP(result.ip).isBogon()) { result.error = 'EBOGONIP'; return result; } result.version.name = res.version.name || res.version || ''; result.version.protocol = res.version.protocol || res.protoco || 0; result.description = res.motd || res.description || ''; result.players.current = res.playerCount || res.players.online || 0; result.players.max = res.maxPlayers || res.players.max || 0; result.players.sample = res.players.sample || []; result.favicon = res.favicon || ''; result.time = new Date().getTime() - timestamp; resolve(result); }) .catch((error) => { clearTimeout(timer); result.error = error; resolve(result); }); }); } export default ping;