如何用discord.js实现Discord机器人带@提及的回复及延迟自动编辑消息功能
原代码核心问题
- 存在基础语法错误:将
@mention直接写在模板字符串外部,无法通过JavaScript语法解析,代码根本无法正常运行 - 逻辑顺序混乱:未优先过滤机器人发送的消息就做指令匹配判断,会触发机器人自我响应的死循环;且重复嵌套相同的消息判断分支,逻辑冗余
- 提及渲染逻辑错误:硬写的
@mention是纯文本字符串,Discord不会将其识别为可交互的@提及,发出的内容就是普通文字,不会高亮成真实用户提及 - 缺少关键实现流程:没有从消息中提取被提及用户的逻辑,也没有实现消息延迟编辑的相关代码
正确实现方案
Discord.js中实现真实用户提及,需要按照固定格式<@用户ID>拼接字符串;延迟编辑消息只需要在拿到发送成功的消息对象后,通过setTimeout设置延时调用编辑方法即可,以下为分版本的可运行代码。
基础版(仅实现正确带@提及的回复功能)
client.on("messageCreate", (message) => { // 优先过滤机器人消息,避免自我响应死循环 if (message.author.bot) return; // 匹配指令规则:消息包含"make my friend"内容,且存在有效用户提及 const isMatched = message.content.includes("make my friend"); const targetUser = message.mentions.users.first(); if (isMatched && targetUser) { // 拼接正确提及格式,发送进度提示 message.channel.send(`正在处理添加 <@${targetUser.id}> 为好友的流程,请稍候...`); } });
完善版(实现10秒后自动编辑回复的全功能)
client.on("messageCreate", async (message) => { if (message.author.bot) return; const isMatched = message.content.includes("make my friend"); const targetUser = message.mentions.users.first(); if (isMatched && targetUser) { // 等待消息发送完成,拿到可操作的消息实例 const progressMsg = await message.channel.send(`正在处理添加 <@${targetUser.id}> 为好友的流程,请稍候...`); // 设置10秒延时,触发消息编辑 setTimeout(() => { progressMsg.edit(`<@${targetUser.id}> 现已成为你的好友!`); }, 10 * 1000); } });
实现注意点
- 主流的Discord.js V13/V14版本已废弃原有的
message事件,替换为独立的messageCreate事件,继续使用旧事件将无法触发任何消息响应 - Discord的@提及无法通过直接写文本实现,必须使用
<@用户ID>格式拼接,服务器才会将其渲染为可点击、可通知用户的高亮提及 - 异步发送消息时必须通过
await拿到发送成功的消息实例,才能正常调用edit方法修改消息内容,否则会触发空引用报错
内容的提问来源于stack exchange,提问作者OGBenT
相关产品推荐
相关产品推荐

