公会成员不再填充,不能 GetUserAsync 因为它只返回机器人而没有其他人
Posted
技术标签:
【中文标题】公会成员不再填充,不能 GetUserAsync 因为它只返回机器人而没有其他人【英文标题】:Guild members are not populated anymore, cannot GetUserAsync as it only returns the bot and no one else 【发布时间】:2021-02-10 09:58:09 【问题描述】:由于某种原因,我无法再从机器人所在的公会中获得任何成员。
为了确保我有用户,我用
构建它 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多名成员了,所以我不明白为什么现在突然失败了。
最重要的是,机器人拥有我拥有的所有角色,所以它不可能神奇地看不到成员。我可以排除机器人的任何视觉问题。
有什么办法可以调试这个吗?我错过了什么吗?如何让公会的所有成员重新工作?
【问题讨论】:
【参考方案1】:这是 Discord 强制执行 intents 的结果。
Intent 允许您选择加入某些网关事件。目前,GUILD_MEMBERS 和 GUILD_PRESENCES 意图是“特权意图”,具有以下效果:
GUILD_MEMBER_[ADD|UPDATE|REMOVE] 需要接收 GUILD_MEMBERS 意图 PRESENCE_UPDATE 要求接收 GUILD_PRESENCES 意图 REQUEST_GUILD_MEMBERS 需要 GUILD_PRESENCES Intent 才能设置 Presences=true 需要 GUILD_MEMBERS 意图来请求整个列表(query='',limit=0 仅限于请求 1 个 guild_id 使用前缀时限制为 100 个成员 (query='prefix', limit=1 GUILD_CREATE 需要 GUILD_PRESENCES 意图来包含不仅仅是机器人和语音成员 列出公会成员需要 GUILD_MEMBERS 意图才能访问默认情况下禁用特权意图。要启用它们:
访问https://discord.com/developers/applications 点击您希望启用特权意图的机器人 导航到左侧的“Bot”标签 滚动到特权网关意图部分 启用您想要的意图如果您的机器人在超过 100 个公会中,您需要验证您的机器人:https://dis.gd/bot-verification。如果您的机器人已经过验证,但需要请求意图许可,请联系 Discord 支持:https://dis.gd/contact。
【讨论】:
以上是关于公会成员不再填充,不能 GetUserAsync 因为它只返回机器人而没有其他人的主要内容,如果未能解决你的问题,请参考以下文章