const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js'); const fn = require('../modules/functions.js'); const strings = require('../data/strings.json'); const dbfn = require('../modules/dbfn.js'); const { GuildInfo } = require('../modules/CustomClasses.js'); module.exports = { data: new SlashCommandBuilder() .setName('setup') .setDescription('Configure some feature settings.') .addSubcommand(sc => sc.setName('rolemenu') .setDescription('Setup the roles to be used with /rolemenu') .addRoleOption(o => o.setName('waterrole') .setDescription('The role for water reminder pings') .setRequired(true) ) .addRoleOption(o => o.setName('fruitrole') .setDescription('The role for fruit alert pings') .setRequired(false) ) ) .addSubcommand(sc => sc.setName('view') .setDescription('View your server\'s configuration')) .addSubcommand(sc => sc.setName('reset') .setDescription('Remove all server configuration from the database') .addBooleanOption(o => o.setName('confirm') .setDescription('WARNING THIS IS IRREVERSIBLE') .setRequired(true) ) ) .setDefaultMemberPermissions(PermissionFlagsBits.Administrator), async execute(interaction) { await interaction.deferReply({ ephemeral: true }); const subcommand = interaction.options.getSubcommand(); switch (subcommand) { case "rolemenu": let waterRoleId = interaction.options.getRole('waterrole').id; let fruitRoleId = interaction.options.getRole('fruitrole') ? interaction.options.getRole('fruitrole').id : undefined; if (interaction.client.guildInfos.has(interaction.guildId)) { let guildInfo = interaction.client.guildInfos.get(interaction.guildId); guildInfo.setRoles(waterRoleId, fruitRoleId); await dbfn.setGuildInfo(guildInfo.queryBuilder("setRoles")); await fn.collectionBuilders.guildInfos(interaction.client); await interaction.editReply(fn.builders.embeds.treeRoleMenu(guildInfo)).catch(e => console.error(e)); } else { let guildInfo = new GuildInfo() .setId(interaction.guildId); guildInfo.setRoles(waterRoleId, fruitRoleId); await dbfn.setGuildInfo(guildInfo.queryBuilder("setRoles")); await fn.collectionBuilders.guildInfos(interaction.client); await interaction.editReply(fn.builders.embeds.treeRoleMenu(guildInfo)).catch(e => console.error(e)); } break; case "view": try { if (interaction.client.guildInfos.has(interaction.guildId)) { let guildInfo = interaction.client.guildInfos.get(interaction.guildId); await interaction.editReply(fn.builders.embed(guildInfo.generateSetupInfo())); } else { await interaction.editReply(fn.builders.errorEmbed("Guild doesn't exist in database!")); } } catch (err) { console.error(err); await interaction.editReply(fn.builders.errorEmbed("There was an error running the command.")); } break; case "reset": if (interaction.client.guildInfos.has(interaction.guildId)) { let guildInfo = interaction.client.guildInfos.get(interaction.guildId); if (interaction.options.getBoolean('confirm')) { fn.reset(interaction).then(res => { interaction.editReply(fn.builders.embed(strings.status.reset)).catch(err => { console.error(err); }); }).catch(err => { console.error(err); interaction.editReply(strings.status.resetError).catch(err => { console.error(err); }); }); } else { await interaction.editReply(fn.builders.embed("You must select 'true' to confirm setup reset. No changes have been made.")).catch(e => console.error(e)); } } else { await interaction.editReply(fn.builders.errorEmbed("There is no configuration to delete.")).catch(e => console.error(e)); } break; default: await interaction.editReply(fn.builders.errorEmbed(strings.error.invalidSubcommand)).catch(e => console.error(e)); break; } }, };