From c2acbcc955b5701328b6e678e306e2b80663c75e Mon Sep 17 00:00:00 2001 From: TheCodedProf Date: Fri, 20 Jan 2023 17:23:51 -0500 Subject: [PATCH] Nucleus stats --- src/commands/settings/oldStats.ts | 291 ++++++++++++++++++++++++++ src/commands/settings/stats.ts | 331 ++++++++++++++---------------- src/utils/createPageIndicator.ts | 12 +- 3 files changed, 447 insertions(+), 187 deletions(-) create mode 100644 src/commands/settings/oldStats.ts diff --git a/src/commands/settings/oldStats.ts b/src/commands/settings/oldStats.ts new file mode 100644 index 0000000..475b5d3 --- /dev/null +++ b/src/commands/settings/oldStats.ts @@ -0,0 +1,291 @@ +import { LoadingEmbed } from "../../utils/defaults.js"; +import Discord, { CommandInteraction, Message, ActionRowBuilder, StringSelectMenuBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuOptionBuilder, APIMessageComponentEmoji, MessageComponentInteraction, TextInputBuilder } from "discord.js"; +import EmojiEmbed from "../../utils/generateEmojiEmbed.js"; +import type { SlashCommandSubcommandBuilder } from "@discordjs/builders"; +import client from "../../utils/client.js"; +import convertCurlyBracketString from "../../utils/convertCurlyBracketString.js"; +import singleNotify from "../../utils/singleNotify.js"; +import getEmojiByName from "../../utils/getEmojiByName.js"; +import createPageIndicator from "../../utils/createPageIndicator.js"; +import { modalInteractionCollector } from "../../utils/dualCollector.js"; +import type { GuildConfig } from "../../utils/database.js"; + +const command = (builder: SlashCommandSubcommandBuilder) => + builder + .setName("stats") + .setDescription("Controls channels which update when someone joins or leaves the server") + +type ChangesType = Record + +const applyChanges = (baseObject: GuildConfig['stats'], changes: ChangesType): GuildConfig['stats'] => { + for (const [id, { name, enabled }] of Object.entries(changes)) { + if (!baseObject[id]) baseObject[id] = { name: "", enabled: false}; + if (name) baseObject[id]!.name = name; + if (enabled) baseObject[id]!.enabled = enabled; + } + return baseObject; +} + + +const callback = async (interaction: CommandInteraction) => { + try{ + if (!interaction.guild) return; + const { renderChannel } = client.logger; + let closed = false; + let page = 0; + const m: Message = await interaction.reply({ embeds: LoadingEmbed, ephemeral: true, fetchReply: true }); + let changes: ChangesType = {}; + do { + const config = await client.database.guilds.read(interaction.guild.id); + const stats = config.stats; + let currentID = ""; + let current: { + name: string; + enabled: boolean; + } = { + name: "", + enabled: false + }; + let description = ""; + let pageSelect = new StringSelectMenuBuilder() + .setCustomId("page") + .setPlaceholder("Select a stats channel to manage") + .setDisabled(Object.keys(stats).length === 0) + .setMinValues(1) + .setMaxValues(1); + let actionSelect = new StringSelectMenuBuilder() + .setCustomId("action") + .setPlaceholder("Perform an action") + .setMinValues(1) + .setMaxValues(1) + .setDisabled(Object.keys(stats).length === 0) + .addOptions( + new StringSelectMenuOptionBuilder() + .setLabel("Edit") + .setValue("edit") + .setDescription("Edit the name of this stats channel") + .setEmoji(getEmojiByName("ICONS.EDIT", "id") as APIMessageComponentEmoji), + new StringSelectMenuOptionBuilder() + .setLabel("Delete") + .setValue("delete") + .setDescription("Delete this stats channel") + .setEmoji(getEmojiByName("TICKETS.ISSUE", "id") as APIMessageComponentEmoji) + ); + if (Object.keys(stats).length === 0) { + description = "You do not have any stats channels set up yet" + pageSelect.addOptions(new StringSelectMenuOptionBuilder().setLabel("No stats channels").setValue("none")) + } else { + currentID = Object.keys(stats)[page]! + current = stats[currentID]!; + current = applyChanges({ [currentID]: current }, changes)[currentID]!; + for (const [id, { name, enabled }] of Object.entries(stats)) { + pageSelect.addOptions( + new StringSelectMenuOptionBuilder() + .setLabel(name) + .setValue(id) + .setDescription(`Enabled: ${enabled}`) + ); + } + actionSelect.addOptions(new StringSelectMenuOptionBuilder() + .setLabel(current.enabled ? "Disable" : "Enable") + .setValue("toggleEnabled") + .setDescription(`Currently ${current.enabled ? "Enabled" : "Disabled"}, click to ${current.enabled ? "disable" : "enable"} this channel`) + .setEmoji(getEmojiByName(current.enabled ? "CONTROL.TICK" : "CONTROL.CROSS", "id") as APIMessageComponentEmoji) + ); + description = `**Currently Editing:** ${renderChannel(currentID)}\n\n` + + `${getEmojiByName(current.enabled ? "CONTROL.TICK" : "CONTROL.CROSS")} Currently ${current.enabled ? "Enabled" : "Disabled"}\n` + + `**Name:** \`${current.name}\`\n` + + `**Preview:** ${await convertCurlyBracketString(current.name, interaction.user.id, interaction.user.username, interaction.guild.name, interaction.guild.members)}` + } + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("back") + .setStyle(ButtonStyle.Primary) + .setEmoji(getEmojiByName("CONTROL.LEFT", "id") as APIMessageComponentEmoji) + .setDisabled(page === 0), + new ButtonBuilder() + .setCustomId("next") + .setEmoji(getEmojiByName("CONTROL.RIGHT", "id") as APIMessageComponentEmoji) + .setStyle(ButtonStyle.Primary) + .setDisabled(page === Object.keys(stats).length - 1), + new ButtonBuilder() + .setCustomId("add") + .setLabel("Create new") + .setEmoji(getEmojiByName("TICKETS.SUGGESTION", "id") as APIMessageComponentEmoji) + .setStyle(ButtonStyle.Secondary) + .setDisabled(Object.keys(stats).length >= 24), + new ButtonBuilder() + .setCustomId("save") + .setLabel("Save") + .setEmoji(getEmojiByName("ICONS.SAVE", "id") as APIMessageComponentEmoji) + .setStyle(ButtonStyle.Success) + .setDisabled(Object.keys(changes).length === 0), + ); + + let embed = new EmojiEmbed() + .setTitle("Stats Channels") + .setDescription(description + "\n\n" + createPageIndicator(Object.keys(stats).length, page)) + .setEmoji("SETTINGS.STATS.GREEN") + .setStatus("Success") + + interaction.editReply({ + embeds: [embed], + components: [ + new ActionRowBuilder().addComponents(pageSelect), + new ActionRowBuilder().addComponents(actionSelect), + row + ] + }); + let i: MessageComponentInteraction; + try { + i = await m.awaitMessageComponent({ filter: (i) => i.user.id === interaction.user.id, time: 30000 }); + } catch (e) { + closed = true; + continue; + } + if (i.isStringSelectMenu()) { + switch(i.customId) { + case "page": + page = Object.keys(stats).indexOf(i.values[0]!); + i.deferUpdate(); + break; + case "action": + if(!changes[currentID]) changes[currentID] = {}; + switch(i.values[0]!) { + case "edit": + await i.showModal( + new Discord.ModalBuilder() + .setCustomId("modal") + .setTitle(`Stats channel name`) + .addComponents( + new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setCustomId("ex1") + .setLabel("Server Info (1/3)") + .setPlaceholder( + `{serverName} - This server's name\n\n` + + `These placeholders will be replaced with the server's name, etc..` + ) + .setMaxLength(1) + .setRequired(false) + .setStyle(Discord.TextInputStyle.Paragraph) + ), + new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setCustomId("ex2") + .setLabel("Member Counts (2/3) - {MemberCount:...}") + .setPlaceholder( + `{:all} - Total member count\n` + + `{:humans} - Total non-bot users\n` + + `{:bots} - Number of bots\n` + ) + .setMaxLength(1) + .setRequired(false) + .setStyle(Discord.TextInputStyle.Paragraph) + ), + new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setCustomId("ex3") + .setLabel("Latest Member (3/3) - {member:...}") + .setPlaceholder( + `{:name} - The members name\n` + ) + .setMaxLength(1) + .setRequired(false) + .setStyle(Discord.TextInputStyle.Paragraph) + ), + new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setCustomId("text") + .setLabel("Channel name input") + .setMaxLength(1000) + .setRequired(true) + .setStyle(Discord.TextInputStyle.Short) + .setValue(current.name) + ) + ) + ); + await interaction.editReply({ + embeds: [ + new EmojiEmbed() + .setTitle("Stats Channel") + .setDescription("Modal opened. If you can't see it, click back and try again.") + .setStatus("Success") + .setEmoji("SETTINGS.STATS.GREEN") + ], + components: [ + new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setLabel("Back") + .setEmoji(getEmojiByName("CONTROL.LEFT", "id")) + .setStyle(ButtonStyle.Primary) + .setCustomId("back") + ) + ] + }); + let out: Discord.ModalSubmitInteraction | null; + try { + out = await modalInteractionCollector( + m, + (m) => m.channel!.id === interaction.channel!.id, + (_) => true + ) as Discord.ModalSubmitInteraction | null; + } catch (e) { + continue; + } + if (!out) continue + if (!out.fields) continue + if (out.isButton()) continue; + const newString = out.fields.getTextInputValue("text"); + if (!newString) continue; + changes[currentID]!.name = newString; + break; + case "delete": + changes[currentID] = {}; + i.deferUpdate(); + break; + case "toggleEnabled": + changes[currentID]!.enabled = !stats[currentID]!.enabled; + i.deferUpdate(); + break; + } + break; + } + } else if (i.isButton()) { + i.deferUpdate(); + switch(i.customId) { + case "back": + page--; + break; + case "next": + page++; + break; + case "add": + break; + case "save": + let changed = applyChanges(config.stats, changes); + singleNotify("statsChannelDeleted", interaction.guild.id, true) + config.stats = changed; + changes = {} + await client.database.guilds.write(interaction.guildId!, config); + } + } + console.log(changes, config.stats); + } while (!closed); + } catch(e) { + console.log(e) + } +}; + +const check = (interaction: CommandInteraction) => { + const member = interaction.member as Discord.GuildMember; + if (!member.permissions.has("ManageChannels")) + return "You must have the *Manage Channels* permission to use this command"; + return true; +}; + + +export { command }; +export { callback }; +export { check }; \ No newline at end of file diff --git a/src/commands/settings/stats.ts b/src/commands/settings/stats.ts index bd63cdc..118afc2 100644 --- a/src/commands/settings/stats.ts +++ b/src/commands/settings/stats.ts @@ -1,5 +1,5 @@ import { LoadingEmbed } from "../../utils/defaults.js"; -import Discord, { CommandInteraction, Message, ActionRowBuilder, StringSelectMenuBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuOptionBuilder, APIMessageComponentEmoji, MessageComponentInteraction, TextInputBuilder } from "discord.js"; +import Discord, { CommandInteraction, Message, ActionRowBuilder, StringSelectMenuBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuOptionBuilder, APIMessageComponentEmoji, TextInputBuilder, StringSelectMenuInteraction, ButtonInteraction } from "discord.js"; import EmojiEmbed from "../../utils/generateEmojiEmbed.js"; import type { SlashCommandSubcommandBuilder } from "@discordjs/builders"; import client from "../../utils/client.js"; @@ -8,205 +8,189 @@ import singleNotify from "../../utils/singleNotify.js"; import getEmojiByName from "../../utils/getEmojiByName.js"; import createPageIndicator from "../../utils/createPageIndicator.js"; import { modalInteractionCollector } from "../../utils/dualCollector.js"; -import type { GuildConfig } from "../../utils/database.js"; + const command = (builder: SlashCommandSubcommandBuilder) => builder .setName("stats") .setDescription("Controls channels which update when someone joins or leaves the server") -type ChangesType = Record -const applyChanges = (baseObject: GuildConfig['stats'], changes: ChangesType): GuildConfig['stats'] => { - for (const [id, { name, enabled }] of Object.entries(changes)) { - if (!baseObject[id]) baseObject[id] = { name: "", enabled: false}; - if (name) baseObject[id]!.name = name; - if (enabled) baseObject[id]!.enabled = enabled; - } - return baseObject; +const showModal = async (interaction: StringSelectMenuInteraction, current: { enabled: boolean; name: string; }) => { + await interaction.showModal( + new Discord.ModalBuilder() + .setCustomId("modal") + .setTitle(`Stats channel name`) + .addComponents( + new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setCustomId("ex1") + .setLabel("Server Info (1/3)") + .setPlaceholder( + `{serverName} - This server's name\n\n` + + `These placeholders will be replaced with the server's name, etc..` + ) + .setMaxLength(1) + .setRequired(false) + .setStyle(Discord.TextInputStyle.Paragraph) + ), + new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setCustomId("ex2") + .setLabel("Member Counts (2/3) - {MemberCount:...}") + .setPlaceholder( + `{:all} - Total member count\n` + + `{:humans} - Total non-bot users\n` + + `{:bots} - Number of bots\n` + ) + .setMaxLength(1) + .setRequired(false) + .setStyle(Discord.TextInputStyle.Paragraph) + ), + new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setCustomId("ex3") + .setLabel("Latest Member (3/3) - {member:...}") + .setPlaceholder( + `{:name} - The members name\n` + ) + .setMaxLength(1) + .setRequired(false) + .setStyle(Discord.TextInputStyle.Paragraph) + ), + new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setCustomId("text") + .setLabel("Channel name input") + .setMaxLength(1000) + .setRequired(true) + .setStyle(Discord.TextInputStyle.Short) + .setValue(current.name) + ) + ) + ); } - const callback = async (interaction: CommandInteraction) => { - try{ if (!interaction.guild) return; const { renderChannel } = client.logger; - let closed = false; - let page = 0; const m: Message = await interaction.reply({ embeds: LoadingEmbed, ephemeral: true, fetchReply: true }); - let changes: ChangesType = {}; + let page = 0; + let closed = false; + const config = await client.database.guilds.read(interaction.guild.id); + const currentObject = config.stats; + let modified = false; do { - const config = await client.database.guilds.read(interaction.guild.id); - const stats = config.stats; - let currentID = ""; - let current: { - name: string; - enabled: boolean; - } = { - name: "", - enabled: false - }; - let description = ""; - let pageSelect = new StringSelectMenuBuilder() + let embed = new EmojiEmbed() + .setTitle("Stats Settings") + .setEmoji("SETTINGS.STATS.GREEN") + .setStatus("Success"); + const noStatsChannels = Object.keys(currentObject).length === 0; + let current: { enabled: boolean; name: string; }; + + const pageSelect = new StringSelectMenuBuilder() .setCustomId("page") - .setPlaceholder("Select a stats channel to manage") - .setDisabled(Object.keys(stats).length === 0) - .setMinValues(1) - .setMaxValues(1); - let actionSelect = new StringSelectMenuBuilder() + .setPlaceholder("Select a stats channel to manage"); + const actionSelect = new StringSelectMenuBuilder() .setCustomId("action") .setPlaceholder("Perform an action") - .setMinValues(1) - .setMaxValues(1) - .setDisabled(Object.keys(stats).length === 0) .addOptions( new StringSelectMenuOptionBuilder() .setLabel("Edit") + .setDescription("Edit the stats channel") .setValue("edit") - .setDescription("Edit the name of this stats channel") .setEmoji(getEmojiByName("ICONS.EDIT", "id") as APIMessageComponentEmoji), new StringSelectMenuOptionBuilder() .setLabel("Delete") + .setDescription("Delete the stats channel") .setValue("delete") - .setDescription("Delete this stats channel") .setEmoji(getEmojiByName("TICKETS.ISSUE", "id") as APIMessageComponentEmoji) + ); + const buttonRow = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("back") + .setStyle(ButtonStyle.Primary) + .setEmoji(getEmojiByName("CONTROL.LEFT", "id") as APIMessageComponentEmoji) + .setDisabled(page === 0), + new ButtonBuilder() + .setCustomId("next") + .setEmoji(getEmojiByName("CONTROL.RIGHT", "id") as APIMessageComponentEmoji) + .setStyle(ButtonStyle.Primary) + .setDisabled(page === Object.keys(currentObject).length - 1), + new ButtonBuilder() + .setCustomId("add") + .setLabel("Create new") + .setEmoji(getEmojiByName("TICKETS.SUGGESTION", "id") as APIMessageComponentEmoji) + .setStyle(ButtonStyle.Secondary) + .setDisabled(Object.keys(currentObject).length >= 24), + new ButtonBuilder() + .setCustomId("save") + .setLabel("Save") + .setEmoji(getEmojiByName("ICONS.SAVE", "id") as APIMessageComponentEmoji) + .setStyle(ButtonStyle.Success) + .setDisabled(modified), + ); + if (noStatsChannels) { + embed.setDescription("No stats channels have been set up yet. Use the button below to add one.\n\n" + + createPageIndicator(1, 1, undefined, true) + ); + pageSelect.setDisabled(true); + actionSelect.setDisabled(true); + pageSelect.addOptions(new StringSelectMenuOptionBuilder() + .setLabel("No stats channels") + .setValue("none") ); - if (Object.keys(stats).length === 0) { - description = "You do not have any stats channels set up yet" - pageSelect.addOptions(new StringSelectMenuOptionBuilder().setLabel("No stats channels").setValue("none")) } else { - currentID = Object.keys(stats)[page]! - current = stats[currentID]!; - current = applyChanges({ [currentID]: current }, changes)[currentID]!; - // Propogate pageSelect with list of stats channels - for (const [id, { name, enabled }] of Object.entries(stats)) { - pageSelect.addOptions( - new StringSelectMenuOptionBuilder() - .setLabel(name) - .setValue(id) - .setDescription(`Enabled: ${enabled}`) - ); - } + page = Math.min(page, Object.keys(currentObject).length - 1); + current = currentObject[Object.keys(config.stats)[page]!]! actionSelect.addOptions(new StringSelectMenuOptionBuilder() .setLabel(current.enabled ? "Disable" : "Enable") .setValue("toggleEnabled") .setDescription(`Currently ${current.enabled ? "Enabled" : "Disabled"}, click to ${current.enabled ? "disable" : "enable"} this channel`) .setEmoji(getEmojiByName(current.enabled ? "CONTROL.TICK" : "CONTROL.CROSS", "id") as APIMessageComponentEmoji) ); - description = `**Currently Editing:** ${renderChannel(currentID)}\n\n` + + + embed.setDescription(`**Currently Editing:** ${renderChannel(Object.keys(currentObject)[page]!)}\n\n` + `${getEmojiByName(current.enabled ? "CONTROL.TICK" : "CONTROL.CROSS")} Currently ${current.enabled ? "Enabled" : "Disabled"}\n` + `**Name:** \`${current.name}\`\n` + - `**Preview:** ${await convertCurlyBracketString(current.name, interaction.user.id, interaction.user.username, interaction.guild.name, interaction.guild.members)}` - } - const row = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId("back") - .setStyle(ButtonStyle.Primary) - .setEmoji(getEmojiByName("CONTROL.LEFT", "id") as APIMessageComponentEmoji) - .setDisabled(page === 0), - new ButtonBuilder() - .setCustomId("next") - .setEmoji(getEmojiByName("CONTROL.RIGHT", "id") as APIMessageComponentEmoji) - .setStyle(ButtonStyle.Primary) - .setDisabled(page === Object.keys(stats).length - 1), - new ButtonBuilder() - .setCustomId("add") - .setLabel("Create new") - .setEmoji(getEmojiByName("TICKETS.SUGGESTION", "id") as APIMessageComponentEmoji) - .setStyle(ButtonStyle.Secondary) - .setDisabled(Object.keys(stats).length >= 24), - new ButtonBuilder() - .setCustomId("save") - .setLabel("Save") - .setEmoji(getEmojiByName("ICONS.SAVE", "id") as APIMessageComponentEmoji) - .setStyle(ButtonStyle.Success) - .setDisabled(Object.keys(changes).length === 0), + `**Preview:** ${await convertCurlyBracketString(current.name, interaction.user.id, interaction.user.username, interaction.guild.name, interaction.guild.members)}` + '\n\n' + + createPageIndicator(Object.keys(config.stats).length, page) ); + for (const [id, { name, enabled }] of Object.entries(currentObject)) { + pageSelect.addOptions(new StringSelectMenuOptionBuilder() + .setLabel(`${name} (${renderChannel(id)})`) + .setEmoji(getEmojiByName(enabled ? "CONTROL.TICK" : "CONTROL.CROSS", "id") as APIMessageComponentEmoji) + .setDescription(`${enabled ? "Enabled" : "Disabled"}`) + .setValue(id) + ); + } + } - let embed = new EmojiEmbed() - .setTitle("Stats Channels") - .setDescription(description + "\n\n" + createPageIndicator(Object.keys(stats).length, page)) - .setEmoji("SETTINGS.STATS.GREEN") - .setStatus("Success") + interaction.editReply({embeds: [embed], components: [ + new ActionRowBuilder().addComponents(pageSelect), + new ActionRowBuilder().addComponents(actionSelect), + buttonRow + ]}); - interaction.editReply({ - embeds: [embed], - components: [ - new ActionRowBuilder().addComponents(pageSelect), - new ActionRowBuilder().addComponents(actionSelect), - row - ] - }); - let i: MessageComponentInteraction; + let i: StringSelectMenuInteraction | ButtonInteraction; try { - i = await m.awaitMessageComponent({ filter: (i) => i.user.id === interaction.user.id, time: 30000 }); + i = await m.awaitMessageComponent({ filter: (interaction) => interaction.user.id === interaction.user.id, time: 60000 }) as StringSelectMenuInteraction | ButtonInteraction; } catch (e) { closed = true; continue; } - if (i.isStringSelectMenu()) { + + if(i.isStringSelectMenu()) { switch(i.customId) { case "page": - page = Object.keys(stats).indexOf(i.values[0]!); - i.deferUpdate(); + page = Object.keys(currentObject).indexOf(i.values[0]!); break; case "action": - if(!changes[currentID]) changes[currentID] = {}; + modified = true; switch(i.values[0]!) { - case "edit": - await i.showModal( - new Discord.ModalBuilder() - .setCustomId("modal") - .setTitle(`Stats channel name`) - .addComponents( - new ActionRowBuilder().addComponents( - new TextInputBuilder() - .setCustomId("ex1") - .setLabel("Server Info (1/3)") - .setPlaceholder( - `{serverName} - This server's name\n\n` + - `These placeholders will be replaced with the server's name, etc..` - ) - .setMaxLength(1) - .setRequired(false) - .setStyle(Discord.TextInputStyle.Paragraph) - ), - new ActionRowBuilder().addComponents( - new TextInputBuilder() - .setCustomId("ex2") - .setLabel("Member Counts (2/3) - {MemberCount:...}") - .setPlaceholder( - `{:all} - Total member count\n` + - `{:humans} - Total non-bot users\n` + - `{:bots} - Number of bots\n` - ) - .setMaxLength(1) - .setRequired(false) - .setStyle(Discord.TextInputStyle.Paragraph) - ), - new ActionRowBuilder().addComponents( - new TextInputBuilder() - .setCustomId("ex3") - .setLabel("Latest Member (3/3) - {member:...}") - .setPlaceholder( - `{:name} - The members name\n` - ) - .setMaxLength(1) - .setRequired(false) - .setStyle(Discord.TextInputStyle.Paragraph) - ), - new ActionRowBuilder().addComponents( - new TextInputBuilder() - .setCustomId("text") - .setLabel("Channel name input") - .setMaxLength(1000) - .setRequired(true) - .setStyle(Discord.TextInputStyle.Short) - .setValue(current.name) - ) - ) - ); + case "edit": { + showModal(i, current!) await interaction.editReply({ embeds: [ new EmojiEmbed() @@ -225,35 +209,24 @@ const callback = async (interaction: CommandInteraction) => { ) ] }); - let out: Discord.ModalSubmitInteraction | null; - try { - out = await modalInteractionCollector( - m, - (m) => m.channel!.id === interaction.channel!.id, - (_) => true - ) as Discord.ModalSubmitInteraction | null; - } catch (e) { - continue; - } - if (!out) continue - if (!out.fields) continue - if (out.isButton()) continue; - const newString = out.fields.getTextInputValue("text"); - if (!newString) continue; - changes[currentID]!.name = newString; break; - case "delete": - changes[currentID] = {}; + } + case "toggleEnabled": { i.deferUpdate(); + currentObject[Object.keys(currentObject)[page]!]!.enabled = !currentObject[Object.keys(currentObject)[page]!]!.enabled; + modified = true; break; - case "toggleEnabled": - changes[currentID]!.enabled = !stats[currentID]!.enabled; + } + case "delete": { i.deferUpdate(); + delete currentObject[Object.keys(currentObject)[page]!]; + modified = true; break; + } } break; } - } else if (i.isButton()) { + } else { i.deferUpdate(); switch(i.customId) { case "back": @@ -265,18 +238,14 @@ const callback = async (interaction: CommandInteraction) => { case "add": break; case "save": - let changed = applyChanges(config.stats, changes); - singleNotify("statsChannelDeleted", interaction.guild.id, true) - config.stats = changed; - changes = {} - await client.database.guilds.write(interaction.guildId!, config); + client.database.guilds.write(interaction.guild.id, {stats: currentObject}); + singleNotify("statsChannelDeleted", interaction.guild.id, true); + modified = false; + break; } } - console.log(changes, config.stats); + } while (!closed); - } catch(e) { - console.log(e) - } }; const check = (interaction: CommandInteraction) => { diff --git a/src/utils/createPageIndicator.ts b/src/utils/createPageIndicator.ts index ee123d6..4ddbae2 100644 --- a/src/utils/createPageIndicator.ts +++ b/src/utils/createPageIndicator.ts @@ -1,17 +1,17 @@ import getEmojiByName from "./getEmojiByName.js"; -function pageIndicator(amount: number, selected: number, showDetails?: boolean | true) { +function pageIndicator(amount: number, selected: number, showDetails?: boolean, disabled?: boolean | string) { let out = ""; - + disabled = disabled ? "GREY." : "" if (amount === 1) { - out += getEmojiByName("TRACKS.SINGLE." + (selected === 0 ? "ACTIVE" : "INACTIVE")); + out += getEmojiByName("TRACKS.SINGLE." + (disabled) + (selected === 0 ? "ACTIVE" : "INACTIVE")); } else { for (let i = 0; i < amount; i++) { out += getEmojiByName( "TRACKS.HORIZONTAL." + - (i === 0 ? "LEFT" : i === amount - 1 ? "RIGHT" : "MIDDLE") + - "." + - (i === selected ? "ACTIVE" : "INACTIVE") + (i === 0 ? "LEFT" : i === amount - 1 ? "RIGHT" : "MIDDLE") + + "." + (disabled) + + (i === selected ? "ACTIVE" : "INACTIVE") ); } }