code
unknown
javascript
a year ago
7.7 kB
5
Indexable
const { SlashCommandBuilder } = require('@discordjs/builders'); const { ChannelType } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('embedbuilder') .setDescription('Send a custom embed [DEV ONLY]. A.K.A EmbedBuilder, SendEmbed') .addChannelOption(option => option.setName('channel') .setDescription('The channel to send the embed to.') .setRequired(true) .addChannelTypes([ChannelType.GUILD_TEXT])) .addBooleanOption(option => option.setName('show-timestamp') .setDescription('Show timestamp on the embed') .setRequired(false)) .addStringOption(option => option.setName('image-url') .setDescription('Image URL (optional)') .setRequired(false)), async execute(interaction) { try { // Check if the user has any of the admin roles const adminRoleIds = config.adminRoleId; const member = interaction.guild.members.cache.get(interaction.user.id); // Check if adminRoleIds is an array and user has any of these roles const hasAdminRole = Array.isArray(adminRoleIds) && adminRoleIds.some(roleId => member.roles.cache.has(roleId)); if (!hasAdminRole) { return interaction.reply({ content: "You do not have permission to use this command.", ephemeral: true, }); } const modal = new ModalBuilder() .setCustomId('embedModal') .setTitle('Embed Builder'); const titleInput = new TextInputBuilder() .setCustomId('title') .setLabel('Title') .setStyle(TextInputStyle.Short) .setRequired(true); const descriptionInput = new TextInputBuilder() .setCustomId('description') .setLabel('Description') .setStyle(TextInputStyle.Paragraph) .setRequired(true); const colorInput = new TextInputBuilder() .setCustomId('color') .setLabel('Color (hex code, optional)') .setStyle(TextInputStyle.Short) .setRequired(false); const footerInput = new TextInputBuilder() .setCustomId('footer') .setLabel('Footer (optional)') .setStyle(TextInputStyle.Short) .setRequired(false); const thumbnailUrlInput = new TextInputBuilder() .setCustomId('thumbnailUrl') .setLabel('Thumbnail URL (optional)') .setStyle(TextInputStyle.Short) .setRequired(false); modal.addComponents( new ActionRowBuilder().addComponents(titleInput), new ActionRowBuilder().addComponents(descriptionInput), new ActionRowBuilder().addComponents(colorInput), new ActionRowBuilder().addComponents(footerInput), new ActionRowBuilder().addComponents(thumbnailUrlInput) ); await interaction.showModal(modal); const filter = (i) => i.customId === 'embedModal' && i.user.id === interaction.user.id; interaction.awaitModalSubmit({ filter, time: 60000 }) .then(async modalInteraction => { const title = modalInteraction.fields.getTextInputValue('title'); const description = modalInteraction.fields.getTextInputValue('description'); const color = modalInteraction.fields.getTextInputValue('color') || Colors.Green; const footer = modalInteraction.fields.getTextInputValue('footer'); const thumbnailUrl = modalInteraction.fields.getTextInputValue('thumbnailUrl'); const showTimestamp = interaction.options.getBoolean('show-timestamp') || false; const imageURL = interaction.options.getString('image-url'); const embed = new EmbedBuilder() .setTitle(title) .setDescription(description) .setColor(color); if (footer) embed.setFooter({ text: footer }); if (thumbnailUrl) embed.setThumbnail(thumbnailUrl); if (showTimestamp) embed.setTimestamp(); if (imageURL) embed.setImage(imageURL); const sendButton = new ButtonBuilder() .setCustomId('sendButton') .setLabel('Send') .setStyle(ButtonStyle.Success); const editButton = new ButtonBuilder() .setCustomId('editButton') .setLabel('Edit') .setStyle(ButtonStyle.Primary); const cancelButton = new ButtonBuilder() .setCustomId('cancelButton') .setLabel('Cancel') .setStyle(ButtonStyle.Danger); const actionRow = new ActionRowBuilder().addComponents(sendButton, editButton, cancelButton); await modalInteraction.reply({ embeds: [embed], components: [actionRow], ephemeral: true }); const buttonFilter = (i) => ['sendButton', 'editButton', 'cancelButton'].includes(i.customId) && i.user.id === interaction.user.id; const collector = modalInteraction.channel.createMessageComponentCollector({ filter: buttonFilter, time: 60000 }); collector.on('collect', async buttonInteraction => { if (buttonInteraction.customId === 'sendButton') { const channel = interaction.options.getChannel('channel'); if (channel.type === 'GUILD_TEXT' && channel.permissionsFor(interaction.user).has(Permissions.FLAGS.SEND_MESSAGES)) { await channel.send({ embeds: [embed] }); await buttonInteraction.update({ content: 'Embed sent successfully!', embeds: [], components: [], ephemeral: true }); } else { await buttonInteraction.update({ content: 'You do not have permission to send messages in the chosen channel.', embeds: [], components: [], ephemeral: true }); } } else if (buttonInteraction.customId === 'editButton') { await buttonInteraction.update({ content: 'Please edit your embed.', components: [], ephemeral: true }); await interaction.showModal(modal); // Restart the process for editing } else if (buttonInteraction.customId === 'cancelButton') { await buttonInteraction.update({ content: 'Embed creation canceled.', embeds: [], components: [], ephemeral: true }); } }); }) .catch(console.error); } catch (error) { console.error('Error executing embedbuilder:', error); interaction.reply({ content: 'An error occurred while executing the command.', ephemeral: true }); } }, };
Editor is loading...
Leave a Comment