0

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

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}\``);
  }
});
Roman Beard
  • 75
  • 2
  • 15
  • 1
    Does this answer your question? [Discord TypeError: message.channel.isText is not a function](https://stackoverflow.com/questions/73027854/discord-typeerror-message-channel-istext-is-not-a-function) – Zsolt Meszaros Aug 19 '22 at 04:48

1 Answers1

1

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'))
IndevSmiles
  • 737
  • 6
  • 17