javascript - Discord JS - 反向查找以从其显示名称中获取用户 ID
问题描述
我们目前正在构建一个机器人,它将审查特定消息并对其执行后续管理操作。其中一个动作将读取一条消息并提取一个命名用户(字符串 - 不是链接),搜索它并返回用户的 ID - 然后在其他地方使用。
if (message.channel.id === register) {
// The post is in the register channel
if (message.content.includes('doing business with you')) {
//it's a successful claim
Rclaimedby = message.content.match(/\*\*(.*?)\*\*/)[1];
const Ruser = client.users.cache.find(user => user.username == Rclaimedby).id;
文本片段将只有个人姓名作为字符串,正则表达式将提取该字符串。如果个人没有设置昵称,它会工作,其余代码工作。但是,只要该名称不是它们的“正常”名称,它就不起作用并因 TypeError 而崩溃。
我需要能够使用该剥离的名称并找到 ID,无论他们是否有昵称,但我一直在寻找几天(以及大量的试验和错误)并且找不到解决方法.
为了提供帮助,消息内容会这样说:
(...) 与您做生意 normalname (...) 或 (...) 与您做生意 randomnickname (...)
帮助?
解决方案
就像您在评论中提到的那样,从他们中提取用户 ID 之间的主要区别displayName
意味着您必须首先获取GuildMember
对象(它是特定于服务器的),然后从中获取user
属性。
总而言之,它只需要对变量进行一些重新操作即可获得所需的内容,因为该displayName
属性特定于每个服务器。
过程:
- 获取服务器 ID
- 从服务器ID,获取服务器
- 从服务器获取
members
属性 - 通过将成员与给定的randomnickname匹配来查找成员,我
displayNickname
在本例中设置了该成员。 - 从对象中获取
user
属性GuildMember
并从那里获取 ID。
代码:
这只是您可以解决的问题。
if (command === "memberinfo") {
let serverID = "800743801526157383"; //server id; manually input your own
let displayNickname = args[0];
message.channel.send(`Sent Nickname: ${displayNickname}`);
let serverMembers = client.guilds.cache.get(serverID).members //defines server and returns members
let matchedMember = serverMembers.cache.find(m => m.displayName === displayNickname);
message.channel.send(`Matched Member ${matchedMember.user.username}.`)
console.log(`The user's ID: ${matchedMember.user.id}`);
}