diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index 7cab65a..7978100 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -23,21 +23,30 @@ shade - - - - com.gmail.artemis.the.gr8.playerstats.Main - - - - - org.jetbrains:annotations - META-INF/versions/** - - - + + + + com.gmail.artemis.the.gr8.playerstats.Main + + + + + org.jetbrains:annotations + + + + + *:* + + META-INF/versions/** + META-INF/maven/com.tchristofferson/** + images/** + + + + diff --git a/pom.xml b/pom.xml index d61f77e..31f4bfb 100644 --- a/pom.xml +++ b/pom.xml @@ -92,23 +92,32 @@ shade - - - - com.gmail.artemis.the.gr8.playerstats.Main - - - - - org.jetbrains:annotations - META-INF/versions/** - - - + + + + com.gmail.artemis.the.gr8.playerstats.Main + + + + + org.jetbrains:annotations + + + + + *:* + + META-INF/versions/** + META-INF/maven/com.tchristofferson/** + images/** + + + + - \ No newline at end of file diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/config/ConfigHandler.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/config/ConfigHandler.java index 52de2e3..3fa03d3 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/config/ConfigHandler.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/config/ConfigHandler.java @@ -56,14 +56,12 @@ public class ConfigHandler { } try { config = YamlConfiguration.loadConfiguration(configFile); + return true; } catch (IllegalArgumentException e) { MyLogger.logException(e, "ConfigHandler", "reloadConfig"); return false; } - //TODO Move this to ReloadThread - MyLogger.setDebugLevel(getDebugLevel()); - return true; } /** Returns the desired debugging level. diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/MessageWriter.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/MessageWriter.java index 5f4957c..00270a4 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/MessageWriter.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/msg/MessageWriter.java @@ -30,7 +30,6 @@ public class MessageWriter { getComponentFactory(); } - //TODO Make ReloadThread do an update public static void updateComponentFactory() { getComponentFactory(); } @@ -55,27 +54,12 @@ public class MessageWriter { "your request will be processed when it is done!", isBukkitConsole); } - public TextComponent partiallyReloaded(boolean isBukkitConsole) { - return componentFactory.msg( - "The reload process was interrupted. " + - "If you notice unexpected behavior, " + - "please reload PlayerStats again to fix it!", isBukkitConsole); - } - - public TextComponent interruptedRequest() { - return componentFactory.msg("Your request was interrupted, please try again in a moment!", false); - } - public TextComponent waitAMoment(boolean longWait, boolean isBukkitConsole) { String msg = longWait ? "Calculating statistics, this may take a minute..." : "Calculating statistics, this may take a few moments..."; return componentFactory.msg(msg, isBukkitConsole); } - public TextComponent formatExceptions(@NotNull String exception, boolean isBukkitConsole) { - return componentFactory.msg(exception, isBukkitConsole); - } - public TextComponent missingStatName(boolean isBukkitConsole) { return componentFactory.msg( "Please provide a valid statistic name!", isBukkitConsole); diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/reload/ReloadThread.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/reload/ReloadThread.java index 70e1a32..1b8a75f 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/reload/ReloadThread.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/reload/ReloadThread.java @@ -12,11 +12,9 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; -import java.util.ConcurrentModificationException; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -54,74 +52,56 @@ public class ReloadThread extends Thread { long time = System.currentTimeMillis(); MyLogger.threadStart(this.getName()); - //if reload is triggered by /statreload (aka this thread does not have ID number 1)... - if (reloadThreadID != 1) { - if (statThread != null && statThread.isAlive()) { - statThread.stopThread(); - return; - - /* - try { - MyLogger.waitingForOtherThread(this.getName(), statThread.getName()); - statThread.join(); - } catch (InterruptedException e) { - MyLogger.logException(e, "ReloadThread", "run(), trying to join" + statThread.getName()); - throw new RuntimeException(e); - } - */ - } - MyLogger.logMsg("Reloading!", false); - if (config.reloadConfig()) { - boolean isBukkitConsole = sender instanceof ConsoleCommandSender && Bukkit.getName().equalsIgnoreCase("CraftBukkit"); - - try { - OfflinePlayerHandler.updateOfflinePlayerList(getPlayerMap()); - } - catch (ConcurrentModificationException e) { - MyLogger.logException(e, "ReloadThread", "run(), trying to update OfflinePlayerList during a reload"); - if (sender != null) { - adventure.sender(sender).sendMessage(messageWriter.partiallyReloaded(isBukkitConsole)); - } - } - - MyLogger.logTimeTaken("ReloadThread", ("loaded " + OfflinePlayerHandler.getOfflinePlayerCount() + " offline players"), time); - if (sender != null) { - adventure.sender(sender).sendMessage(messageWriter.reloadedConfig(isBukkitConsole)); - } + if (statThread != null && statThread.isAlive()) { + try { + MyLogger.waitingForOtherThread(this.getName(), statThread.getName()); + statThread.join(); + } catch (InterruptedException e) { + MyLogger.logException(e, "ReloadThread", "run(), trying to join" + statThread.getName()); + throw new RuntimeException(e); } } - //during first start-up... - else { - try { - OfflinePlayerHandler.updateOfflinePlayerList(getPlayerMap()); - ThreadManager.recordCalcTime(System.currentTimeMillis() - time); - MyLogger.logTimeTaken("ReloadThread", - ("loaded " + OfflinePlayerHandler.getOfflinePlayerCount() + " offline players"), time); - } - catch (ConcurrentModificationException e) { - MyLogger.logException(e, "ReloadThread", "run(), trying to update OfflinePlayerList during first start-up"); + + if (reloadThreadID != 1 && config.reloadConfig()) { //during a reload + MyLogger.logMsg("Reloading!", false); + MyLogger.setDebugLevel(config.getDebugLevel()); + MessageWriter.updateComponentFactory(); + loadOfflinePlayers(); + + boolean isBukkitConsole = sender instanceof ConsoleCommandSender && Bukkit.getName().equalsIgnoreCase("CraftBukkit"); + if (sender != null) { + adventure.sender(sender).sendMessage( + messageWriter.reloadedConfig(isBukkitConsole)); } } + else { //during first start-up + MyLogger.setDebugLevel(config.getDebugLevel()); + loadOfflinePlayers(); + ThreadManager.recordCalcTime(System.currentTimeMillis() - time); + } } - private @NotNull ConcurrentHashMap getPlayerMap() throws ConcurrentModificationException { + private void loadOfflinePlayers() { long time = System.currentTimeMillis(); OfflinePlayer[] offlinePlayers; if (config.whitelistOnly()) { offlinePlayers = Bukkit.getWhitelistedPlayers().toArray(OfflinePlayer[]::new); - MyLogger.logTimeTaken("ReloadThread", "retrieved whitelist", time, DebugLevel.MEDIUM); + MyLogger.logTimeTaken("ReloadThread", + "retrieved whitelist", time, DebugLevel.MEDIUM); } else if (config.excludeBanned()) { Set bannedPlayers = Bukkit.getBannedPlayers(); offlinePlayers = Arrays.stream(Bukkit.getOfflinePlayers()) .parallel() .filter(offlinePlayer -> !bannedPlayers.contains(offlinePlayer)).toArray(OfflinePlayer[]::new); - MyLogger.logTimeTaken("ReloadThread", "retrieved banlist", time, DebugLevel.MEDIUM); + MyLogger.logTimeTaken("ReloadThread", + "retrieved banlist", time, DebugLevel.MEDIUM); } else { offlinePlayers = Bukkit.getOfflinePlayers(); - MyLogger.logTimeTaken("ReloadThread", "retrieved list of Offline Players", time, DebugLevel.MEDIUM); + MyLogger.logTimeTaken("ReloadThread", + "retrieved list of Offline Players", time, DebugLevel.MEDIUM); } int size = offlinePlayers != null ? offlinePlayers.length : 16; @@ -129,23 +109,11 @@ public class ReloadThread extends Thread { ReloadAction task = new ReloadAction(threshold, offlinePlayers, config.getLastPlayedLimit(), playerMap); MyLogger.actionCreated((offlinePlayers != null) ? offlinePlayers.length : 0); - ForkJoinPool.commonPool().invoke(task); MyLogger.actionFinished(1); + MyLogger.logTimeTaken("ReloadThread", + ("loaded " + OfflinePlayerHandler.getOfflinePlayerCount() + " offline players"), time); - return generateFakeExtraPlayers(playerMap, 10); - } - - //generate fake extra players for PlayerStats, by looping over the real offlinePlayers multiple times - private @NotNull ConcurrentHashMap generateFakeExtraPlayers(@NotNull ConcurrentHashMap realPlayers, int loops) { - if (loops == 0 || loops == 1) return realPlayers; - - ConcurrentHashMap newPlayerMap = new ConcurrentHashMap<>(realPlayers.size() * loops); - for (int i = 0; i < loops; i++) { - for (String key : realPlayers.keySet()) { - newPlayerMap.put(key + i, realPlayers.get(key)); - } - } - return newPlayerMap; + OfflinePlayerHandler.updateOfflinePlayerList(playerMap); } } \ No newline at end of file diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/StatThread.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/StatThread.java index 02bb5ff..2760976 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/StatThread.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/StatThread.java @@ -10,10 +10,7 @@ import com.gmail.artemis.the.gr8.playerstats.utils.MyLogger; import com.gmail.artemis.the.gr8.playerstats.utils.OfflinePlayerHandler; import com.google.common.collect.ImmutableList; import net.kyori.adventure.platform.bukkit.BukkitAudiences; -import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -24,7 +21,6 @@ import java.util.stream.Collectors; public class StatThread extends Thread { - private volatile boolean keepRunning = true; private final int threshold; private final StatRequest request; @@ -51,12 +47,6 @@ public class StatThread extends Thread { MyLogger.threadCreated(this.getName()); } - public void stopThread() { - MyLogger.logMsg("stopThread() is being executed by: " + Thread.currentThread().getName(), false); - keepRunning = false; - MyLogger.logMsg("StatThread has been forced to stop!", true); - } - //what the thread will do once started @Override public void run() throws IllegalStateException, NullPointerException { @@ -69,54 +59,45 @@ public class StatThread extends Thread { throw new NullPointerException("No statistic request was found!"); } - CommandSender sender = request.getCommandSender(); - boolean isBukkitConsole = sender instanceof ConsoleCommandSender && Bukkit.getName().equalsIgnoreCase("CraftBukkit"); if (reloadThread != null && reloadThread.isAlive()) { try { MyLogger.waitingForOtherThread(this.getName(), reloadThread.getName()); adventure.sender(request.getCommandSender()) .sendMessage(messageWriter - .stillReloading(isBukkitConsole)); + .stillReloading(request.isBukkitConsoleSender())); reloadThread.join(); - //TODO Add timeout after which it checks again and potentially aborts mission } catch (InterruptedException e) { MyLogger.logException(e, "StatThread", "Trying to join" + reloadThread.getName()); throw new RuntimeException(e); } } - //TODO Evaluate if this really does something - while (keepRunning) { - Target selection = request.getSelection(); - if (selection == Target.PLAYER) { - adventure.sender(sender).sendMessage( - messageWriter.formatPlayerStat(getIndividualStat(), request)); - } - else { - if (ThreadManager.getLastRecordedCalcTime() > 2000) { - adventure.sender(sender).sendMessage( - messageWriter.waitAMoment(ThreadManager.getLastRecordedCalcTime() > 20000, isBukkitConsole)); - } - try { - if (selection == Target.TOP) { - adventure.sender(sender).sendMessage( - messageWriter.formatTopStats(getTopStats(), request)); - } else { - adventure.sender(sender).sendMessage( - messageWriter.formatServerStat(getServerTotal(), request)); - } - } catch (ConcurrentModificationException e) { - if (!isBukkitConsole) { - adventure.sender(sender).sendMessage( - messageWriter.unknownError(false)); - } - } - } - return; + Target selection = request.getSelection(); + if (selection == Target.PLAYER) { + adventure.sender(request.getCommandSender()).sendMessage( + messageWriter.formatPlayerStat(getIndividualStat(), request)); + } + else { + if (ThreadManager.getLastRecordedCalcTime() > 2000) { + adventure.sender(request.getCommandSender()).sendMessage( + messageWriter.waitAMoment(ThreadManager.getLastRecordedCalcTime() > 20000, request.isBukkitConsoleSender())); + } + try { + if (selection == Target.TOP) { + adventure.sender(request.getCommandSender()).sendMessage( + messageWriter.formatTopStats(getTopStats(), request)); + } else { + adventure.sender(request.getCommandSender()).sendMessage( + messageWriter.formatServerStat(getServerTotal(), request)); + } + } catch (ConcurrentModificationException e) { + if (!request.isConsoleSender()) { + adventure.sender(request.getCommandSender()).sendMessage( + messageWriter.unknownError(false)); + } + } } - MyLogger.logMsg("(" + Thread.currentThread().getName() + ") shutting down...", false); - adventure.sender(sender).sendMessage(messageWriter.interruptedRequest()); } private LinkedHashMap getTopStats() throws ConcurrentModificationException {