公会成员不再被填充,无法GetUserAsync,因为它只返回机器人,而不返回其他人



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

为了确保我有用户,我用构建它

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强制执行意图的结果。

意向允许您选择参加某些网关事件。当前GUILD_EMBERS和GUILD_PRENCES的意图是";特权意图";并具有以下效果:

  • GUILD_EMBER_[ADD|UPDATE|REMOVE]需要接收GUILD_MEMBERS意图
  • PRESNCE_UPDATE要求接收GUILD_PRENCES意图
  • 请求生成成员
    • 需要GUILD_PRENCES意图设置PRESENCES=true
    • 需要GUILD_EMBERS意图请求整个列表(查询=",限制=0<=n(
    • 仅限于请求1个guild_id
    • 使用前缀时限制为100个成员(查询="前缀",限制=1<=n<=100(
  • GUILD_CREATE要求GUILD_PRENCES意图包含的不仅仅是机器人和语音成员
  • 列出帮会成员需要Guild_Members意图访问

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

  • 访问https://discord.com/developers/applications
  • 单击要启用特权意图的机器人
  • 导航到";Bot";左边的选项卡
  • 滚动至特权网关意图部分
  • 启用您想要的意图

如果你的机器人在100多个公会中,你需要验证你的机器人:https://dis.gd/bot-verification.如果您的机器人已经验证,但需要申请意向权限,请联系Discord支持:https://dis.gd/contact.

相关内容

最新更新