gpt4 book ai didi

java - Discord JDA - 无效的成员列表

转载 作者:行者123 更新时间:2023-12-04 14:35:33 29 4
gpt4 key购买 nike

我正在创建一个 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 设计。将来,机器人将仅限于默认连接到语音 channel 的缓存成员。
如果您只需要成员数量,您可以使用 Guild#getMemberCount !否则:createDefault/createLight只会缓存连接到语音 channel 的成员或公会的所有者(一见钟情)。要缓存更多成员,您必须启用 GUILD_MEMBERS Intent 在您的机器人和 JDA 的应用程序仪表板中。
enter image description here
现在你可以做这样的事情:

JDA api = JDABuilder.createDefault(token)
.setMemberCachePolicy(MemberCachePolicy.ALL)
.enableIntents(GatewayIntent.GUILD_MEMBERS)
.build();
GUILD_MEMBERS需要意图是因为它启用了 GUILD_MEMBER_REMOVE dispatch 告诉库在成员被踢/禁止/离开时从缓存中删除成员。
此设置将执行 延迟加载 ,这意味着它将仅从语音成员开始,并在他们变得活跃后将更多成员添加到缓存中。
要在启动时加载所有成员,您必须另外启用 成员分块 :
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 维基文章: Gateway Intents and Member Cache Policy .

关于java - Discord JDA - 无效的成员列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61226721/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com