diff --git a/src/main/java/de/fanta/challengesjoinentities/commands/ChallengesCommand/ChallengeListUserStatsCommand.java b/src/main/java/de/fanta/challengesjoinentities/commands/ChallengesCommand/ChallengeListUserStatsCommand.java new file mode 100644 index 0000000..87bff56 --- /dev/null +++ b/src/main/java/de/fanta/challengesjoinentities/commands/ChallengesCommand/ChallengeListUserStatsCommand.java @@ -0,0 +1,125 @@ +package de.fanta.challengesjoinentities.commands.ChallengesCommand; + +import de.fanta.challengesjoinentities.ChallengesJoinEntities; +import de.fanta.challengesjoinentities.ChatUtil; +import de.fanta.challengesjoinentities.loadgui.ChallengeLoadGUI; +import de.fanta.challengesjoinentities.utils.DurationCommandUtil; +import de.fanta.challengesjoinentities.utils.Statistics; +import de.iani.cubesidestats.api.Ordering; +import de.iani.cubesidestats.api.PlayerWithScore; +import de.iani.cubesidestats.api.PositionAlgorithm; +import de.iani.cubesidestats.api.StatisticKey; +import de.iani.cubesidestats.api.TimeFrame; +import de.iani.cubesideutils.StringUtil; +import de.iani.cubesideutils.bukkit.commands.SubCommand; +import de.iani.cubesideutils.commands.ArgsParser; +import de.iani.playerUUIDCache.CachedPlayer; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class ChallengeListUserStatsCommand extends SubCommand { + private final ChallengesJoinEntities plugin; + + public ChallengeListUserStatsCommand(ChallengesJoinEntities plugin) { + this.plugin = plugin; + } + + public boolean onCommand(CommandSender sender, Command command, String alias, String commandString, ArgsParser args) { + if (!(sender instanceof Player p)) { + ChatUtil.sendErrorMessage(sender, "Du musst ein Spieler sein!"); + return true; + } + + if (!args.hasNext()) { + return false; + } + + String statisticKeyString = args.getNext().toUpperCase(); + if (!plugin.getCubesideStatistics().hasStatisticKey(statisticKeyString)) { + ChatUtil.sendErrorMessage(p, "StatsKey " + statisticKeyString + " nicht gefunden"); + return true; + } + + StatisticKey statisticKey; + try { + statisticKey = plugin.getCubesideStatistics().getStatisticKey(statisticKeyString, false); + } catch (IllegalArgumentException ex) { + ChatUtil.sendErrorMessage(p, "StatsKey " + statisticKeyString + " konnte nicht geladen werden!"); + return true; + } + + if (!args.hasNext()) { + return false; + } + + String timeFrameString = args.getNext(); + TimeFrame timeFrame; + try { + timeFrame = TimeFrame.valueOf(timeFrameString); + } catch (IllegalArgumentException ex) { + ChatUtil.sendErrorMessage(p, "Diesen TimeFrame gibt es nicht! (DAY, MONTH, ALL_TIME)"); + return true; + } + + + long duration = DurationCommandUtil.parseDuration(sender, args, false); + if (duration == 0) { + return true; + } + + statisticKey.getTop(0, 1000, Ordering.ASCENDING, timeFrame, PositionAlgorithm.DO_NOT_SKIP_POSITIONS_AFTER_DUPLICATES, playerWithScores -> playerWithScores.forEach(playerWithScore -> { + Bukkit.getLogger().info(playerWithScore.getPlayer().getOwner().toString()); + if (playerWithScore.getScore() >= duration) { + Bukkit.getLogger().info(String.valueOf(playerWithScore.getScore())); + CachedPlayer cachedPlayer = plugin.getPlayerUUIDCache().getPlayer(playerWithScore.getPlayer().getOwner()); + if (cachedPlayer != null) { + Bukkit.getLogger().info(cachedPlayer.getName()); + ChatUtil.sendNormalMessage(p, cachedPlayer.getName() + ChatUtil.BLUE + " Zeit:" + StringUtil.formatTimespan((playerWithScore.getScore() / 1000) * 1000, " Tag, ", ":", "", "", "", ":", false, true) + ChatUtil.ORANGE + " Position: " + playerWithScore.getPosition()); + } + + } + })); + + + return true; + } + + @Override + public String getRequiredPermission() { + return "challenges.stats.listusers"; + } + + @Override + public String getUsage() { + return " "; + } + + @Override + public ArrayList onTabComplete(CommandSender sender, Command command, String alias, ArgsParser args) { + int i = args.remaining(); + if (i == 1) { + ArrayList li = new ArrayList<>(); + plugin.getCubesideStatistics().getAllStatisticKeys().forEach(statisticKey -> { + if (statisticKey.getName().startsWith("challenge.speedruns")) { + li.add(statisticKey.getName()); + } + }); + return li; + } + + if (i == 2) { + ArrayList li = new ArrayList<>(); + for (TimeFrame timeFrame : TimeFrame.values()) { + li.add(timeFrame.name()); + } + return li; + } + return new ArrayList<>(); + } +} diff --git a/src/main/java/de/fanta/challengesjoinentities/utils/DurationCommandUtil.java b/src/main/java/de/fanta/challengesjoinentities/utils/DurationCommandUtil.java new file mode 100644 index 0000000..047996e --- /dev/null +++ b/src/main/java/de/fanta/challengesjoinentities/utils/DurationCommandUtil.java @@ -0,0 +1,57 @@ +package de.fanta.challengesjoinentities.utils; + +import de.fanta.challengesjoinentities.ChatUtil; +import de.iani.cubesideutils.StringUtil; +import de.iani.cubesideutils.commands.ArgsParser; +import org.bukkit.command.CommandSender; + +import java.util.Collections; +import java.util.Set; +import java.util.TreeSet; + +public class DurationCommandUtil { + + private DurationCommandUtil() { + // prevent instances + } + + public static final Set PERM_STRINGS; + + static { + Set permStrings = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + permStrings.add("-1"); + permStrings.add("perm"); + permStrings.add("permanent"); + permStrings.add("inf"); + permStrings.add("infinite"); + permStrings.add("infinity"); + permStrings.add("forever"); + PERM_STRINGS = Collections.unmodifiableSet(permStrings); + } + + public static long parseDuration(CommandSender sender, ArgsParser args, boolean allowPermanent) { + if (!args.hasNext()) { + ChatUtil.sendWarningMessage(sender, "Bitte gib die Dauer im Format \"7d12h15m30s\" (eine Einheit genügt)", allowPermanent ? " oder als \"perm\"" : "", " an."); + return 0; + } + + String durationString = args.getNext(); + if (PERM_STRINGS.contains(durationString)) { + return -1; + } + + long duration; + try { + duration = StringUtil.parseTimespan(durationString); + if (duration <= 0) { + throw new NumberFormatException(); + } + } catch (IllegalArgumentException e) { + ChatUtil.sendWarningMessage(sender, "Bitte gib die Dauer im Format \"7d12h15m30s\" (eine Einheit genügt)", allowPermanent ? " oder als \"perm\"" : "", " an."); + return 0; + } + + return duration; + } + +}