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

Discord bot仅被@时才发Embed,但回复消息也触发如何解决?

问题原因

discord.js 中的 message.mentions.has() 方法默认会将回复消息时自动附带的隐含用户提及纳入检测范围,所以用户回复 bot 的消息时就算没有手动@,也会命中触发条件。

修复方案

给 mentions.has() 方法添加第二个配置参数,忽略回复场景的隐含提及即可,修改后的代码如下:

const mentionEmbed = new Discord.MessageEmbed()
    .setColor("#FF5733")
    .setTitle("Salve, Roberval na área 🐔")
    .setDescription("Sou um bot dedicado ao envio de desenhos ASCII e copypastas utilizados em streams de qualidade duvidosa na plataforma roxa. \n \nPara me usar, basta utilizar o prefixo r! + o comando que você quiser!")
    .setFooter("All rights reserved @ Roberval - 2021", "https://i.imgur.com/BwCCYT9.jpg");

client.on("message", (message) => {
    if (message.author.bot) return false;

    if (message.content.includes("@here") || message.content.includes("@everyone")) return false;

    // 新增ignoreRepliedUser配置,忽略回复消息中的隐含提及
    if (message.mentions.has(client.user.id, { ignoreRepliedUser: true })) {
        message.channel.send(mentionEmbed);
    }
});

可选严格模式

如果你需要仅当用户发送纯@bot内容时才触发,排除@同时带其他文本的场景,可以再加一层内容校验:

client.on("message", (message) => {
    if (message.author.bot) return false;

    if (message.content.includes("@here") || message.content.includes("@everyone")) return false;

    if (message.mentions.has(client.user.id, { ignoreRepliedUser: true })) {
        // 兼容服务器和私聊场景的提及格式,移除@内容后判断剩余文本是否为空
        const mentionStr = message.guild ? `<@!${client.user.id}>` : `<@${client.user.id}>`;
        const pureContent = message.content.replace(mentionStr, '').trim();
        if (pureContent === '') {
            message.channel.send(mentionEmbed);
        }
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:06:02