Discord.js v13 Ticket System工单系统创建后无法关闭删除求助
解决方案
你的现有代码存在两个核心问题:
- 创建工单后没有配置关闭工单的触发入口
- 没有对应监听关闭触发事件的处理逻辑,来执行频道删除操作
步骤1:修改工单创建逻辑,增加关闭触发入口
这里我们用按钮作为关闭入口,修改你的现有代码如下:
case 'ticket': case 'Ticket': const guild = client.guilds.cache.get('877207084251369512') // 创建频道是异步操作,用await拿到创建完成的频道对象,避免查找频道失败的问题 const ticketChannel = await guild.channels.create(message.author.username + '-ticket', { type: 'GUILD_TEXT', // v13版本频道类型枚举调整,text需改为GUILD_TEXT topic: 'Ticket' + message.author.id, parent: '896402801428456046', permissionOverwrites: [ { id: message.author.id, allow: ['SEND_MESSAGES', 'VIEW_CHANNEL', 'READ_MESSAGE_HISTORY', 'EMBED_LINKS', 'ATTACH_FILES'], }, { id: message.guild.roles.everyone, deny: ['VIEW_CHANNEL'], }, { id: "877570054710001735", allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'], }, ], }) const created = new Discord.MessageEmbed() .setTitle("Ticket-System") .setDescription("您的工单已创建成功!") .setTimestamp() .setFooter('Ticket System') .setColor("GREY") message.channel.send({embeds: [created]}); // 新建关闭按钮 const closeBtn = new Discord.MessageButton() .setCustomId('close_ticket') .setLabel('关闭工单') .setStyle('DANGER') const row = new Discord.MessageActionRow().addComponents(closeBtn) // 给新工单频道发一条带关闭按钮的提示 const tipEmbed = new Discord.MessageEmbed() .setDescription(`工单创建人:<@${message.author.id}>\n处理完毕后点击下方按钮即可关闭工单`) .setColor('GREEN') ticketChannel.send({embeds: [tipEmbed], components: [row]})
注意:你需要把当前的代码逻辑放在async函数里,否则await会报错,比如消息监听事件回调要写成client.on('messageCreate', async message => { ... })
步骤2:新增交互监听事件,处理工单关闭逻辑
在你的客户端事件监听部分新增以下代码,监听按钮点击事件:
client.on('interactionCreate', async interaction => { // 只处理关闭工单的按钮交互 if (!interaction.isButton() || interaction.customId !== 'close_ticket') return; const channel = interaction.channel; // 校验当前频道是否为工单频道,避免误删普通频道 if (!channel.topic?.startsWith('Ticket') || channel.parentId !== '896402801428456046') { return interaction.reply({content: '当前频道不是工单频道,无法关闭', ephemeral: true}) } // 校验权限:仅工单创建人、管理组可关闭工单 const ticketAuthorId = channel.topic.replace('Ticket', '') const isAdmin = interaction.member.roles.cache.has('877570054710001735') if (interaction.user.id !== ticketAuthorId && !isAdmin) { return interaction.reply({content: '你没有权限关闭该工单', ephemeral: true}) } // 执行删除频道操作 await interaction.reply('工单将在3秒后关闭') setTimeout(() => { channel.delete().catch(err => console.log('删除工单频道失败:', err)) }, 3000) })
前置要求确认
- 你的bot已经被授予
MANAGE_CHANNELS权限,否则无法删除频道 - 你的Discord.js客户端初始化时已经开启了必要的意图:
GUILDS、GUILD_MESSAGES、GUILD_MESSAGE_REACTIONS、GUILD_INTERACTIONS - 你已经在Discord开发者后台的bot设置里开启了
Privileged Gateway Intents下的相关开关
内容的提问来源于stack exchange,提问作者I need Help
相关产品推荐
相关产品推荐

