Improved reload process, excluded unnecessary files in pom.xml and deleted some unnecessary error throwing

This commit is contained in:
Artemis-the-gr8 2022-06-29 21:30:25 +02:00
parent 9ca234975b
commit 9949da4384
6 changed files with 104 additions and 155 deletions

View File

@ -23,6 +23,8 @@
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<transformers>
<transformer>
@ -32,12 +34,19 @@
<artifactSet>
<excludes>
<exclude>org.jetbrains:annotations</exclude>
<exclude>META-INF/versions/**</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/versions/**</exclude>
<exclude>META-INF/maven/com.tchristofferson/**</exclude>
<exclude>images/**</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

19
pom.xml
View File

@ -92,23 +92,32 @@
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.gmail.artemis.the.gr8.playerstats.Main</mainClass>
</transformer>
</transformers>
<artifactSet>
<excludes>
<exclude>org.jetbrains:annotations</exclude>
<exclude>META-INF/versions/**</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/versions/**</exclude>
<exclude>META-INF/maven/com.tchristofferson/**</exclude>
<exclude>images/**</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -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.

View File

@ -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);

View File

@ -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,13 +52,7 @@ 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();
@ -68,60 +60,48 @@ public class ReloadThread extends Thread {
MyLogger.logException(e, "ReloadThread", "run(), trying to join" + statThread.getName());
throw new RuntimeException(e);
}
*/
}
if (reloadThreadID != 1 && config.reloadConfig()) { //during a reload
MyLogger.logMsg("Reloading!", false);
if (config.reloadConfig()) {
MyLogger.setDebugLevel(config.getDebugLevel());
MessageWriter.updateComponentFactory();
loadOfflinePlayers();
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));
adventure.sender(sender).sendMessage(
messageWriter.reloadedConfig(isBukkitConsole));
}
}
MyLogger.logTimeTaken("ReloadThread", ("loaded " + OfflinePlayerHandler.getOfflinePlayerCount() + " offline players"), time);
if (sender != null) {
adventure.sender(sender).sendMessage(messageWriter.reloadedConfig(isBukkitConsole));
}
}
}
//during first start-up...
else {
try {
OfflinePlayerHandler.updateOfflinePlayerList(getPlayerMap());
else { //during first start-up
MyLogger.setDebugLevel(config.getDebugLevel());
loadOfflinePlayers();
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");
}
}
}
private @NotNull ConcurrentHashMap<String, UUID> 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<OfflinePlayer> 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<String, UUID> generateFakeExtraPlayers(@NotNull ConcurrentHashMap<String, UUID> realPlayers, int loops) {
if (loops == 0 || loops == 1) return realPlayers;
ConcurrentHashMap<String, UUID> 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);
}
}

View File

@ -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(
adventure.sender(request.getCommandSender()).sendMessage(
messageWriter.formatPlayerStat(getIndividualStat(), request));
}
else {
if (ThreadManager.getLastRecordedCalcTime() > 2000) {
adventure.sender(sender).sendMessage(
messageWriter.waitAMoment(ThreadManager.getLastRecordedCalcTime() > 20000, isBukkitConsole));
adventure.sender(request.getCommandSender()).sendMessage(
messageWriter.waitAMoment(ThreadManager.getLastRecordedCalcTime() > 20000, request.isBukkitConsoleSender()));
}
try {
if (selection == Target.TOP) {
adventure.sender(sender).sendMessage(
adventure.sender(request.getCommandSender()).sendMessage(
messageWriter.formatTopStats(getTopStats(), request));
} else {
adventure.sender(sender).sendMessage(
adventure.sender(request.getCommandSender()).sendMessage(
messageWriter.formatServerStat(getServerTotal(), request));
}
} catch (ConcurrentModificationException e) {
if (!isBukkitConsole) {
adventure.sender(sender).sendMessage(
if (!request.isConsoleSender()) {
adventure.sender(request.getCommandSender()).sendMessage(
messageWriter.unknownError(false));
}
}
}
return;
}
MyLogger.logMsg("(" + Thread.currentThread().getName() + ") shutting down...", false);
adventure.sender(sender).sendMessage(messageWriter.interruptedRequest());
}
private LinkedHashMap<String, Integer> getTopStats() throws ConcurrentModificationException {