From aa4c53b5ba6b4f76a14716b7e9a2482df4e17adf Mon Sep 17 00:00:00 2001 From: Artemis-the-gr8 Date: Wed, 8 Jun 2022 01:35:08 +0200 Subject: [PATCH] Release v1.2! --- dependency-reduced-pom.xml | 2 +- pom.xml | 2 +- .../artemis/the/gr8/playerstats/Main.java | 2 +- .../the/gr8/playerstats/ThreadManager.java | 7 +- .../filehandlers/ConfigHandler.java | 19 +++ .../filehandlers/TestFileHandler.java | 161 ------------------ .../playerstats/listeners/JoinListener.java | 13 +- .../gr8/playerstats/reload/ReloadThread.java | 8 +- .../gr8/playerstats/statistic/StatThread.java | 10 +- .../playerstats/statistic/TopStatAction.java | 3 +- .../gr8/playerstats/utils/MessageFactory.java | 37 ++-- src/main/resources/config.yml | 60 ++++--- src/main/resources/images/new_usage.png | Bin 0 -> 19052 bytes src/main/resources/images/server_stat.png | Bin 0 -> 4427 bytes src/main/resources/images/usage.png | Bin 14816 -> 16509 bytes 15 files changed, 102 insertions(+), 222 deletions(-) delete mode 100644 src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/TestFileHandler.java create mode 100644 src/main/resources/images/new_usage.png create mode 100644 src/main/resources/images/server_stat.png diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index cdeb76f..c5bf9cc 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.gmail.artemis-the-gr8 PlayerStats - 1.1 + 1.2 diff --git a/pom.xml b/pom.xml index 18560fd..281044e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.gmail.artemis-the-gr8 PlayerStats - 1.1 + 1.2 17 diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/Main.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/Main.java index a61210b..e8ac5eb 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/Main.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/Main.java @@ -46,7 +46,7 @@ public class Main extends JavaPlugin { if (reloadcmd != null) reloadcmd.setExecutor(new ReloadCommand(threadManager)); //register the listener - Bukkit.getPluginManager().registerEvents(new JoinListener(threadManager), this); + Bukkit.getPluginManager().registerEvents(new JoinListener(config, threadManager), this); logTimeTaken("onEnable", "time taken", time); this.getLogger().info("Enabled PlayerStats!"); } diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/ThreadManager.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/ThreadManager.java index 68e0292..bbd9c77 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/ThreadManager.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/ThreadManager.java @@ -1,7 +1,6 @@ package com.gmail.artemis.the.gr8.playerstats; import com.gmail.artemis.the.gr8.playerstats.filehandlers.ConfigHandler; -import com.gmail.artemis.the.gr8.playerstats.filehandlers.TestFileHandler; import com.gmail.artemis.the.gr8.playerstats.reload.ReloadThread; import com.gmail.artemis.the.gr8.playerstats.statistic.StatRequest; import com.gmail.artemis.the.gr8.playerstats.statistic.StatThread; @@ -17,7 +16,6 @@ public class ThreadManager { private final Main plugin; private final BukkitAudiences adventure; private static ConfigHandler config; - private static TestFileHandler testFile; private final MessageFactory messageFactory; private ReloadThread reloadThread; @@ -30,17 +28,16 @@ public class ThreadManager { config = c; messageFactory = m; - testFile = new TestFileHandler(plugin); startReloadThread(null, true); } public void startReloadThread(CommandSender sender, boolean firstTimeLoading) { - reloadThread = new ReloadThread(threshold, adventure, config, testFile, messageFactory, plugin, statThread, sender, firstTimeLoading); + reloadThread = new ReloadThread(threshold, adventure, config, messageFactory, plugin, statThread, sender, firstTimeLoading); reloadThread.start(); } public void startStatThread(StatRequest request) { - statThread = new StatThread(threshold, request, reloadThread, adventure, config, testFile, messageFactory, plugin); + statThread = new StatThread(threshold, request, reloadThread, adventure, config, messageFactory, plugin); statThread.start(); } diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/ConfigHandler.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/ConfigHandler.java index a950008..fbdd3e5 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/ConfigHandler.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/ConfigHandler.java @@ -19,7 +19,21 @@ public class ConfigHandler { public ConfigHandler(Main p) { plugin = p; saveDefaultConfig(); + config = YamlConfiguration.loadConfiguration(configFile); + checkConfigVersion(); + } + + public boolean isConfigUpdated() { + return config.contains("config-version"); + } + + /** Sends a message in console if the latest version of the config is not present */ + private void checkConfigVersion() { + if (!config.contains("config-version")) { + plugin.getLogger().warning("Your config version is outdated! " + + "Please delete your current config.yml (or rename it/copy it to another folder) and do /statreload"); + } } /** Reloads the config from file, or creates a new file with default values if there is none. */ @@ -67,6 +81,11 @@ public class ConfigHandler { return config.getString("your-server-name", "this server"); } + + public String getServerTitle() { + return config.getString("total-server-stat-title", "In total on"); + } + /** Returns a String that represents either a Chat Color, hex color code, or Style. Default values are "none" for Style, and "green" or "gold" for Color (for top or individual color). */ public String getPlayerNameFormatting(Query selection, boolean isStyle) { diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/TestFileHandler.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/TestFileHandler.java deleted file mode 100644 index 0ede62e..0000000 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/filehandlers/TestFileHandler.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.gmail.artemis.the.gr8.playerstats.filehandlers; - -import com.gmail.artemis.the.gr8.playerstats.Main; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.io.IOException; - -public class TestFileHandler { - - private File testFile; - private FileConfiguration testConf; - private ConfigurationSection number; - private final Main plugin; - - private String onEnable; - private String reload; - private String debugging; - private String topStat; - - public TestFileHandler(Main p) { - plugin = p; - onEnable = "onEnable"; - reload = "reload"; - debugging = "exception-debugging"; - topStat = "top-stat"; - } - - /** - * Creates a new config section for the given threshold. Only needs to be called once, unless threshold changes. - * @param count amount of players to calculate statistics with - * @param threshold how small the subTasks have to become - */ - public void saveThreshold(int count, int threshold) { - loadFile(count); - String path = threshold + " threshold"; - try { - number = testConf.getConfigurationSection(path); - if (number == null) { - number = testConf.createSection(path); - number.createSection(onEnable); - number.createSection(reload); - number.createSection(debugging); - number.createSection(topStat); - } - else { - number = testConf.getConfigurationSection(path); - } - saveFile(); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - public void logRunCount(boolean errorEncountered) { - try { - ConfigurationSection section = number.getConfigurationSection(debugging); - if (section != null) { - int runs = section.getInt("runs"); - section.set("runs", runs +1); - - if (errorEncountered) { - int errors = section.getInt("errors"); - section.set("errors", errors + 1); - - String path = "error-" + (errors + 1) + "-during-run"; - int lastError = section.getInt("error-" + errors + "-during-run"); - - int runsUntilError = runs - lastError; - String path2 = "until-error-" + (errors + 1); - - section.set(path2, runsUntilError); - section.set(path, runs); - } - saveFile(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * Logs how long a certain method took for the earlier set threshold. Always make sure saveThreshold has been - * called once before this method is called. - * @param time how long the given action took - * @param scenario describes which section to get. 1 means onEnable, 2 means reload, and 3 means top-stat - */ - public void saveTimeTaken(long time, int scenario) { - String path = ""; - if (scenario == 1) path = onEnable; - else if (scenario == 2) path = reload; - else if (scenario == 3) path = topStat; - - try { - ConfigurationSection section = number.getConfigurationSection(path); - if (section != null) { - saveTimeToSection(time, section); - saveFile(); - } - } - catch (Exception e) { - e.printStackTrace(); - } - } - - private void saveTimeToSection(long time, ConfigurationSection section) { - if (section.contains("average")) { - long average = section.getLong("average"); - long newAverage = ((average * (section.getKeys(false).size() -1)) + time)/section.getKeys(false).size(); - section.set(section.getKeys(false).size() + "", time); - section.set("average", newAverage); - } - - else { - section.set("average", time); - section.set("1", time); - } - } - - private void loadFile(int players) { - String fileName = "test_" + players + ".yml"; - testFile = new File(plugin.getDataFolder(), fileName); - if (!testFile.exists()) { - plugin.getLogger().info("Attempting to create testFile..."); - createFile(); - } - - testConf = new YamlConfiguration(); - try { - testConf.load(testFile); - } - catch (IOException | InvalidConfigurationException exception) { - exception.printStackTrace(); - } - saveFile(); - } - - private void createFile() { - testFile.getParentFile().mkdirs(); - try { - testFile.createNewFile(); - plugin.getLogger().info("Even though this would return false, secretly a file has been created anyway"); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - private void saveFile() { - try { - testConf.save(testFile); - } - catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/listeners/JoinListener.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/listeners/JoinListener.java index 1279165..5d7a7a9 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/listeners/JoinListener.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/listeners/JoinListener.java @@ -1,6 +1,9 @@ package com.gmail.artemis.the.gr8.playerstats.listeners; import com.gmail.artemis.the.gr8.playerstats.ThreadManager; +import com.gmail.artemis.the.gr8.playerstats.filehandlers.ConfigHandler; +import com.gmail.artemis.the.gr8.playerstats.utils.MessageFactory; +import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; @@ -8,9 +11,11 @@ import org.bukkit.event.player.PlayerJoinEvent; public class JoinListener implements Listener { + private static ConfigHandler config; private final ThreadManager threadManager; - public JoinListener(ThreadManager t) { + public JoinListener(ConfigHandler c, ThreadManager t) { + config = c; threadManager = t; } @@ -19,5 +24,11 @@ public class JoinListener implements Listener { if (!joinEvent.getPlayer().hasPlayedBefore()) { threadManager.startReloadThread(null, false); } + + else if (joinEvent.getPlayer().isOp() && !config.isConfigUpdated()) { + joinEvent.getPlayer().sendMessage(MessageFactory.getPluginPrefix() + ChatColor.GRAY + ChatColor.ITALIC + + "Your config version is outdated! " + + "Please delete your current config.yml (or rename it/copy it to another folder) and do /statreload"); + } } } 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 77a1201..7a50159 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 @@ -3,7 +3,6 @@ package com.gmail.artemis.the.gr8.playerstats.reload; import com.gmail.artemis.the.gr8.playerstats.Main; import com.gmail.artemis.the.gr8.playerstats.ThreadManager; import com.gmail.artemis.the.gr8.playerstats.filehandlers.ConfigHandler; -import com.gmail.artemis.the.gr8.playerstats.filehandlers.TestFileHandler; import com.gmail.artemis.the.gr8.playerstats.statistic.StatThread; import com.gmail.artemis.the.gr8.playerstats.utils.MessageFactory; import com.gmail.artemis.the.gr8.playerstats.utils.OfflinePlayerHandler; @@ -24,7 +23,6 @@ public class ReloadThread extends Thread { private final BukkitAudiences adventure; private static ConfigHandler config; - private static TestFileHandler testFile; private final MessageFactory messageFactory; private final Main plugin; @@ -32,11 +30,10 @@ public class ReloadThread extends Thread { private final CommandSender sender; private final boolean firstTimeLoading; - public ReloadThread(int threshold, BukkitAudiences b, ConfigHandler c, TestFileHandler t, MessageFactory m, Main p, @Nullable StatThread s, @Nullable CommandSender se, boolean firstTime) { + public ReloadThread(int threshold, BukkitAudiences b, ConfigHandler c, MessageFactory m, Main p, @Nullable StatThread s, @Nullable CommandSender se, boolean firstTime) { this.threshold = threshold; adventure = b; config = c; - testFile = t; messageFactory = m; plugin = p; @@ -73,7 +70,6 @@ public class ReloadThread extends Thread { } } - testFile.saveTimeTaken(System.currentTimeMillis() - time, 2); plugin.getLogger().info("Amount of relevant players: " + OfflinePlayerHandler.getOfflinePlayerCount()); plugin.logTimeTaken("ReloadThread", "loading offline players", time); if (sender != null) { @@ -85,8 +81,6 @@ public class ReloadThread extends Thread { plugin.getLogger().info("Loading offline players..."); OfflinePlayerHandler.updateOfflinePlayerList(getPlayerMap(true)); - testFile.saveThreshold(OfflinePlayerHandler.getOfflinePlayerCount(), threshold); - testFile.saveTimeTaken(System.currentTimeMillis() - time, 1); plugin.getLogger().info("Amount of relevant players: " + OfflinePlayerHandler.getOfflinePlayerCount()); plugin.logTimeTaken("ReloadThread", "loading offline players", time); ThreadManager.recordCalcTime(System.currentTimeMillis() - time); 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 9e4e856..7cb9ca9 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 @@ -2,7 +2,6 @@ package com.gmail.artemis.the.gr8.playerstats.statistic; import com.gmail.artemis.the.gr8.playerstats.Main; import com.gmail.artemis.the.gr8.playerstats.enums.Query; -import com.gmail.artemis.the.gr8.playerstats.filehandlers.TestFileHandler; import com.gmail.artemis.the.gr8.playerstats.reload.ReloadThread; import com.gmail.artemis.the.gr8.playerstats.ThreadManager; import com.gmail.artemis.the.gr8.playerstats.filehandlers.ConfigHandler; @@ -28,19 +27,17 @@ public class StatThread extends Thread { private final BukkitAudiences adventure; private static ConfigHandler config; - private static TestFileHandler testFile; private final MessageFactory messageFactory; private final Main plugin; //constructor (called on thread creation) - public StatThread(int threshold, StatRequest s, @Nullable ReloadThread r, BukkitAudiences b, ConfigHandler c, TestFileHandler t, MessageFactory o, Main p) { + public StatThread(int threshold, StatRequest s, @Nullable ReloadThread r, BukkitAudiences b, ConfigHandler c, MessageFactory o, Main p) { this.threshold = threshold; request = s; reloadThread = r; adventure = b; config = c; - testFile = t; messageFactory = o; plugin = p; plugin.getLogger().info("StatThread created!"); @@ -76,7 +73,7 @@ public class StatThread extends Thread { if (ThreadManager.getLastRecordedCalcTime() > 20000) { adventure.sender(sender).sendMessage(messageFactory.waitAMoment(true)); } - else if (ThreadManager.getLastRecordedCalcTime() > 1500) { + else if (ThreadManager.getLastRecordedCalcTime() > 2000) { adventure.sender(sender).sendMessage(messageFactory.waitAMoment(false)); } @@ -91,7 +88,6 @@ public class StatThread extends Thread { } } catch (ConcurrentModificationException e) { - testFile.logRunCount(true); adventure.sender(sender).sendMessage(messageFactory.unknownError()); } catch (Exception e) { adventure.sender(sender).sendMessage(messageFactory.formatExceptions(e.toString())); @@ -141,8 +137,6 @@ public class StatThread extends Thread { throw new ConcurrentModificationException(e.toString()); } - testFile.saveTimeTaken(System.currentTimeMillis() - time, 3); - testFile.logRunCount(false); ThreadManager.recordCalcTime(System.currentTimeMillis() - time); plugin.logTimeTaken("StatThread", "calculating all stats", time); diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/TopStatAction.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/TopStatAction.java index 694d55e..aad364a 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/TopStatAction.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/statistic/TopStatAction.java @@ -20,11 +20,10 @@ public class TopStatAction extends RecursiveAction { /** * Gets the statistic numbers for all players whose name is on the list, puts them in a ConcurrentHashMap * using the default ForkJoinPool, and returns the ConcurrentHashMap when everything is done - * @param playerNames List of playerNames of players that should be included in the stat calculations + * @param playerNames ImmutableList of playerNames of players that should be included in the stat calculations * @param statRequest a validated statRequest * @param playerStats the ConcurrentHashMap to put the results on */ - public TopStatAction(int threshold, ImmutableList playerNames, StatRequest statRequest, ConcurrentHashMap playerStats) { this.threshold = threshold; this.playerNames = playerNames; diff --git a/src/main/java/com/gmail/artemis/the/gr8/playerstats/utils/MessageFactory.java b/src/main/java/com/gmail/artemis/the/gr8/playerstats/utils/MessageFactory.java index 960d8db..2c3c957 100644 --- a/src/main/java/com/gmail/artemis/the/gr8/playerstats/utils/MessageFactory.java +++ b/src/main/java/com/gmail/artemis/the/gr8/playerstats/utils/MessageFactory.java @@ -10,6 +10,7 @@ import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.util.Index; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Statistic; import org.bukkit.map.MinecraftFont; import org.jetbrains.annotations.Nullable; @@ -22,7 +23,7 @@ public class MessageFactory { private static ConfigHandler config; - private static final TextColor msgColor = TextColor.fromHexString("#55aaff"); + private static final TextColor msgColor = TextColor.fromHexString("#55AAFF"); private static final TextColor hoverBaseColor = TextColor.fromHexString("#55C6FF"); private static final TextColor hoverAccentColor1 = TextColor.fromHexString("#FFB80E"); private static final TextColor hoverAccentColor2 = TextColor.fromHexString("#FFD52B"); @@ -32,7 +33,11 @@ public class MessageFactory { config = c; } - private static TextComponent getPluginPrefix() { + public static String getPluginPrefix() { + return ChatColor.GRAY + "[" + ChatColor.GOLD + "PlayerStats" + ChatColor.GRAY + "] " + ChatColor.RESET; + } + + private static TextComponent pluginPrefix() { return text("[") .append(text("PlayerStats").color(NamedTextColor.GOLD)) .append(text("]") @@ -41,34 +46,34 @@ public class MessageFactory { } public TextComponent reloadedConfig() { - return getPluginPrefix().append(text("Config reloaded!").color(NamedTextColor.GREEN)); + return pluginPrefix().append(text("Config reloaded!").color(NamedTextColor.GREEN)); } public TextComponent stillReloading() { - return getPluginPrefix().append(text("The plugin is still (re)loading, your request will be processed when it is done!").color(msgColor)); + return pluginPrefix().append(text("The plugin is still (re)loading, your request will be processed when it is done!").color(msgColor)); } public TextComponent partiallyReloaded() { - return getPluginPrefix().append( + return pluginPrefix().append( text("The reload process was interrupted. If you notice unexpected behavior, please reload PlayerStats again to fix it!").color(msgColor)); } public TextComponent waitAMoment(boolean longWait) { - return longWait ? getPluginPrefix().append(text("Calculating statistics, this may take a minute...").color(msgColor)) - : getPluginPrefix().append(text("Calculating statistics, this may take a few moments...").color(msgColor)); + return longWait ? pluginPrefix().append(text("Calculating statistics, this may take a minute...").color(msgColor)) + : pluginPrefix().append(text("Calculating statistics, this may take a few moments...").color(msgColor)); } public TextComponent formatExceptions(String exception) { - return getPluginPrefix().append(text(exception).color(msgColor)); + return pluginPrefix().append(text(exception).color(msgColor)); } public TextComponent missingStatName() { - return getPluginPrefix().append(text("Please provide a valid statistic name!").color(msgColor)); + return pluginPrefix().append(text("Please provide a valid statistic name!").color(msgColor)); } public TextComponent missingSubStatName(Statistic.Type statType) { String subStat = getSubStatTypeName(statType) == null ? "sub-statistic" : getSubStatTypeName(statType); - return getPluginPrefix() + return pluginPrefix() .append(text("Please add a valid ") .append(text(subStat)) .append(text(" to look up this statistic!"))) @@ -76,12 +81,12 @@ public class MessageFactory { } public TextComponent missingPlayerName() { - return getPluginPrefix().append(text("Please specify a valid player-name!").color(msgColor)); + return pluginPrefix().append(text("Please specify a valid player-name!").color(msgColor)); } public TextComponent wrongSubStatType(Statistic.Type statType, String subStatEntry) { String subStat = getSubStatTypeName(statType) == null ? "sub-statistic for this statistic" : getSubStatTypeName(statType); - return getPluginPrefix() + return pluginPrefix() .append(text("\"") .append(text(subStatEntry)) .append(text("\"")) @@ -91,7 +96,7 @@ public class MessageFactory { } public TextComponent unknownError() { - return getPluginPrefix() + return pluginPrefix() .append(text("Something went wrong with your request, please try again or see /statistic for a usage explanation!") .color(msgColor)); } @@ -104,7 +109,7 @@ public class MessageFactory { return Component.newline() - .append(underscores).append(spaces).append(getPluginPrefix()).append(spaces).append(underscores) + .append(underscores).append(spaces).append(pluginPrefix()).append(spaces).append(underscores) .append(newline()) .append(text("Hover over the arguments for more information!").color(NamedTextColor.GRAY).decorate(TextDecoration.ITALIC)) .append(newline()) @@ -169,7 +174,7 @@ public class MessageFactory { public TextComponent formatTopStats(LinkedHashMap topStats, String statName, String subStatEntryName) { TextComponent.Builder topList = Component.text(); - topList.append(newline()).append(getPluginPrefix()) + topList.append(newline()).append(pluginPrefix()) .append(titleComponent(Query.TOP, "Top")).append(space()) .append(titleNumberComponent(topStats.size())).append(space()) .append(statNameComponent(Query.TOP, statName)).append(space()) @@ -208,7 +213,7 @@ public class MessageFactory { public TextComponent formatServerStat(String statName, String subStatEntry, int stat) { TextComponent.Builder serverStat = Component.text(); - serverStat.append(titleComponent(Query.SERVER, "Total for")) + serverStat.append(titleComponent(Query.SERVER, config.getServerTitle())) .append(space()) .append(serverNameComponent()) .append(space()) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index db02e40..86ccb52 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,33 +1,58 @@ -# -------------------------------- -# PlayerStats Configuration -# -------------------------------- +# -------------------------------------------------------------------------------------------------------- # +# PlayerStats Configuration # +# -------------------------------------------------------------------------------------------------------- # +config-version: 2 + + + # ------------------------------- # + # General # + # ------------------------------- # +# If true, OP players will receive a message when they join the server if the config version is outdated +outdated-config-notifications: true -# ----------- General ------------ # Filtering options to control which players should be included in statistic calculations include-whitelist-only: false exclude-banned-players: false -# To only show statistics from players that have been online in the last x days, specify the number of days here +# To only show statistics from players that have been online in the last [x] days, set a number for x # Leave this on 0 to include all players number-of-days-since-last-joined: 0 -# ----------- Format ------------- -# The name you want displayed for a total-on-this-server statistic -your-server-name: 'this server' + # ------------------------------- # + # Format & Display # + # ------------------------------- # +# If true, the stat-numbers in the top list will be aligned with dots +use-dots: true # The maximum number of results displayed in the top list top-list-max-size: 10 -# If true, the top list will be aligned with lines of dots so that the stat numbers are all underneath each other -use-dots: true +# The title above the top list (the x is translated to the list-max-size, by default 10) +top-list-title: 'Top [x]' + +# The text you want displayed for a total-on-this-server statistic +# This will be put on the same line ('In total on this server: [x] animals bred', for example) +total-server-stat-title: 'In total on' +your-server-name: 'this server' -# -------- Color & Style --------- -# The colors below can be chat color names or hex codes (format: '#xxxxxx' <-- including quotation marks!) -# The style options include: bold, italic, underlined, strikethrough (and for some reason I decided to also include magic) + # ------------------------------- # + # Color & Style # + # ------------------------------- # +# The colors below can be Chat Colors or hex codes (format: '#xxxxxx' <-- including quotation marks!) -top-list: + # -------- Styles --------- # # -------- Chat Colors --------- # + # # # # + # bold # # red dark_red # + # italic # # yellow gold # + # underlined # # green dark_green # + # magic # # aqua dark_aqua # + # strikethrough # # blue dark_blue # + # ------------------------- # # light_purple dark_purple # + # gray dark_gray # + # black white # +top-list: # ------------------------------ # title: yellow title-style: none @@ -72,7 +97,7 @@ total-server: title-style: none server-name: gold - server-name-style: italic + server-name-style: none stat-names: yellow stat-names-style: none @@ -81,7 +106,4 @@ total-server: sub-stat-names-style: none stat-numbers: '#ADE7FF' - stat-numbers-style: none - - - + stat-numbers-style: none \ No newline at end of file diff --git a/src/main/resources/images/new_usage.png b/src/main/resources/images/new_usage.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9079818acbb7c1f6ec1223a0b2f21b426013ec GIT binary patch literal 19052 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