205 lines
8.7 KiB
JavaScript
205 lines
8.7 KiB
JavaScript
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 ( Config.ALLOW_COMMANDS == false ) 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:
|