Friday, September 20, 2024 2:34:17 AM
> settings

Customize


Authenticate

> server_initialization.js
const ESMCommand = require("../esm_command");
module.exports = class ESMCommand_Server_Initialization extends ESMCommand {
    constructor(bot) {
        super(bot);
        this.permissions = {
            restricted: true
        };
    }

    async fromServer() {
        let retryCount = 0;

        // Update the DB
        let server = await this.db.serverInitialization(this.serverID, this.params);
        let community = await this.db.getCommunity(server.community_id);
        let guild = null;

        // Attempt to find the Discord Guild. This will fail if they kicked the bot (in which case, we will disconnect their connection)
        while (this.util.isEmpty(guild) && retryCount < 10) {
            guild = await this.ESMBot.getGuild(community.guild_id);
            if (!this.util.isEmpty(guild)) break;
            await this.util.sleep(5000);
            retryCount++;
        }

        // We failed after 10 tries (just in case Discord is having issues)
        if (this.util.isEmpty(guild)) {
            console.log("disconnecting server, no guild");
            return this.wss.disconnect(server.id);
        }

        let data = {
            function_name: "postServerInitialization",
            server_id: this.serverID,
            is_premium: true,
            territory_admins: []
        };

        // Compile the territory admins
        await this.compileTerritoryAdmins(community, guild, data);

        // Compile the Settings
        await this.compileSettings(server, data);

        // Compile the Rewards
        await this.compileRewards(server, data);

        // Let commands through
        this.wss.unlockServer(server.id);

        this.send({
            server_id: server.id,
            command: "post_initialization",
            parameters: data
        });

        this.ESMBot.logger.success(`'${server.id}' has successfully connected`);
    }

    async compileTerritoryAdmins(community, guild, data) {
        let fetch = async () => {
            let territory_admins = _.keys(community.territory_admins);

            let roles = await guild.roles.fetch();
            for (let role_arr of roles.cache) {
                let id = role_arr[0];
                let role = role_arr[1];
                if (!role.permissions.has("ADMINISTRATOR") && !(territory_admins.includes(id))) continue;

                let roleMembers = [];
                try {
                    roleMembers = role.members;
                } catch (error) {};


                for (let member_array of roleMembers) {
                    let id = member_array[0];
                    let steamUID = await this.db.getSteamUIDFromID(id);
                    if (this.util.isEmpty(steamUID)) continue;

                    data.territory_admins.push(steamUID);
                }
            }
        };

        // This is stupid
        await fetch();

        // Get the owner
        let ownerUID = await this.db.getSteamUIDFromID(guild.ownerID);
        if (!this.util.isEmpty(ownerUID)) {
            if (!data.territory_admins.includes(ownerUID)) {
                data.territory_admins.push(ownerUID);
            }
        }

        data.territory_admins = this.util.arrayToString(data.territory_admins);
    }

    async compileRewards(server, data) {
        data.reward_player_poptabs = server.rewards.player_poptabs;
        data.reward_locker_poptabs = server.rewards.locker_poptabs;
        data.reward_respect = server.rewards.respect;
        let items = [];
        _.each(server.rewards.items, (quantity, item) => {
            items.push([item, quantity]);
        });
        data.reward_items = this.util.arrayToString(items);
    }

    async compileSettings(server, data) {
        _.each(server.settings, (value, key) => {
            this.compileSetting(key, value, data);
        });

        // We use a boolean for Exile Threads
        data.request_thread_type = data.request_thread_type === "exile";

        // Correct the taxes/gambing (We take in a whole number, we need to convert it to a decimal)
        data.taxes_territory_payment = data.taxes_territory_payment / 100;
        data.taxes_territory_upgrade = data.taxes_territory_upgrade / 100;
        // data.gambling_payout = data.gambling_payout / 100;
        // data.gambling_win_chance = data.gambling_win_chance / 100;
    }

    compileSetting(name, setting, data, parentNames = []) {
        if (_.isPlainObject(setting)) {
            let names = _.clone(parentNames);
            names.push(name);
            _.each(setting, (value, key) => {
                this.compileSetting(key, value, data, names);
            });
        } else {
            if (_.isEmpty(parentNames)) {
                data[name] = setting;
            } else {
                data[`${parentNames.join("_")}_${name}`] = setting;
            }
        }
    }
};
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8