我试着做一个函数来显示关于服务器的信息。
public static void serverInfo(Guild guild, MessageChannel channel) {
EmbedBuilder embed = new EmbedBuilder();
//Calculations
int people = 0;
int roles = 0;
int tc = 0;
int vc = 0;
for (Member member : guild.getMembers()) {
if (!member.getUser().isBot())
++people;
}
for (Role ignored : guild.getRoles())
++roles;
for (TextChannel ignored : guild.getTextChannels())
++tc;
for (VoiceChannel ignored : guild.getVoiceChannels())
++vc;
String time = String.valueOf(guild.getTimeCreated());
String created = time.substring(8, 10) + "-" + time.substring(5, 7) + "-" + time.substring(0, 4);
embed.setTitle(guild.getName());
embed.setThumbnail(guild.getIconUrl());
embed.addField("Total Members", String.valueOf(guild.getMemberCount()+1), true);
embed.addField("Members", String.valueOf(people),true);
embed.addField("Bots", String.valueOf((guild.getMemberCount()+1)-people), true);
embed.addField("Owner", Objects.requireNonNull(guild.getOwner()).getUser().getName(), true);
embed.addField("Roles", String.valueOf(roles), true);
embed.addField("Text Channels", String.valueOf(tc), false);
embed.addField("Voice Channels", String.valueOf(vc), true);
embed.addField("Date Created", created, false);
channel.sendMessageEmbeds(embed.build()).queue();
}
但是,这会引发NullPointerException
java.base/java.util.Objects.requireNonNull(Objects.java:208)的java.lang.NullPointerException在com.television.CommandExecutor.onMessageReceived(CommandExecutor.java:19)的com.television.Commands.Infos.serverInfo(Infos.java:38)
但是,如果我从函数中删除了这个部分,它就能正常工作,也不会引发任何例外。
for (Member member : guild.getMembers()) {
if (!member.getUser().isBot())
++people;
}
这一切为什么要发生?在我测试过的3台服务器中,只有1台服务器出现了这个问题。
其次,我知道这与标题中的问题没有多大关系,我如何计算成员/机器人的数量,因为这一部分(上面代码片段中的for-每个循环)没有正确计算成员数,它总是有1作为bot变量的值,因此成员数-1是人的值。
发布于 2022-04-04 09:20:27
提前两件事:您必须缓存来自每个公会的所有成员,或者在需要时(建议)检索它们。要做到这一点,您需要启用GUILD_MEMBERS特权意图。
您可以使用以下方法很容易地检索表示公会所有成员的列表:
public CompletableFuture<List<Member>> loadMembersFull(Guild guild) {
CompletableFuture<List<Member>> future = new CompletableFuture<>();
if (guild.isLoaded()) {
future.complete(guild.getMembers());
} else {
guild.loadMembers()
.onError(future::completeExceptionally)
.onSuccess(future::complete);
}
}
有了这些,你就可以继续做其他的事情了。实际上,我不知道为什么它没有for-循环就能工作,但是看起来错误并不发生在那里,而是在加载所有者时,因为它会将异常抛到您的#requireNonNull中。当所有者对象不再在公会中或尚未加载时,该所有者对象为空。所有者也可以删除帐户或被禁止的不和谐。为了解决这个问题,我建议您将您的行替换为以下一行:
embed.addField("Owner", Optional.ofNullable(guild.getOwner()).map(owner -> owner.getUser().getName()).orElse("<not found>"), true);
要获得适当数量的用户,您应该筛选用户列表,以确定他们是否是机器人。
int amount = (int) loadMembersFull(guild).join().stream()
.map(Member::getUser)
.filter(user -> !user.isBot())
.count();
如果你需要更多的帮助,可以在我的不和谐服务器上问我
https://stackoverflow.com/questions/71719101
复制相似问题