From 0a8df28a941a90c7c6d27f4f057bdbd38df99d4e Mon Sep 17 00:00:00 2001 From: SileNce5k Date: Sun, 27 Jul 2025 13:52:53 +0200 Subject: [PATCH] Add minecraft command to get server info --- commands/info/mc.js | 104 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 commands/info/mc.js diff --git a/commands/info/mc.js b/commands/info/mc.js new file mode 100644 index 0000000..1b28b54 --- /dev/null +++ b/commands/info/mc.js @@ -0,0 +1,104 @@ +// Code is taken from https://github.com/stphnduvall/mcstatus/blob/master/src/index.ts +// and converted to pure js. + +const net = require('net') +const { EmbedBuilder } = require('discord.js'); + +module.exports = { + name: 'mc', // Keep it to one word + description: 'get mc server info from lazy duchess server', + hidden: true, + whitelist: true, + async execute({ message, args }) { + let host = ""; + let port = 25565; + if (args[0]) host = args[0]; + + if (host.includes(":")) { + port = host.replace(/.+(?:\:)/g, ""); + host = host.match(/.+(?:\:)/g, "")[0].replace(":", ""); + } + if(host === "") return message.channel.send("No host provided") + let info = await getMinecraftServerInfo(host, port); + if (info) { + console.log(info) + const embed = new EmbedBuilder() + embed.setColor("#ee7939") + embed.setTimestamp() + embed.addFields([ + { name: "ping", value: info.ping.toString(), inline: false }, + { name: "Player Count", value: info.playercount, inline: false }, + { name: "Max Players", value: info.maxPlayers, inline: false }, + { name: "MOTD", value: info.motd, inline: false }, + ]) + + message.channel.send({ embeds: [embed] }); + } else { + message.channel.send("Something went wrong\nThe minecraft server is likely not reachable from the discord bot") + } + + } +}; + + + +async function getMinecraftServerInfo(host, port = 25565) { + let serverInfo = { + ping: undefined, + maxPlayers: undefined, + version: undefined, + playercount: undefined, + motd: undefined + } + + let startTime = new Date(); + let data; + let ping; + serverInfo = await new Promise((resolve) => { + const client = net.connect({ host, port }, () => { + ping = Math.round(new Date().getMilliseconds() - startTime.getMilliseconds()); + + let buff = Buffer.from([0xFE, 0x01]); + client.write(buff); + + }) + let error = false; + client.on('data', (d) => { + data = d.toString() + client.destroy(); + + }) + client.once('error', (error) => { + console.error(error) + error = true; + }) + client.once('connectionAttemptFailed', (ip) => { + console.error("in attempt failed") + error = true; + }) + + client.once('connectionAttemptTimeout', (ip) => { + console.error("in attempt timeout") + error = true; + }) + client.on('close', () => { + if (!error) { + let _serverInfo = data?.split('\x00\x00\x00'); + + if (!_serverInfo) { + console.log("Something went wrong.") + resolve(serverInfo) + } + serverInfo.version = _serverInfo[2].replace(/\u0000/g, '') + serverInfo.motd = _serverInfo[3].replace(/\u0000/g, '') + serverInfo.playercount = Number(_serverInfo[4].replace(/\u0000/g, '')) + serverInfo.maxPlayers = Number(_serverInfo[5].replace(/\u0000/g, '')) + serverInfo.ping = Number(ping) + resolve(serverInfo) + } else { + resolve(0) + } + }) + }) + return serverInfo +}