【发布时间】:2020-12-24 15:57:19
【问题描述】:
我尝试检索公会或频道中的所有用户。我尝试了不同的方法,但没有任何想要的结果。
方法#1。
public static List<Member> getMembers() {
return Arrays.stream(WebClient.builder().build()
.get()
.uri(URL)
.header("Authorization", "Bot " + Credentials.TOKEN)
.retrieve()
.bodyToMono(Member[].class)
.block()).collect(Collectors.toList());
}
这只会检索最后一个加入服务器的用户。
方法#2
Guild guild = event.getJDA().getGuildById(GUILD_ID);
event.getChannel().sendMessage("Users: " + guild.getMembers().size()).queue();
这只会检索 2 个用户。在调试时,我发现它正在检索机器人本身和我。
方法#3
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
String messageSent = event.getMessage().getContentRaw();
if (messageSent.equalsIgnoreCase("members")) {
Guild guild = event.getJDA().getGuildById(GUILD_ID);
event.getChannel().sendMessage("Users: " +
guild.getMembers().size()).queue();
event.getChannel().sendMessage("Thats all for now").queue();
}
}
与 #2 相同。
方法#4
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
String messageSent = event.getMessage().getContentRaw();
event.getChannel().getMembers().forEach(member -> {
event.getChannel().sendMessage("[Channel - " + event.getChannel().getName() + " ]").queue();
event.getChannel().sendMessage("---- Members -> " + member.getUser().getName()).queue();
});
}
与 #2 和 #3 相同
调试时我发现#3 和#4 中的#2 一样,它只检索机器人和我。
有时如果其他用户执行命令,机器人会检索该用户和机器人本身。
根据文档 GuildChannel.getMembers() 返回所有 具有 {@link net.dv8tion.jda.api.Permission#MESSAGE_READ} 的成员 权限
因此,我已授予所有用户在我的测试服务器中阅读消息的权限。
文档还说 Guild.getMembers() 只会检查 缓存成员!
我做错了什么? 我应该怎么做才能获得公会或频道中的所有用户?
提前致谢。
【问题讨论】:
-
@Minn 你的回答解决了我的问题 :) 我的机器人不会因为检索大量用户或因为我使用 ChunkingFilter.ALL、MemberCachePolicy.ALL、GatewayIntent.GUILD_MEMBERS 而被禁止吗?在此先感谢大家!
-
它不会被禁止,但它会limit your bot to 100 servers unless it is verified,您需要在开发者门户中明确启用意图。
标签: java discord discord-jda