const ESMCommand = require("../esm_command"); const Gamedig = require("gamedig"); module.exports = class ESMCommand_Server extends ESMCommand { constructor(bot) { super(bot); this.commandParams = { serverID: { regex: this.util.regex.serverID.base } }; this.information = { category: "system", params: "<server_id>", help: "Displays information for a particular server" }; this.configuration = { allowedInTextChannels: { modifiable: true, default: true }, cooldown: { modifiable: true, default: [2, "seconds"] } }; } async fromDiscord() { if (!(await this.db.isValidServer(this.params.serverID))) { this.ESMBot.send(this.message.channel, "I didn't find that server. Please ensure you spelled it correct and try again"); return; } let server = await this.db.getServer(this.params.serverID); let serverStatus = this.ESMBot.wss.isServerOnline(server.id); let isServerConnected = serverStatus; let embed = { title: server.name, timestamp: this.ESMBot.moment.utc(), color: isServerConnected ? this.ESMBot.colors.GREEN : this.ESMBot.colors.RED, fields: [{ name: "Server ID", value: server.id, inline: true }, { name: "IP and port", value: `${server.ip}:${server.port}`, inline: true }, { name: "Status", value: isServerConnected ? "Online" : "Offline", inline: true } ] }; if (isServerConnected) { let serverUptime = await this.db.getServerUptime(server.id); try { let state = await Gamedig.query({ type: 'arma3', host: server.ip, port: server.port }); if (state != null) { embed.fields.push({ name: "Map", value: this.util.isEmpty(state["map"]) ? "Not Provided" : state["map"], inline: true }, { name: "Players", value: `${state["raw"]["numplayers"]}/${state["maxplayers"]}`, inline: true }, { name: "Restart Schedule", value: `Every ${server.restart_hour}h ${server.restart_min}m`, inline: true }, { name: "Server up-time", value: serverUptime }); } } catch (err) { embed.fields.push({ name: "Server Info", value: "Failed to query server" }); } } if (!this.util.isEmpty(server.mods)) { let groupedMods = _.groupBy(_.toPairs(server.mods), (mod) => { mod = mod[1]; if (mod.required) { return "Required Mods"; } else { return "Optional Mods"; } }); _.each(groupedMods, (mods, type) => { // Add the header embed.fields.push({ name: this.util.embed.EMPTY_SPACE, value: `__${type}__` }); let field = { name: this.util.embed.EMPTY_SPACE, value: "" }; // Add the mods _.each(_.fromPairs(mods), (mod, modName) => { let text = `${this.util.isEmpty(mod.link) ? `${modName} ${mod.version || ""}` : `[${modName} ${mod.version || ""}](${mod.link})`}\n`; if ((_.size(field.value) + _.size(text)) >= this.util.embed.FIELD_VALUE_LENGTH_MAX) { embed.fields.push(field); field = { name: this.util.embed.EMPTY_SPACE, value: text }; } else { field.value += text; } }); embed.fields.push(field); }); } this.ESMBot.send(this.message.channel, embed); } }