跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

如何在 Discord.js v14 中实现带成员提及的用户信息命令

本文详解如何使用 Discord.js v14 构建一个健壮的前缀式 ,user 命令,要求用户必须提及目标成员(否则提示错误),并正确解析被提及者信息用于构建用户资料卡片。 本文详解如何使用 discord. js v14 构建一个健壮的前缀式 `,user` 命令,要求用户必须提及目标成员(否则提示错误),并正确解析被提及者信息用于构建用户资料卡片。 在 Discord.js v14 中,实现一个需强制提及他人的用户信息命令(如 ,user @Member)时,常见误区是直接用 === 严格匹配完整消息内容(如 message.content === ',user')。这种写法会导致命令完全失效——因为当用户输入 ,user @Member 时,message.content 实际为 ",user <@123456789>",与字面量 ,user 不相等,条件恒为 false,自然无法触发响应。 ✅ 正确做法是使用字符串前缀匹配:
const prefix = ','; client.on('messageCreate', async (message) => { // 忽略机器人自身和非文本频道消息 if (message.author.bot || !message.guild || !message.content.startsWith(prefix)) return; const args = message.content.slice(prefix.length).trim().split(/ +/); const command = args.shift()?.toLowerCase(); if (command !== 'user') return; // 提取被提及的成员(支持用户提及或ID) const targetUser = message.mentions.users.first() || (args[0] && await client.users.fetch(args[0].replace(/[<@!>]/g, ''), { cache: true }).catch(() => null)); // 验证是否提供了有效目标用户 if (!targetUser) { return message.reply('❌ 请至少提及一位成员(例如:`,user @Alice`)或提供有效用户ID。'); } try { // 获取该用户在当前服务器中的成员信息(含角色、加入时间等) const member = await message.guild.members.fetch(targetUser.id).catch(() => null); const userinfoEmbed = new EmbedBuilder() .setTitle('? 用户信息') .setThumbnail(targetUser.displayAvatarURL({ dynamic: true })) .addFields( { name: '? 显示名称', value: targetUser.displayName, inline: true }, { name: '? 用户ID', value: `\`${targetUser.id}\``, inline: true }, { name: '? 账户邮箱', value: targetUser.email || '未公开', inline: true }, { name: '? 注册时间', value: ``, inline: true }, { name: '? 服务器内昵称', value: member?.nickname || '无', inline: true }, { name: '? 服务器加入时间', value: member ? `` : '❌ 该用户不在本服务器中', inline: true } ) .setColor('#2e2f36') .setFooter({ text: `请求者:${message.author.tag}`, iconURL: message.author.displayAvatarURL({ dynamic: true }) }); await message.channel.send({ embeds: [userinfoEmbed] }); } catch (error) { console.error('获取用户信息失败:', error); await message.reply('⚠️ 获取用户数据时发生错误,请稍后重试。'); } });
? 关键要点说明: php版微信js-sdk支付接口类 php版微信js-sdk支付接口类 下载 ✅ 使用 message.content.startsWith(prefix + 'user') 替代严格相等判断,兼容带参数/提及的任意变体(如 ,user@Alice、,user @Bob); ✅ 通过 .slice() 和 .split() 安全拆分参数,避免空格干扰; ✅ 同时支持 @mention 和纯 userID 输入(自动清洗 <@!123> 格式),提升命令鲁棒性; ✅ 使用 message.guild.members.fetch() 获取服务器内成员详情(如角色、加入时间),而 message.mentions.users.first() 仅返回用户基础信息; ✅ 添加 .catch(() => null) 防止因权限不足或用户不存在导致 Promise 拒绝崩溃; ✅ 嵌入式响应包含时间戳格式化()、动态头像、请求者水印,符合 Discord 最佳实践。 ⚠️ 注意事项: 确保 Bot 拥有 GuildMembersRead 权限(v14 默认需要显式开启 intent); 若需获取用户邮箱(.email),Bot 必须是 OAuth2 应用且用户已授权 email scope(生产环境极少使用,通常留空); 对于大型服务器,建议对 members.fetch() 添加超时控制或缓存策略以优化性能。 掌握这一模式后,你可轻松将其复用于其他需目标用户的命令(如 ,ban、,avatar、,roleinfo),构建专业、可靠的 Discord 机器人交互体验。

相关文章