我正在创建一个不和谐的机器人,遇到了一个奇怪的问题。我需要遍历服务器上的每个用户并执行一个条件操作。但是当收到所有成员的列表时,它只包含我和机器人本身。
public class Bot extends ListenerAdapter {
public void onGuildMessageReceived(GuildMessageReceivedEvent Event) {
String Message = Event.getMessage().getContentRaw();
if(Message.charAt(0) == Globals.BOT_PREFIX) {
String[] Args = Message.split("\\s+");
if(Args[0].equalsIgnoreCase(CommandType.COMMAND_DEV_TEST)) {
List<Member> MemberList = Event.getGuild().getMembers();
for(int i = 0; i < MemberList.size(); i++)
System.out.println(MemberList.get(i));
}
}
}
如果另一个人写,那么仍然显示的只有我和bot。
我假设您使用的是4.2.0版本的开发版本(4.1.1_102和更高版本)
在这些版本中,引入了新的工厂方法,使人们意识到新的discord API设计。在未来,机器人将被限制为缓存默认连接到语音通道的成员。
CreateDefault
/CreateLight
将只缓存连接到语音频道的成员或公会的所有者(第一眼看到)。要缓存更多成员,必须在bot的应用程序仪表板和JDA中启用guild_members
意图。
现在您可以做如下操作:
JDA api = JDABuilder.createDefault(token)
.setMemberCachePolicy(MemberCachePolicy.ALL)
.enableIntents(GatewayIntent.GUILD_MEMBERS)
.build();
需要Guild_Members
意图,因为它使Guild_Member_Remove
分派能够在成员被删除/禁止/离开时通知库从缓存中删除成员。
此设置将执行懒惰加载,这意味着它将仅从语音成员开始,并在他们成为活动成员后将更多成员添加到缓存中。
要在启动时加载所有成员,必须另外启用成员分块:
JDABuilder.createDefault(token)
.setChunkingFilter(ChunkingFilter.ALL) // enable member chunking for all guilds
.setMemberCachePolicy(MemberCachePolicy.ALL) // ignored if chunking enabled
.enableIntents(GatewayIntent.GUILD_MEMBERS)
.build();
你也可以使用guild#loadmembers或guild#findmembers为各个公会加载它们。
我还建议阅读这篇JDA wiki文章:网关意图和成员缓存策略。