如何通过用户对象检索公会的所有成员?

How to retrieve all members of a guild by user object?

我有以下代码设置,但它经常在我的服务器上找不到成员。
我该如何解决这个问题?

BOT.on('message', function(message) {
  if (!message.content.startsWith(prefix)) return;
  const args = message.content.slice(prefix.length).split(' ');
  const command = args.shift().toLowerCase();
  const chan = message.channel;

  if (command == "grabreacts" && chan.name == "the-purge") {
    var role = message.guild.roles.find(role => role.name === "2019 Purge Survivor");
    if (!role) return message.channel.send(`**${message.author.username}**, role not found`);
    //console.log(role);

    chan.fetchMessage(args)
      .then(function(value) {
        const react = value.reactions.filter(r => r.emoji == "").first();
        var reacts = react.count;
        react.fetchUsers()
          .then(function(users) {
            var fetchedMemebers = users.size;
            users.map(async user => {
              console.log(user.tag);
              message.guild.fetchMember(user, false)
                .then((memeber) => {
                  member.addRole(role)
                    .then((mem) => {
                      react.remove(user)
                        .catch((err) => console.log("Cannot remove user: " + user.tag + ". ex: " + ex + "!"));
                    })
                    .catch(ex => {
                      console.log(ex);
                    });
                })
                .catch((err) => {
                  console.log("Cannot find member object for: " + user.tag + "!");
                });
            });
            var assignedusers = role.members.size;
            message.reply("Reacts found: " + reacts + "; users fetched: " + fetchedMemebers + "; roles assigned: " + assignedusers);
          })
          .catch(err => message.reply("Cannot fetch users for react: '" + reacts + "', err: " + err + "!"));

      })
      .catch(err => message.reply("Cannot fetch message: '" + args + "', err: " + err + "!"));

  }
});

它工作正常,直到 message.guild.fetchMember(user, false),我掉进了 catch 块并打印了许多 "Cannot find member object for: ******#****!" 消息。

我没有取回任何实际的异常块,并且代码适用于前 62 或 788 个反应。似乎如果机器人没有缓存用户信息,即使在 message.guild.fetchMember(user, boolean) 中使用 false 也不起作用。

然而,该成员的用户对象已定义。我需要成员对象才能使用 member.addRole().

有人可以帮我弄清楚如何让它工作吗?或者我做错了什么?

我是 运行 节点 v11.6.0,"discord.js": "^11.4.2" 作为依赖项。

谢谢!

我发现来自 BOT.guilds.first() 的公会对象有: 成员:656, 成员数:2470

所以,如果我这样做:

        BOT.guilds.first().fetchMembers().then((guild) => {
            ...
        }

这解决了我的问题,因为我可以在 .then() 子句中看到 fetchMembers() returns 一个 Promise<Guild>,并且 Guild 对象具有所有成员都在其中获取。

希望这对其他人有所帮助!