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
相关产品推荐
相关产品推荐

