const { Events, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuOptionBuilder, StringSelectMenuBuilder, ComponentType } = require("discord.js"); module.exports = { name: Events.InteractionCreate, async execute(client, interaction) { if (interaction.customId === "presetListMenu") { //await interaction.deferUpdate(); const presets = await interaction.client.db.get("serverPresets"); let groupedPresets = {}; for (let preset of presets) { if (!groupedPresets[preset.category]) { groupedPresets[preset.category] = []; } groupedPresets[preset.category].push( preset.status == -1 ? `🚧 ${preset.name}` : preset.name ); } let fields = []; for (let category in groupedPresets) { fields.push({ name: category, value: `> [**\`${groupedPresets[category].join( "`**](https://canary.discord.com/channels/1105356182295687209/1136364398731079741/1136601775932190730)\n> [**`" )}\`**](https://canary.discord.com/channels/1105356182295687209/1136364398731079741/1136601775932190730)`, inline: true }); } let { tier } = await client.db.get( `ashServers.${interaction.user.id}` ); let tierLevel = ""; switch (tier) { case 1: tierLevel = "Silver"; break; case 2: tierLevel = "Gold"; break; case 3: tierLevel = "Diamond"; break; } const presetCategories = new EmbedBuilder() .setDescription(`## Presets List\nTier Level: \`${tierLevel}\``) .addFields(fields) .setColor("#2b2d31") .setFooter({ text: "Powered by ASH | Assetto Server Hosting", iconURL: client.user.avatarURL() }); const uniqueCategories = [ ...new Set( (await client.db.get("serverPresets")).map( (preset) => preset.name ) ) ]; let presetOptions = uniqueCategories.map((x) => { return new StringSelectMenuOptionBuilder() .setLabel(x) .setValue(x); }); const presetSelectMenu = new StringSelectMenuBuilder() .setCustomId("categorySelect") .setPlaceholder("Select a preset") .addOptions(presetOptions); const row = [ new ActionRowBuilder().addComponents(presetSelectMenu) ]; let categoryResponse = await interaction.reply({ embeds: [presetCategories], components: [...row], ephemeral: true }); const collector = categoryResponse.createMessageComponentCollector({ componentType: ComponentType.StringSelect, time: 6e4 * 2 }); collector.once("collect", async (i) => { const categorySelection = i.values[0]; console.log(categorySelection); let selectedServerQuery = await interaction.client.db.get( `ashServers.${interaction.user.id}.servers` ); const selectedServer = await interaction.client.db.get( `ashServers.${interaction.user.id}.selectedServer` ); let selectedServerInfo = selectedServerQuery.find( (server) => server.nickname === selectedServer ); function findInfoURLByName(nameToFind) { const foundItem = presets.find( (item) => item.name === nameToFind ); return foundItem ? foundItem.infoURL : null; } function findPresetURLByName(nameToFind) { const foundItem = presets.find( (item) => item.name === nameToFind ); return foundItem ? foundItem.discordSync.installURL : null; } selectedServerInfo.preset = categorySelection; selectedServerInfo.presetURL = findPresetURLByName(categorySelection); await interaction.client.db.set( `ashServers.${interaction.user.id}.servers`, selectedServerQuery ); console.log("SHOW UP ----"); console.log( await interaction.client.db.get( `ashServers.${interaction.user.id}.servers` ) ); console.log("SHOW UP ----"); presetCategories.setDescription( `## Presets List\nTier Level: \`${tierLevel}\`\nSelected preset: [**\`${categorySelection}\`**](${findInfoURLByName( categorySelection )})` ); await interaction.editReply({ embeds: [presetCategories], components: [], ephemeral: true }); }); } } };