59 lines
1.6 KiB
JavaScript
59 lines
1.6 KiB
JavaScript
const MinecraftServerListPing = require("minecraft-status").MinecraftServerListPing;
|
|
|
|
// Use `dns` to resolve the SRV record for minecraft servers
|
|
const dns = require("dns");
|
|
const { hostname } = require("os");
|
|
const checkSrv = (hostname) => {
|
|
hostname = `_minecraft._tcp.${hostname}`;
|
|
return new Promise((resolve, reject) => {
|
|
dns.resolveSrv(hostname, (err, addresses) => {
|
|
if (err) {
|
|
return reject(err);
|
|
}
|
|
if (!addresses || addresses.length <= 0) return reject("No SRV record found.");
|
|
resolve(addresses[0]);
|
|
});
|
|
});
|
|
}
|
|
|
|
const findMc = (address, timeout) => {
|
|
if (!timeout) timeout = 5000;
|
|
return new Promise((resolve, reject) => {
|
|
// First, if theres a port, if there is, use that
|
|
if (address.includes(":")) {
|
|
const [host, port] = address.split(":");
|
|
start = Date.now();
|
|
MinecraftServerListPing.ping(4, host, port, timeout).then((data) => {
|
|
end = Date.now();
|
|
data.ping = end - start;
|
|
resolve(data);
|
|
}).catch((err) => {
|
|
reject(err);
|
|
});
|
|
} else {
|
|
// No SRV record, try to ping the address on port 25565
|
|
start = Date.now();
|
|
MinecraftServerListPing.ping(4, address, 25565, timeout).then((data) => {
|
|
end = Date.now();
|
|
data.ping = end - start;
|
|
resolve(data);
|
|
}).catch((err) => {
|
|
// Not a port, first try to resolve an SRV record
|
|
checkSrv(address).then((addr) => {
|
|
start = Date.now();
|
|
MinecraftServerListPing.ping(4, addr.name, addr.port, timeout).then((data) => {
|
|
end = Date.now();
|
|
data.ping = end - start;
|
|
resolve(data);
|
|
}).catch((err) => {
|
|
reject(err);
|
|
});
|
|
}).catch((err) => {
|
|
reject(err);
|
|
})
|
|
});
|
|
}
|
|
})
|
|
}
|
|
|
|
module.exports = findMc; |