Discord.js v13点击按钮删除频道功能失效该如何修复?
Discord工单系统按钮删除功能修复方案
核心错误点
- 收集器配置错误:你为下拉菜单消息创建的组件收集器配置属性名写错,
filtro不符合discord.js参数要求,正确属性名应为filter;同时该收集器仅筛选选择菜单交互,且仅绑定在初始下拉菜单消息上,工单频道内的按钮点击事件根本不会被该收集器捕获。 - 按钮判断逻辑错误:
Discord.MessageButton.customId是对按钮类的错误引用,不是实际触发交互的实例属性,无法正确匹配按钮点击事件。 - 频道获取逻辑错误:
message.guild.channel是无效属性,无法拿到当前工单频道对象。
修复代码
你可以直接替换原有逻辑,以下是完整修复后的代码:
const Discord = require("discord.js"); const { MessageSelectMenu, MessageActionRow } = require("discord.js"); module.exports = { name: "ticket", author: "Falcone", run: async(client, message, args) => { if (!message.member.permissions.has("ADMINISTRATOR")) return message.reply('你没有`ADMINISTRATOR`权限'); await message.delete(); let embed = new Discord.MessageEmbed() .setColor("RANDOM") .setDescription(`测试`) .setThumbnail(message.guild.iconURL({ dynamic: true })) .setAuthor(message.guild.name, message.guild.iconURL({ dynamic: true })); let painel = new MessageActionRow().addComponents( new MessageSelectMenu() .setCustomId('menu') .setPlaceholder('请选择工单类型') .addOptions([ { label: '技术支持', description: '', emoji: '🙋♂️', value: '1', }, { label: '测试', description: '', emoji: '⛔', value: '2', }, { label: '其他', description: '', emoji: '🤖', value: '3', } ]) ); message.channel.send({ embeds: [embed], components: [painel] }).then(msg => { // 修正filter属性名 const filter = (interaction) => interaction.isSelectMenu() && interaction.user.id === message.author.id; const coletor = msg.createMessageComponentCollector({ filter }); coletor.on('collect', async (collected) => { let ticket = collected.values[0] await collected.deferUpdate() if (ticket === "1") { const ticketEmbed = new Discord.MessageEmbed() .setTitle('工单已创建') .setDescription('您好,客服会尽快为您处理,请先描述您遇到的问题,谢谢!') .setColor('GREEN') .setTimestamp() const delBtnRow = new MessageActionRow() .addComponents( new Discord.MessageButton() .setCustomId('del') .setLabel('🗑️ 删除工单') .setStyle('DANGER'), ); // 创建工单频道,参数名改ticketChannel避免和原msg混淆 message.guild.channels.create(`${collected.user.id}`, { type : 'GUILD_TEXT', permissionOverwrites : [ { id : message.guild.id, deny : ['VIEW_CHANNEL'] }, { id : collected.user.id, allow : ['VIEW_CHANNEL', 'SEND_MESSAGES', 'ATTACH_FILES'] } ] }).then(async (ticketChannel) => { // 发送带按钮的消息并钉选 const ticketMsg = await ticketChannel.send({ embeds: [ticketEmbed], components: [delBtnRow] }); await ticketMsg.pin(); // 给当前工单的删除按钮单独加收集器 const btnFilter = i => i.customId === 'del' && i.user.id === collected.user.id; const btnCollector = ticketMsg.createMessageComponentCollector({ filter: btnFilter }); btnCollector.on('collect', async (i) => { await i.deferUpdate(); // 直接删除当前工单频道 await ticketChannel.delete(); }); }) } // 其他工单类型逻辑可自行扩展 }) }); } }
内容的提问来源于stack exchange,提问作者MrKotopoulos
相关产品推荐
相关产品推荐

