You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:57:02