diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java index 77a10d2..833ba41 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java @@ -33,6 +33,7 @@ import eu.mhsl.craftattack.spawn.appliances.tablist.Tablist; import eu.mhsl.craftattack.spawn.appliances.titleClear.TitleClear; import eu.mhsl.craftattack.spawn.appliances.whitelist.Whitelist; import eu.mhsl.craftattack.spawn.appliances.worldmuseum.WorldMuseum; +import eu.mhsl.craftattack.spawn.appliances.yearRank.YearRank; import eu.mhsl.craftattack.spawn.config.Configuration; import org.bukkit.Bukkit; import org.bukkit.event.HandlerList; @@ -89,7 +90,8 @@ public final class Main extends JavaPlugin { new PackSelect(), new GlowingBerries(), new Maintenance(), - new OptionLinks() + new OptionLinks(), + new YearRank() ) .filter(appliance -> disabledAppliances.stream() .noneMatch(s -> s.equalsIgnoreCase(appliance.getClass().getSimpleName()))) diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java index 2ec3533..429cfdd 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java @@ -1,9 +1,11 @@ package eu.mhsl.craftattack.spawn.appliances.displayName; +import eu.mhsl.craftattack.spawn.Main; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker; import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarkerListener; import eu.mhsl.craftattack.spawn.appliances.outlawed.Outlawed; +import eu.mhsl.craftattack.spawn.appliances.yearRank.YearRank; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.TextComponent; @@ -14,19 +16,22 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.function.Supplier; +import java.util.logging.Level; public class DisplayName extends Appliance { public void update(Player player) { TextColor playerColor = queryAppliance(AdminMarker.class).getPlayerColor(player); List> prefixes = List.of( - () -> queryAppliance(Outlawed.class).getNamePrefix(player) + () -> queryAppliance(Outlawed.class).getNamePrefix(player), + () -> queryAppliance(YearRank.class).getNamePrefix(player) ); ComponentBuilder playerName = Component.text(); prefixes.forEach(supplier -> { Component prefix = supplier.get(); if(prefix == null) return; - playerName.append(prefix).append(Component.text(" ")); + playerName.append(prefix).append( + Component.text(" ").hoverEvent(Component.empty().asHoverEvent())); }); playerName.append(Component.text(player.getName(), playerColor)); @@ -41,7 +46,7 @@ public class DisplayName extends Appliance { player.playerListName(component); } catch(Exception e) { //TODO this throws often exceptions, but still works, don't know why - //Main.instance().getLogger().log(Level.SEVERE, e, e::getMessage); + Main.instance().getLogger().log(Level.SEVERE, e, e::getMessage); } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/optionLinks/OptionLinks.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/optionLinks/OptionLinks.java index 19ad207..d92c198 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/optionLinks/OptionLinks.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/optionLinks/OptionLinks.java @@ -41,8 +41,6 @@ public class OptionLinks extends Appliance { public void setServerLinks(Player player) { ServerLinks playerLinks = Bukkit.getServerLinks().copy(); - Main.logger().info("Set server links for " + player.getName()); - Bukkit.getScheduler().runTaskAsynchronously(Main.instance(), () -> { this.links.forEach(suppliedLink -> { Component component = suppliedLink.component.apply(new ComponentSupplier()); @@ -54,9 +52,6 @@ public class OptionLinks extends Appliance { Main.logger().log(Level.INFO, String.format("Failed to create OptionLink '%s' for player '%s'", uri, player.getName()), e); } }); - - Main.logger().info("Sent links for " + player.getName()); - player.sendLinks(playerLinks); }); } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/yearRank/YearRank.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/yearRank/YearRank.java new file mode 100644 index 0000000..75e3acb --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/yearRank/YearRank.java @@ -0,0 +1,99 @@ +package eu.mhsl.craftattack.spawn.appliances.yearRank; + +import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.*; + +public class YearRank extends Appliance { + record CraftAttackYear(String name) {} + private final Map> rankMap = new HashMap<>(); + + @Override + public void onEnable() { + File folder = new File(Main.instance().getDataFolder(), "yearRank"); + + //noinspection ResultOfMethodCallIgnored + folder.mkdirs(); + + Optional dataFolders = Optional.ofNullable(folder.listFiles()); + if(dataFolders.isEmpty()) return; + + List.of(dataFolders.get()).forEach(playerDataFolder -> { + Optional datFiles = Optional.ofNullable(playerDataFolder.listFiles()); + if(datFiles.isEmpty()) return; + + CraftAttackYear craftAttackYear = new CraftAttackYear(playerDataFolder.getName()); + + Arrays.stream(datFiles.get()) + .map(file -> file.getName().split("\\.")[0]) + .distinct() + .map(UUID::fromString) + .peek(uuid -> rankMap.computeIfAbsent(uuid, p -> new ArrayList<>())) + .forEach(uuid -> rankMap.get(uuid).add(craftAttackYear)); + }); + } + + public @Nullable Component getNamePrefix(Player player) { + if(!rankMap.containsKey(player.getUniqueId())) return null; + int yearCount = rankMap.get(player.getUniqueId()).size(); + if(yearCount <= 3) return null; + + return Component.text() + .append(Component.text("[\uD83C\uDF1F]", NamedTextColor.GOLD)) + .hoverEvent(HoverEvent.showText( + Component.text(String.format("Langzeitspieler: %s ist bereits seit %d Jahren dabei!", player.getName(), yearCount)) + )) + .build(); + } + + public Component listYearRanks() { + TextComponent.Builder builder = Component.text(); + builder.append(Component.text("Top 30 Spieler: ", NamedTextColor.GOLD)); + rankMap.keySet().stream() + .map(uuid -> Map.entry(uuid, rankMap.get(uuid).size())) + .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) + .limit(30) + .forEach(entry -> builder + .appendNewline() + .append(Component.text(entry.getKey().toString(), NamedTextColor.GRAY) + .hoverEvent(HoverEvent.showText(Component.text(entry.getKey().toString()))) + .clickEvent(ClickEvent.copyToClipboard(entry.getKey().toString()))) + .append(Component.text(": ")) + .append(Component.text(entry.getValue(), NamedTextColor.GOLD))); + + builder + .appendNewline() + .appendNewline() + .append(Component.text("Übersischt:", NamedTextColor.GOLD)); + + rankMap.values().stream() + .mapMulti(Iterable::forEach) + .filter(o -> o instanceof CraftAttackYear) + .map(o -> (CraftAttackYear) o) + .distinct() + .forEach(craftAttackYear -> builder + .appendNewline() + .append(Component.text(craftAttackYear.name, NamedTextColor.GRAY)) + .append(Component.text(": ")) + .append(Component.text(rankMap.keySet().stream() + .filter(uuid -> rankMap.get(uuid).contains(craftAttackYear)).count()))); + + return builder.build(); + } + + @Override + protected @NotNull List> commands() { + return List.of(new YearRankCommand()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/yearRank/YearRankCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/yearRank/YearRankCommand.java new file mode 100644 index 0000000..b879b04 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/yearRank/YearRankCommand.java @@ -0,0 +1,17 @@ +package eu.mhsl.craftattack.spawn.appliances.yearRank; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class YearRankCommand extends ApplianceCommand { + public YearRankCommand() { + super("yearRank"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) throws Exception { + sender.sendMessage(getAppliance().listYearRanks()); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f1768ae..84efe67 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -38,4 +38,5 @@ commands: vogelfrei: settings: texturepack: - maintanance: \ No newline at end of file + maintanance: + yearRank: \ No newline at end of file