From da49c46539979655839a163e83be9d64925151e9 Mon Sep 17 00:00:00 2001 From: Artemis-the-gr8 Date: Sun, 23 Oct 2022 17:37:38 +0200 Subject: [PATCH] Worked on transforming playerNames into UUIDs and vice versa for the ExcludeCommand (#88) --- .../com/artemis/the/gr8/playerstats/Main.java | 7 ++-- .../playerstats/commands/ExcludeCommand.java | 24 +++++++++++++ .../playerstats/commands/ReloadCommand.java | 4 +-- .../playerstats/commands/ShareCommand.java | 10 +++--- .../gr8/playerstats/commands/StatCommand.java | 2 +- .../playerstats/enums/StandardMessage.java | 2 +- .../gr8/playerstats/msg/OutputManager.java | 1 + .../{ => msgutils}/FormattingFunction.java | 2 +- .../gr8/playerstats/share/ShareManager.java | 19 +++++++++-- .../playerstats/statistic/RequestManager.java | 12 +++---- .../gr8/playerstats/statistic/StatResult.java | 2 +- .../gr8/playerstats/utils/FileHandler.java | 34 ++++++++++++------- .../utils/OfflinePlayerHandler.java | 28 ++++++++++----- src/main/resources/excluded_players.yml | 3 ++ 14 files changed, 106 insertions(+), 44 deletions(-) rename src/main/java/com/artemis/the/gr8/playerstats/msg/{ => msgutils}/FormattingFunction.java (94%) diff --git a/src/main/java/com/artemis/the/gr8/playerstats/Main.java b/src/main/java/com/artemis/the/gr8/playerstats/Main.java index 5361ad3..0df25dd 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/Main.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/Main.java @@ -106,11 +106,10 @@ public final class Main extends JavaPlugin implements PlayerStats { config = ConfigHandler.getInstance(); languageKeyHandler = LanguageKeyHandler.getInstance(); offlinePlayerHandler = OfflinePlayerHandler.getInstance(); + shareManager = ShareManager.getInstance(); outputManager = new OutputManager(adventure); - shareManager = new ShareManager(); - - requestManager = new RequestManager(outputManager, shareManager); + requestManager = new RequestManager(outputManager); threadManager = new ThreadManager(this, outputManager); } @@ -138,7 +137,7 @@ public final class Main extends JavaPlugin implements PlayerStats { } PluginCommand sharecmd = this.getCommand("statisticshare"); if (sharecmd != null) { - sharecmd.setExecutor(new ShareCommand(shareManager, outputManager)); + sharecmd.setExecutor(new ShareCommand(outputManager)); } } diff --git a/src/main/java/com/artemis/the/gr8/playerstats/commands/ExcludeCommand.java b/src/main/java/com/artemis/the/gr8/playerstats/commands/ExcludeCommand.java index 85ac5e2..22ad05b 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/commands/ExcludeCommand.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/commands/ExcludeCommand.java @@ -1,12 +1,16 @@ package com.artemis.the.gr8.playerstats.commands; +import com.artemis.the.gr8.playerstats.utils.MyLogger; import com.artemis.the.gr8.playerstats.utils.OfflinePlayerHandler; +import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; +import java.util.List; + public final class ExcludeCommand implements CommandExecutor { private final OfflinePlayerHandler offlinePlayerHandler; @@ -17,7 +21,27 @@ public final class ExcludeCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (args.length == 1 && args[0].equalsIgnoreCase("list")) { + List excludedPlayers = offlinePlayerHandler.getListOfExcludedPlayerNames(); + for (String player : excludedPlayers) { + MyLogger.logLowLevelMsg(player); + } + } + //this is going to return false for all UUIDs in file at boot-up - that's an issue + else if (args.length >= 2 && offlinePlayerHandler.isLoadedPlayer(args[1])) { + String playerName = args[1]; + OfflinePlayer player = offlinePlayerHandler.getOfflinePlayer(playerName); + + switch (args[0]) { + case "add" -> offlinePlayerHandler.addPlayerToExcludeList(player.getUniqueId()); + case "remove" -> offlinePlayerHandler.removePlayerFromExcludeList(player.getUniqueId()); + case "info" -> { + boolean isExcluded = offlinePlayerHandler.isExcluded(player.getUniqueId()); + MyLogger.logLowLevelMsg(player.getName() + " is excluded: " + isExcluded); + } + } + } return false; } } diff --git a/src/main/java/com/artemis/the/gr8/playerstats/commands/ReloadCommand.java b/src/main/java/com/artemis/the/gr8/playerstats/commands/ReloadCommand.java index 18fbfbd..4f2d869 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/commands/ReloadCommand.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/commands/ReloadCommand.java @@ -11,8 +11,8 @@ public final class ReloadCommand implements CommandExecutor { private static ThreadManager threadManager; - public ReloadCommand(ThreadManager t) { - threadManager = t; + public ReloadCommand(ThreadManager threadManager) { + ReloadCommand.threadManager = threadManager; } @Override diff --git a/src/main/java/com/artemis/the/gr8/playerstats/commands/ShareCommand.java b/src/main/java/com/artemis/the/gr8/playerstats/commands/ShareCommand.java index b60e7c8..6b09b1a 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/commands/ShareCommand.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/commands/ShareCommand.java @@ -12,17 +12,17 @@ import org.jetbrains.annotations.NotNull; public final class ShareCommand implements CommandExecutor { - private static ShareManager shareManager; private static OutputManager outputManager; + private static ShareManager shareManager; - public ShareCommand(ShareManager s, OutputManager m) { - shareManager = s; - outputManager = m; + public ShareCommand(OutputManager outputManager) { + ShareCommand.outputManager = outputManager; + shareManager = ShareManager.getInstance(); } @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, @NotNull String[] args) { - if (args.length == 1 && ShareManager.isEnabled()) { + if (args.length == 1 && shareManager.isEnabled()) { int shareCode; try { shareCode = Integer.parseInt(args[0]); diff --git a/src/main/java/com/artemis/the/gr8/playerstats/commands/StatCommand.java b/src/main/java/com/artemis/the/gr8/playerstats/commands/StatCommand.java index 499abd1..ae6a580 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/commands/StatCommand.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/commands/StatCommand.java @@ -243,7 +243,7 @@ public final class StatCommand implements CommandExecutor { OfflinePlayerHandler offlinePlayerHandler = OfflinePlayerHandler.getInstance(); for (String arg : args) { - if (offlinePlayerHandler.isRelevantPlayer(arg)) { + if (offlinePlayerHandler.isLoadedPlayer(arg)) { return arg; } } diff --git a/src/main/java/com/artemis/the/gr8/playerstats/enums/StandardMessage.java b/src/main/java/com/artemis/the/gr8/playerstats/enums/StandardMessage.java index a7cf69b..46c2360 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/enums/StandardMessage.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/enums/StandardMessage.java @@ -14,5 +14,5 @@ public enum StandardMessage { STILL_ON_SHARE_COOLDOWN, RESULTS_ALREADY_SHARED, STAT_RESULTS_TOO_OLD, - UNKNOWN_ERROR, + UNKNOWN_ERROR } diff --git a/src/main/java/com/artemis/the/gr8/playerstats/msg/OutputManager.java b/src/main/java/com/artemis/the/gr8/playerstats/msg/OutputManager.java index e0a60e4..3210dff 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/msg/OutputManager.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/msg/OutputManager.java @@ -5,6 +5,7 @@ import com.artemis.the.gr8.playerstats.config.ConfigHandler; import com.artemis.the.gr8.playerstats.enums.StandardMessage; import com.artemis.the.gr8.playerstats.msg.components.BukkitConsoleComponentFactory; import com.artemis.the.gr8.playerstats.msg.components.PrideComponentFactory; +import com.artemis.the.gr8.playerstats.msg.msgutils.FormattingFunction; import com.artemis.the.gr8.playerstats.msg.msgutils.LanguageKeyHandler; import com.artemis.the.gr8.playerstats.statistic.StatRequest; import net.kyori.adventure.platform.bukkit.BukkitAudiences; diff --git a/src/main/java/com/artemis/the/gr8/playerstats/msg/FormattingFunction.java b/src/main/java/com/artemis/the/gr8/playerstats/msg/msgutils/FormattingFunction.java similarity index 94% rename from src/main/java/com/artemis/the/gr8/playerstats/msg/FormattingFunction.java rename to src/main/java/com/artemis/the/gr8/playerstats/msg/msgutils/FormattingFunction.java index 5f8a0e4..c231ef9 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/msg/FormattingFunction.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/msg/msgutils/FormattingFunction.java @@ -1,4 +1,4 @@ -package com.artemis.the.gr8.playerstats.msg; +package com.artemis.the.gr8.playerstats.msg.msgutils; import net.kyori.adventure.text.TextComponent; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/artemis/the/gr8/playerstats/share/ShareManager.java b/src/main/java/com/artemis/the/gr8/playerstats/share/ShareManager.java index 20a9a69..a2eb460 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/share/ShareManager.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/share/ShareManager.java @@ -25,6 +25,7 @@ import static java.time.temporal.ChronoUnit.SECONDS; */ public final class ShareManager { + private static volatile ShareManager instance; private static boolean isEnabled; private int waitingTime; @@ -33,11 +34,25 @@ public final class ShareManager { private ConcurrentHashMap shareTimeStamp; private ArrayBlockingQueue sharedResults; - public ShareManager() { + private ShareManager() { updateSettings(); } - public static boolean isEnabled() { + public static ShareManager getInstance() { + ShareManager localVar = instance; + if (localVar != null) { + return localVar; + } + + synchronized (ShareManager.class) { + if (instance == null) { + instance = new ShareManager(); + } + return instance; + } + } + + public boolean isEnabled() { return isEnabled; } diff --git a/src/main/java/com/artemis/the/gr8/playerstats/statistic/RequestManager.java b/src/main/java/com/artemis/the/gr8/playerstats/statistic/RequestManager.java index b604c8c..c70e88f 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/statistic/RequestManager.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/statistic/RequestManager.java @@ -2,7 +2,7 @@ package com.artemis.the.gr8.playerstats.statistic; import com.artemis.the.gr8.playerstats.api.RequestGenerator; import com.artemis.the.gr8.playerstats.api.StatManager; -import com.artemis.the.gr8.playerstats.msg.FormattingFunction; +import com.artemis.the.gr8.playerstats.msg.msgutils.FormattingFunction; import com.artemis.the.gr8.playerstats.msg.OutputManager; import com.artemis.the.gr8.playerstats.multithreading.ThreadManager; import com.artemis.the.gr8.playerstats.share.ShareManager; @@ -28,9 +28,9 @@ public final class RequestManager implements StatManager { private static RequestProcessor processor; private final OfflinePlayerHandler offlinePlayerHandler; - public RequestManager(OutputManager outputManager, ShareManager shareManager) { - processor = new RequestProcessor(outputManager, shareManager); + public RequestManager(OutputManager outputManager) { offlinePlayerHandler = OfflinePlayerHandler.getInstance(); + processor = new RequestProcessor(outputManager); } public static StatResult execute(@NotNull StatRequest request) { @@ -82,9 +82,9 @@ public final class RequestManager implements StatManager { private static OutputManager outputManager; private static ShareManager shareManager; - public RequestProcessor(OutputManager outputManager, ShareManager shareManager) { + public RequestProcessor(OutputManager outputManager) { RequestProcessor.outputManager = outputManager; - RequestProcessor.shareManager = shareManager; + RequestProcessor.shareManager = ShareManager.getInstance(); } public @NotNull StatResult processPlayerRequest(StatRequest.Settings requestSettings) { @@ -149,7 +149,7 @@ public final class RequestManager implements StatManager { private boolean outputShouldBeStored(CommandSender sender) { return !(sender instanceof ConsoleCommandSender) && - ShareManager.isEnabled() && + shareManager.isEnabled() && shareManager.senderHasPermission(sender); } diff --git a/src/main/java/com/artemis/the/gr8/playerstats/statistic/StatResult.java b/src/main/java/com/artemis/the/gr8/playerstats/statistic/StatResult.java index 12cdfc0..fd2b122 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/statistic/StatResult.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/statistic/StatResult.java @@ -33,7 +33,7 @@ import net.kyori.adventure.text.TextComponent; * and use the BukkitAudiences object can be found on * Adventure's website. * - *

You can also use the provided {@link #formattedString ()} method to get the + *

You can also use the provided {@link #formattedString()} method to get the * same information in String-format. Don't use Adventure's #content() * or #toString() methods on the Components - those won't get the actual * message. And finally, if you want the results to be formatted differently, diff --git a/src/main/java/com/artemis/the/gr8/playerstats/utils/FileHandler.java b/src/main/java/com/artemis/the/gr8/playerstats/utils/FileHandler.java index 7acdbab..ce42e4a 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/utils/FileHandler.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/utils/FileHandler.java @@ -9,9 +9,10 @@ import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; public abstract class FileHandler { @@ -48,7 +49,7 @@ public abstract class FileHandler { } public void addValuesToFile(@NotNull Map keyValuePairs) { - keyValuePairs.forEach(this::addValue); + keyValuePairs.forEach(this::setValue); save(); updateFile(); } @@ -58,23 +59,30 @@ public abstract class FileHandler { * (or expanded if it already exists) * @param value the value(s) to expand the List with */ - public void addValueToListInFile(@NotNull String key, @NotNull Object value) { - List currentValues = fileConfiguration.getList(key); + public void addEntryToListInFile(@NotNull String key, @NotNull String value) { + List existingList = fileConfiguration.getStringList(key); - List updatedValues; - if (currentValues != null) { - updatedValues = new ArrayList<>(currentValues); - } else { - updatedValues = new ArrayList<>(); - } - updatedValues.add(value); + List updatedList = existingList.stream() + .filter(Objects::nonNull) + .collect(Collectors.toList()); + updatedList.add(value); - addValue(key, updatedValues); + setValue(key, updatedList); save(); updateFile(); } - private void addValue(String key, Object value) { + public void removeEntryFromListInFile(@NotNull String key, @NotNull String value) { + List currentValues = fileConfiguration.getStringList(key); + + if (currentValues.remove(value)) { + setValue(key, currentValues); + save(); + updateFile(); + } + } + + private void setValue(String key, Object value) { fileConfiguration.set(key, value); } diff --git a/src/main/java/com/artemis/the/gr8/playerstats/utils/OfflinePlayerHandler.java b/src/main/java/com/artemis/the/gr8/playerstats/utils/OfflinePlayerHandler.java index 177898f..b5cfaca 100644 --- a/src/main/java/com/artemis/the/gr8/playerstats/utils/OfflinePlayerHandler.java +++ b/src/main/java/com/artemis/the/gr8/playerstats/utils/OfflinePlayerHandler.java @@ -13,6 +13,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ForkJoinPool; import java.util.function.Predicate; +import java.util.stream.Collectors; /** * A utility class that deals with OfflinePlayers. It stores a list @@ -64,23 +65,34 @@ public final class OfflinePlayerHandler extends FileHandler { * @param playerName String (case-sensitive) * @return true if this player is included */ - public boolean isRelevantPlayer(String playerName) { + public boolean isLoadedPlayer(String playerName) { return offlinePlayerUUIDs.containsKey(playerName); } - public void excludePlayer(UUID uniqueID) { - super.addValueToListInFile("excluded", uniqueID); + public void addPlayerToExcludeList(UUID uniqueID) { + super.addEntryToListInFile("excluded", uniqueID.toString()); + } + + public void removePlayerFromExcludeList(UUID uniqueID) { + super.removeEntryFromListInFile("excluded", uniqueID.toString()); + } + + public List getListOfExcludedPlayerNames() { + List excludedUUIDs = excludedPlayers.getStringList("excluded"); + return excludedUUIDs.stream() + .map(UUID::fromString) + .map(Bukkit::getOfflinePlayer) + .map(OfflinePlayer::getName) + .collect(Collectors.toList()); } public boolean isExcluded(UUID uniqueID) { - List excluded = excludedPlayers.getList("excluded"); - if (excluded == null) { - return false; - } + List excluded = excludedPlayers.getStringList("excluded"); return excluded.stream() .filter(Objects::nonNull) - .anyMatch(obj -> obj.equals(uniqueID)); + .map(UUID::fromString) + .anyMatch(uuid -> uuid.equals(uniqueID)); } /** diff --git a/src/main/resources/excluded_players.yml b/src/main/resources/excluded_players.yml index 05cfef6..1dc7bc9 100644 --- a/src/main/resources/excluded_players.yml +++ b/src/main/resources/excluded_players.yml @@ -6,5 +6,8 @@ # This can be used for more fine-grained filtering, for example to exclude alt accounts. # For more general filtering settings, see the config.yml (section 'General') +# Format: +# - playerUUID-1 +# - playerUUID-2 excluded: - \ No newline at end of file