diff --git a/commands/mc/status.js b/commands/mc/status.js index 2029215..27a3e51 100644 --- a/commands/mc/status.js +++ b/commands/mc/status.js @@ -1,61 +1,36 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); -const dgram = require('dgram'); +const axios = require('axios'); const { server_ip, server_port } = require('../../config.json'); module.exports = { data: new SlashCommandBuilder() .setName('server-status') - .setDescription('shows you some information about the minecraft server'), - async execute(interaction) { - try { - const serverInfo = await getServerInfo('your_server_ip', your_server_port); + .setDescription('Get the current server status and players'), - const embed = { - color: 0x0099ff, - title: 'Minecraft Server Status', + async execute(interaction) { + const SERVER_IP = `${server_ip}:${server_port}`; + + axios.get(`https://api.mcsrvstat.us/3/${SERVER_IP}`).then((resp) => { + const data = resp.data; + + const embedData = { + title: SERVER_IP, + description: data.online ? 'Server is online' : 'Server is offline', + color: data.online ? 0x00FF00 : 0xFF0000, fields: [ - { name: 'Description', value: serverInfo.description.text }, - { name: 'Players', value: `${serverInfo.players.online}/${serverInfo.players.max}`, inline: true }, - { name: 'Version', value: serverInfo.version.name, inline: true }, - { name: 'Online Players', value: serverInfo.players.sample.map(player => player.name).join(', ') }, + { name: 'Version', value: `${data.version} (Protocol ${data.protocol.version})`, inline: false }, ], + footer: { text: `${data.players.online}/${data.players.max} players` }, }; - await interaction.reply({ embeds: [embed], content: '```json\n' + JSON.stringify(serverInfo, null, 2) + '```' }); - } catch (error) { - console.error(error.message || 'Failed to retrieve Minecraft server info.'); - await interaction.reply('Failed to retrieve Minecraft server info.'); - } - }, -}; - - -async function getServerInfo(ip, port) { - const client = dgram.createSocket('udp4'); - - // Send an empty payload for a status request - const handshakePacket = Buffer.from([0xFE, 0xFD, 0x00]); - client.send(handshakePacket, port, ip); - - return new Promise((resolve, reject) => { - client.on('message', (response) => { - if (response.slice(0, 2).equals(Buffer.from([0xFF, 0xFD])) && response.length > 35) { - const jsonResponse = response.toString('utf8', 35); - try { - const parsedResponse = JSON.parse(jsonResponse); - resolve(parsedResponse); - } catch (error) { - reject(new Error('Failed to parse server info.')); - } + if (data.players && data.players.list && data.players.list.length > 0) { + embedData.fields.push({ name: 'Player List', value: data.players.list.map(player => player.name).join('\n'), inline: false }); } else { - reject(new Error('Failed to retrieve server info.')); + embedData.fields.push({ name: 'Player List', value: 'No players online :(', inline: false }); } - client.close(); + const embed = new EmbedBuilder(embedData); + interaction.reply({ content: 'Server status:', embeds: [embed] }); }); - - client.on('error', (err) => { - reject(err); - }); - }); -} \ No newline at end of file + }, +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f7cb15b..357f64b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,7 @@ "packages": { "": { "dependencies": { - "dgram": "^1.0.1", + "axios": "^1.6.4", "discord.js": "^14.14.1" } }, @@ -171,11 +171,39 @@ "npm": ">=7.0.0" } }, - "node_modules/dgram": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dgram/-/dgram-1.0.1.tgz", - "integrity": "sha512-zJVFL1EWfKtE0z2VN6qfpn/a+qG1viEzcwJA0EjtzS76ONSE3sEyWBwEbo32hS4IFw/EWVuWN+8b89aPW6It2A==", - "deprecated": "npm is holding this package for security reasons. As it's a core Node module, we will not transfer it over to other users. You may safely remove the package from your dependencies." + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz", + "integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } }, "node_modules/discord-api-types": { "version": "0.37.61", @@ -211,6 +239,38 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/follow-redirects": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -226,6 +286,30 @@ "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.5.0.tgz", "integrity": "sha512-wJkXvutRbNWcc37tt5j1HyOK1nosspdh3dj6LUYYAvF6JYNqs53IfRvK9oEpcwiDA1NdoIi64yAMfdivPeVAyw==" }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/ts-mixer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", diff --git a/package.json b/package.json index f7b76e7..dabb69a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "dependencies": { - "dgram": "^1.0.1", + "axios": "^1.6.4", "discord.js": "^14.14.1" } } diff --git a/startBot.sh b/startBot.sh new file mode 100644 index 0000000..a768167 --- /dev/null +++ b/startBot.sh @@ -0,0 +1,2 @@ +#!/usr/bin/bash +node bot.js