mc-status-bot/findMc.js

56 lines
1.5 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) reject(err);
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;