公会成员不再存在,不能 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 意图才能访问
默认情况下禁用特权意图。要启用它们:
- 访问https://discord.com/developers/applications
- 单击您希望启用特权意图的机器人
- 导航到左侧的“机器人”选项卡
- 滚动到特权网关意图部分
- 启用您想要的意图
如果您的机器人在超过 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。
出于某种原因,我无法再从该机器人所在的公会中获得任何成员。
为了确保我有用户,我用
构造它 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 意图才能访问
默认情况下禁用特权意图。要启用它们:
- 访问https://discord.com/developers/applications
- 单击您希望启用特权意图的机器人
- 导航到左侧的“机器人”选项卡
- 滚动到特权网关意图部分
- 启用您想要的意图
如果您的机器人在超过 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。