const { Client, Intents, PermissionsBitField, ChannelType, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuBuilder } = require('discord.js'); module.exports = { name: 'interactionCreate', async execute(interaction) { if (!interaction.isStringSelectMenu() && !interaction.isButton()) return; const appbuttons = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setLabel("Appeal's") .setURL("https://forms.gle/nasjmUThiz3nzTa79") .setEmoji('<:Ed_form:1250252674218196993>') .setStyle(ButtonStyle.Link), new ButtonBuilder() .setLabel("Roblox group") .setURL("https://www.roblox.com/groups/33293764/Extra-Designs#!/about") .setEmoji('<:Ed_roblox:1232778651989446736>') .setStyle(ButtonStyle.Link) ); if (interaction.isStringSelectMenu()) { try { await interaction.deferUpdate(); const selectedValue = interaction.values[0]; let interactionEmbed; if (interaction.customId === 'select') { if (selectedValue === 'option_regulations') { interactionEmbed = new EmbedBuilder() .setTitle('Regulations') .setColor("#0182FD") .addFields( { name: 'Nsfw', value: 'You must not show any NSFW content in our server, doing so will result in a ban.' }, { name: 'Profanity', value: 'While swearing is allowed, please keep it to a minimum and be mindful of others in the server.' }, { name: 'Discord Tos', value: 'Adhere to Discord\'s Terms of Service at all times. Failure to do so will lead to a ban and a report to Discord.' }, { name: 'Common Sense', value: 'Use common sense; refrain from engaging in any activity that is clearly inappropriate or harmful.' }, { name: 'Respect', value: 'Show respect to everyone in the server. Treat others with the same level of respect you expect to receive.' }, { name: 'Advertising', value: 'Any type of Advertising is not allowed or you will get an immediate ban' } ); } else if (selectedValue === 'option_careers') { interactionEmbed = new EmbedBuilder() .setTitle('Careers') .setDescription('Want to become a designer? To apply, please DM our bot at <@1192137595300368384>. Alternatively, you can send a modmail, and a high-ranking member will assist you.') .setColor("#0182FD") .setFooter({ text: 'Pay rate: 90% of designs\' earnings.' }); } else if (selectedValue === 'option_Guide') { interactionEmbed = new EmbedBuilder() .setTitle('Interaction Guide') .setColor("#0182FD") .setDescription('Here is how our moderation system works') .addFields( { name: '3 warnings = mute for 1 day', value: '5 warnings = kick' }, { name: '7 warnings = ban', value: 'adhere to discord rules' } ); } else if (selectedValue === 'option_server_info') { interactionEmbed = new EmbedBuilder() .setTitle('Information') .setColor("#0182FD") .addFields( { name: 'Products', value: 'Discover our diverse range of services, spanning Liveries, Clothing, Graphics, Packages, Discord Services, and many more.' }, { name: 'Designing Department', value: 'Join our dynamic team of skilled, professional, and experienced designers. Apply by messaging our bot <@1192137595300368384> through Modmail. Designers earn an impressive 90% of their commissions.' }, { name: 'Order Information', value: 'For detailed Order Info Review our Order Terms of Service [here](https://discord.com/channels/1175455610679078912/1175455931765629059).' } ); } } if (interaction.customId === 'select_help') { if (selectedValue === 'option_support') { const supportButtons = new ActionRowBuilder().addComponents( new ButtonBuilder() .setCustomId('gen_support') .setLabel('General Support') .setStyle(ButtonStyle.Primary), new ButtonBuilder() .setCustomId('mgmt_support') .setLabel('Management Support') .setStyle(ButtonStyle.Primary) ); await interaction.followUp({ content: 'Please select the type of support you need:', components: [supportButtons], ephemeral: true }); return; } } if (interactionEmbed) { await interaction.followUp({ embeds: [interactionEmbed], ephemeral: true }); const menu1 = new ActionRowBuilder().addComponents( new StringSelectMenuBuilder() .setCustomId('select') .setPlaceholder('Make a selection') .addOptions([ { label: 'Regulations', description: "Read server's rules.", value: 'option_regulations', emoji: '<:Ed_chat:1250252066841038898>' }, { label: 'Careers', description: 'Make a Career in Extra', value: 'option_careers', emoji: '<:ED_folder:1221266760741683333>' }, { label: 'Interaction Guide', description: "Read How our server moderation system works", value: 'option_Guide', emoji: '<:Ed_tool:1221266329374560256>' }, { label: 'Server Information', description: 'Review our Server Information', value: 'option_server_info', emoji: '<:Ed_info:1221271425483149383>' }, ]) ); const menu2 = new ActionRowBuilder().addComponents( new StringSelectMenuBuilder() .setCustomId('select_help') .setPlaceholder('Get help') .addOptions([ { label: 'Support info', description: "Get support, and info", value: 'option_support', emoji: '<:Ed_ticket:1232781661612015698>' } ]) ); await interaction.editReply({ components: [menu1, menu2, appbuttons] }); } } catch (error) { console.error('Error replying to interaction:', error); if (error.code === 10062) { console.warn('Interaction was unknown (likely timed out).'); } else if (error.code !== 40060) { try { await interaction.followUp({ content: 'There was an error processing your request.', ephemeral: true }); } catch (err) { console.error('Error sending follow-up:', err); } } } } if (interaction.isButton()) { try { if (interaction.customId === 'gen_support' || interaction.customId === 'mgmt_support') { const ticketType = interaction.customId === 'gen_support' ? 'gen' : 'mgmt'; const supportRoleIds = ticketType === 'gen' ? ['1252105419858514028', '1252105419858514027', '1252105419871227904'] : ['1252105419871227907', '1252105419871227905']; const ticketChannel = await interaction.guild.channels.create({ name: `${ticketType}-${interaction.user.username}`, type: ChannelType.GuildText, parent: '1255331722770256023', permissionOverwrites: [ { id: interaction.guild.roles.everyone, deny: [PermissionsBitField.Flags.ViewChannel], }, ...supportRoleIds.map(roleId => ({ id: roleId, allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages], })), { id: interaction.user.id, allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages], } ] }); const ticketButtons = new ActionRowBuilder().addComponents( new ButtonBuilder() .setCustomId('claim_ticket') .setLabel('Claim') .setStyle(ButtonStyle.Success), new ButtonBuilder() .setCustomId('close_ticket') .setLabel('Close') .setStyle(ButtonStyle.Danger) ); await ticketChannel.send({ content: `Welcome ${interaction.user}, please describe your issue.`, components: [ticketButtons] }); await interaction.reply({ content: `Your ticket has been created: ${ticketChannel}`, ephemeral: true }); } if (interaction.customId === 'claim_ticket') { await interaction.channel.permissionOverwrites.set([ { id: interaction.guild.roles.everyone, deny: [PermissionsBitField.Flags.ViewChannel], }, { id: interaction.user.id, allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages], } ]); await interaction.reply({ content: 'This ticket has been claimed.', ephemeral: true }); } if (interaction.customId === 'close_ticket') { const closeEmbed = new EmbedBuilder() .setColor('#FF0000') .setDescription('Are you sure you want to close this ticket?'); const closeButtons = new ActionRowBuilder().addComponents( new ButtonBuilder() .setCustomId('confirm_close') .setLabel('Confirm') .setStyle(ButtonStyle.Danger) ); await interaction.reply({ embeds: [closeEmbed], components: [closeButtons], ephemeral: true }); } if (interaction.customId === 'confirm_close') { async function fetchMessages(channel) { let messages = []; let lastId; let fetched; do { fetched = await channel.messages.fetch({ limit: 100, before: lastId }); messages = messages.concat(Array.from(fetched.values())); lastId = fetched.last()?.id; } while (fetched.size === 100); return messages; } const ticketChannel = interaction.channel; const messages = await fetchMessages(ticketChannel); await Promise.all(messages.map(async message => { if (message.author.id === interaction.client.user.id) { await message.delete(); } })); await ticketChannel.delete(); await interaction.reply({ content: 'The ticket has been closed and deleted.', ephemeral: true }); } } catch (error) { console.error('Error handling button interaction:', error); if (error.code === 10062) { console.warn('Interaction was unknown (likely timed out).'); } else if (error.code !== 40060) { try { await interaction.reply({ content: 'There was an error processing your request.', ephemeral: true }); } catch (err) { console.error('Error sending follow-up:', err); } } } } }, };