【问题标题】:How to retrieve all members of a guild by user object?如何通过用户对象检索公会的所有成员?
【发布时间】:2019-06-04 09:11:03
【问题描述】:

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

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 块并打印了许多“找不到成员对象:******#****!”消息。

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

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

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

我正在运行 node v11.6.0,并将 "discord.js": "^11.4.2" 作为依赖项。

谢谢!

【问题讨论】:

  • 使用message.guild.member()这个还是不行吗?
  • @FedericoGrandi,如果我使用找不到会员:var member = message.guild.member(user); if (member != null) { ... }
  • 当您尝试message.guild.fetchMember(user.id, false) 时会发生什么?也许该方法无法弄清楚如何处理完整的用户对象(即使文档说它应该可以工作)
  • @T.Dirks,它适用于用户对象,用于 77/100 的第一个获取的用户。就好像机器人正在从所有成员的缓存列表中获取,而不是通过 API 进行搜索。我会注意到,如果我尝试@同一服务器上的某些人,我需要开始输入并删除几次,然后才会被建议;或者我可能需要进入管理服务器并以这种方式加载成员,然后才能找到它们。

标签: discord.js


【解决方案1】:

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

所以,如果我这样做:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 2021-05-29
    相关资源
    最近更新 更多