公会成员不再填充,不能GetUserAsync,因为它仅返回bot而没有其他人

时间:2020-10-28 03:20:18

标签: c# discord discord.net

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

为了确保有用户,我用

构造它
        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,以及其他任何缓存的的东西)全部被填充。该bot可以在频道中与所有用户交谈,也可以在频道中与所有用户接收消息,因此我不知道为什么它无法获得所有成员。

最让我困惑的是,这一切都在起作用,然后魔术般地停止了一整夜的工作。公会已经有100多个成员了,所以我不明白为什么它现在突然失败了。

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

有什么办法可以调试吗?我想念什么吗?我如何让行会的所有成员重新工作?

1 个答案:

答案 0 :(得分:1)

这是不和谐强制执行intents的结果。

意图允许您选择加入某些网关事件。当前,GUILD_MEMBERS和GUILD_PRESENCES意图是“特权意图”,并且具有以下效果:

  • GUILD_MEMBER_ [ADD | UPDATE | REMOVE]要求接收GUILD_MEMBERS意图
  • PRESENCE_UPDATE要求接收GUILD_PRESENCES意图
  • REQUEST_GUILD_MEMBERS
    • 需要GUILD_PRESENCES意图将状态设置为true
    • 需要GUILD_MEMBERS意图来请求整个列表(query ='',limit = 0 <= n)
    • 仅限于请求1个guild_id
    • 使用前缀(query ='prefix',limit = 1 <= n <= 100)时
    • 最多只能有100个成员
  • GUILD_CREATE需要GUILD_PRESENCES意图包含更多的漫游器和语音成员
  • 列表公会成员需要具有GUILD_MEMBERS意向才能访问

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

如果您的漫游器超过100个行会,则需要验证您的漫游器:https://dis.gd/bot-verification。如果您的漫游器已经过验证,但需要请求意图许可,请与Discord支持人员联系:https://dis.gd/contact