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

Discord.js机器人添加bot过滤判断后无法转移带反应的embed消息

问题原因

  • 事件参数解析不全:messageReactionAdd 事件会返回 reaction、user 两个参数,你仅解构了消息对象,未获取触发反应的用户,无法正确过滤机器人自身触发的反应。
  • 过滤逻辑错误:你当前判断的是message.author.bot(原消息作者是否为机器人),但你需要过滤的是添加反应的主体是否为机器人,二者逻辑完全不匹配,这是你添加判断后功能失效的核心原因。
  • 频道判断语法错误:
    • 使用赋值运算符=代替全等判断运算符===,会导致逻辑判断完全失效
    • 频道ID取值错误,message.guild.channels.id 为无效属性,正确取值应为message.channel.id
  • 缺少需求要求的逻辑:没有根据反应类型匹配转发频道,也没有删除原频道的源消息。

修复后代码

client.on("messageCreate", message => {
    // 原有自动加反应逻辑保持不变
    if (message.channel.id === analiseChannelID) {
        message.react(aprovada);
        message.react(nula);
        message.react(negada);
    } else if (message.channel.id === aprovadasChannelID) {
        message.react(arquivada);
        message.react(negada);
    } else if (message.channel.id === negadasChannelID) {
        message.react(arquivada);
        message.react(negada);
    } else if (message.channel.id === nulaChannelID) {
        message.react(arquivada);
        message.react(negada);
    }
});

// 修复事件参数,拿到触发反应的user
client.on("messageReactionAdd", async (reaction, user) => {
    // 过滤机器人自身添加的反应
    if (user.bot) return;
    const message = reaction.message;
    // 仅处理待审核频道的消息反应
    if (message.channel.id !== analiseChannelID) return;
    // 按表情匹配对应转发频道
    let targetChannel;
    if (reaction.emoji.id === aprovada || reaction.emoji.name === aprovada) {
        targetChannel = message.client.channels.cache.get(aprovadasChannelID);
    } else if (reaction.emoji.id === negada || reaction.emoji.name === negada) {
        targetChannel = message.client.channels.cache.get(negadasChannelID);
    } else if (reaction.emoji.id === nula || reaction.emoji.name === nula) {
        targetChannel = message.client.channels.cache.get(nulaChannelID);
    }
    // 未匹配到对应表情直接终止
    if (!targetChannel) return;
    try {
        // 转发embed
        await targetChannel.send({ embeds: message.embeds });
        // 删除原频道的源消息
        await message.delete();
    } catch (err) {
        console.error("消息转发/删除失败:", err);
    }
});

额外注意事项

  • 如果你使用的是discord.js v14+版本,需要在客户端初始化时开启MessageContent、GuildMessageReactions等相关意图,否则无法监听到消息反应事件。
  • 如果你的反应表情是服务器自定义表情,判断时需要取reaction.emoji.id匹配,如果是系统默认表情,取reaction.emoji.name匹配即可。

内容的提问来源于stack exchange,提问作者Maker__

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:45:03