如何在Discord.js中实现+mention命令以提及指定Discord成员?
解决Discord.js中+mention命令的实现问题
我来帮你搞定这个+mention命令的问题!在Discord.js里实现这个功能其实没那么复杂,关键是找对成员的查找方式,下面分主流版本给你具体的解决方案:
方案一:Discord.js v14及以上(当前主流版本)
如果你的机器人用的是v14或更新版本,可以用下面的代码实现。核心思路是从服务器成员中匹配输入的用户名,然后输出对应的成员标签或直接提及:
// 监听消息创建事件(前缀命令模式) client.on('messageCreate', async (message) => { // 过滤非+mention开头的消息和机器人消息 if (!message.content.startsWith('+mention') || message.author.bot) return; // 提取用户输入的用户名参数 const targetUsername = message.content.slice('+mention '.length).trim(); if (!targetUsername) { return message.reply('请告诉我要提及的用户名哦!'); } try { // 在服务器成员缓存中查找匹配的用户(不区分大小写) const targetMember = message.guild.members.cache.find(member => member.user.username.toLowerCase() === targetUsername.toLowerCase() ); if (!targetMember) { return message.reply(`找不到用户名为「${targetUsername}」的成员呢!`); } // 输出两种格式:一种是可点击的提及,一种是纯文本的@用户名#判别器 message.channel.send(`你要的提及:${targetMember}\n纯文本标签:${targetMember.user.tag}`); // 注:${targetMember}会自动被Discord解析为@Gamer222#6478这种可点击的提及 } catch (err) { console.error('查找成员出错:', err); message.reply('查找成员时出现了错误,请稍后再试!'); } });
方案二:Discord.js v13版本
如果你的机器人还在使用v13,核心逻辑和v14一致,只是如果需要获取不在缓存里的成员,fetch方法的调用略有不同:
client.on('messageCreate', async (message) => { if (!message.content.startsWith('+mention') || message.author.bot) return; const targetUsername = message.content.slice('+mention '.length).trim(); if (!targetUsername) { return message.reply('请提供要提及的用户名!'); } try { let targetMember = message.guild.members.cache.find(member => member.user.username.toLowerCase() === targetUsername.toLowerCase() ); // 如果缓存里找不到,尝试从服务器拉取成员数据(需要机器人有GUILD_MEMBERS权限) if (!targetMember) { const fetchedMembers = await message.guild.members.fetch({ query: targetUsername, limit: 1 }); targetMember = fetchedMembers.first(); } if (!targetMember) { return message.reply(`找不到用户名为「${targetUsername}」的成员!`); } message.channel.send(`可点击提及:${targetMember}\n纯文本标签:${targetMember.user.tag}`); } catch (err) { console.error('错误信息:', err); message.reply('查找成员失败,可能是机器人权限不足或者用户不存在!'); } });
额外优化:支持带判别器的精准查找
如果服务器里有重名用户,你可以修改代码支持用户输入完整的「用户名#判别器」,比如+mention Gamer222#6478,这样查找更精准:
// 修改参数提取和查找逻辑 const targetTag = message.content.slice('+mention '.length).trim(); const targetMember = message.guild.members.cache.find(member => member.user.tag === targetTag);
注意事项
- 确保机器人拥有
GUILD_MEMBERS权限,不然无法获取服务器成员列表 - 大型服务器中,成员可能不在缓存里,所以需要用
fetch方法拉取数据 ${targetMember}输出的是Discord可识别的提及格式(点击能跳转用户资料),而targetMember.user.tag是纯文本的「@用户名#判别器」,可以根据需求选择
内容的提问来源于stack exchange,提问作者Sheshank S.
相关产品推荐
相关产品推荐

