Friday, September 20, 2024 3:01:50 AM
> settings

Customize


Authenticate

> server.js
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);
    }
}
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8