Sha*_*571 3 java bots discord discord-jda
我正在创建一个 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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果另一个人写,那么仍然只显示我和机器人。
Min*_*inn 12
我假设您使用的是 4.2.0 版本(4.1.1_102 及更高版本)的开发版本
在这些版本中,引入了新的工厂方法,让人们了解新的 discord API 设计。将来,机器人将仅限于默认连接到语音通道的缓存成员。
如果您只需要成员数量,您可以使用Guild#getMemberCount!除此以外:
的createDefault
/createLight
将只超高速缓存部件连接到语音信道或行会所有者(在第一视线)。要缓存更多成员,您必须GUILD_MEMBERS
在机器人的应用程序仪表板和 JDA 中启用该意图。
现在你可以做这样的事情:
JDA api = JDABuilder.createDefault(token)
.setMemberCachePolicy(MemberCachePolicy.ALL)
.enableIntents(GatewayIntent.GUILD_MEMBERS)
.build();
Run Code Online (Sandbox Code Playgroud)
这个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();
Run Code Online (Sandbox Code Playgroud)
您还可以使用Guild#loadMembers或Guild#findMembers为单个公会加载它们。
我建议您也阅读这篇 JDA wiki 文章:网关意图和成员缓存策略。