Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

A new category is being created each time a users clicks on the support button

I have a ticket system ive been updating from v13 to v14 of discord, and ive changed a lot to meet the v14 reqs, but Im having an issue with the categories part (which wasn’t an issue in v13 of discord)

So when I go to create a ticket, I just click the support button and a ticket is made along side the category being created.

Image of the ticket after being created and placed in a brand new category

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Code:

const { PermissionsBitField, EmbedBuilder, ChannelType, ActionRowBuilder, ButtonBuilder, ButtonStyle, ButtonInteraction } = require('discord.js');
const client = require('../index');
const supportSchema = require('../models/supportRole');
const categorySchema = require('../models/category');

client.on('interactionCreate', async (interaction) => {
  try {
    if (interaction.isButton()) {
      if (interaction.customId === 'tic') {
        let ticketChannel = interaction.guild.channels.cache.find((tc) => tc.name === `ticket-${interaction.user.id}`);
        let ticketCategory = interaction.guild.channels.cache.find((ch) => ch.name === 'tickets');
        
        if (interaction.guild.channels.cache.find((ch) => ch.name === `ticket-${interaction.user.id}`)) return interaction.reply({ content: `<:CL_Support:912055272275599380> You currently have an open ticket.\n<:CL_Reply:909436090413363252> <#${ticketChannel.id}>`, ephemeral: true });
        if (!interaction.guild.members.me.permissions.has(PermissionsBitField.Flags.ManageChannels)) return interaction.reply({ content: "I do not have perms to create your ticket channel. - `[MANAGE_CHANNELS]`", ephemeral: true });
        
        if (interaction.guild.channels.cache.some((type) => type.type === 'GuildCategory' && type.name === 'tickets')) {
          console.log(`A new ticket has been created in ${interaction.guild.name} by ${interaction.user.username}`);
        } else {
          categorySchema.findOne({ Guild: interaction.guild.id }, async (err, data) => {
              if (data) {
                const ticketCategory = interaction.guild.channels.create({
                    name: `${data.Category}`,
                    permissionOverwrites: [
                      {
                        id: interaction.guild.members.me.roles.highest,
                        allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles, PermissionsBitField.Flags.ManageChannels],
                      },
                      {
                        id: interaction.user.id,
                        allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles],
                      },
                      {
                        id: interaction.guild.roles.everyone,
                        deny: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles],
                      },
                    ],
                    type: ChannelType.GuildCategory,
                  }).catch();
              }
            
              if (!data) {
                const ticketCategory = interaction.guild.channels.create({
                    name: 'tickets',
                    permissionOverwrites: [
                      {
                        id: interaction.guild.members.me.roles.highest,
                        allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles, PermissionsBitField.Flags.ManageChannels],
                      },
                      {
                        id: interaction.user.id,
                        allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles],
                      },
                      {
                        id: interaction.guild.roles.everyone,
                        deny: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles],
                      },
                    ],
                    type: ChannelType.GuildCategory,
                  }).catch();
              }
            }
          );
        }
        
        supportSchema.findOne({ Guild: interaction.guild.id }, async (err, data) => {
            if (data) {
              let role = data.Role;
              const channel = await interaction.guild.channels.create({
                  parent: ticketCategory,
                  name: `ticket-${interaction.user.id}`,
                  topic: "Ticketing made easy, right at your fingertips!",
                  permissionOverwrites: [
                    {
                      id: interaction.guild.members.me.roles.highest,
                      allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles, PermissionsBitField.Flags.ManageChannels],
                    },
                    {
                      id: interaction.user.id,
                      allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles],
                    },
                    {
                      id: interaction.guild.roles.everyone,
                      deny: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles],
                    },
                    {
                      id: role,
                      allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles, PermissionsBitField.Flags.ManageChannels],
                    },
                  ],
                  type: ChannelType.GuildText,
                }).catch();
              
              const ticketEmbed = new EmbedBuilder()
                .setTitle('__Support Ticket__')
                .setDescription("> Support will be with you shortly. While you wait, please let us know how we can help you today!\n\nClick on the 🗑️ to close this ticket")
                .setColor('Green')
                .setFooter({ text: `User ID: ${interaction.user.id}`, iconURL: interaction.user.displayAvatarURL() })
                .setTimestamp();
              
              /*const lockTicket = new ButtonBuilder()
                  .setCustomId('lockChannelWithData')
                  .setLabel("đź”’ Lock")
                  .setStyle(ButtonStyle.Secondary)
                  .setDisabled(false);*/
              
              const deleteTicket = new ButtonBuilder()
                  .setCustomId('delChannelWithData')
                  .setLabel("🗑️ Close")
                  .setStyle(ButtonStyle.Danger)
                  .setDisabled(false);
              
              interaction.reply({ content: `<:CL_Support:912055272275599380> Your ticket has been created!\n<:CL_Reply:909436090413363252> <#${channel.id}>`, ephemeral: true });
              channel.send({ content: `<@&${role}> <@${interaction.user.id}>`, embeds: [ticketEmbed], components: [new ActionRowBuilder().addComponents(deleteTicket)] });
              
              const logchannel = interaction.guild.channels.cache.find((lc) => lc.name === 'mod-log');
              if (logchannel) {
                const ticketLogs = new EmbedBuilder()
                  .setTitle('Ticket Created')
                  .addFields([
                     {
                        name: 'Ticket Name',
                        value: `<:CL_Reply:909436090413363252> \`${channel.name}\``
                     },
                     {
                        name: 'Opened by',
                        value: `<:CL_Reply:909436090413363252> \`${interaction.user.tag}\``
                     },
                     {
                        name: 'Created',
                        value: `<:CL_Reply:909436090413363252> <t:${Math.floor(Date.now() / 1000)}:R>`
                     }
                  ])
                  .setFooter({ text: "Crimson - Ticket Logger", iconURL: client.user.displayAvatarURL() })
                  .setColor("#5865F2")
                  .setTimestamp();
                logchannel.send({ embeds: [ticketLogs] });
              }
            }
          
            if (!data) {
              const channel = await interaction.guild.channels.create({
                  parent: ticketCategory,
                  name: `ticket-${interaction.user.id}`,
                  topic: "Ticketing made easy, right at your fingertips!",
                  permissionOverwrites: [
                    {
                      id: interaction.guild.members.me.roles.highest,
                      allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles, PermissionsBitField.Flags.ManageChannels],
                    },
                    {
                      id: interaction.user.id,
                      allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles],
                    },
                    {
                      id: interaction.guild.roles.everyone,
                      deny: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.AttachFiles],
                    },
                  ],
                  type: ChannelType.GuildText,
                }).catch();
              
              const ticketEmbed = new EmbedBuilder()
                .setTitle('__Support Ticket__')
                .setDescription("> Support will be with you shortly. While you wait, please let us know how we can help you today!\n\nClick on the 🗑️ to close this ticket")
                .setColor('Green')
                .setFooter({ text: `User ID: ${interaction.user.id}`, iconURL: interaction.user.displayAvatarURL() })
                .setTimestamp();
              
              const deleteTicket = new ButtonBuilder()
                  .setCustomId('delChannelWithData')
                  .setLabel("🗑️ Close")
                  .setStyle(ButtonStyle.Danger)
                  .setDisabled(false);
              
              interaction.reply({ content: `<:CL_Support:912055272275599380> Your ticket has been created!\n<:CL_Reply:909436090413363252> <#${channel.id}>`, ephemeral: true });
              channel.send({ content: `@here <@${interaction.user.id}>`, embeds: [ticketEmbed], components: [new ActionRowBuilder().addComponents(deleteTicket)] });
              
              const logchannel = interaction.guild.channels.cache.find((lc) => lc.name === 'mod-log');
              if (logchannel) {
                const ticketLogs = new EmbedBuilder()
                  .setTitle("Ticket Created")
                  .addFields([
                     {
                        name: 'Ticket Name',
                        value: `<:CL_Reply:909436090413363252> \`${channel.name}\``
                     },
                     {
                        name: 'Opened by',
                        value: `<:CL_Reply:909436090413363252> \`${interaction.user.tag}\``
                     },
                     {
                        name: 'Created',
                        value: `<:CL_Reply:909436090413363252> <t:${Math.floor(Date.now() / 1000)}:R>`
                     }
                  ])
                  .setFooter({ text: "Crimson - Ticket Logger", iconURL: client.user.displayAvatarURL() })
                  .setColor('#5865F2')
                  .setTimestamp();
                logchannel.send({ embeds: [ticketLogs] });
              }
            }
          }
        );
      }
      
      if (interaction.customId === 'delChannelWithData') {
        if (!interaction.member.permissions.has(PermissionsBitField.Flags.ManageChannels)) {
          return interaction.reply({ content: "You do not have perms to close this ticket. - `[MANAGE_CHANNELS]`", ephemeral: true });
        } else {
          interaction.reply({ content: "Closing ticket, please wait...", ephemeral: true }).then((ch) => {
              setTimeout(() => interaction.channel.delete(), 3000);
            }).catch((err) => interaction.reply(`\`${err}\``));
        }
      }
      
      if (interaction.customId === 'delChannelWithoutData') {
        if (!interaction.member.permissions.has(PermissionsBitField.Flags.ManageChannels)) {
          return interaction.reply({ content: "You do not have perms to close this ticket. - `[MANAGE_CHANNELS]`", ephemeral: true });
        } else {
          interaction.reply({ content: "Closing ticket, please wait...", ephemeral: true }).then((ch) => {
              setTimeout(() => interaction.channel.delete(), 3000);
            }).catch((err) => interaction.reply(`\`${err}\``));
        }
      }
    }
  } catch (err) {
    interaction.reply(`\`${err}\``);
  }
});

>Solution :

Something is wrong with this line (it’s evaluating to false):

interaction.guild.channels.cache.some((type) => type.type === 'GuildCategory' && type.name === 'tickets'))

My guess is that type.type === 'GuildCategory' is out of date. Try this:

interaction.guild.channels.cache.some((type) => type.type === ChannelType.GuildCategory && type.name === 'tickets'))
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading