const { SlashCommandBuilder, EmbedBuilder, ButtonStyle, ButtonBuilder, MessageFlags, ContainerBuilder, TextDisplayBuilder, MediaGalleryBuilder, ThumbnailBuilder, SeparatorBuilder, SectionBuilder, } = require("discord.js"); const bumpdb = require("../../schemas/bump"); const mConfig = require("../../config.json"); module.exports = { data: new SlashCommandBuilder() .setName("preview") .setDescription("|📜・Preview the server embed"), run: async ({ interaction, client }) => { // Defer reply with ephemeral flag await interaction.deferReply({ flags: MessageFlags.Ephemeral }); // Fetch server config from your DB const db = await bumpdb.findOne({ server: interaction.guild.id }); // Validate essential data if (!db || !db.invlink || !db.txt || !db.channel) { const errorEmbed = new EmbedBuilder() .setColor(mConfig.colors.error) .setDescription( `<:settings:1252974786200473630> Please complete your server setup using the available commands.` ); return interaction.followUp({ embeds: [errorEmbed], ephemeral: true }); } // Normalize invite URL const inviteURL = db.invlink.startsWith("http") ? db.invlink : `https://discord.gg/${db.invlink}`; // Buttons (one button per SectionBuilder) const joinButton = new ButtonBuilder() .setEmoji("<:home:1252974766760132638>") .setLabel("Join Server") .setStyle(ButtonStyle.Link) .setURL(inviteURL); const addButton = new ButtonBuilder() .setEmoji("<:rocket:1252974718865113159>") .setLabel("Add WeBump") .setStyle(ButtonStyle.Link) .setURL(mConfig.links.invite); // Prepare display components container const container = new ContainerBuilder(); // Server info text const infoText = new TextDisplayBuilder().setContent( `## ${interaction.guild.name}\n` + `<:clock:1287010766624391178> **Created:** \n` + `<:user:1252974736422731887> **Members:** \`${interaction.guild.memberCount}\`\n` + `<:star:1252974723294429225> **Boosts:** \`${interaction.guild.premiumSubscriptionCount}\`\n` + `<:rocket:1252974718865113159> **Bumps:** \`${db.numbump || 0}\`` ); // Thumbnail for server icon inside a section const thumbnail = new ThumbnailBuilder() .setURL(interaction.guild.iconURL({ size: 256, dynamic: true }) || client.user.avatarURL()) .setDescription(`${interaction.guild.name} Server Icon`); const infoSection = new SectionBuilder() .addTextDisplayComponents(infoText) .setThumbnailAccessory(thumbnail); container.addSectionComponents(infoSection); container.addSeparatorComponents(new SeparatorBuilder()); // Server description text const descriptionText = new TextDisplayBuilder() .setContent(`## <:edit:1252974696992083970> Server Description:\n${db.txt}`); container.addTextDisplayComponents(descriptionText); container.addSeparatorComponents(new SeparatorBuilder()); // Footer text with links const footerText = new TextDisplayBuilder() .setContent( `[Support](${mConfig.links.support}) • [Nova Advertising](${mConfig.links.nova}) • [Free Premium](https://guilds.me/servers/1039881426595762247/vote)` ); // Banner media gallery const mediaGallery = new MediaGalleryBuilder().addItems([{ media: { url: db.banner } }]); container.addTextDisplayComponents(footerText); container.addMediaGalleryComponents(mediaGallery); container.addSeparatorComponents(new SeparatorBuilder()); // Buttons in separate sections (one button per section) const joinSection = new SectionBuilder().setButtonAccessory(joinButton); const addSection = new SectionBuilder().setButtonAccessory(addButton); container.addSectionComponents(joinSection); container.addSectionComponents(addSection); // Send the reply try { await interaction.followUp({ content: `<:global:1252974701773455371> ${inviteURL}`, components: [container], flags: MessageFlags.IsComponentsV2 | MessageFlags.Ephemeral, }); } catch (error) { console.error("Preview send error:", error); const errorEmbed = new EmbedBuilder() .setColor(mConfig.colors.error) .setDescription( `<:settings:1252974786200473630> Failed to send preview. Please check your invite and media settings.` ); await interaction.followUp({ embeds: [errorEmbed], ephemeral: true }); } }, };