From 265f37d35e661a52fd3323d7b56f102bf088e104 Mon Sep 17 00:00:00 2001 From: angushushu Date: Sun, 12 Nov 2023 01:04:15 -0500 Subject: [PATCH] yue --- .idea/artifacts/EcoBalancer.xml | 6 + .../org/cubexmc/ecobalancer/EcoBalancer.java | 106 ++- .../ecobalancer/commands/CheckAllCommand.java | 7 +- .../commands/CheckPlayerCommand.java | 6 +- .../ecobalancer/commands/UtilCommand.java | 21 +- .../cubexmc/ecobalancer/metrics/Metrics.java | 881 ++++++++++++++++++ src/main/resources/config.yml | 25 +- src/main/resources/lang.yml | 38 + src/main/resources/lang_en.yml | 39 + target/EcoBalancer-0.0.1-beta.jar | Bin 0 -> 42988 bytes target/EcoBalancer-1.0-SNAPSHOT.jar | Bin 17383 -> 0 bytes target/classes/config.yml | 25 +- target/classes/lang.yml | 38 + target/classes/lang_en.yml | 39 + .../EcoBalancer$1BatchRunnable.class | Bin 3759 -> 3903 bytes .../org/cubexmc/ecobalancer/EcoBalancer.class | Bin 16596 -> 18764 bytes .../commands/CheckAllCommand.class | Bin 1814 -> 1573 bytes .../commands/CheckPlayerCommand.class | Bin 2319 -> 2075 bytes .../ecobalancer/commands/UtilCommand.class | Bin 2401 -> 2019 bytes .../ecobalancer/metrics/Metrics$1.class | Bin 0 -> 233 bytes .../metrics/Metrics$AdvancedBarChart.class | Bin 0 -> 2583 bytes .../metrics/Metrics$AdvancedPie.class | Bin 0 -> 2682 bytes .../metrics/Metrics$CustomChart.class | Bin 0 -> 2613 bytes .../metrics/Metrics$DrilldownPie.class | Bin 0 -> 3163 bytes ...Metrics$JsonObjectBuilder$JsonObject.class | Bin 0 -> 1007 bytes .../metrics/Metrics$JsonObjectBuilder.class | Bin 0 -> 5831 bytes .../metrics/Metrics$MetricsBase.class | Bin 0 -> 12905 bytes .../metrics/Metrics$MultiLineChart.class | Bin 0 -> 2691 bytes .../metrics/Metrics$SimpleBarChart.class | Bin 0 -> 2607 bytes .../metrics/Metrics$SimplePie.class | Bin 0 -> 1644 bytes .../metrics/Metrics$SingleLineChart.class | Bin 0 -> 1646 bytes .../cubexmc/ecobalancer/metrics/Metrics.class | Bin 0 -> 8820 bytes .../compile/default-compile/createdFiles.lst | 13 + .../compile/default-compile/inputFiles.lst | 1 + target/original-EcoBalancer-1.0-SNAPSHOT.jar | Bin 17071 -> 42418 bytes 35 files changed, 1181 insertions(+), 64 deletions(-) create mode 100644 .idea/artifacts/EcoBalancer.xml create mode 100644 src/main/java/org/cubexmc/ecobalancer/metrics/Metrics.java create mode 100644 src/main/resources/lang.yml create mode 100644 src/main/resources/lang_en.yml create mode 100644 target/EcoBalancer-0.0.1-beta.jar delete mode 100644 target/EcoBalancer-1.0-SNAPSHOT.jar create mode 100644 target/classes/lang.yml create mode 100644 target/classes/lang_en.yml create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$1.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$AdvancedBarChart.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$AdvancedPie.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$CustomChart.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$DrilldownPie.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$JsonObjectBuilder$JsonObject.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$JsonObjectBuilder.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$MetricsBase.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$MultiLineChart.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$SimpleBarChart.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$SimplePie.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics$SingleLineChart.class create mode 100644 target/classes/org/cubexmc/ecobalancer/metrics/Metrics.class diff --git a/.idea/artifacts/EcoBalancer.xml b/.idea/artifacts/EcoBalancer.xml new file mode 100644 index 0000000..284f532 --- /dev/null +++ b/.idea/artifacts/EcoBalancer.xml @@ -0,0 +1,6 @@ + + + D:/MC_server/Purpur/plugins + + + \ No newline at end of file diff --git a/src/main/java/org/cubexmc/ecobalancer/EcoBalancer.java b/src/main/java/org/cubexmc/ecobalancer/EcoBalancer.java index becda00..cd0ebcf 100644 --- a/src/main/java/org/cubexmc/ecobalancer/EcoBalancer.java +++ b/src/main/java/org/cubexmc/ecobalancer/EcoBalancer.java @@ -7,6 +7,8 @@ import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; import org.cubexmc.ecobalancer.commands.CheckAllCommand; @@ -25,8 +27,8 @@ import java.util.logging.SimpleFormatter; import java.util.zip.GZIPOutputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; + +import org.cubexmc.ecobalancer.metrics.Metrics; public final class EcoBalancer extends JavaPlugin { @@ -42,6 +44,7 @@ public final class EcoBalancer extends JavaPlugin { private String scheduleType; private List scheduleDaysOfWeek; private List scheduleDatesOfMonth; + private FileConfiguration langConfig; @Override public void onEnable() { @@ -78,6 +81,13 @@ public void onEnable() { e.printStackTrace(); } + // metrics + int pluginId = 20269; // <-- Replace with the id of your plugin! + Metrics metrics = new Metrics(this, pluginId); + // Optional: Add custom charts + metrics.addCustomChart(new Metrics.SimplePie("chart_id", () -> "My value")); + +// getCommand("ecobalancer").setExecutor(new UtilCommand(this)); getCommand("ecobal").setExecutor(new UtilCommand(this)); getCommand("checkall").setExecutor(new CheckAllCommand(this)); getCommand("checkplayer").setExecutor(new CheckPlayerCommand(this)); @@ -87,7 +97,8 @@ public void onEnable() { public void loadConfiguration() { // Cancel all scheduled tasks Bukkit.getScheduler().cancelTasks(this); - + // load language config + loadLangFile(); // Load the new scheduling configuration scheduleType = getConfig().getString("schedule.type", "daily"); scheduleDaysOfWeek = getConfig().getIntegerList("schedule.days-of-week"); @@ -120,6 +131,25 @@ public void loadConfiguration() { } } + private void loadLangFile() { + File langFile = new File(getDataFolder(), "lang.yml"); + if (!langFile.exists()) { + saveResource("lang.yml", false); + } + langConfig = YamlConfiguration.loadConfiguration(langFile); + } + + public String getFormattedMessage(String path, Map placeholders) { + String message = langConfig.getString(path, "Message not found!"); + if (placeholders != null) { + for (Map.Entry entry : placeholders.entrySet()) { + message = message.replace("%" + entry.getKey() + "%", entry.getValue()); + } + } + + return ChatColor.translateAlternateColorCodes('&', message); + } + @Override public void onDisable() { // Ensure all pending logs are flushed and the handler is closed @@ -140,16 +170,25 @@ public void onDisable() { // Method to compress the existing log file private void compressExistingLogFile(File logFile) { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HHmm"); String timestamp = dateFormat.format(new Date(logFile.lastModified())); - File compressedFile = new File(logFile.getParent(), timestamp + ".gz"); - + File renamedLogFile = new File(logFile.getParent(), timestamp + ".log"); + // Rename the file to include the timestamp + if (!logFile.renameTo(renamedLogFile)) { + getLogger().severe("Could not rename the log file."); + return; + } + // Compress the renamed log file into a .gz file + File compressedFile = new File(renamedLogFile.getParent(), renamedLogFile.getName() + ".gz"); try (GZIPOutputStream gzos = new GZIPOutputStream(new FileOutputStream(compressedFile))) { - Files.copy(logFile.toPath(), gzos); + Files.copy(renamedLogFile.toPath(), gzos); } catch (IOException e) { getLogger().severe("Could not compress the log file: " + e.getMessage()); } - logFile.delete(); // 删除原始日志文件 + // Delete the original (now renamed) log file after it's compressed + if (!renamedLogFile.delete()) { + getLogger().severe("Could not delete the original log file after compression."); + } } private boolean setupEconomy() { @@ -187,49 +226,59 @@ public void checkBalance(CommandSender sender, long currentTime, OfflinePlayer p deductionRate = 0.0; // defaultRate should be defined somewhere in your class } + Map placeholders = new HashMap<>(); + placeholders.put("player", player.getName()); + placeholders.put("balance", String.format("%.2f", balance)); + placeholders.put("days_offline", String.valueOf(daysOffline)); + + if (deductBasedOnTime) { // 计算玩家离线天数 if (balance < 0) { econ.depositPlayer(player, -1 * balance); + placeholders.put("new_balance", String.format("%.2f", econ.getBalance(player))); if (sender != null) { - sender.sendMessage(ChatColor.YELLOW + player.getName() + ChatColor.GREEN + " 的余额置为" + String.format("%.2f", balance) + "。"); - sender.sendMessage(ChatColor.GREEN + "已将余额置为" + String.format("%.2f", econ.getBalance(player)) + "。"); + sender.sendMessage(getFormattedMessage("messages.set_balance.reason", placeholders)); + sender.sendMessage(getFormattedMessage("messages.set_balance.balance_set", placeholders)); } if (log) - fileLogger.info("[负额度] 已将 " + player.getName() + " 的余额置为" + String.format("%.2f", econ.getBalance(player)) + "。"); + fileLogger.info(getFormattedMessage("logs.negative_balance", placeholders)); } else { if (daysOffline > inactiveDaysToClear) { // 清除超过inactiveDaysToClear天未上线的玩家 econ.withdrawPlayer(player, balance); + placeholders.put("new_balance", String.format("%.2f", econ.getBalance(player))); if (sender != null) { - sender.sendMessage(ChatColor.YELLOW + player.getName() + ChatColor.GREEN + " 已经离线" + daysOffline + "天,极不活跃。"); - sender.sendMessage(ChatColor.GREEN + "已将余额置为" + String.format("%.2f", econ.getBalance(player)) + "。"); + sender.sendMessage(getFormattedMessage("messages.offline_extreme.reason", placeholders)); + sender.sendMessage(getFormattedMessage("messages.offline_extreme.balance_set", placeholders)); } if (log) - fileLogger.info("[及不活跃] 已将 " + player.getName() + " 的余额置为" + String.format("%.2f", econ.getBalance(player)) + "。"); + fileLogger.info(getFormattedMessage("logs.inactive_extreme", placeholders)); } else if (daysOffline > inactiveDaysToDeduct) { // 对于超过50天未上线的玩家,按税率扣除 double deduction = balance * deductionRate; + placeholders.put("deduction", String.format("%.2f", deduction)); econ.withdrawPlayer(player, deduction); if (sender != null) { - sender.sendMessage(ChatColor.YELLOW + player.getName() + ChatColor.GREEN + " 已经离线" + daysOffline + "天,较不活跃。"); - sender.sendMessage(ChatColor.GREEN + "已从余额中扣除 " + ChatColor.YELLOW + String.format("%.2f", deduction) + ChatColor.GREEN + "。"); + sender.sendMessage(getFormattedMessage("messages.offline_moderate.reason", placeholders)); + sender.sendMessage(getFormattedMessage("messages.offline_moderate.deduction_made", placeholders)); } if (log) - fileLogger.info("[较不活跃] 已从 " + player.getName() + " 的余额中扣除 " + String.format("%.2f", deduction) + "。"); + fileLogger.info(getFormattedMessage("logs.inactive_moderate", placeholders)); } else { if (sender != null) { - sender.sendMessage(ChatColor.YELLOW + player.getName() + ChatColor.GREEN + " 仅离线" + daysOffline + "天,较活跃。"); + sender.sendMessage(getFormattedMessage("messages.offline_active", placeholders)); } } } } else { double deduction = balance * deductionRate; + placeholders.put("deduction", String.format("%.2f", deduction)); econ.withdrawPlayer(player, deduction); if (sender != null) - sender.sendMessage(ChatColor.GREEN + "已从 " + ChatColor.YELLOW + player.getName() + ChatColor.GREEN + " 的余额中扣除 " + ChatColor.YELLOW + String.format("%.2f", deduction) + ChatColor.GREEN + "。"); + sender.sendMessage(getFormattedMessage("messages.deduction_made", placeholders)); if (log) - fileLogger.info("已从 " + player.getName() + " 的余额中扣除 " + String.format("%.2f", deduction) + "。"); + fileLogger.info(getFormattedMessage("logs.deduction_made", placeholders)); } } @@ -346,11 +395,18 @@ public void run() { checkBalance(null, currentTime, player, false); } index += batchSize; + + Map placeholders = new HashMap<>(); + placeholders.put("start", Integer.toString(start)); + placeholders.put("end", Integer.toString(end)); + placeholders.put("batch", Integer.toString(end - start)); + placeholders.put("total_players", Integer.toString(players.length)); + if (sender != null) { // Send a message to the sender after each batch - Bukkit.getScheduler().runTask(EcoBalancer.this, () -> sender.sendMessage(ChatColor.GRAY + "处理了" + (end - start) + "个玩家,共处理:" + end)); + Bukkit.getScheduler().runTask(EcoBalancer.this, () -> sender.sendMessage(getFormattedMessage("messages.players_processing", placeholders))); } else { - getLogger().info("处理了" + (end - start) + "个玩家,共处理:" + end); + getLogger().info(getFormattedMessage("logs.players_processed", placeholders)); } if (index < players.length) { // Schedule next batch @@ -360,10 +416,10 @@ public void run() { // Send a message to the sender after each batch Bukkit.getScheduler().runTask(EcoBalancer.this, () -> { if (sender != null) { - sender.sendMessage(ChatColor.GREEN + "所有玩家都已被洗劫。"); + sender.sendMessage(getFormattedMessage("messages.all_players_processed", null)); } else { - getLogger().info("所有玩家都已被洗劫。"); - fileLogger.info("处理了" + players.length + "个玩家,共处理:" + end); + getLogger().info(getFormattedMessage("logs.all_players_processed", null)); + fileLogger.info(getFormattedMessage("logs.all_players_processed", null)); } }); } diff --git a/src/main/java/org/cubexmc/ecobalancer/commands/CheckAllCommand.java b/src/main/java/org/cubexmc/ecobalancer/commands/CheckAllCommand.java index 762b712..7c5b826 100644 --- a/src/main/java/org/cubexmc/ecobalancer/commands/CheckAllCommand.java +++ b/src/main/java/org/cubexmc/ecobalancer/commands/CheckAllCommand.java @@ -24,20 +24,21 @@ public boolean onCommand(CommandSender sender, Command command, String s, String if (sender instanceof Player) { Player player = (Player) sender; if (!player.hasPermission("ecobalancer.admin")) { - player.sendMessage(ChatColor.RED + "你没有权限使用这个命令。"); + player.sendMessage(plugin.getFormattedMessage("messages.no_permission", null)); return true; } if (args.length == 0) { - player.sendMessage(ChatColor.GREEN + "正在扫描离线玩家..."); + player.sendMessage(plugin.getFormattedMessage("messages.scanning_offline_players", null)); plugin.checkAll(sender); } } else if (sender.hasPermission("ecobalancer.admin")) { if (args.length == 0) { - sender.sendMessage(ChatColor.GREEN + "正在扫描离线玩家..."); + sender.sendMessage(plugin.getFormattedMessage("messages.scanning_offline_players", null)); plugin.checkAll(sender); } } + return true; } } diff --git a/src/main/java/org/cubexmc/ecobalancer/commands/CheckPlayerCommand.java b/src/main/java/org/cubexmc/ecobalancer/commands/CheckPlayerCommand.java index 44ae6c9..b80f136 100644 --- a/src/main/java/org/cubexmc/ecobalancer/commands/CheckPlayerCommand.java +++ b/src/main/java/org/cubexmc/ecobalancer/commands/CheckPlayerCommand.java @@ -24,17 +24,17 @@ public boolean onCommand(CommandSender sender, Command command, String s, String if (sender instanceof Player) { Player player = (Player) sender; if (!player.hasPermission("ecobalancer.admin")) { - player.sendMessage(ChatColor.RED + "你没有权限使用这个命令。"); + player.sendMessage(plugin.getFormattedMessage("messages.no_permission", null)); return true; } if (args.length == 0) { - player.sendMessage(ChatColor.GREEN + "请输入玩家名称或使用/checkall"); + player.sendMessage(plugin.getFormattedMessage("messages.enter_player_name_or_use_checkall", null)); } else { checkPlayer(player, args[0]); } } else if (sender.hasPermission("ecobalancer.admin")) { if (args.length == 0) { - sender.sendMessage(ChatColor.GREEN + "请输入玩家名称或使用/checkall"); + sender.sendMessage(plugin.getFormattedMessage("messages.enter_player_name_or_use_checkall", null)); } else { checkPlayer(sender, args[0]); } diff --git a/src/main/java/org/cubexmc/ecobalancer/commands/UtilCommand.java b/src/main/java/org/cubexmc/ecobalancer/commands/UtilCommand.java index 60b2206..0330dfb 100644 --- a/src/main/java/org/cubexmc/ecobalancer/commands/UtilCommand.java +++ b/src/main/java/org/cubexmc/ecobalancer/commands/UtilCommand.java @@ -7,6 +7,9 @@ import org.bukkit.command.CommandSender; import org.cubexmc.ecobalancer.EcoBalancer; +import java.util.HashMap; +import java.util.Map; + public class UtilCommand implements CommandExecutor { EcoBalancer plugin; @@ -15,19 +18,23 @@ public UtilCommand(EcoBalancer plugin) { } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (args.length > 0 && args[0].equalsIgnoreCase("reload")) { Bukkit.getScheduler().cancelTasks(plugin); plugin.reloadConfig(); plugin.loadConfiguration(); // You should create this method - sender.sendMessage(ChatColor.GREEN + "EcoBalancer 重载成功"); + sender.sendMessage(plugin.getFormattedMessage("messages.reload_success", null)); return true; } else if (args.length > 0 && args[0].equalsIgnoreCase("help")) { - sender.sendMessage(ChatColor.WHITE + "" + ChatColor.BOLD + "EcoBalancer 帮助:"); - sender.sendMessage(ChatColor.YELLOW + "/ecobal help " + ChatColor.WHITE + "- 帮助"); - sender.sendMessage(ChatColor.YELLOW + "/checkall " + ChatColor.WHITE + "- 检查并清洗全部玩家余额"); - sender.sendMessage(ChatColor.YELLOW + "/checkplayer " + ChatColor.WHITE + "- 检查并清洗单个玩家余额"); - sender.sendMessage(ChatColor.YELLOW + "/ecobal reload " + ChatColor.WHITE + "- 重载配置文件"); - sender.sendMessage(ChatColor.GRAY + "" + ChatColor.ITALIC + "来自CubeX统治阶级工具包"); + sender.sendMessage(plugin.getFormattedMessage("messages.help_header", null)); + String[] commandMessages = { + plugin.getFormattedMessage("messages.commands.help", null), + plugin.getFormattedMessage("messages.commands.checkall", null), + plugin.getFormattedMessage("messages.commands.checkplayer", null), + plugin.getFormattedMessage("messages.commands.reload", null), + plugin.getFormattedMessage("messages.help_footer", null) + }; + sender.sendMessage(String.join("\n", commandMessages)); return true; } return false; diff --git a/src/main/java/org/cubexmc/ecobalancer/metrics/Metrics.java b/src/main/java/org/cubexmc/ecobalancer/metrics/Metrics.java new file mode 100644 index 0000000..a540c51 --- /dev/null +++ b/src/main/java/org/cubexmc/ecobalancer/metrics/Metrics.java @@ -0,0 +1,881 @@ +/* + * This Metrics class was auto-generated and can be copied into your project if you are + * not using a build tool like Gradle or Maven for dependency management. + * + * IMPORTANT: You are not allowed to modify this class, except changing the package. + * + * Disallowed modifications include but are not limited to: + * - Remove the option for users to opt-out + * - Change the frequency for data submission + * - Obfuscate the code (every obfuscator should allow you to make an exception for specific files) + * - Reformat the code (if you use a linter, add an exception) + * + * Violations will result in a ban of your plugin and account from bStats. + */ +package org.cubexmc.ecobalancer.metrics; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.logging.Level; +import java.util.stream.Collectors; +import java.util.zip.GZIPOutputStream; +import javax.net.ssl.HttpsURLConnection; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; + +public class Metrics { + + private final Plugin plugin; + + private final MetricsBase metricsBase; + + /** + * Creates a new Metrics instance. + * + * @param plugin Your plugin instance. + * @param serviceId The id of the service. It can be found at What is my plugin id? + */ + public Metrics(JavaPlugin plugin, int serviceId) { + this.plugin = plugin; + // Get the config file + File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); + File configFile = new File(bStatsFolder, "config.yml"); + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + if (!config.isSet("serverUuid")) { + config.addDefault("enabled", true); + config.addDefault("serverUuid", UUID.randomUUID().toString()); + config.addDefault("logFailedRequests", false); + config.addDefault("logSentData", false); + config.addDefault("logResponseStatusText", false); + // Inform the server owners about bStats + config + .options() + .header( + "bStats (https://bStats.org) collects some basic information for plugin authors, like how\n" + + "many people use their plugin and their total player count. It's recommended to keep bStats\n" + + "enabled, but if you're not comfortable with this, you can turn this setting off. There is no\n" + + "performance penalty associated with having metrics enabled, and data sent to bStats is fully\n" + + "anonymous.") + .copyDefaults(true); + try { + config.save(configFile); + } catch (IOException ignored) { + } + } + // Load the data + boolean enabled = config.getBoolean("enabled", true); + String serverUUID = config.getString("serverUuid"); + boolean logErrors = config.getBoolean("logFailedRequests", false); + boolean logSentData = config.getBoolean("logSentData", false); + boolean logResponseStatusText = config.getBoolean("logResponseStatusText", false); + metricsBase = + new MetricsBase( + "bukkit", + serverUUID, + serviceId, + enabled, + this::appendPlatformData, + this::appendServiceData, + submitDataTask -> Bukkit.getScheduler().runTask(plugin, submitDataTask), + plugin::isEnabled, + (message, error) -> this.plugin.getLogger().log(Level.WARNING, message, error), + (message) -> this.plugin.getLogger().log(Level.INFO, message), + logErrors, + logSentData, + logResponseStatusText); + } + + /** Shuts down the underlying scheduler service. */ + public void shutdown() { + metricsBase.shutdown(); + } + + /** + * Adds a custom chart. + * + * @param chart The chart to add. + */ + public void addCustomChart(CustomChart chart) { + metricsBase.addCustomChart(chart); + } + + private void appendPlatformData(JsonObjectBuilder builder) { + builder.appendField("playerAmount", getPlayerAmount()); + builder.appendField("onlineMode", Bukkit.getOnlineMode() ? 1 : 0); + builder.appendField("bukkitVersion", Bukkit.getVersion()); + builder.appendField("bukkitName", Bukkit.getName()); + builder.appendField("javaVersion", System.getProperty("java.version")); + builder.appendField("osName", System.getProperty("os.name")); + builder.appendField("osArch", System.getProperty("os.arch")); + builder.appendField("osVersion", System.getProperty("os.version")); + builder.appendField("coreCount", Runtime.getRuntime().availableProcessors()); + } + + private void appendServiceData(JsonObjectBuilder builder) { + builder.appendField("pluginVersion", plugin.getDescription().getVersion()); + } + + private int getPlayerAmount() { + try { + // Around MC 1.8 the return type was changed from an array to a collection, + // This fixes java.lang.NoSuchMethodError: + // org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; + Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); + return onlinePlayersMethod.getReturnType().equals(Collection.class) + ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() + : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; + } catch (Exception e) { + // Just use the new method if the reflection failed + return Bukkit.getOnlinePlayers().size(); + } + } + + public static class MetricsBase { + + /** The version of the Metrics class. */ + public static final String METRICS_VERSION = "3.0.2"; + + private static final String REPORT_URL = "https://bStats.org/api/v2/data/%s"; + + private final ScheduledExecutorService scheduler; + + private final String platform; + + private final String serverUuid; + + private final int serviceId; + + private final Consumer appendPlatformDataConsumer; + + private final Consumer appendServiceDataConsumer; + + private final Consumer submitTaskConsumer; + + private final Supplier checkServiceEnabledSupplier; + + private final BiConsumer errorLogger; + + private final Consumer infoLogger; + + private final boolean logErrors; + + private final boolean logSentData; + + private final boolean logResponseStatusText; + + private final Set customCharts = new HashSet<>(); + + private final boolean enabled; + + /** + * Creates a new MetricsBase class instance. + * + * @param platform The platform of the service. + * @param serviceId The id of the service. + * @param serverUuid The server uuid. + * @param enabled Whether or not data sending is enabled. + * @param appendPlatformDataConsumer A consumer that receives a {@code JsonObjectBuilder} and + * appends all platform-specific data. + * @param appendServiceDataConsumer A consumer that receives a {@code JsonObjectBuilder} and + * appends all service-specific data. + * @param submitTaskConsumer A consumer that takes a runnable with the submit task. This can be + * used to delegate the data collection to a another thread to prevent errors caused by + * concurrency. Can be {@code null}. + * @param checkServiceEnabledSupplier A supplier to check if the service is still enabled. + * @param errorLogger A consumer that accepts log message and an error. + * @param infoLogger A consumer that accepts info log messages. + * @param logErrors Whether or not errors should be logged. + * @param logSentData Whether or not the sent data should be logged. + * @param logResponseStatusText Whether or not the response status text should be logged. + */ + public MetricsBase( + String platform, + String serverUuid, + int serviceId, + boolean enabled, + Consumer appendPlatformDataConsumer, + Consumer appendServiceDataConsumer, + Consumer submitTaskConsumer, + Supplier checkServiceEnabledSupplier, + BiConsumer errorLogger, + Consumer infoLogger, + boolean logErrors, + boolean logSentData, + boolean logResponseStatusText) { + ScheduledThreadPoolExecutor scheduler = + new ScheduledThreadPoolExecutor(1, task -> new Thread(task, "bStats-Metrics")); + // We want delayed tasks (non-periodic) that will execute in the future to be + // cancelled when the scheduler is shutdown. + // Otherwise, we risk preventing the server from shutting down even when + // MetricsBase#shutdown() is called + scheduler.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); + this.scheduler = scheduler; + this.platform = platform; + this.serverUuid = serverUuid; + this.serviceId = serviceId; + this.enabled = enabled; + this.appendPlatformDataConsumer = appendPlatformDataConsumer; + this.appendServiceDataConsumer = appendServiceDataConsumer; + this.submitTaskConsumer = submitTaskConsumer; + this.checkServiceEnabledSupplier = checkServiceEnabledSupplier; + this.errorLogger = errorLogger; + this.infoLogger = infoLogger; + this.logErrors = logErrors; + this.logSentData = logSentData; + this.logResponseStatusText = logResponseStatusText; + checkRelocation(); + if (enabled) { + // WARNING: Removing the option to opt-out will get your plugin banned from + // bStats + startSubmitting(); + } + } + + public void addCustomChart(CustomChart chart) { + this.customCharts.add(chart); + } + + public void shutdown() { + scheduler.shutdown(); + } + + private void startSubmitting() { + final Runnable submitTask = + () -> { + if (!enabled || !checkServiceEnabledSupplier.get()) { + // Submitting data or service is disabled + scheduler.shutdown(); + return; + } + if (submitTaskConsumer != null) { + submitTaskConsumer.accept(this::submitData); + } else { + this.submitData(); + } + }; + // Many servers tend to restart at a fixed time at xx:00 which causes an uneven + // distribution of requests on the + // bStats backend. To circumvent this problem, we introduce some randomness into + // the initial and second delay. + // WARNING: You must not modify and part of this Metrics class, including the + // submit delay or frequency! + // WARNING: Modifying this code will get your plugin banned on bStats. Just + // don't do it! + long initialDelay = (long) (1000 * 60 * (3 + Math.random() * 3)); + long secondDelay = (long) (1000 * 60 * (Math.random() * 30)); + scheduler.schedule(submitTask, initialDelay, TimeUnit.MILLISECONDS); + scheduler.scheduleAtFixedRate( + submitTask, initialDelay + secondDelay, 1000 * 60 * 30, TimeUnit.MILLISECONDS); + } + + private void submitData() { + final JsonObjectBuilder baseJsonBuilder = new JsonObjectBuilder(); + appendPlatformDataConsumer.accept(baseJsonBuilder); + final JsonObjectBuilder serviceJsonBuilder = new JsonObjectBuilder(); + appendServiceDataConsumer.accept(serviceJsonBuilder); + JsonObjectBuilder.JsonObject[] chartData = + customCharts.stream() + .map(customChart -> customChart.getRequestJsonObject(errorLogger, logErrors)) + .filter(Objects::nonNull) + .toArray(JsonObjectBuilder.JsonObject[]::new); + serviceJsonBuilder.appendField("id", serviceId); + serviceJsonBuilder.appendField("customCharts", chartData); + baseJsonBuilder.appendField("service", serviceJsonBuilder.build()); + baseJsonBuilder.appendField("serverUUID", serverUuid); + baseJsonBuilder.appendField("metricsVersion", METRICS_VERSION); + JsonObjectBuilder.JsonObject data = baseJsonBuilder.build(); + scheduler.execute( + () -> { + try { + // Send the data + sendData(data); + } catch (Exception e) { + // Something went wrong! :( + if (logErrors) { + errorLogger.accept("Could not submit bStats metrics data", e); + } + } + }); + } + + private void sendData(JsonObjectBuilder.JsonObject data) throws Exception { + if (logSentData) { + infoLogger.accept("Sent bStats metrics data: " + data.toString()); + } + String url = String.format(REPORT_URL, platform); + HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection(); + // Compress the data to save bandwidth + byte[] compressedData = compress(data.toString()); + connection.setRequestMethod("POST"); + connection.addRequestProperty("Accept", "application/json"); + connection.addRequestProperty("Connection", "close"); + connection.addRequestProperty("Content-Encoding", "gzip"); + connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("User-Agent", "Metrics-Service/1"); + connection.setDoOutput(true); + try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { + outputStream.write(compressedData); + } + StringBuilder builder = new StringBuilder(); + try (BufferedReader bufferedReader = + new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + String line; + while ((line = bufferedReader.readLine()) != null) { + builder.append(line); + } + } + if (logResponseStatusText) { + infoLogger.accept("Sent data to bStats and received response: " + builder); + } + } + + /** Checks that the class was properly relocated. */ + private void checkRelocation() { + // You can use the property to disable the check in your test environment + if (System.getProperty("bstats.relocatecheck") == null + || !System.getProperty("bstats.relocatecheck").equals("false")) { + // Maven's Relocate is clever and changes strings, too. So we have to use this + // little "trick" ... :D + final String defaultPackage = + new String(new byte[] {'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's'}); + final String examplePackage = + new String(new byte[] {'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); + // We want to make sure no one just copy & pastes the example and uses the wrong + // package names + if (MetricsBase.class.getPackage().getName().startsWith(defaultPackage) + || MetricsBase.class.getPackage().getName().startsWith(examplePackage)) { + throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); + } + } + } + + /** + * Gzips the given string. + * + * @param str The string to gzip. + * @return The gzipped string. + */ + private static byte[] compress(final String str) throws IOException { + if (str == null) { + return null; + } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) { + gzip.write(str.getBytes(StandardCharsets.UTF_8)); + } + return outputStream.toByteArray(); + } + } + + public static class SimplePie extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimplePie(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + String value = callable.call(); + if (value == null || value.isEmpty()) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("value", value).build(); + } + } + + public static class MultiLineChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public MultiLineChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class AdvancedPie extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedPie(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class SimpleBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimpleBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + for (Map.Entry entry : map.entrySet()) { + valuesBuilder.appendField(entry.getKey(), new int[] {entry.getValue()}); + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class AdvancedBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue().length == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class DrilldownPie extends CustomChart { + + private final Callable>> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public DrilldownPie(String chartId, Callable>> callable) { + super(chartId); + this.callable = callable; + } + + @Override + public JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map> map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean reallyAllSkipped = true; + for (Map.Entry> entryValues : map.entrySet()) { + JsonObjectBuilder valueBuilder = new JsonObjectBuilder(); + boolean allSkipped = true; + for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { + valueBuilder.appendField(valueEntry.getKey(), valueEntry.getValue()); + allSkipped = false; + } + if (!allSkipped) { + reallyAllSkipped = false; + valuesBuilder.appendField(entryValues.getKey(), valueBuilder.build()); + } + } + if (reallyAllSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public abstract static class CustomChart { + + private final String chartId; + + protected CustomChart(String chartId) { + if (chartId == null) { + throw new IllegalArgumentException("chartId must not be null"); + } + this.chartId = chartId; + } + + public JsonObjectBuilder.JsonObject getRequestJsonObject( + BiConsumer errorLogger, boolean logErrors) { + JsonObjectBuilder builder = new JsonObjectBuilder(); + builder.appendField("chartId", chartId); + try { + JsonObjectBuilder.JsonObject data = getChartData(); + if (data == null) { + // If the data is null we don't send the chart. + return null; + } + builder.appendField("data", data); + } catch (Throwable t) { + if (logErrors) { + errorLogger.accept("Failed to get data for custom chart with id " + chartId, t); + } + return null; + } + return builder.build(); + } + + protected abstract JsonObjectBuilder.JsonObject getChartData() throws Exception; + } + + public static class SingleLineChart extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SingleLineChart(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + int value = callable.call(); + if (value == 0) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("value", value).build(); + } + } + + /** + * An extremely simple JSON builder. + * + *

While this class is neither feature-rich nor the most performant one, it's sufficient enough + * for its use-case. + */ + public static class JsonObjectBuilder { + + private StringBuilder builder = new StringBuilder(); + + private boolean hasAtLeastOneField = false; + + public JsonObjectBuilder() { + builder.append("{"); + } + + /** + * Appends a null field to the JSON. + * + * @param key The key of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendNull(String key) { + appendFieldUnescaped(key, "null"); + return this; + } + + /** + * Appends a string field to the JSON. + * + * @param key The key of the field. + * @param value The value of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, String value) { + if (value == null) { + throw new IllegalArgumentException("JSON value must not be null"); + } + appendFieldUnescaped(key, "\"" + escape(value) + "\""); + return this; + } + + /** + * Appends an integer field to the JSON. + * + * @param key The key of the field. + * @param value The value of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, int value) { + appendFieldUnescaped(key, String.valueOf(value)); + return this; + } + + /** + * Appends an object to the JSON. + * + * @param key The key of the field. + * @param object The object. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, JsonObject object) { + if (object == null) { + throw new IllegalArgumentException("JSON object must not be null"); + } + appendFieldUnescaped(key, object.toString()); + return this; + } + + /** + * Appends a string array to the JSON. + * + * @param key The key of the field. + * @param values The string array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, String[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values) + .map(value -> "\"" + escape(value) + "\"") + .collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends an integer array to the JSON. + * + * @param key The key of the field. + * @param values The integer array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, int[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values).mapToObj(String::valueOf).collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends an object array to the JSON. + * + * @param key The key of the field. + * @param values The integer array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, JsonObject[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values).map(JsonObject::toString).collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends a field to the object. + * + * @param key The key of the field. + * @param escapedValue The escaped value of the field. + */ + private void appendFieldUnescaped(String key, String escapedValue) { + if (builder == null) { + throw new IllegalStateException("JSON has already been built"); + } + if (key == null) { + throw new IllegalArgumentException("JSON key must not be null"); + } + if (hasAtLeastOneField) { + builder.append(","); + } + builder.append("\"").append(escape(key)).append("\":").append(escapedValue); + hasAtLeastOneField = true; + } + + /** + * Builds the JSON string and invalidates this builder. + * + * @return The built JSON string. + */ + public JsonObject build() { + if (builder == null) { + throw new IllegalStateException("JSON has already been built"); + } + JsonObject object = new JsonObject(builder.append("}").toString()); + builder = null; + return object; + } + + /** + * Escapes the given string like stated in https://www.ietf.org/rfc/rfc4627.txt. + * + *

This method escapes only the necessary characters '"', '\'. and '\u0000' - '\u001F'. + * Compact escapes are not used (e.g., '\n' is escaped as "\u000a" and not as "\n"). + * + * @param value The value to escape. + * @return The escaped value. + */ + private static String escape(String value) { + final StringBuilder builder = new StringBuilder(); + for (int i = 0; i < value.length(); i++) { + char c = value.charAt(i); + if (c == '"') { + builder.append("\\\""); + } else if (c == '\\') { + builder.append("\\\\"); + } else if (c <= '\u000F') { + builder.append("\\u000").append(Integer.toHexString(c)); + } else if (c <= '\u001F') { + builder.append("\\u00").append(Integer.toHexString(c)); + } else { + builder.append(c); + } + } + return builder.toString(); + } + + /** + * A super simple representation of a JSON object. + * + *

This class only exists to make methods of the {@link JsonObjectBuilder} type-safe and not + * allow a raw string inputs for methods like {@link JsonObjectBuilder#appendField(String, + * JsonObject)}. + */ + public static class JsonObject { + + private final String value; + + private JsonObject(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b732d8a..4f6a0d7 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,18 +1,17 @@ -check-time: "20:00" # 格式为 HH:mm +check-time: "20:00" # 格式为 HH:mm # Time format is HH:mm check-schedule: -type: 'weekly' # 选项: 'daily', 'weekly', 'monthly' -days-of-week: [1, 3, 5] # 周一, 周三, 周五 (1 = 周六, 7 = 周日) -dates-of-month: [1] # 每月一号 +type: 'weekly' # 选项: 'daily', 'weekly', 'monthly' # Options: 'daily', 'weekly', 'monthly' +days-of-week: [1, 3, 5] # 周一, 周三, 周五 (1 = 周六, 7 = 周日) # Monday, Wednesday, Friday (1 = Saturday, 7 = Sunday) +dates-of-month: [1] # 每月一号 # 1st day of each month deduct-based-on-time: true -# 下面两个选项仅在 deduct-based-on-time 为 true 时生效 -inactive-days-to-deduct: 50 # 未上线扣款开始的天数 -inactive-days-to-clear: 500 # 未上线清空余额的天数 -# 按阶级扣税 +# 下面两个选项仅在 deduct-based-on-time 为 true 时生效 # The following two options only take effect when deduct-based-on-time is true +inactive-days-to-deduct: 50 # 未上线扣款开始的天数 # Days inactive before starting deductions +inactive-days-to-clear: 500 # 未上线清空余额的天数 # Days inactive before clearing balance +# 按阶级扣税 # Tax brackets for deductions tax-brackets: - threshold: 100000 - rate: 0.001 + rate: 0.001 # 税率 # Tax rate - threshold: 1000000 - rate: 0.01 - - threshold: null # null 表示无上限 - rate: 0.02 - + rate: 0.01 # 税率 # Tax rate + - threshold: null # 无上限 # No limit + rate: 0.02 # 税率 # Tax rate \ No newline at end of file diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml new file mode 100644 index 0000000..cf432a1 --- /dev/null +++ b/src/main/resources/lang.yml @@ -0,0 +1,38 @@ +messages: + # reload + reload_success: '&a配置文件已成功重载。' + # help + commands: + help: '&e/ecobal help &f- 帮助' + checkall: '&e/checkall &f- 检查并清洗全部玩家余额' + checkplayer: '&e/checkplayer &f- 检查并清洗单个玩家余额' + reload: '&e/ecobal reload &f- 重载配置文件' + help_footer: '&7&o来自CubeX统治阶级工具包' + help_header: '&f&lEcoBalancer 帮助:' + # check + no_permission: '&c你没有权限使用这个命令。' + scanning_offline_players: '&a正在扫描离线玩家...' + enter_player_name_or_use_checkall: '&a请输入玩家名称或使用/checkall' + # ecobal + set_balance: + reason: "&e玩家 &6%player% &e的余额为 &6%balance%&e。" + balance_set: "&e已将余额置为 &6%new_balance%&e。" + offline_extreme: + reason: "&e玩家 &6%player% &e已经离线 &6%days_offline% &e天,极不活跃。" + balance_set: "&e已将余额置为 &6%new_balance%&e。" + offline_moderate: + reason: "&e玩家 &6%player% &e已经离线 &6%days_offline% &e天,较不活跃。" + deduction_made: "&e已从余额中扣除 &6%deduction%&e。" + offline_active: "&e玩家 &6%player% &e仅离线 &6%days_offline% &e天,较活跃。" + deduction_made: "&e已从 &6%player% &e的余额中扣除 &6%deduction%&e。" + players_processing: "&7处理了 &6%batch% &7个玩家,共处理:&6%end%" + players_processed: "&7共&6%end% &7个玩家,处理总数:&6%end%" + all_players_processed: "&a所有玩家都已被洗劫。" +logs: + negative_balance: "[负额度] 已将 %player% 的余额置为%balance%。" + inactive_extreme: "[及不活跃] 已将 %player% 的余额置为%new_balance%。" + inactive_moderate: "[较不活跃] 已从 %player% 的余额中扣除 %deduction%。" + deduction_made: "已从 %player% 的余额中扣除 %deduction%。" + players_processed: "处理了 %start% 个玩家,共处理:%end%" + all_players_processed: "所有玩家都已被洗劫。" + batch_processed: "处理了 %total_players% 个玩家,共处理:%end%" diff --git a/src/main/resources/lang_en.yml b/src/main/resources/lang_en.yml new file mode 100644 index 0000000..b584ddd --- /dev/null +++ b/src/main/resources/lang_en.yml @@ -0,0 +1,39 @@ +# to use English version, you need to rename this file to lang.yml +messages: + # reload + reload_success: '&aConfig file reloaded successfully.' + # help + commands: + help: '&e/ecobal help &f- Help' + checkall: '&e/checkall &f- Check and clean all player balances' + checkplayer: '&e/checkplayer &f- Check and clean single player balance' + reload: '&e/ecobal reload &f- Reload config file' + help_footer: '&7&oFrom CubeX Ruling Class Toolkit' + help_header: '&f&lEcoBalancer Help:' + # check + no_permission: '&cYou do not have permission to use this command.' + scanning_offline_players: '&aScanning offline players...' + enter_player_name_or_use_checkall: '&aPlease enter player name or use /checkall' + # ecobal + set_balance: + reason: "&ePlayer &6%player% &e's balance is &6%balance%&e." + balance_set: "&eBalance has been set to &6%new_balance%&e." + offline_extreme: + reason: "&ePlayer &6%player% &ehas been offline for &6%days_offline% &edays, extremely inactive." + balance_set: "&eBalance has been set to &6%new_balance%&e." + offline_moderate: + reason: "&ePlayer &6%player% &ehas been offline for &6%days_offline% &edays, moderately inactive." + deduction_made: "&e&6%deduction% &ehas been deducted from the balance." + offline_active: "&ePlayer &6%player% &ehas only been offline &6%days_offline% &edays, moderately active." + deduction_made: "&e&6%deduction% &ehas been deducted from &6%player%&e's balance." + players_processing: "&7Processed &6%batch% &7players, total processed: &6%end%" + players_processed: "&7Total &6%end% &7players, total processed: &6%end%" + all_players_processed: "&aAll players have been cleaned." +logs: + negative_balance: "[Negative Balance] Set %player%'s balance to %balance%." + inactive_extreme: "[Extremely Inactive] Set %player%'s balance to %new_balance%." + inactive_moderate: "[Moderately Inactive] Deducted %deduction% from %player%'s balance." + deduction_made: "Deducted %deduction% from %player%'s balance." + players_processed: "Processed %start% players, total processed: %end%" + all_players_processed: "All players have been cleaned." + batch_processed: "Processed %total_players% players, total processed: %end%" \ No newline at end of file diff --git a/target/EcoBalancer-0.0.1-beta.jar b/target/EcoBalancer-0.0.1-beta.jar new file mode 100644 index 0000000000000000000000000000000000000000..1bf31eadbcb9ba5a452e0f248d63f3470aaf8bc1 GIT binary patch literal 42988 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 diff --git a/target/classes/config.yml b/target/classes/config.yml index b732d8a..4f6a0d7 100644 --- a/target/classes/config.yml +++ b/target/classes/config.yml @@ -1,18 +1,17 @@ -check-time: "20:00" # 格式为 HH:mm +check-time: "20:00" # 格式为 HH:mm # Time format is HH:mm check-schedule: -type: 'weekly' # 选项: 'daily', 'weekly', 'monthly' -days-of-week: [1, 3, 5] # 周一, 周三, 周五 (1 = 周六, 7 = 周日) -dates-of-month: [1] # 每月一号 +type: 'weekly' # 选项: 'daily', 'weekly', 'monthly' # Options: 'daily', 'weekly', 'monthly' +days-of-week: [1, 3, 5] # 周一, 周三, 周五 (1 = 周六, 7 = 周日) # Monday, Wednesday, Friday (1 = Saturday, 7 = Sunday) +dates-of-month: [1] # 每月一号 # 1st day of each month deduct-based-on-time: true -# 下面两个选项仅在 deduct-based-on-time 为 true 时生效 -inactive-days-to-deduct: 50 # 未上线扣款开始的天数 -inactive-days-to-clear: 500 # 未上线清空余额的天数 -# 按阶级扣税 +# 下面两个选项仅在 deduct-based-on-time 为 true 时生效 # The following two options only take effect when deduct-based-on-time is true +inactive-days-to-deduct: 50 # 未上线扣款开始的天数 # Days inactive before starting deductions +inactive-days-to-clear: 500 # 未上线清空余额的天数 # Days inactive before clearing balance +# 按阶级扣税 # Tax brackets for deductions tax-brackets: - threshold: 100000 - rate: 0.001 + rate: 0.001 # 税率 # Tax rate - threshold: 1000000 - rate: 0.01 - - threshold: null # null 表示无上限 - rate: 0.02 - + rate: 0.01 # 税率 # Tax rate + - threshold: null # 无上限 # No limit + rate: 0.02 # 税率 # Tax rate \ No newline at end of file diff --git a/target/classes/lang.yml b/target/classes/lang.yml new file mode 100644 index 0000000..cf432a1 --- /dev/null +++ b/target/classes/lang.yml @@ -0,0 +1,38 @@ +messages: + # reload + reload_success: '&a配置文件已成功重载。' + # help + commands: + help: '&e/ecobal help &f- 帮助' + checkall: '&e/checkall &f- 检查并清洗全部玩家余额' + checkplayer: '&e/checkplayer &f- 检查并清洗单个玩家余额' + reload: '&e/ecobal reload &f- 重载配置文件' + help_footer: '&7&o来自CubeX统治阶级工具包' + help_header: '&f&lEcoBalancer 帮助:' + # check + no_permission: '&c你没有权限使用这个命令。' + scanning_offline_players: '&a正在扫描离线玩家...' + enter_player_name_or_use_checkall: '&a请输入玩家名称或使用/checkall' + # ecobal + set_balance: + reason: "&e玩家 &6%player% &e的余额为 &6%balance%&e。" + balance_set: "&e已将余额置为 &6%new_balance%&e。" + offline_extreme: + reason: "&e玩家 &6%player% &e已经离线 &6%days_offline% &e天,极不活跃。" + balance_set: "&e已将余额置为 &6%new_balance%&e。" + offline_moderate: + reason: "&e玩家 &6%player% &e已经离线 &6%days_offline% &e天,较不活跃。" + deduction_made: "&e已从余额中扣除 &6%deduction%&e。" + offline_active: "&e玩家 &6%player% &e仅离线 &6%days_offline% &e天,较活跃。" + deduction_made: "&e已从 &6%player% &e的余额中扣除 &6%deduction%&e。" + players_processing: "&7处理了 &6%batch% &7个玩家,共处理:&6%end%" + players_processed: "&7共&6%end% &7个玩家,处理总数:&6%end%" + all_players_processed: "&a所有玩家都已被洗劫。" +logs: + negative_balance: "[负额度] 已将 %player% 的余额置为%balance%。" + inactive_extreme: "[及不活跃] 已将 %player% 的余额置为%new_balance%。" + inactive_moderate: "[较不活跃] 已从 %player% 的余额中扣除 %deduction%。" + deduction_made: "已从 %player% 的余额中扣除 %deduction%。" + players_processed: "处理了 %start% 个玩家,共处理:%end%" + all_players_processed: "所有玩家都已被洗劫。" + batch_processed: "处理了 %total_players% 个玩家,共处理:%end%" diff --git a/target/classes/lang_en.yml b/target/classes/lang_en.yml new file mode 100644 index 0000000..b584ddd --- /dev/null +++ b/target/classes/lang_en.yml @@ -0,0 +1,39 @@ +# to use English version, you need to rename this file to lang.yml +messages: + # reload + reload_success: '&aConfig file reloaded successfully.' + # help + commands: + help: '&e/ecobal help &f- Help' + checkall: '&e/checkall &f- Check and clean all player balances' + checkplayer: '&e/checkplayer &f- Check and clean single player balance' + reload: '&e/ecobal reload &f- Reload config file' + help_footer: '&7&oFrom CubeX Ruling Class Toolkit' + help_header: '&f&lEcoBalancer Help:' + # check + no_permission: '&cYou do not have permission to use this command.' + scanning_offline_players: '&aScanning offline players...' + enter_player_name_or_use_checkall: '&aPlease enter player name or use /checkall' + # ecobal + set_balance: + reason: "&ePlayer &6%player% &e's balance is &6%balance%&e." + balance_set: "&eBalance has been set to &6%new_balance%&e." + offline_extreme: + reason: "&ePlayer &6%player% &ehas been offline for &6%days_offline% &edays, extremely inactive." + balance_set: "&eBalance has been set to &6%new_balance%&e." + offline_moderate: + reason: "&ePlayer &6%player% &ehas been offline for &6%days_offline% &edays, moderately inactive." + deduction_made: "&e&6%deduction% &ehas been deducted from the balance." + offline_active: "&ePlayer &6%player% &ehas only been offline &6%days_offline% &edays, moderately active." + deduction_made: "&e&6%deduction% &ehas been deducted from &6%player%&e's balance." + players_processing: "&7Processed &6%batch% &7players, total processed: &6%end%" + players_processed: "&7Total &6%end% &7players, total processed: &6%end%" + all_players_processed: "&aAll players have been cleaned." +logs: + negative_balance: "[Negative Balance] Set %player%'s balance to %balance%." + inactive_extreme: "[Extremely Inactive] Set %player%'s balance to %new_balance%." + inactive_moderate: "[Moderately Inactive] Deducted %deduction% from %player%'s balance." + deduction_made: "Deducted %deduction% from %player%'s balance." + players_processed: "Processed %start% players, total processed: %end%" + all_players_processed: "All players have been cleaned." + batch_processed: "Processed %total_players% players, total processed: %end%" \ No newline at end of file diff --git a/target/classes/org/cubexmc/ecobalancer/EcoBalancer$1BatchRunnable.class b/target/classes/org/cubexmc/ecobalancer/EcoBalancer$1BatchRunnable.class index 733d4222455118fd936be2329ee6995b755750b7..a10e6ad2fbd1bc3ee438fa66f4442dfcf0640072 100644 GIT binary patch delta 1753 zcmZux-BVO`7=GSmch9nWXkqyhFhIqT4*@kGYmv}OKtcQ<%(C#Xds;pYyW8%8B+D(e zR7?ebnVDIsDO4Bb*pS$a-q}=tL02_hbz2uT(>PA=@9Zvtb#Zpz?~mtw&iV4;JEiU) z?%%o%paGve9z zl1?zRaHzf`Z0aFBMsS&tU1n@B93tdbc2sp*HLZ}O+3!IkniM>$Vm%%sWXXV)$*$ay zkP#g<3F|8tWOnxt=>gL(vYn;=l2Ah=k&Gsm^`TSR|mw<9g7I3hY+# zEcOs`L%O*+5*yJ>QxA5rTMOxg#)ZqKU|KwiSmw;l@w@Rn_9}Qm#f#`8ED^srmxv?w zYS&f-R0N@mS^JnLBsUx&7>jlzYncWYh6tr2$UQwt39k!2mR#pM%q znUzJ(I5SGJST(ef{-9RDB&k?KXb|<8D;}Im{N`#}cLo#8`M`i47~W_YgzQa`h#5Cy zTC__y2O`0^*NL-kyoYlN-dAxRAKciV>7)_`7u~SoBNgx9q*uWwQoE$$I3~n-_cHrc z!br9$!eXul}-taZG~!3V^4&zg?c_$8L9phGC4!+4$b0;!`62a(`^ zDLLQ-;SH8;Si(}f^?QJ`zGIJr?SF~yJ#C3^QMKnA)NHHutuDEVx;ZptV0W$W@udrt z=A|XU1!_z6*HCWH8(8z+Md?knvP9KVt-XcKz#O)4t!WfW`z*H0KVMJnEP7}094kfq zB$V5iQJBun!@fE6J7iLE+QvcNTX-p5?mACyhs0nTa(SDhaL_U2({Ys11Xj@rG_l-F zC(%Zy`Q@F&UYf!noxy$*I8J9VN$2ndoyQ%zfFBcd5kJ!<{7Ii%K(;VAtKh|(IK*v= zu^fl76d4k(6u1ujfm*il#}2>3&yo$@n86Xe#c^+Qq{_aeeEP%$2lG{MirdK>w$|K5L5&5~AcNLBhhZD0VOi1`Mx`T(A>BmG3QpT3 zJ{cB11@g*t8FspYLb{3?y2fA2nFV}l#lb|1Fs(QNACDrZ4Pak|grGoPGfx Z@{^Q4X6Z8feC(4DUE$|bTw~0O{sGapo0I?m delta 1642 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 K<&F$B?*0M1(Qb+W delta 875 zcmZva*-ukZ5XOJ!w)H|6h{#roY-KM{m8C)jk%G7&DBuHc79q$IN}A$pjXv=rXpONA zMvWT^nuw;d1khLi4Wa12V2trx6hfo9$=q{h=9_QkoAca!Kgsyz*UCCj!{v8IRRmSi z1sNmW>t5%WcYMg%6Yvj@54B7Vj|~j^jijMV#7dTm%}h3j1*ty&kh6bsbaXi2^jz}> zJialXU!d!5YZat-{4eU(>g1ZqBVTa9J25dhJ|L(p?HKU}cX_+|M+UD3+-1_Y>xyf| zoq%0XxViQ?w)iAAI~99)>w9=+b8Tb$-rTp1@aEF%tvhR*tIxjPxT&!fX>7%RN#YB} zakR#hXwXtKWt0mN0=_>%Idkd1eYs6os4!DWRcJ{Rdo-Djm^rFxWN7bhYwJv)T40O4 zdAc<_7n_=oO;2yXSlwRP*uMR0>ut2Es>(<$bt*11$Eg?CLyr`DC|RjZbd#cTLXa0~ z*5#Q@xT#P%DJYQltoL^nMagJF$Ss;MORLDUfo5q>h356PV2ku6p_4WRJ%>mn6_327 z%S%j;m`;wem(y@I>8Vw87vfAAE2#PMXg}f+M2kKOxg*eJQ^MvR~X{H zi&?d+aNb2ogSPD;mrza0UX#`7IXVi6|- z41uCqtr|JAI$0`b*Ud^XU#;fLB?3@88y*bFIFDg#g&R*eF~Xqr=9{IO zS;?*!jQ8{_8AUT&u4L;~GrRiATzz8{3KEnFG13d1Mj0wb_vVc6$J7()^w zxF}*$Mien?!4Y-GaY@9qj2T?EK001F`*BsqH6$!Azsz4}7@_8YFHJtfHIiUtjvF$a z4!R4tLFX(*DRA@wlC}?~>AMhjDB>_j=LxC>eBj}S3#W0DqClq_w=ho;_1UP5&~D>S z2a|=UqmOb;{RcdoSkxQe;YkRp;PW2h6o)MYR6+X+(RYUJK{>=Z4*a&tA8kSDCW5_0 z3m#1sRNfKaN2rCE-UgZAu!%9dBcR(z-3E-lY>L4xP3U!u~`Fi0j2Ax>*b zA&AEa;Uz|~M!vtp1U^8wHO>-y59zr}RYF@wPi+(TaGzAR-yUGW_M(Z0NZU>|k-;O< zzDRj5`u-py!lV9%iwilav_aeLx?ZOVZHJTt=<|^SOeJhT^q?y6d${s{1#R;|8|M)t stEb5RxJ_}|CZ_a=DLrBe$x73-_R^l_O`|C`w0W`s$xBufxrM!5HH@EfPq~$ywQJul23;sk+U;R6j%)(t>Es)H%TmRnuI|=Q zQ%^@nED@?{izI5g;$7VeM?+n$BDel)(Xd@-xj_Miimb@_^U=;0#hTLk_DJ$e-+fK( z(dI;WwcLHVnnNY*W`&}7Y~=RD^E(qaE>GON_`a`qY~=Oi-}k3p_l*rb9RF)%Z20c~ zzx--#Oi*SnwQebYR++&X)>^}A)lOTKbq3$r zinz8n)Ya{E^Sz>E>dD~Ls5O4+-sB$-#viA~dw-uCcslXhl?>5Pb6d2zBNC5$aI?W+ zBNbM@wkvxxKAlQMfwkXJ;LBk%WgfOrrSqe~Pi(brYoVMPYIW)iwz1v%PdlEolU+Ky z4eHrrZBeCGm7~$QPf;W_@?Jb~?9q~YQL^bA46zP5yVx)GfOy-`0ssI2 diff --git a/target/classes/org/cubexmc/ecobalancer/commands/UtilCommand.class b/target/classes/org/cubexmc/ecobalancer/commands/UtilCommand.class index 3a740118df9b6129b00b454cf7e2a940ae0ed2c1..faf243a6628807d046ca004056dc70ed26aa1977 100644 GIT binary patch delta 951 zcmZ`&OHUI~7(I7pI#Y*gOHrU83K$8t*eZf3#ri<%i~6df2nv(-+K1B?`_Sm7OZV1| z8xvP-*buQ66ZirC0Qbh9VPgE|PScPyW|HsD`OZ0a?ssnHm-n|@|MBaIbk(&i0xl*bm64cT$j4>BZBFNB{;^k{o{ZUghRMqBiWzG)CU-gPhG{wxVHo%izh)Y5s@DFO z7<$_^b`(xrX*<{RLZNK=t}-xPhX+v?uHiaOk}YKN40C%!nN1tTIDc8;`2-Iy?MX`z zT9dI-(!v^UG7MYUe3^83nA_bPHfG0N+fjYGTH<+1g>>)L{#sUDsQpx@syD#sQaj+H zD$%y^I8`)q8@~5!gmZg0dm( z6`w-xN#V}enyHq?xdYFlER5%^W_(c*AZ!DN02f$QP^v%|ZAug1vH;VLfOppCXkf1S zVR?g2FT=_pO0!#2d(nd<=*4mPFor(NpdS$&rW6LSN=yz%@fL%4har5R|Kc-_VV%@l z7(sm*qawTr#j*}J;&?z;KmoO4Y~UdlC_bzA2#-a`4J_h`xPk_j$f01FcokCQ4_=e@ JDIp2Z{sCtX(!>A& literal 2401 zcma)7S#J|p7(F+37{{3qvap2JY^|M;xTSQ9DKs%oNNWfsArR;`9#5P}CLS{$Q|Jn+ zqEx7<`qG658mU#pB7{^#oj??RK&AeIzG8?;1*GdRSauJq;pbGlah&GZ)`-7O@>wb)ud`3U~u^Z16A;#N`O~H zHAIFzx{(OVnV52ZOb#lt9+N0kR*aymkBv#mcsh8(RJE|(pj0U>lTeckyQAd-BeLFE zND}g3HN_Z;rb}@z)}T&6y@&=hKDEw1(@>KM>Qc^TBrV;ONa}_XmeLBtT7R^-9~&16 zoc3ZJ)(hAmq6r%r>iAM(nbA?z40c)tgP2gvK6zM)XEeoN@cRSSf(xkh(ntaS1R1Kv zW^56#Rm3*<7oY=du|K9ft><&iP+8c+W9|t zr0v)ohV|r-n&26p7vbmOb(~teJ7Y+uswV|BGpt|ET4zSp;)>x#0In*uqD??h#0z+l zq0zC&@UUctbxkMAD!Y$IB1ak4IXClUJj64-B$5GNCWWO`N=e2UTAgy)_6r48C|Fnv zx#Lxa4GzEf7AGbj&Cln*`ZjlYicj!5pP+qN-X$B9&C4VAi+BTMd5@_t*{hK}u$&gs z`%QER=oAsgAqJm=i^2&A7R=vAJLFcXPE+NGl1@vBat0mnpo_shtY|6D^ijhvZ&}j-Z98KhDE5>j(hq$qCH^`MoFCf)#*nQH^X#W zom!Zi%HNq={4u+5|5|QlIyXL(`+8i!7{iY85=PD|a>nH5_S;9a)WzqJfKDr^6V~G- zbZt~kDn~P8F~#VYVjA_-M|D}!1|&n}?Lw#999HQHXtNGYsr04p)eu9Ko_uo24n1{$ zl(b>Uc_^15LMvT?s8dDM>GG&|i>UX@ zqdqL6VkJ@W;_4H;I^saNZ@F#}#V&9$4v+vqJ^dQ66^-;ZuEidbqZ{k#^4x$k^weL% zMqI-t{6TN@U)aK$u$3LeHr7E#;NtDGWmyuBg>eoak!U0p&f@}?mTDj46D~Z}KE-Dw W{^t})HhPSn$M}cPUr@UO7yko1n6m!> diff --git a/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$1.class b/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$1.class new file mode 100644 index 0000000000000000000000000000000000000000..e858b6bd963968c93a3731209c7a3aa1347a82ca GIT binary patch literal 233 zcma)$K?=e!5Ji7%wY3WN2rdM1V-UQ7D7X+8o*<1wZD|uoTJdZyJb;H1r|JRxF#p5w zm_N_g{Q+Q&QG}kr!n$1QHltguC25M7stw8IDJ=*p@*!U#w4ntnB^Yf3*t9^cslh`1*ldnrA=zX$8wO_7 zAK;}kUf4g-+d89k&>6-nFZ>Pu5ofIRJ-drZDmbxvk(_hh^SdM&Z)t|RGs&90QwTbgAv1Qra_ zuu}}(6D!-=u9hI7Vj@ctW-%Gdg%CtYL0CluD#Kj67}pBB61;F-vpk@nu9Zq!z9bk1 zT%@{floEQy)a#ZdOgoYG7?KLkFkEdH>SnEC-p+3e-M(HoN(Ets5k;pA%2|eviC8Xz zb2zV{TSX6EWaxL?JPn+|CkkAAxoYn_ zxEu0jK*b=27=q-WwVxFf@w3N@9TSL@jNmnlC>T{ShVd5tjzG|`g{9dQi=n4QHsjGr zK@5`$;wq-38C?wnk6FmJEv>dD_H4;}QAI+A!eKCbsh2iBAS`jjY*~cGe_rTE!xk82ouz84Ncle9x_Yq)})|sr()3)D4EOPjKV^ zLHQ5HQYJ!KqiAY&-J*_L{^yQcXu78Kd&j0ECO0#wWQvr|p5$z!c24T%SdI!UT`77t8LH@VzGW!sT}^H5%{6MI zR^0vSG4|%acCg*x$vCLgDb74x)NGCF(wPc0dt2l0wjVhWbxYZsYYfS@BhsiUs zF>4C+;}PT(-Cs9kT((lTbg^v6heP$Au#3_KI%Z5$Sm}~hs|nJv#W3Dxche|pc?CP4 ztsolHe+wby%bAM`Ooqiak(#E4mx(3{xz|9!5WTgWo^~o(`P$N&p%ceV`Vls6(Yitu zoz@OoBa`vRV3SkdL;04D9ayFRGxCZLz|RK}=0jK`+Mvsh+jy5wB#1kBk5tN?1meij zUIMxl3Ft!Kg%9sz$pvQXq$fZ;U;T*ay~k8Zlixu(L>I$P=v|%q8S2y_USjwLe)h2Ntf$mqJ2Vl{Rlk4u!5+9UiO4OZxqCS$C!fY-_Y-eMl3#3ohSAJ?KuQK krFD`NaTH@FrzbW(H}a?W|r`}v&byk|f8 z{ezDH48x9~1wI9S6#)bZCreg7p;xnFqo^l@Udn0(&D4dJC<@y$^h#pJ9eYyMid`zE zRy4~d1jh{1u*V5)ebcMjx|U$0d?LdZWBL=U%`NiL77HtEx{cX&TU1j%!&K<2-kWlzd7AQDDI9M~`ntCQ>wowe> zq{<{?%}`$0^ID-Q6rAD`9BqdrY10;YiTMZ~RdE`ltZSIAt^-3_x*1dPm~<0lHy6aF zg2xH_YffCI$#XlS;w(~xs8%iuGdE?3LXI%E3oX;}={++f8Nwtdvn~s&$goeUIEOSL zkd+i7oMW8#?7gSP$fR_BLDn=)xUx$X|4)?vkZh6=&KP-9v#S+IR6obcdNd}y50Ife4Z(qD&;t@yQU3O%vOt8VO?^YNb7WoFY3Hz8FK9j z{q~AcA&fK)Yh8=t92H&m!!#41wXP1Y5AyA647pj}30t`1+V%{j#6;y=pF5m>rc||bF=faHO7&jJ z8`!?7lt12?jUhc;TrH*TYU!!AL@_o2MYOCO%%-+gk6 zK1G0TB0`_xX_j@n>d4>{uhwZ+AKFy%bs}2DUJ@h4cJ-jZ^bG zAdE5$pwAJaFVIF`at2?ahrUKHeZvpQw^*d_uuR|MGW~#8=tsOtKjAg{8E?=p4q(HK zb{Z$Jgy(q11$)qi@Fte=JOkB+*KrvyFfhG%881R(Xe5a3EO9NfZ0Tyr^UCpF7lOBN zR6$HZ2i@Y&C6dOCc^w~t)ax@ Q5P!v#gJDh~h6=)e02RpYvH$=8 literal 0 HcmV?d00001 diff --git a/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$CustomChart.class b/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$CustomChart.class new file mode 100644 index 0000000000000000000000000000000000000000..529dccaf7d40b642b840792c7f3f000b7c692894 GIT binary patch literal 2613 zcmb_eZBrXn6n^ezVUw^F8eUV|vb0nPZ&6y*5=2V?0fAOP5Ueko&28Aa*$tcBmX71g zsDHo@{m@_F*E*vx%8Y*Oj6cay>$#hl1fj}6KV#cBSr*Uf)(to3=eg}o z?-;z`nT{Psl%dnu(p_&ZtL6Qor`e9DWw>VhmKB8pRd{SIZr4*O8h z#&G?(cIS(ZT}sHLZ(3RIM$w8;7%?%%Rh+{M3=Mjr!0qge$*nAdegv??VI&q#96~Be zNxGooBDxsV9QOj)Q@W=!%=Vqaa8DI&DvWLhIZH+b(#ryA55vQwu$>r4t-n)*ol@{3 zLrb-qR<~T|zMiqTfPD%|DopkYCI=V>XLQrzS!*zxW!2#bht>hiwHbl!MC(X2D7pV_j5s@J}k)gLXqEZE?YOI$fi8aA)O2xRS zrMir$aiTr#WI03Af@$+5KcC_5s>r5jC&$pOHQhDEx-68vEwjildhCL(>D3fN9M(>$KXYwb<|M-vb+Xg2sI)8?ne98h-5`_z`Em4>Ts|+fG`L zEXYzGVaY~JDxgE!#v8$2U;}UB2Cc|i;EQ3B=1pKvX(=gaQjjJA!!%~dDY<7!a!+Ql zzK_<8J+vg=FuNI(f!*14b`}!k zoi}~*L7%On$`_$ZLq#o%7cGlYe}Iqv3X3YluV*Ig1_MUaN@aWc^f~7{ea_dX``#a4 ze+OVUt|uT7(h$}WK~!K@*_lZfYI$?6R7jhJa^5H!cENPgCDV1RLNz_=kL`oCs#`7% z&Kiy@5Z!0lmOCKO(m8U;xMHMfG?UKJ!k)>b#^Z<~t|6f#30+|KYB7c!t5}>aU$u{0 zra-J<6pKc_$j{9_O3k&3=|b5q)EvjO-Sl9fkkRm*z~0ru9I2M=WBE&F!97s3iqoc( zKoi!egsc?^b*9FXScml*T6Ao{3j&+GEj|fcAglrvSl^jyNQMu<$l3&&>JCPYN)oMj zQO8TzB%oQ<;Znt&_i(4w%4Qu~u$8;#2A%nw$!xD(a_ogbQ6`C3(5~TC9Ua)d%)e(4 zvs}|L+_EFEVVP|j5sQFt%BvI%dwfN_U5jv`R(Tra;5%0_*A~ z+*A9oiZ+Q}?9$0HYDQ;F_ozuxEBbW2i9OsRMFJg-lnJu5V&eJ*)_5Qdp34)`xq1Wc!kLS8cAAvEQCD@^Jmo1)jW>ZY@)O+pKYac98lTXk`V4;#xQDv?(f)u2iHI7L~^ZOf| zJ(fB@{3o*YF)|8VSdQ^G=H3PHwA1jI{{hB4xg6n%p*@T5rkraOE;FEj@rmKNf?08` zvR&0sUb-Z_pdPKT7`bxIDVPT>b+zlk17nBEHK$qIHl4wuQLUQv!TVzSDmx`>y6laj zH=ZWm4}YNr`>{ts4c7#QR*BNkeFL^MNVv5+3byhUB>Cv#@m232jwd*iILUuvBggR+ zB?XQlj>)d>I}lwxUqQRgX$YtJ`H|yOg-B56w{Orid53iG`V!hAng#Bnb+qRP=skq+!kI$r&{_@eZ8hkdix`RqyA{PPwQ!mEMliJcta|O4c4)?SYW+VeFfI> zwrE@2Gr5bs>Wk#Pi-85avw)$AP@i`5;k_2^Q?!K!x&z-zF}i@m3mBQW`Ox0vMH&Rr ze5~7F;qNW(GVJAZj88krQN-jJTI4ZolPAzFbLfz#kd>!#QjX)aoWKov2A|1E+>}%J zT%N@j@*Hl<^Y~s~z>o4Gev*0oBB#B2oMfSIuqyB30^%%h6&GP3O1uj4EU$(vu49_3 z5tZ$rZZZ4{lX~oc_!;kEhE?gnx0t0x$g7~Lv+viUU*E?i`tbEHQ@==m8N?o7n}#M0 zt>OV6!WvQ!`9k6YJQheP(a_6@S_AH5&+piHA2NcHmly$?&MN$tcpnbOF2YD|q!w0h Z`6{k3fF_PtIrj2NHy4d#o{|p`{}Tp0auNUl literal 0 HcmV?d00001 diff --git a/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$JsonObjectBuilder$JsonObject.class b/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$JsonObjectBuilder$JsonObject.class new file mode 100644 index 0000000000000000000000000000000000000000..860ef753574332d94a0d043e3e43a4383afcf7c1 GIT binary patch literal 1007 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 G)cgdWMj44KTNGjCYh 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 E2iV7bHUIzs literal 0 HcmV?d00001 diff --git a/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$MultiLineChart.class b/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$MultiLineChart.class new file mode 100644 index 0000000000000000000000000000000000000000..d8ed727c2f78707976044ed3812988748d1ddbee GIT binary patch literal 2691 zcmb_eZBrXn6n;+LHZL1&X+co2v?3*d4Yjnk1W_BnrUhC}4T4zREZ4A*Y~p6q0cZT6 z{s2EYj{bpuZG8b_$6812IQm?5b!W;mIvvY@IA`=W|-$Pj{gNg={H z#`%H04>TB=lFl#4n&t=}?NP=56Xic7n<7NAM#0qVn#EUh@t?2eWYaeD#9KBujHWx| zQ6n|Qe}wV9s&BAvuRf5-F-6nmRnF@n*+~{^rM$2%yG^8XuFMxTr&)$vd%}RdW>g8M z+lIBZOL3ZtF1uoeIndcuiq{SK0=7oos_aHC{_FA{7)uF@$`{FLtkasUF>jsr!Y#b@ zeB67?RmEMZdkvD1Y8#*impxO9W#%7+F1=h(Q&<0Y2pJoDAxs2%19c3^t+bpyB~8XAg1x~yo|f~I z+j!1xUITIIbygzn*pg1CYny2l?= z3KG9!NWs`I=nq0T=@Z^!^);URU|^lcVRq!h21)_>&9?y)5q`ZkQ08%rzhx?+2&WK7 H6_MWom;&$y literal 0 HcmV?d00001 diff --git a/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$SimpleBarChart.class b/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$SimpleBarChart.class new file mode 100644 index 0000000000000000000000000000000000000000..20a4598d92de6add9f8ac8b206fd11f5a94eadd1 GIT binary patch literal 2607 zcmb_eTUQ%Z6#mX6Fu6=9r3I;4+ag*LXoFHKC0LaJHZ2!xYLM33WH=2&lS!ORy5PZ| z;e)@x*SeO{g}Pim`Ou%_^7fsX!6b^Vh%Od6=j^l3{`TcN`^=MHzxf`(6}Sm#i0FtK z=tIB2Ox>+ytyWp?)~u|w>SeQPI+k>^HR-vw)y%F2<9NQ+^y;a9YQ( zfe}0_YcHuPr9a8cLhee&K5#B4WyCL zF==2*xiQps@KA-mZJW(Cx$7z2%LcM46;X!*9WM!-Y9C=t<4elhB&IQAkZ08FuSoBf z+|zMYV9?j?V2M(kHE>NS#;8~_t1YP`$5`8{1;>*WRh&7zX5czrr>^Y;x_-V2s%~!@ zSU_GNX*L?t*;=+`bxYv(5zM?-NUt25BDolr7}P`MXj9?7W#9%10)1u0A%PoA^s%jv zw<(!Z#&4;hRs=pfB8>kB%e%Sp&v$daW1BzYg!%xm0N}c+dRKx@dYPdF%HV_VDid1Q(f6 zr2?vl9a13IbAsAj4iD2>q-Hi$N!ryT7byQzL;-rQ9O2v2ZLs%)siJ3E59mY4g2d9U zB^#bycbYm#o}jz=Ed66gAW^KhTuUz7>P<4jxAC%yiOYiHNHXdwf`0u!2($@e0 literal 0 HcmV?d00001 diff --git a/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$SimplePie.class b/target/classes/org/cubexmc/ecobalancer/metrics/Metrics$SimplePie.class new file mode 100644 index 0000000000000000000000000000000000000000..697ffc8ef8d1284509578dfe05879650dca2052b GIT binary patch literal 1644 zcmbVMTTc^F5dKanENz!txdQ+ z`~{dOL`{rOKKPrAaZb0;B48>H?VOpNneUr3bLQvoFW&%6VJ$W3)T4o6%64*^ z?q$SQUe|dE$?B`wtS#@&oHyX38M!WWg~h^>DC(2&rrX~O;5;AgDQq_i6O!Z z1z}~E3}I#&_z72DRmnjUQfFqBkl2@1T)_yj$w;aU%XD35&Ny7DJi!o38##-+o|bckyv~mEH?fL$_G;GFi!u?@)LW7diEM&wu7r=8}QvR0gW^Y#5GJ(N_mn% z0bHlE1oSNu(1)HvkaqM)8TcjTkp$zhk5E3NiQzliQ}G`N$M?{=Lzuf?(erE{7ovS+ z8Q8<{F1h=}qLd2k4Mn}Bz4eY3)%y~;E{=ikj4r__*Dkl*R3Cv)v{5L)1i# z@h4!S5H&GA`ntA0dmshwGLqC!VPT@2| z#IW2=&Gaa+j_Fih#u8*2inMiv?V?FSyCGI@-dn!?|sSP$Y#}M~G8FIIb zI=yDwc^~Ooic{9bnB=K`iIz-)@nA?ErhQiXO`ZSe{En}bNLs0Iw=qSlnyWFeJVRH} z)%2$uS}n*lwzjMDnrqlrUB)6qf3xNPd|`+cZO_s9x*?`e3D&`!Fr{nWvbd8owR)Ws z1}%iCHoJwo`Orq`IZ{O$z-IRZVnvR}yVUdM>fBNKVsD zLW+Jg3P_WjA&pM5gJe8Ca{!i}{RsIzT{|#K|J~w~^c-R71!B@mTq50=Z;m;rbR$Px z#ub7TCqX3PDxC$PuMvbk^*lnftfvCvI^l=_r_vuFe?k|-H}vmgFgyGTVYc@LLr)Gc zoH#eUkFkAB?vbe+>(5Lhqmv{786Fs_qlC)f`pX=~Ft nM7o<~dyCEzGRTsgAgzQY+zyE~zl1x8(&AXcU6LzwT1E61JsrI> literal 0 HcmV?d00001 diff --git a/target/classes/org/cubexmc/ecobalancer/metrics/Metrics.class b/target/classes/org/cubexmc/ecobalancer/metrics/Metrics.class new file mode 100644 index 0000000000000000000000000000000000000000..74d41837629685731719eedaa0215893c4b8ff38 GIT binary patch literal 8820 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 literal 0 HcmV?d00001 diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index c16772a..3b77e30 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,5 +1,18 @@ org\cubexmc\ecobalancer\EcoBalancer$1BatchRunnable.class org\cubexmc\ecobalancer\EcoBalancer.class +org\cubexmc\ecobalancer\metrics\Metrics$1.class org\cubexmc\ecobalancer\commands\CheckPlayerCommand.class +org\cubexmc\ecobalancer\metrics\Metrics.class +org\cubexmc\ecobalancer\metrics\Metrics$CustomChart.class +org\cubexmc\ecobalancer\metrics\Metrics$SingleLineChart.class +org\cubexmc\ecobalancer\metrics\Metrics$JsonObjectBuilder.class +org\cubexmc\ecobalancer\metrics\Metrics$JsonObjectBuilder$JsonObject.class +org\cubexmc\ecobalancer\metrics\Metrics$MetricsBase.class +org\cubexmc\ecobalancer\metrics\Metrics$SimpleBarChart.class org\cubexmc\ecobalancer\commands\UtilCommand.class +org\cubexmc\ecobalancer\metrics\Metrics$MultiLineChart.class +org\cubexmc\ecobalancer\metrics\Metrics$AdvancedPie.class org\cubexmc\ecobalancer\commands\CheckAllCommand.class +org\cubexmc\ecobalancer\metrics\Metrics$AdvancedBarChart.class +org\cubexmc\ecobalancer\metrics\Metrics$SimplePie.class +org\cubexmc\ecobalancer\metrics\Metrics$DrilldownPie.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index e685e58..e5c0e92 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -2,3 +2,4 @@ C:\Users\jerry\Desktop\MC server\EcoBalancer\src\main\java\org\cubexmc\ecobalanc C:\Users\jerry\Desktop\MC server\EcoBalancer\src\main\java\org\cubexmc\ecobalancer\commands\UtilCommand.java C:\Users\jerry\Desktop\MC server\EcoBalancer\src\main\java\org\cubexmc\ecobalancer\EcoBalancer.java C:\Users\jerry\Desktop\MC server\EcoBalancer\src\main\java\org\cubexmc\ecobalancer\commands\CheckPlayerCommand.java +C:\Users\jerry\Desktop\MC server\EcoBalancer\src\main\java\org\cubexmc\ecobalancer\metrics\Metrics.java diff --git a/target/original-EcoBalancer-1.0-SNAPSHOT.jar b/target/original-EcoBalancer-1.0-SNAPSHOT.jar index f6fe023f2f0b9c80edac64f07766652e2110b4fd..a0454e1a86c668de00fb928e60a0dfde3e269c86 100644 GIT binary patch literal 42418 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�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

ixLQqQebbYD-7eqEdCMk0HIRuo-0 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 PI=~hh0AS$zhxNYzT<0(5