const Config = require('./config/config'); const Servers = require('./config/servers'); const { Client, GatewayIntentBits, Partials, EmbedBuilder } = require('discord.js'); const Rcon = require('rcon'); const Query = require("minecraft-query"); const Server = require('./includes/class_server'); const FS = require('fs'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent ] }); client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`); var interval = Config.PRESENCE_INTERVAL * 60 * 1000; if ( interval != 0 ) { getOnlineReport(); setInterval(function() { getOnlineReport(); }, interval); } }); process.on('SIGINT', function() { console.log("Closing down..."); process.exit(1); }); function getOnlineReport(channel = null) { let online = []; Servers.forEach(function (server) { if ( server.active ) { online[server.slug] = {tested: false, online: false, players: [], name: ""}; online[server.slug].name = server.name; } }); Servers.forEach(function (server) { if ( !online[server.slug] ) return; const q = new Query({host: server.rconAddress, port: server.queryPort, timeout: 7250}); try { q.fullStat() .then(response => { online[server.slug].tested = true; online[server.slug].online = true; online[server.slug].players = response.players; }) .then(success => { q.close(); let playerCount = 0; let embed = new EmbedBuilder() .setColor(0x44ff44) .setThumbnail(Config.GUILD_THUMBNAIL); for ( const s in online ) { if ( !online[s].tested ) { continue; } if ( online[s].players.length > 0 ) { playerCount += online[s].players.length; embed.addFields({name: "**"+online[s].name+"**", value: online[s].players.join(', '), inline: false}); } }; embed.setTitle("**Players Currently Online:** " + playerCount); if ( channel !== null ) channel.send({embeds: [embed]}); if ( Config.PRESENCE_INTERVAL != 0 ) { client.user.setPresence({ activities: [{ name: "Online: " + playerCount }], status: 'online' }); } }) .catch(e => { q.close(); //console.log("slug: " + server.slug); //console.log(online); online[server.slug].tested = true; }); } catch (e) { console.log(e); } }); } client.on('messageCreate', (msg) => { if ( msg.author.id === client.user.id ) return; if ( msg.content.startsWith(">>paddle") ) { if ( msg.member.roles.cache.has(Config.MOD_ROLE) || msg.member.roles.cache.has(Config.STAFF_ROLE) ) { let response = ""; msg.mentions.users.forEach(function (user) { response += "<@" + user.id + "> "; }); response += "Don't do bad things!"; msg.channel.send({ content: response, files: ["images/paddlin_badge.png"] }); } } if ( msg.content.startsWith(">>servers") && Config.CHANNELS_ALLOW.includes(msg.channel.id) ) { let embed = new EmbedBuilder() .setTitle("Here's a list of our current servers...") .setColor(0xFFaaaa); Servers.forEach(function (server) { if ( server.active ) embed.addFields({ name: "**" + server.name + "** *(" + server.slug + ")*", value: server.description }); }); embed.setFooter({ text: "Get more info on a pack with: >>server slug\nThe slugs are in parenthesis above" }); msg.channel.send({ embeds: [embed] }); } if ( msg.content == ">>online" && Config.CHANNELS_ALLOW.includes(msg.channel.id) ) { getOnlineReport(msg.channel); } if ( msg.content == ">>server" && Config.CHANNELS_ALLOW.includes(msg.channel.id) ) { msg.channel.send("**Usage:** >>server *slug*"); } if ( msg.content.startsWith(">>restart") && Config.CHANNELS_ALLOW.includes(msg.channel.id) && Config.ALLOW_RESTART ) { if ( msg.member.roles.cache.has(Config.RESTART_ROLE) ) { let cmdParts = msg.content.trim().split(" "); let server = Servers.find(element => element.slug == cmdParts[1].trim()); if ( typeof server === 'undefined' ) { msg.channel.send("**Error:** There is no server with a slug of \"`" + cmdParts[1].trim() + "`\""); } else { let restartFile = '/automation/mcrestart/' + server.slug + '.restart'; FS.stat(restartFile, function(err, stat) { if ( err == null ) { msg.channel.send("**Warning:** " + server.name + " is already queued for a restart"); } else if ( err.code === 'ENOENT' ) { FS.closeSync(FS.openSync(restartFile, 'w')); msg.channel.send("**Notice:** " + server.name + " queued for restart by " + msg.author.username); } }); } } else { msg.channel.send("**Error:** You do not have permission to restart servers"); } } if ( msg.content.startsWith(">>server ") && Config.CHANNELS_ALLOW.includes(msg.channel.id) ) { let cmdParts = msg.content.trim().split(" "); let server = Servers.find(element => element.slug == cmdParts[1].trim()); if ( server ) { let hostStatus = "Offline"; if (server.hostIsAlive()) hostStatus = "Online"; let serverStatus = "Stopped"; let serverTPS = "---"; if ( (hostStatus == "Online") && (server.rconPort != 0) ) { var rcon = new Rcon(server.rconAddress, server.rconPort, server.rconPassword); rcon.on('auth', function() { serverStatus = "Running"; rcon.send(server.rconTPSCommand); }).on('response', function(response) { if ( ['1.2.5', '1.4.7'].includes(server.mcVersion) ) { let tpsParts = response.trim().split("\n"); serverTPS = tpsParts[0].split(" ").pop().slice(2); } else { let tpsParts = response.trim().split(" "); serverTPS = tpsParts.pop(); if ( serverTPS.includes("*") ) serverTPS = serverTPS.split("*").pop(); } const q = new Query({host: server.rconAddress, port: server.queryPort, timeout: 250}); try { q.fullStat() .then(response => { server.sendDetails(msg.channel, hostStatus, serverStatus, serverTPS, response); }) .then(() => { q.close(); }) .catch(e => { q.close(); server.sendDetails(msg.channel, hostStatus, serverStatus, serverTPS); }); } catch (e) { console.log(e); } }).on('error', function(err) { console.log("RCon Error connecting to '" + server.slug + "': " + err); server.sendDetails(msg.channel, hostStatus, serverStatus, serverTPS); }).on('end', function() { console.log("RCon connection to '" + server.slug + "' Failed for some unknown reason"); server.sendDetails(msg.channel, hostStatus, serverStatus, serverTPS); }); rcon.connect(); } else { if ( server.rconPort != 0 ) { console.log("No rcon settings for: " + server.name); } server.sendDetails(msg.channel, hostStatus, serverStatus, serverTPS); } } else { if ( cmdParts[1] ) { msg.channel.send("No server with the slug \"`" + cmdParts[1] + "`\" exists"); } else { msg.channel.send("**Usage:** >>server *slug*"); } } } }); client.login(Config.BOT_TOKEN); // vim: set et ts=4 sw=4: