Discord JDA - 无效的成员列表
Discord JDA - Invalid Member List
我在创建 Discord 机器人时遇到了一个奇怪的问题。我需要遍历服务器上的每个用户并执行条件操作。但是当收到所有成员的列表时,它只包含我和机器人本身。
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));
}
}
}
如果其他人写,那么只显示我和机器人。
我假设您使用的是 4.2.0 版本的开发版本(4.1.1_102 及更高版本)
在这些版本中,引入了新的工厂方法,让人们了解新的 discord API 设计。以后bot默认只限连接语音通道的缓存成员
如果你只需要成员数,你可以使用Guild#getMemberCount!否则:
createDefault
/createLight
只会缓存连接到语音频道的成员或公会所有者(第一眼)。要缓存更多成员,您必须在机器人的应用程序仪表板和 JDA 中启用 GUILD_MEMBERS
意图。
现在你可以这样做:
JDA api = JDABuilder.createDefault(token)
.setMemberCachePolicy(MemberCachePolicy.ALL)
.enableIntents(GatewayIntent.GUILD_MEMBERS)
.build();
GUILD_MEMBERS
意图是必需的,因为它启用 GUILD_MEMBER_REMOVE
分派以告诉库在 kicked/banned/leave.
时从缓存中删除成员
此设置将执行延迟加载,这意味着它将仅从语音成员开始,并在它们变得活跃后将更多成员添加到缓存中。
要在启动时加载所有成员,您必须另外启用 成员分块:
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 or Guild#findMembers.
为单个公会加载它们
我还建议阅读这篇 JDA 维基文章:Gateway Intents and Member Cache Policy。
我在创建 Discord 机器人时遇到了一个奇怪的问题。我需要遍历服务器上的每个用户并执行条件操作。但是当收到所有成员的列表时,它只包含我和机器人本身。
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));
}
}
}
如果其他人写,那么只显示我和机器人。
我假设您使用的是 4.2.0 版本的开发版本(4.1.1_102 及更高版本)
在这些版本中,引入了新的工厂方法,让人们了解新的 discord API 设计。以后bot默认只限连接语音通道的缓存成员
如果你只需要成员数,你可以使用Guild#getMemberCount!否则:
createDefault
/createLight
只会缓存连接到语音频道的成员或公会所有者(第一眼)。要缓存更多成员,您必须在机器人的应用程序仪表板和 JDA 中启用 GUILD_MEMBERS
意图。
现在你可以这样做:
JDA api = JDABuilder.createDefault(token)
.setMemberCachePolicy(MemberCachePolicy.ALL)
.enableIntents(GatewayIntent.GUILD_MEMBERS)
.build();
GUILD_MEMBERS
意图是必需的,因为它启用 GUILD_MEMBER_REMOVE
分派以告诉库在 kicked/banned/leave.
此设置将执行延迟加载,这意味着它将仅从语音成员开始,并在它们变得活跃后将更多成员添加到缓存中。
要在启动时加载所有成员,您必须另外启用 成员分块:
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 or Guild#findMembers.
为单个公会加载它们我还建议阅读这篇 JDA 维基文章:Gateway Intents and Member Cache Policy。