首页 > 解决方案 > 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 (...)

帮助?

标签: javascriptnode.jsdiscorddiscord.js

解决方案


就像您在评论中提到的那样,从他们中提取用户 ID 之间的主要区别displayName意味着您必须首先获取GuildMember对象(它是特定于服务器的),然后从中获取user属性。

总而言之,它只需要对变量进行一些重新操作即可获得所需的内容,因为该displayName属性特定于每个服务器。


过程:

  1. 获取服务器 ID
  2. 从服务器ID,获取服务器
  3. 从服务器获取members属性
  4. 通过将成员与给定的randomnickname匹配来查找成员,我displayNickname在本例中设置了该成员。
  5. 从对象中获取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}`);
}

资源:


推荐阅读