175 lines
7.3 KiB
JavaScript
175 lines
7.3 KiB
JavaScript
const Config = require('./config/config');
|
|
const Servers = require('./config/servers');
|
|
const Discord = require('discord.js');
|
|
const Rcon = require('mbr-rcon');
|
|
const Query = require("minecraft-query");
|
|
const Server = require('./includes/class_server');
|
|
|
|
const client = new Discord.Client();
|
|
|
|
client.on('ready', () => {
|
|
console.log(`Logged in as ${client.user.tag}!`);
|
|
});
|
|
|
|
process.on('SIGINT', function() {
|
|
console.log("Closing down...");
|
|
process.exit(1);
|
|
});
|
|
|
|
function sendOnline(status, channel) {
|
|
let playerCount = 0;
|
|
let embed = new Discord.MessageEmbed()
|
|
.setThumbnail("https://www.circlecraft.info/images/circlecraft_discord.png")
|
|
.setColor(0x44ff44);
|
|
for ( const s in status ) {
|
|
if ( !status[s].tested ) {
|
|
return;
|
|
}
|
|
if ( status[s].players.length > 0 ) {
|
|
playerCount += status[s].players.length;
|
|
embed.addField("**" + status[s].name + "**:", status[s].players.join(', '), false);
|
|
}
|
|
};
|
|
if ( playerCount == 0 ) return;
|
|
embed.setTitle("**Players Currently Online:** " + playerCount);
|
|
channel.send(embed);
|
|
}
|
|
|
|
client.on('message', async msg => {
|
|
if ( msg.content.startsWith(">>servers") && Config.CHANNELS_ALLOW.includes(msg.channel.id) ) {
|
|
let embed = new Discord.MessageEmbed()
|
|
.setTitle("Here's a list of our current servers...")
|
|
.setColor(0xFFaaaa);
|
|
Servers.forEach(function (server) {
|
|
if ( server.active ) embed.addField("**" + server.name + "** *(" + server.slug + ")*", server.description);
|
|
});
|
|
embed.setFooter("Get more info on a pack with: >>server slug\nThe slugs are in parenthesis above");
|
|
|
|
msg.channel.send(embed);
|
|
}
|
|
|
|
if ( msg.content == ">>online" && Config.CHANNELS_ALLOW.includes(msg.channel.id) ) {
|
|
let status = [];
|
|
Servers.forEach(function (server) {
|
|
if ( server.active ) {
|
|
status[server.slug] = {tested: false, online: false, players: [], name: ""};
|
|
status[server.slug].name = server.name;
|
|
}
|
|
});
|
|
Servers.forEach(function (server) {
|
|
const q = new Query({host: server.rconAddress, port: server.queryPort, timeout: 250});
|
|
try {
|
|
q.fullStat()
|
|
.then(response => {
|
|
status[server.slug].tested = true;
|
|
status[server.slug].online = true;
|
|
status[server.slug].players = response.players;
|
|
sendOnline(status, msg.channel);
|
|
})
|
|
.then(() => { q.close(); })
|
|
.catch(e => {
|
|
q.close();
|
|
status[server.slug].tested = true;
|
|
sendOnline(status, msg.channel);
|
|
});
|
|
} catch (e) {
|
|
console.log(e);
|
|
}
|
|
});
|
|
}
|
|
|
|
if ( msg.content == ">>server" && Config.CHANNELS_ALLOW.includes(msg.channel.id) ) {
|
|
msg.channel.send("**Usage:** >>server *slug*");
|
|
}
|
|
|
|
if ( msg.content.startsWith(">>server ") && Config.CHANNELS_ALLOW.includes(msg.channel.id) ) {
|
|
let cmdParts = msg.content.split(" ");
|
|
let server = Servers.find(element => element.slug == cmdParts[1]);
|
|
if ( server ) {
|
|
let hostStatus = "Offline";
|
|
try {
|
|
if (server.hostIsAlive()) hostStatus = "Online";
|
|
} catch (e) {
|
|
console.log(e);
|
|
}
|
|
//console.log(query);
|
|
let serverStatus = "Stopped";
|
|
let serverTPS = "---";
|
|
if ( server.rconPort != 0 ) {
|
|
//console.log("Making new rcon connection...");
|
|
const rcon = new Rcon({
|
|
host: server.rconAddress,
|
|
port: server.rconPort,
|
|
pass: server.rconPassword,
|
|
onClose: function () {}
|
|
});
|
|
const connection = rcon.connect({
|
|
onSuccess: function() {
|
|
//console.log("Connected! " + serverStatus);
|
|
serverStatus = "Running";
|
|
},
|
|
onError: function() {
|
|
console.log("Could not connect to rcon server: " + server.name + " " + server.rconAddress + " " + server.rconPort);
|
|
server.sendDetails(msg.channel, hostStatus, serverStatus, serverTPS);
|
|
}
|
|
});
|
|
connection.auth({
|
|
onSuccess: function () {
|
|
//console.log("Successfully authenticated to: " + server.name);
|
|
},
|
|
onError: function (error) {
|
|
console.log("Could not authenticate to rcon server: " + server.name + " " + server.rconAddress + " " + server.rconPort);
|
|
server.sendDetails(msg.channel, hostStatus, serverStatus, serverTPS);
|
|
}
|
|
});
|
|
await connection.send(server.rconTPSCommand, {
|
|
onSuccess: function (response) {
|
|
//console.log(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();
|
|
}
|
|
//console.log("Got it all!_" + hostStatus + "_" + serverStatus + "_" + serverTPS + "_");
|
|
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);
|
|
}
|
|
},
|
|
onError: function (error) {
|
|
console.log("Could not query rcon server: " + server.name + " " + server.rconAddress + " " + server.rconPort);
|
|
server.sendDetails(msg.channel, hostStatus, serverStatus, serverTPS);
|
|
}
|
|
});
|
|
} else {
|
|
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: ts=4:sw=4
|