公会成员不再存在,不能 GetUserAsync 因为它只有 returns 机器人,没有其他人

Guild members are not populated anymore, cannot GetUserAsync as it only returns the bot and no one else

出于某种原因,我无法再从该机器人所在的公会中获得任何成员。

为了确保我有用户,我用

构造它
        DiscordSocketConfig config = new DiscordSocketConfig { AlwaysDownloadUsers = true };
        client = new DiscordSocketClient(config);

我响应的事件在连接很久之后才响应。它将从机器人所在的公会中的频道本身获取消息,因此它已连接,正在工作,并且可以看到所有成员。

我遍历了所有成员,并尝试使用一些调试代码将它们打印出来,例如:

        Console.WriteLine("Users:");
        foreach (IGuildUser? u in Guild.GetUsersAsync().Result)
            Console.WriteLine($"    {u.Username} ({u.Id})");

而且它只打印自己。

我在代码中使用它的方式如下:

Guild.GetUserAsync(user.Id)  // user is valid, this is empty for anyone who is not the bot

公会对象的私有字段 _members 有 1 个元素(即机器人本身),但所有其他元素(例如:_emojis_channels、任何其他缓存的东西)都已完全填充。机器人可以在频道中与所有用户交谈并在频道中接收消息,所以我不知道为什么它不能获得所有成员。

最让我困惑的是,这一切都在工作,然后神奇地在一夜之间停止工作。公会成员已经100多了一段时间了,所以我不明白为什么现在突然失败了。

最重要的是,机器人拥有我拥有的所有角色,所以它不可能神奇地看不到成员。我可以排除机器人的任何视觉问题。

我有什么调试方法吗?我错过了什么吗?我怎样才能让公会的所有成员重新工作?

这是 Discord 强制执行 intents 的结果。

Intents 允许您opt-in 某些网关事件。目前,GUILD_MEMBERS 和 GUILD_PRESENCES 意图是“特权意图”,具有以下效果:

  • GUILD_MEMBER_[ADD|UPDATE|REMOVE] 需要接收 GUILD_MEMBERS 意图
  • PRESENCE_UPDATE 需要接收 GUILD_PRESENCES 意图
  • REQUEST_GUILD_MEMBERS
    • 需要 GUILD_PRESENCES 意图设置 presences=true
    • 需要 GUILD_MEMBERS 请求整个列表的意图(查询='',限制=0<=n)
    • 仅限请求1个guild_id
    • 使用前缀时限制为 100 个成员 (query='prefix', limit=1<=n<=100)
  • GUILD_CREATE 要求 GUILD_PRESENCES 意图包含的不仅仅是机器人和语音成员
  • 列出公会成员需要 GUILD_MEMBERS 意图才能访问

默认情况下禁用特权意图。要启用它们:

如果您的机器人在超过 100 个公会中,您将需要验证您的机器人:https://dis.gd/bot-verification. If your bot is already verified, but need to request intents permission, contact Discord support: https://dis.gd/contact