Discord.js v13工单系统ephemeral消息失效 机器人启动后需点击按钮激活
问题1:ephemeral属性不生效的原因与解决
ephemeral(短暂消息)仅能在响应交互对象时生效,你当前调用的是普通频道消息的reply方法,不属于交互响应范畴,该属性会被直接忽略。你需要改为对触发按钮点击的交互实例调用reply/followUp方法,才能生效短暂消息配置。
问题2:首次点击按钮才能激活系统的原因与解决
你错误地将工单创建逻辑写在了collector的收集回调中,而collector本身是在第一次按钮点击触发run函数时才会被创建,相当于第一次点击的作用仅为启动监听器,后续点击才会触发工单创建逻辑。实际上discord.js的交互事件已经会主动触发run函数,你完全不需要额外创建collector监听组件,直接在run函数内处理当前交互即可。
修正后代码
const { MessageActionRow, MessageButton, MessageEmbed, Permissions } = require('discord.js'); const db = require("quick.db"); exports.run = async (client, interaction) => { // 只处理OPENTICKET的按钮交互 if (!interaction.isButton() || interaction.customId !== 'OPENTICKET') return; // 必须加await,否则会出现交互超时错误 await interaction.deferUpdate(); let getContador = await db.get('counter') if(getContador === null) { await db.set("counter", 1) getContador = 1 } else { await db.add("counter", 1) getContador = await db.get('counter') } let tcID = "895323735702253569" let tmID = "895358127950659604" // 直接处理当前交互,不需要额外创建collector let cTicket = await interaction.guild.channels.create(`🎫┆Ticket ${getContador}`, { type: 'GUILD_TEXT', permissionOverwrites: [ { id: interaction.guild.id, deny: [Permissions.FLAGS.VIEW_CHANNEL], }, { id: interaction.user.id, allow: [Permissions.FLAGS.VIEW_CHANNEL, Permissions.FLAGS.SEND_MESSAGES], }, ] }) // 用交互实例的followUp方法发送短暂消息 await interaction.followUp({ content: `... ${cTicket.toString()}...`, ephemeral: true }) }
内容的提问来源于stack exchange,提问作者snowe
相关产品推荐
相关产品推荐

