mirror of
https://github.com/itHotL/PlayerStats.git
synced 2025-02-10 00:41:21 +01:00
Improved reload process, excluded unnecessary files in pom.xml and deleted some unnecessary error throwing
This commit is contained in:
parent
9ca234975b
commit
9949da4384
@ -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
19
pom.xml
@ -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>
|
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user