由于某些原因,我无法再从机器人所在的公会中获得任何成员。
为了确保我有用户,我用构建它
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.