From 76576b1cd36c7c6011cb5864eef729487dce9a8d Mon Sep 17 00:00:00 2001 From: JaTiTV Date: Tue, 18 Jan 2022 14:50:36 +0100 Subject: [PATCH] initial --- .gitattributes | 2 + .idea/.gitignore | 3 + .idea/artifacts/T2C_AliasBungee_v0_0_1.xml | 8 + .idea/compiler.xml | 17 + .idea/discord.xml | 7 + .idea/encodings.xml | 7 + .idea/jarRepositories.xml | 55 ++ .../Maven__net_t2code_PlugmanGUI_3_0.xml | 13 + .../Maven__net_t2code_T2CodeLib_10_6.xml | 13 + .../Maven__net_t2code_bungee_1615.xml | 13 + ...aven__org_projectlombok_lombok_1_18_22.xml | 13 + .idea/misc.xml | 19 + .idea/modules.xml | 8 + .idea/runConfigurations.xml | 10 + .idea/uiDesigner.xml | 124 +++ .idea/vcs.xml | 6 + T2Code-Alias.iml | 32 + pom.xml | 91 ++ .../java/net/t2code/alias/Bungee/Main.java | 75 ++ .../cmdManagement/Alias_CmdExecuter.java | 96 ++ .../alias/Bungee/cmdManagement/Commands.java | 38 + .../cmdManagement/RegisterCommands.java | 114 +++ .../Bungee/config/config/CreateConfig.java | 35 + .../config/CreateExampleAliasConfig.java | 107 +++ .../Bungee/config/config/SelectAlias.java | 68 ++ .../Bungee/config/config/SelectConfig.java | 26 + .../config/languages/LanguagesCreate.java | 66 ++ .../alias/Bungee/config/languages/MSG.java | 49 + .../config/languages/SelectMessages.java | 51 ++ .../alias/Bungee/objects/Alias_Objekt.java | 103 +++ .../alias/Bungee/system/AliasRegister.java | 21 + .../net/t2code/alias/Bungee/system/Load.java | 70 ++ .../t2code/alias/Bungee/system/Metrics.java | 846 ++++++++++++++++++ src/main/java/net/t2code/alias/Util.java | 18 + src/main/resources/bungee.yml | 6 + target/classes/bungee.yml | 6 + .../net/t2code/alias/Bungee/Main.class | Bin 0 -> 4389 bytes .../cmdManagement/Alias_CmdExecuter$1.class | Bin 0 -> 769 bytes .../cmdManagement/Alias_CmdExecuter.class | Bin 0 -> 4174 bytes .../alias/Bungee/cmdManagement/Commands.class | Bin 0 -> 2559 bytes .../cmdManagement/RegisterCommands.class | Bin 0 -> 5405 bytes .../Bungee/config/config/CreateConfig.class | Bin 0 -> 2295 bytes .../config/CreateExampleAliasConfig.class | Bin 0 -> 5519 bytes .../Bungee/config/config/SelectAlias.class | Bin 0 -> 4764 bytes .../Bungee/config/config/SelectConfig.class | Bin 0 -> 1457 bytes .../config/languages/LanguagesCreate.class | Bin 0 -> 3194 bytes .../alias/Bungee/config/languages/MSG.class | Bin 0 -> 1757 bytes .../config/languages/SelectMessages.class | Bin 0 -> 3017 bytes .../alias/Bungee/objects/Alias_Objekt.class | Bin 0 -> 3228 bytes .../alias/Bungee/system/AliasRegister.class | Bin 0 -> 1895 bytes .../net/t2code/alias/Bungee/system/Load.class | Bin 0 -> 3266 bytes .../alias/Bungee/system/Metrics$1.class | Bin 0 -> 231 bytes .../system/Metrics$AdvancedBarChart.class | Bin 0 -> 2572 bytes .../Bungee/system/Metrics$AdvancedPie.class | Bin 0 -> 2671 bytes .../Bungee/system/Metrics$CustomChart.class | Bin 0 -> 2600 bytes .../Bungee/system/Metrics$DrilldownPie.class | Bin 0 -> 3152 bytes ...Metrics$JsonObjectBuilder$JsonObject.class | Bin 0 -> 1000 bytes .../system/Metrics$JsonObjectBuilder.class | Bin 0 -> 5812 bytes .../Bungee/system/Metrics$MetricsBase.class | Bin 0 -> 12753 bytes .../system/Metrics$MultiLineChart.class | Bin 0 -> 2680 bytes .../system/Metrics$SimpleBarChart.class | Bin 0 -> 2596 bytes .../Bungee/system/Metrics$SimplePie.class | Bin 0 -> 1636 bytes .../system/Metrics$SingleLineChart.class | Bin 0 -> 1638 bytes .../t2code/alias/Bungee/system/Metrics.class | Bin 0 -> 8440 bytes target/classes/net/t2code/alias/Util.class | Bin 0 -> 1395 bytes 65 files changed, 2236 insertions(+) create mode 100644 .gitattributes create mode 100644 .idea/.gitignore create mode 100644 .idea/artifacts/T2C_AliasBungee_v0_0_1.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/discord.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/libraries/Maven__net_t2code_PlugmanGUI_3_0.xml create mode 100644 .idea/libraries/Maven__net_t2code_T2CodeLib_10_6.xml create mode 100644 .idea/libraries/Maven__net_t2code_bungee_1615.xml create mode 100644 .idea/libraries/Maven__org_projectlombok_lombok_1_18_22.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 T2Code-Alias.iml create mode 100644 pom.xml create mode 100644 src/main/java/net/t2code/alias/Bungee/Main.java create mode 100644 src/main/java/net/t2code/alias/Bungee/cmdManagement/Alias_CmdExecuter.java create mode 100644 src/main/java/net/t2code/alias/Bungee/cmdManagement/Commands.java create mode 100644 src/main/java/net/t2code/alias/Bungee/cmdManagement/RegisterCommands.java create mode 100644 src/main/java/net/t2code/alias/Bungee/config/config/CreateConfig.java create mode 100644 src/main/java/net/t2code/alias/Bungee/config/config/CreateExampleAliasConfig.java create mode 100644 src/main/java/net/t2code/alias/Bungee/config/config/SelectAlias.java create mode 100644 src/main/java/net/t2code/alias/Bungee/config/config/SelectConfig.java create mode 100644 src/main/java/net/t2code/alias/Bungee/config/languages/LanguagesCreate.java create mode 100644 src/main/java/net/t2code/alias/Bungee/config/languages/MSG.java create mode 100644 src/main/java/net/t2code/alias/Bungee/config/languages/SelectMessages.java create mode 100644 src/main/java/net/t2code/alias/Bungee/objects/Alias_Objekt.java create mode 100644 src/main/java/net/t2code/alias/Bungee/system/AliasRegister.java create mode 100644 src/main/java/net/t2code/alias/Bungee/system/Load.java create mode 100644 src/main/java/net/t2code/alias/Bungee/system/Metrics.java create mode 100644 src/main/java/net/t2code/alias/Util.java create mode 100644 src/main/resources/bungee.yml create mode 100644 target/classes/bungee.yml create mode 100644 target/classes/net/t2code/alias/Bungee/Main.class create mode 100644 target/classes/net/t2code/alias/Bungee/cmdManagement/Alias_CmdExecuter$1.class create mode 100644 target/classes/net/t2code/alias/Bungee/cmdManagement/Alias_CmdExecuter.class create mode 100644 target/classes/net/t2code/alias/Bungee/cmdManagement/Commands.class create mode 100644 target/classes/net/t2code/alias/Bungee/cmdManagement/RegisterCommands.class create mode 100644 target/classes/net/t2code/alias/Bungee/config/config/CreateConfig.class create mode 100644 target/classes/net/t2code/alias/Bungee/config/config/CreateExampleAliasConfig.class create mode 100644 target/classes/net/t2code/alias/Bungee/config/config/SelectAlias.class create mode 100644 target/classes/net/t2code/alias/Bungee/config/config/SelectConfig.class create mode 100644 target/classes/net/t2code/alias/Bungee/config/languages/LanguagesCreate.class create mode 100644 target/classes/net/t2code/alias/Bungee/config/languages/MSG.class create mode 100644 target/classes/net/t2code/alias/Bungee/config/languages/SelectMessages.class create mode 100644 target/classes/net/t2code/alias/Bungee/objects/Alias_Objekt.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/AliasRegister.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Load.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$1.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$AdvancedBarChart.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$AdvancedPie.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$CustomChart.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$DrilldownPie.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$JsonObjectBuilder$JsonObject.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$JsonObjectBuilder.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$MetricsBase.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$MultiLineChart.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$SimpleBarChart.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$SimplePie.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics$SingleLineChart.class create mode 100644 target/classes/net/t2code/alias/Bungee/system/Metrics.class create mode 100644 target/classes/net/t2code/alias/Util.class diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/artifacts/T2C_AliasBungee_v0_0_1.xml b/.idea/artifacts/T2C_AliasBungee_v0_0_1.xml new file mode 100644 index 0000000..227e12b --- /dev/null +++ b/.idea/artifacts/T2C_AliasBungee_v0_0_1.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/../../Plugins/T2Code-Alias/.jar + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..ca9b6f9 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..8cf359d --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..8de226a --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_t2code_PlugmanGUI_3_0.xml b/.idea/libraries/Maven__net_t2code_PlugmanGUI_3_0.xml new file mode 100644 index 0000000..a1291e9 --- /dev/null +++ b/.idea/libraries/Maven__net_t2code_PlugmanGUI_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_t2code_T2CodeLib_10_6.xml b/.idea/libraries/Maven__net_t2code_T2CodeLib_10_6.xml new file mode 100644 index 0000000..0151d6a --- /dev/null +++ b/.idea/libraries/Maven__net_t2code_T2CodeLib_10_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_t2code_bungee_1615.xml b/.idea/libraries/Maven__net_t2code_bungee_1615.xml new file mode 100644 index 0000000..c2092ae --- /dev/null +++ b/.idea/libraries/Maven__net_t2code_bungee_1615.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_projectlombok_lombok_1_18_22.xml b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_22.xml new file mode 100644 index 0000000..72b596e --- /dev/null +++ b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_22.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..3656e5e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5f32aad --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/T2Code-Alias.iml b/T2Code-Alias.iml new file mode 100644 index 0000000..c05648c --- /dev/null +++ b/T2Code-Alias.iml @@ -0,0 +1,32 @@ + + + + + + + SPIGOT + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..cf0e21b --- /dev/null +++ b/pom.xml @@ -0,0 +1,91 @@ + + + 4.0.0 + + net.t2code + AliasBungee + 0.0.1 + jar + + T2C-AliasBungee + + T2Code Alias for BungeeCord + + 1.8 + UTF-8 + + T2Code.net + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + false + + + + + + + + src/main/resources + true + + + + + + + Builders-Paradise + https://repo.t2code.net/repository/Builders-Paradise/ + + + T2Code + https://repo.t2code.net/repository/T2Code/ + + + + + + net.t2code + bungee + 1615 + + + net.t2code + PlugmanGUI + 3.0 + + + net.t2code + T2CodeLib + 10.6 + + + org.projectlombok + lombok + 1.18.22 + provided + + + diff --git a/src/main/java/net/t2code/alias/Bungee/Main.java b/src/main/java/net/t2code/alias/Bungee/Main.java new file mode 100644 index 0000000..5940603 --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/Main.java @@ -0,0 +1,75 @@ +package net.t2code.alias.Bungee; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.plugin.Plugin; +import net.t2code.alias.Bungee.objects.Alias_Objekt; +import net.t2code.alias.Bungee.system.Load; +import net.t2code.alias.Util; +import net.t2code.lib.Bungee.Lib.messages.BT2CodeTemplate; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Objects; +import java.util.logging.Level; + +public final class Main extends Plugin { + public static File getPath() { + return plugin.getDataFolder(); + } + + public static String prefix = Util.Prefix; + public static Integer spigotID = Util.SpigotID; + public static Integer bstatsID = Util.BstatsID; + public static String spigot = Util.Spigot; + public static String discord = Util.Discord; + + + public static String version; + public static String autor; + + public static Main plugin; + + public static HashMap aliasHashMap = new HashMap<>(); + public static ArrayList allAliases = new ArrayList<>(); + + private static Boolean enable= false; + + @Override + public void onEnable() { + // Plugin startup logic + plugin = this; + autor = plugin.getDescription().getAuthor(); + version = plugin.getDescription().getVersion(); + if (pluginNotFound("T2CodeLib", 96388, Util.getRequiredT2CodeLibVersion())) return; + Load.onLoad(prefix, autor, version, spigot, spigotID, discord, bstatsID); + enable = true; + } + + @Override + public void onDisable() { + // Plugin shutdown logic + aliasHashMap.clear(); + allAliases.clear(); + if (enable) return; + BT2CodeTemplate.onDisable(prefix, autor, version, spigot, discord); + } + + public static Boolean pluginNotFound(String pl, Integer spigotID, double ver) { + if (ProxyServer.getInstance().getPluginManager().getPlugin(pl) == null) { + plugin.getLogger().log(Level.SEVERE, "Plugin can not be loaded!"); + ProxyServer.getInstance().getConsole().sendMessage(Util.getPrefix() + " §e" + pl + " §4could not be found. Please download it here: " + + "§6https://spigotmc.org/resources/" + pl + "." + spigotID + " §4to be able to use this plugin."); + Main.plugin.onDisable(); + return true; + } else { + if (Double.parseDouble(Objects.requireNonNull(ProxyServer.getInstance().getPluginManager().getPlugin(pl)).getDescription().getVersion()) < ver) { + plugin.getLogger().log(Level.SEVERE, "Plugin can not be loaded!"); + ProxyServer.getInstance().getConsole().sendMessage(Util.getPrefix() + " §e" + pl + " §4is out of date! This plugin requires at least version §2" + ver + " §4of §6" + pl + " §4Please update it here: §6https://spigotmc.org/resources/" + pl + "." + spigotID + " §4to use this version of " + plugin.getDescription().getName() + "."); + Main.plugin.onDisable(); + return true; + } + return false; + } + } +} diff --git a/src/main/java/net/t2code/alias/Bungee/cmdManagement/Alias_CmdExecuter.java b/src/main/java/net/t2code/alias/Bungee/cmdManagement/Alias_CmdExecuter.java new file mode 100644 index 0000000..878dc9d --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/cmdManagement/Alias_CmdExecuter.java @@ -0,0 +1,96 @@ +package net.t2code.alias.Bungee.cmdManagement; + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Command; +import net.md_5.bungee.api.plugin.TabExecutor; +import net.t2code.alias.Bungee.Main; +import net.t2code.alias.Bungee.config.languages.SelectMessages; +import net.t2code.lib.Bungee.Lib.messages.Bsend; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class Alias_CmdExecuter extends Command implements TabExecutor { + String Prefix; + public Alias_CmdExecuter() { + super("t2code-alias","t2code.alias.admin","t2c-a", "alias"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + Prefix = Main.prefix; + + if (args.length == 0) { + // Command + if (sender.hasPermission("t2code.alias.command.info")) { + Commands.info(sender); + } else Bsend.sender(sender, SelectMessages.NoPermissionForCommand.replace("[cmd]", "/t2code-alias info") + .replace("[perm]", "t2code.alias.command.info")); + } else { + switch (args[0].toLowerCase()) { + case "reload": + case "rl": + if (sender.hasPermission("t2code.alias.command.reload")) { + Commands.reload(sender); + } else Bsend.sender(sender, SelectMessages.NoPermissionForCommand.replace("[cmd]", "/t2code-alias reload") + .replace("[perm]", "t2code.alias.command.reload")); + break; + case "info": + case "plugin": + case "version": + if (sender.hasPermission("t2code.alias.command.info")) { + Commands.info(sender); + } else Bsend.sender(sender, SelectMessages.NoPermissionForCommand.replace("[cmd]", "/t2code-alias info") + .replace("[perm]", "t2code.alias.command.info")); + break; + } + } + } + + //TabCompleter + private static HashMap arg1 = new HashMap() {{ + put("reload", "t2code.alias.command.reload"); + put("rl", "t2code.alias.command.reload"); + put("info", "t2code.alias.command.info"); + }}; + + @Override + public Iterable onTabComplete(CommandSender sender, String[] args) { + List list = new ArrayList<>(); + if (sender instanceof ProxiedPlayer) { + ProxiedPlayer p = (ProxiedPlayer) sender; + if (args.length == 1) { + for (String command : arg1.keySet()) { + Boolean passend = true; + for (int i = 0; i < args[0].length(); i++) { + if (args[0].length() >= command.length()) { + passend = false; + } else { + if (args[0].charAt(i) != command.charAt(i)) { + passend = false; + } + } + } + if (hasPermission(p, arg1.get(command)) && passend) { + list.add(command); + } + } + } + } + return list; + } + + public static boolean hasPermission(ProxiedPlayer player, String permission) { + String[] Permissions = permission.split(";"); + for (String perm : Permissions) { + if (player.hasPermission(perm)) { + return true; + } + } + return false; + } + +} + diff --git a/src/main/java/net/t2code/alias/Bungee/cmdManagement/Commands.java b/src/main/java/net/t2code/alias/Bungee/cmdManagement/Commands.java new file mode 100644 index 0000000..8c98b31 --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/cmdManagement/Commands.java @@ -0,0 +1,38 @@ +package net.t2code.alias.Bungee.cmdManagement; + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Plugin; +import net.t2code.alias.Bungee.Main; +import net.t2code.alias.Bungee.config.languages.SelectMessages; +import net.t2code.alias.Bungee.system.Load; +import net.t2code.lib.Bungee.Lib.messages.BT2CodeTemplate; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Bungee.Lib.update.BUpdateAPI; + + +public class Commands { + private static Plugin plugin = Main.plugin; + private static String prefix = Main.prefix; + private static String autor = Main.autor; + private static String version = Main.version; + private static String spigot = Main.spigot; + private static String discord = Main.discord; + + + public static void info(CommandSender sender) { + BT2CodeTemplate.sendInfo(sender,prefix,spigot,discord,autor,version, BUpdateAPI.bungeePluginVersionen.get(plugin.getDescription().getName()).publicVersion); + } + + public static void reload(CommandSender sender) { + if (sender instanceof ProxiedPlayer) sender.sendMessage(SelectMessages.ReloadStart); + Bsend.console(Main.prefix + "§8-------------------------------"); + Bsend.console(Main.prefix + " §6Plugin reload..."); + Bsend.console(Main.prefix + "§8-------------------------------"); + Load.loadReload(); + if (sender instanceof ProxiedPlayer) sender.sendMessage(SelectMessages.ReloadEnd); + Bsend.console(Main.prefix + "§8-------------------------------"); + Bsend.console(Main.prefix + " §2Plugin successfully reloaded."); + Bsend.console(Main.prefix + "§8-------------------------------"); + } +} diff --git a/src/main/java/net/t2code/alias/Bungee/cmdManagement/RegisterCommands.java b/src/main/java/net/t2code/alias/Bungee/cmdManagement/RegisterCommands.java new file mode 100644 index 0000000..344aa31 --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/cmdManagement/RegisterCommands.java @@ -0,0 +1,114 @@ +package net.t2code.alias.Bungee.cmdManagement; + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Command; +import net.t2code.alias.Bungee.Main; +import net.t2code.alias.Bungee.config.languages.SelectMessages; +import net.t2code.alias.Bungee.objects.Alias_Objekt; +import net.t2code.lib.Bungee.Lib.commands.Bcmd; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Bungee.Lib.replace.BReplace; +import net.t2code.lib.Spigot.Lib.messages.TextBuilder; + +public class RegisterCommands extends Command { + private final String alias; + private final String prefix = Main.prefix; + + public RegisterCommands(String alias) { + super(alias, "t2code.alias.use." + alias.toLowerCase()); + this.alias = alias; + } + + @Override + public void execute(CommandSender sender, String[] args) { + Alias_Objekt Alias = Main.aliasHashMap.get(alias); + + if (!Alias.AliasEnable) { + Bsend.sender(sender, SelectMessages.AliasDisabled); + return; + } + if (sender instanceof ProxiedPlayer) { + ProxiedPlayer player = (ProxiedPlayer) sender; + + if (Alias.AdminEnable) { + if (player.hasPermission(Alias.AdminPermission)) { + if (Alias.AdminCommandEnable) { + for (String cmd : Alias.AdminCommands) { + if (Alias.AdminCommandAsConsole) { + Bcmd.Console(cmd.replace("[player]", player.getName())); + } else { + Bcmd.Player(player, cmd.replace("[player]", player.getName())); + } + } + } + if (Alias.AdminMessageEnable) { + for (String msg : Alias.AdminMessages) { + String text = BReplace.replace(prefix, msg); + String hover = BReplace.replace(prefix, Alias.AdminHover); + if (Alias.AdminTextBuilder) { + TextBuilder textBuilder = new TextBuilder(text); + textBuilder.addHover(hover); + if (Alias.AdminClickEvent) { + textBuilder.addClickEvent(ClickEvent.Action.valueOf(Alias.AdminAction), Alias.AdminActionValue); + } + player.sendMessage(textBuilder.build()); + } else { + Bsend.player(player, text); + } + } + } + return; + } + } + if (Alias.Perm_necessary) { + if (!(player.hasPermission("t2code.alias.use." + alias.toLowerCase()) || player.hasPermission("t2code.alias.admin"))) { + Bsend.player(player, SelectMessages.NoPermissionForCommand.replace("[cmd]", "/" + alias.toLowerCase()) + .replace("[perm]", "t2code.alias.use." + alias.toLowerCase())); + return; + } + } + if (Alias.Command_Enable) { + for (String cmd : Alias.Command) { + if (Alias.CommandAsConsole) { + Bcmd.Console(cmd.replace("[player]", player.getName())); + } else { + Bcmd.Player(player, cmd.replace("[player]", player.getName())); + } + } + } + if (Alias.Message_Enable) { + for (String msg : Alias.Messages) { + String text = BReplace.replace(prefix, msg); + String hover = BReplace.replace(prefix, Alias.Hover); + if (Alias.TextBuilder) { + TextBuilder textBuilder = new TextBuilder(text); + textBuilder.addHover(hover); + if (Alias.ClickEvent) { + textBuilder.addClickEvent(ClickEvent.Action.valueOf(Alias.Action), Alias.ActionValue); + } + player.sendMessage(textBuilder.build()); + } else { + Bsend.player(player, text); + } + } + } + } else { + if (Alias.ConsoleEnable) { + if (Alias.ConsoleCommandEnable) { + for (String cmd : Alias.ConsoleCommands) { + Bcmd.Console(cmd.replace("[player]", sender.getName())); + } + } + if (Alias.ConsoleMessageEnable) { + for (String msg : Alias.ConsoleMessages) { + Bsend.console(BReplace.replace(prefix, msg)); + } + } + } else Bsend.sender(sender, SelectMessages.OnlyForPlayer); + } + return; + } +} + diff --git a/src/main/java/net/t2code/alias/Bungee/config/config/CreateConfig.java b/src/main/java/net/t2code/alias/Bungee/config/config/CreateConfig.java new file mode 100644 index 0000000..1786b34 --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/config/config/CreateConfig.java @@ -0,0 +1,35 @@ +package net.t2code.alias.Bungee.config.config; + +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; +import net.t2code.alias.Bungee.Main; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Bungee.Lib.yamlConfiguration.BConfig; + + +import java.io.File; +import java.io.IOException; + +public class CreateConfig { + public static Integer ConfigVersion = 1; + + public static void configCreate() throws IOException { + Long long_ = Long.valueOf(System.currentTimeMillis()); + + File config = new File(Main.getPath(), "config.yml"); + if (!config.exists()) { + config.createNewFile(); + } + Configuration configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(config); + + configuration.set("ConfigVersion", ConfigVersion); + + //BConfig.set("Plugin.UpdateCheckOnJoin", true, configuration); + BConfig.set("Plugin.language", "english", configuration); + + ConfigurationProvider.getProvider(YamlConfiguration.class).save(configuration, config); + + Bsend.console(Main.prefix + " §2config.yml were successfully created / updated." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } +} diff --git a/src/main/java/net/t2code/alias/Bungee/config/config/CreateExampleAliasConfig.java b/src/main/java/net/t2code/alias/Bungee/config/config/CreateExampleAliasConfig.java new file mode 100644 index 0000000..d585c23 --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/config/config/CreateExampleAliasConfig.java @@ -0,0 +1,107 @@ +package net.t2code.alias.Bungee.config.config; + +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; +import net.t2code.alias.Bungee.Main; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Bungee.Lib.yamlConfiguration.BConfig; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +public class CreateExampleAliasConfig { + + private static Boolean Enable = true; + private static Boolean PermNecessary = true; + + private static Boolean CommandEnable = false; + private static Boolean CommandAsConsole = true; + private static List Commands = Arrays.asList("end"); + + private static Boolean MessageEnable = true; + private static List Messages = Arrays.asList("&5Hi", "&6This is an example message"); + private static Boolean TextBuilder = true; + private static String Hover = "&4T2Code"; + private static Boolean ClickEvent = true; + private static String Action = "OPEN_URL"; + private static String ActionValue = "git.t2code.net"; + + private static Boolean AdminEnable = false; + private static String AdminPermission = "t2code.alias.admin"; + + private static Boolean AdminCommandEnable = true; + private static Boolean AdminCommandAsConsole = true; + private static List AdminCommands = Arrays.asList(); + + private static Boolean AdminMessageEnable = false; + private static List AdminMessages = Arrays.asList(); + private static Boolean AdminTextBuilder = false; + private static String AdminHover = ""; + private static Boolean AdminClickEvent = false; + private static String AdminAction = ""; + private static String AdminActionValue = ""; + + private static Boolean ConsoleEnable = false; + private static Boolean ConsoleCommandEnable = false; + private static List ConsoleCommands = Arrays.asList(); + private static Boolean ConsoleMessageEnable = false; + private static List ConsoleMessages = Arrays.asList(); + + public static void configCreate() throws IOException { + Long long_ = Long.valueOf(System.currentTimeMillis()); + + File directory = new File(Main.getPath(), "Alias"); + if (!directory.exists()) { + directory.mkdir(); + } + File config = new File(Main.getPath(), "Alias/aliasexample.yml"); + if (!config.exists()) { + config.createNewFile(); + } + + Configuration configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(config); + + + BConfig.set("Alias.Enable", Enable, configuration); + BConfig.set("Alias.Permission.Necessary", PermNecessary, configuration); + + BConfig.set("Alias.Command.Enable", CommandEnable, configuration); + BConfig.set("Alias.Command.CommandAsConsole", CommandAsConsole, configuration); + BConfig.set("Alias.Command.Commands", Commands, configuration); + + BConfig.set("Alias.Message.Enable", MessageEnable, configuration); + BConfig.set("Alias.Message.Messages", Messages, configuration); + BConfig.set("Alias.Message.TextBuilder.Enable", TextBuilder, configuration); + BConfig.set("Alias.Message.TextBuilder.Hover", Hover, configuration); + BConfig.set("Alias.Message.TextBuilder.ClickEvent.Enable", ClickEvent, configuration); + BConfig.set("Alias.Message.TextBuilder.ClickEvent.Action", Action, configuration); + BConfig.set("Alias.Message.TextBuilder.ClickEvent.ActionValue", ActionValue, configuration); + + + BConfig.set("Alias.Admin.Enable", AdminEnable, configuration); + BConfig.set("Alias.Admin.Permission", AdminPermission, configuration); + + BConfig.set("Alias.Admin.Command.Enable", AdminCommandEnable, configuration); + BConfig.set("Alias.Admin.Command.CommandAsConsole", AdminCommandAsConsole, configuration); + BConfig.set("Alias.Admin.Command.Commands", AdminCommands, configuration); + + BConfig.set("Alias.Admin.Message.Enable", AdminMessageEnable, configuration); + BConfig.set("Alias.Admin.Message.Messages", AdminMessages, configuration); + BConfig.set("Alias.Admin.Message.TextBuilder.Enable", AdminTextBuilder, configuration); + BConfig.set("Alias.Admin.Message.TextBuilder.Hover", AdminHover, configuration); + BConfig.set("Alias.Admin.Message.TextBuilder.ClickEvent.Enable", AdminClickEvent, configuration); + BConfig.set("Alias.Admin.Message.TextBuilder.ClickEvent.Action", AdminAction, configuration); + BConfig.set("Alias.Admin.Message.TextBuilder.ClickEvent.ActionValue", AdminActionValue, configuration); + + BConfig.set("Alias.Console.Enable", ConsoleEnable, configuration); + BConfig.set("Alias.Console.Command.Enable", ConsoleCommandEnable, configuration); + BConfig.set("Alias.Console.Command.Commands", ConsoleCommands, configuration); + BConfig.set("Alias.Console.Message.Enable", ConsoleMessageEnable, configuration); + BConfig.set("Alias.Console.Message.Messages", ConsoleMessages, configuration); + ConfigurationProvider.getProvider(YamlConfiguration.class).save(configuration, config); + Bsend.console(Main.prefix + " §2config.yml were successfully created / updated." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } +} diff --git a/src/main/java/net/t2code/alias/Bungee/config/config/SelectAlias.java b/src/main/java/net/t2code/alias/Bungee/config/config/SelectAlias.java new file mode 100644 index 0000000..7b37c96 --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/config/config/SelectAlias.java @@ -0,0 +1,68 @@ +package net.t2code.alias.Bungee.config.config; + +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; +import net.t2code.alias.Bungee.Main; +import net.t2code.alias.Bungee.system.AliasRegister; +import net.t2code.alias.Bungee.objects.Alias_Objekt; + +import java.io.File; +import java.io.IOException; + +public class SelectAlias { + public static void onSelect() throws IOException { + Main.aliasHashMap.clear(); + Main.allAliases.clear(); + File f = new File(Main.getPath() + "/Alias/"); + File[] fileArray = f.listFiles(); + + assert fileArray != null; + for (File config_gui : fileArray) { + Main.allAliases.add(config_gui.getName().replace(".yml", "")); + String sub = config_gui.getName().substring(config_gui.getName().length() - 4); + if (sub.equals(".yml")) { + Configuration configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(config_gui); + + Alias_Objekt alias = new Alias_Objekt( + configuration.getBoolean("Alias.Enable"), + configuration.getBoolean("Alias.Permission.Necessary"), + + configuration.getBoolean("Alias.Command.Enable"), + configuration.getBoolean("Alias.Command.CommandAsConsole"), + configuration.getStringList("Alias.Command.Commands"), + + configuration.getBoolean("Alias.Message.Enable"), + configuration.getStringList("Alias.Message.Messages"), + configuration.getBoolean("Alias.Message.TextBuilder.Enable"), + configuration.getString("Alias.Message.TextBuilder.Hover"), + configuration.getBoolean("Alias.Message.TextBuilder.ClickEvent.Enable"), + configuration.getString("Alias.Message.TextBuilder.ClickEvent.Action"), + configuration.getString("Alias.Message.TextBuilder.ClickEvent.ActionValue"), + + configuration.getBoolean("Alias.Admin.Enable"), + configuration.getString("Alias.Admin.Permission"), + + configuration.getBoolean("Alias.Admin.Command.Enable"), + configuration.getBoolean("Alias.Admin.Command.CommandAsConsole"), + configuration.getStringList("Alias.Admin.Command.Commands"), + + configuration.getBoolean("Alias.Admin.Message.Enable"), + configuration.getStringList("Alias.Admin.Message.Messages"), + configuration.getBoolean("Alias.Admin.Message.TextBuilder.Enable"), + configuration.getString("Alias.Admin.Message.TextBuilder.Hover"), + configuration.getBoolean("Alias.Admin.Message.TextBuilder.ClickEvent.Enable"), + configuration.getString("Alias.Admin.Message.TextBuilder.ClickEvent.Action"), + configuration.getString("Alias.Admin.Message.TextBuilder.ClickEvent.ActionValue"), + + configuration.getBoolean("Alias.Console.Enable"), + configuration.getBoolean("Alias.Console.Command.Enable"), + configuration.getStringList("Alias.Console.Command.Commands"), + configuration.getBoolean("Alias.Console.Message.Enable"), + configuration.getStringList("Alias.Console.Message.Messages")); + Main.aliasHashMap.put(config_gui.getName().replace(".yml", ""), alias); + AliasRegister.onRegister(); + } + } + } +} diff --git a/src/main/java/net/t2code/alias/Bungee/config/config/SelectConfig.java b/src/main/java/net/t2code/alias/Bungee/config/config/SelectConfig.java new file mode 100644 index 0000000..a322f91 --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/config/config/SelectConfig.java @@ -0,0 +1,26 @@ +package net.t2code.alias.Bungee.config.config; + +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; +import net.t2code.alias.Bungee.Main; + +import java.io.File; +import java.io.IOException; + +public class SelectConfig { + public static Integer ConfigVersion; + public static Boolean UpdateCheckOnJoin; + public static String language; + public static Boolean Bungee; + public static String thisServer; + public static void onSelect() throws IOException { + File config = new File(Main.getPath(), "config.yml"); + Configuration configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(config); + + ConfigVersion =configuration.getInt("ConfigVersion"); + + // UpdateCheckOnJoin = configuration.getBoolean("Plugin.UpdateCheckOnJoin"); + language = configuration.getString("Plugin.language"); + } +} diff --git a/src/main/java/net/t2code/alias/Bungee/config/languages/LanguagesCreate.java b/src/main/java/net/t2code/alias/Bungee/config/languages/LanguagesCreate.java new file mode 100644 index 0000000..a85bcea --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/config/languages/LanguagesCreate.java @@ -0,0 +1,66 @@ +package net.t2code.alias.Bungee.config.languages; + +import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; +import net.t2code.alias.Bungee.Main; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Bungee.Lib.yamlConfiguration.BConfig; + +import java.io.File; +import java.io.IOException; + +public class LanguagesCreate { + private static Plugin plugin = Main.plugin; + + public static void langCreate() throws IOException { + Bsend.debug(plugin, "§4Language files are created / updated..."); + Long long_ = Long.valueOf(System.currentTimeMillis()); + + /** + * + * ENGLISH + * + */ + File directory = new File(Main.getPath(), "languages"); + if (!directory.exists()) { + directory.mkdir(); + } + File messagesEN = new File(Main.getPath(), "languages/english.yml"); + if (!messagesEN.exists()) { + messagesEN.createNewFile(); + } + Configuration configurationEN = ConfigurationProvider.getProvider(YamlConfiguration.class).load(messagesEN); + + BConfig.set("Plugin.OnlyForPlayer", MSG.EN_OnlyForPlayer, configurationEN); + BConfig.set("Plugin.AliasDisabled", MSG.EN_Disabled, configurationEN); + BConfig.set("Plugin.Reload.Start", MSG.EN_ReloadStart, configurationEN); + BConfig.set("Plugin.Reload.End", MSG.EN_ReloadEnd, configurationEN); + BConfig.set("Plugin.ForCommand", MSG.EN_NoPermissionForCommand, configurationEN); + + ConfigurationProvider.getProvider(YamlConfiguration.class).save(configurationEN, messagesEN); + + /** + * + * GERMAN + * + */ + + File messagesDE = new File(Main.getPath(), "languages/german.yml"); + if (!messagesDE.exists()) { + messagesDE.createNewFile(); + } + Configuration configurationDE = ConfigurationProvider.getProvider(YamlConfiguration.class).load(messagesDE); + + BConfig.set("Plugin.OnlyForPlayer", MSG.DE_OnlyForPlayer, configurationDE); + BConfig.set("Plugin.AliasDisabled", MSG.DE_Disabled, configurationDE); + BConfig.set("Plugin.Reload.Start", MSG.DE_ReloadStart, configurationDE); + BConfig.set("Plugin.Reload.End", MSG.DE_ReloadEnd, configurationDE); + BConfig.set("Plugin.ForCommand", MSG.DE_NoPermissionForCommand, configurationDE); + + ConfigurationProvider.getProvider(YamlConfiguration.class).save(configurationEN, messagesDE); + + Bsend.console(Main.prefix + " §2Language files were successfully created / updated." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } +} diff --git a/src/main/java/net/t2code/alias/Bungee/config/languages/MSG.java b/src/main/java/net/t2code/alias/Bungee/config/languages/MSG.java new file mode 100644 index 0000000..01cdd07 --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/config/languages/MSG.java @@ -0,0 +1,49 @@ +// This claas was created by JaTiTV + +// ----------------------------- +// _____ _____ _ _ _____ +// / ____/ ____| | | |_ _| +// | | | | __| | | | | | +// | | | | |_ | | | | | | +// | |___| |__| | |__| |_| |_ +// \_____\_____|\____/|_____| +// ----------------------------- + +package net.t2code.alias.Bungee.config.languages; + +public class MSG { + + // EN + + public static String EN_OnlyForPlayer = "[prefix] &cThis command is for players only!"; + + public static String EN_Disabled = "Unknown command. Type ''/help'' for help."; + + public static String EN_ReloadStart = "[prefix] &6Plugin is reloaded..."; + public static String EN_ReloadEnd = "[prefix] &2Plugin was successfully reloaded."; + + public static String EN_NoPermissionForCommand = "[prefix] &cFor &b[cmd] &cyou lack the permission &6[perm]&c!"; + + // DE + public static String DE_OnlyForPlayer = "[prefix] &cDieser Command ist nur f[ue]r Spieler!"; + + public static String DE_Disabled = "Unknown command. Type ''/help'' for help."; + + public static String DE_ReloadStart = "[prefix] &6Plugin wird neu geladen..."; + public static String DE_ReloadEnd = "[prefix] &2Plugin wurde erfolgreich neu geladen."; + + public static String DE_NoPermissionForCommand = "[prefix] &cF[ue]r &b[cmd] &cfehlt dir die Permission &6[perm]&c!"; + // FR + + + // NO + public static String NO_OnlyForPlayer = "[prefix] &cDenne kommandoen er for spillere kun!"; + + public static String NO_Disabled = "Unknown command. Type ''/help'' for help."; + + public static String NO_ReloadStart = "[prefix] &6Pluginet blir relastet..."; + public static String NO_ReloadEnd = "[prefix] &2Pluginet har blitt lastet inn på nytt."; + + public static String NO_NoPermissionForCommand = "[prefix] &cFor &b[cmd] &cmangler du tillatelsen &6[perm]&c!"; + +} diff --git a/src/main/java/net/t2code/alias/Bungee/config/languages/SelectMessages.java b/src/main/java/net/t2code/alias/Bungee/config/languages/SelectMessages.java new file mode 100644 index 0000000..aedd8ce --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/config/languages/SelectMessages.java @@ -0,0 +1,51 @@ +package net.t2code.alias.Bungee.config.languages; + +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; +import net.t2code.alias.Bungee.Main; +import net.t2code.alias.Bungee.config.config.SelectConfig; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Bungee.Lib.yamlConfiguration.BConfig; + +import java.io.File; +import java.io.IOException; + +public class SelectMessages { + private static String prefix = Main.prefix; + + public static String selectMSG; + + public static String OnlyForPlayer; + public static String ReloadStart; + public static String ReloadEnd; + + public static String NoPermissionForCommand; + public static String AliasDisabled; + + + public static void onSelect(String Prefix)throws IOException { + File msg = new File(Main.getPath(), "languages/" + SelectConfig.language + ".yml"); + Bsend.debug(Main.plugin, "§4Select language..."); + Long long_ = Long.valueOf(System.currentTimeMillis()); + if (!msg.isFile()) { + Bsend.console(Prefix); + Bsend.console(Prefix + " §4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + Bsend.console(Prefix + " §4The selected §c" + SelectConfig.language + " §4language file was not found."); + Bsend.console(Prefix + " §6The default language §eEnglish §6is used!"); + Bsend.console(Prefix + " §4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + Bsend.console(Prefix); + msg = new File(Main.getPath(), "languages/" + "english.yml"); + selectMSG = "english"; + } else selectMSG = SelectConfig.language; + Configuration configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(msg); + + OnlyForPlayer = BConfig.select(prefix, "Plugin.OnlyForPlayer", configuration); + AliasDisabled = BConfig.select(prefix, "Plugin.AliasDisabled", configuration); + ReloadStart = BConfig.select(prefix, "Plugin.Reload.Start", configuration); + ReloadEnd = BConfig.select(prefix, "Plugin.Reload.End", configuration); + NoPermissionForCommand = BConfig.select(prefix, "Plugin.ForCommand", configuration); + + Bsend.console(Prefix + " §2Language successfully selected to: §6" + selectMSG + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } +} diff --git a/src/main/java/net/t2code/alias/Bungee/objects/Alias_Objekt.java b/src/main/java/net/t2code/alias/Bungee/objects/Alias_Objekt.java new file mode 100644 index 0000000..2374f1d --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/objects/Alias_Objekt.java @@ -0,0 +1,103 @@ +package net.t2code.alias.Bungee.objects; + +import java.util.List; + +public class Alias_Objekt { + public Boolean AliasEnable; + public Boolean Command_Enable; + public Boolean Perm_necessary; + + public Boolean CommandAsConsole; + public List Command; + public Boolean Message_Enable; + public List Messages; + public Boolean TextBuilder; + public String Hover; + public Boolean ClickEvent; + public String Action; + public String ActionValue; + + public Boolean AdminEnable; + public String AdminPermission; + public Boolean AdminCommandEnable; + public Boolean AdminCommandAsConsole; + public List AdminCommands; + public Boolean AdminMessageEnable; + public List AdminMessages; + public Boolean AdminTextBuilder; + public String AdminHover; + public Boolean AdminClickEvent; + public String AdminAction; + public String AdminActionValue; + public Boolean ConsoleEnable; + public Boolean ConsoleCommandEnable; + public List ConsoleCommands; + public Boolean ConsoleMessageEnable; + public List ConsoleMessages; + + public Alias_Objekt(Boolean AliasEnable, + Boolean Perm_necessary, + + Boolean Command_Enable, + Boolean CommandAsConsole, + List Command, + Boolean Message_Enable, + List Messages, + Boolean TextBuilder, + String Hover, + Boolean ClickEvent, + String Action, + String ActionValue, + + Boolean AdminEnable, + String AdminPermission, + Boolean AdminCommandEnable, + Boolean AdminCommandAsConsole, + List AdminCommands, + Boolean AdminMessageEnable, + List AdminMessages, + Boolean AdminTextBuilder, + String AdminHover, + Boolean AdminClickEvent, + String AdminAction, + String AdminActionValue, + + Boolean ConsoleEnable, + Boolean ConsoleCommandEnable, + List ConsoleCommands, + Boolean ConsoleMessageEnable, + List ConsoleMessages) { + this.AliasEnable = AliasEnable; + this.Perm_necessary = Perm_necessary; + + this.Command_Enable = Command_Enable; + this.CommandAsConsole = CommandAsConsole; + this.Command = Command; + this.Message_Enable = Message_Enable; + this.Messages = Messages; + this.TextBuilder = TextBuilder; + this.Hover = Hover; + this.ClickEvent = ClickEvent; + this.Action = Action; + this.ActionValue = ActionValue; + this.AdminEnable = AdminEnable; + this.AdminPermission = AdminPermission; + this.AdminCommandEnable = AdminCommandEnable; + this.AdminCommandAsConsole = AdminCommandAsConsole; + this.AdminCommands = AdminCommands; + this.AdminMessageEnable = AdminMessageEnable; + this.AdminMessages = AdminMessages; + this.AdminTextBuilder = AdminTextBuilder; + this.AdminHover = AdminHover; + this.AdminClickEvent = AdminClickEvent; + this.AdminAction = AdminAction; + this.AdminActionValue = AdminActionValue; + + this.ConsoleEnable = ConsoleEnable; + this.ConsoleCommandEnable = ConsoleCommandEnable; + this.ConsoleCommands = ConsoleCommands; + this.ConsoleMessageEnable = ConsoleMessageEnable; + this.ConsoleMessages = ConsoleMessages; + + } +} diff --git a/src/main/java/net/t2code/alias/Bungee/system/AliasRegister.java b/src/main/java/net/t2code/alias/Bungee/system/AliasRegister.java new file mode 100644 index 0000000..255a5dc --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/system/AliasRegister.java @@ -0,0 +1,21 @@ +package net.t2code.alias.Bungee.system; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.plugin.Plugin; +import net.t2code.alias.Bungee.Main; +import net.t2code.alias.Bungee.cmdManagement.RegisterCommands; +import net.t2code.lib.Bungee.Lib.messages.Bsend; + +public class AliasRegister { + public static void onRegister() { + Plugin plugin = Main.plugin; + for (String alias : Main.allAliases) { + if (Main.aliasHashMap.get(alias) != null) { + if (Main.aliasHashMap.get(alias).AliasEnable) { + Bsend.debug(plugin, "Alias register 1.18_R1"); + ProxyServer.getInstance().getPluginManager().registerCommand(Main.plugin, new RegisterCommands(alias)); + } + } else Bsend.warning(plugin, " §4AliasHashmap is null!"); + } + } +} diff --git a/src/main/java/net/t2code/alias/Bungee/system/Load.java b/src/main/java/net/t2code/alias/Bungee/system/Load.java new file mode 100644 index 0000000..f4c8886 --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/system/Load.java @@ -0,0 +1,70 @@ +package net.t2code.alias.Bungee.system; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.plugin.Plugin; +import net.t2code.alias.Bungee.Main; +import net.t2code.alias.Bungee.cmdManagement.Alias_CmdExecuter; +import net.t2code.alias.Bungee.config.config.CreateConfig; +import net.t2code.alias.Bungee.config.config.CreateExampleAliasConfig; +import net.t2code.alias.Bungee.config.config.SelectAlias; +import net.t2code.alias.Bungee.config.config.SelectConfig; +import net.t2code.alias.Bungee.config.languages.LanguagesCreate; +import net.t2code.alias.Bungee.config.languages.SelectMessages; +import net.t2code.lib.Bungee.Lib.messages.BT2CodeTemplate; +import net.t2code.lib.Bungee.Lib.update.BUpdateAPI; + + + +import java.io.File; +import java.io.IOException; + +public class Load { + static Plugin plugin = Main.plugin; + public static void onLoad(String prefix, String autor, String version, String spigot, int spigotID, String discord, int bstatsID) { + Long long_ = BT2CodeTemplate.onLoadHeader(prefix,autor,version,spigot,discord); + if (!Main.getPath().exists()) Main.getPath().mkdir(); + ProxyServer.getInstance().getPluginManager().registerCommand(Main.plugin, new Alias_CmdExecuter()); + loadReload(); + BUpdateAPI.onUpdateCheckTimer(plugin, prefix, spigot, discord, spigotID); + + BT2CodeTemplate.onLoadFooter(prefix, long_); + Metrics metrics = new Metrics(plugin, bstatsID); + } + + public static void loadReload() { + + if (!new File(Main.getPath(), "config.yml").exists()) { + try { + CreateExampleAliasConfig.configCreate(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + try { + CreateConfig.configCreate(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + LanguagesCreate.langCreate(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + SelectConfig.onSelect(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + SelectMessages.onSelect(Main.prefix); + } catch (IOException e) { + e.printStackTrace(); + } + try { + SelectAlias.onSelect(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/net/t2code/alias/Bungee/system/Metrics.java b/src/main/java/net/t2code/alias/Bungee/system/Metrics.java new file mode 100644 index 0000000..792ac9d --- /dev/null +++ b/src/main/java/net/t2code/alias/Bungee/system/Metrics.java @@ -0,0 +1,846 @@ +package net.t2code.alias.Bungee.system; + +import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; + +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +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; + +public class Metrics { + + private final Plugin plugin; + + private final MetricsBase metricsBase; + + private boolean enabled; + + private String serverUUID; + + private boolean logErrors = false; + + private boolean logSentData; + + private boolean logResponseStatusText; + + /** + * 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(Plugin plugin, int serviceId) { + this.plugin = plugin; + try { + loadConfig(); + } catch (IOException e) { + // Failed to load configuration + plugin.getLogger().log(Level.WARNING, "Failed to load bStats config!", e); + metricsBase = null; + return; + } + metricsBase = + new MetricsBase( + "bungeecord", + serverUUID, + serviceId, + enabled, + this::appendPlatformData, + this::appendServiceData, + null, + () -> true, + (message, error) -> this.plugin.getLogger().log(Level.WARNING, message, error), + (message) -> this.plugin.getLogger().log(Level.INFO, message), + logErrors, + logSentData, + logResponseStatusText); + } + + /** Loads the bStats configuration. */ + private void loadConfig() throws IOException { + File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); + bStatsFolder.mkdirs(); + File configFile = new File(bStatsFolder, "config.yml"); + if (!configFile.exists()) { + writeFile( + configFile, + "# bStats (https://bStats.org) collects some basic information for plugin authors, like how", + "# many people use their plugin and their total player count. It's recommended to keep bStats", + "# enabled, but if you're not comfortable with this, you can turn this setting off. There is no", + "# performance penalty associated with having metrics enabled, and data sent to bStats is fully", + "# anonymous.", + "enabled: true", + "serverUuid: \"" + UUID.randomUUID() + "\"", + "logFailedRequests: false", + "logSentData: false", + "logResponseStatusText: false"); + } + Configuration configuration = + ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile); + // Load configuration + enabled = configuration.getBoolean("enabled", true); + serverUUID = configuration.getString("serverUuid"); + logErrors = configuration.getBoolean("logFailedRequests", false); + logSentData = configuration.getBoolean("logSentData", false); + logResponseStatusText = configuration.getBoolean("logResponseStatusText", false); + } + + private void writeFile(File file, String... lines) throws IOException { + try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file))) { + for (String line : lines) { + bufferedWriter.write(line); + bufferedWriter.newLine(); + } + } + } + + /** + * 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", plugin.getProxy().getOnlineCount()); + builder.appendField("managedServers", plugin.getProxy().getServers().size()); + builder.appendField("onlineMode", plugin.getProxy().getConfig().isOnlineMode() ? 1 : 0); + builder.appendField("bungeecordVersion", plugin.getProxy().getVersion()); + 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()); + } + + public static class MetricsBase { + + /** The version of the Metrics class. */ + public static final String METRICS_VERSION = "2.2.1"; + + private static final ScheduledExecutorService scheduler = + Executors.newScheduledThreadPool(1, task -> new Thread(task, "bStats-Metrics")); + + private static final String REPORT_URL = "https://bStats.org/api/v2/data/%s"; + + 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) { + 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) { + startSubmitting(); + } + } + + public void addCustomChart(CustomChart chart) { + this.customCharts.add(chart); + } + + 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 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 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 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 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(); + } + } + + 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 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(); + } + } + + /** + * 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; + } + } + } +} diff --git a/src/main/java/net/t2code/alias/Util.java b/src/main/java/net/t2code/alias/Util.java new file mode 100644 index 0000000..d01730b --- /dev/null +++ b/src/main/java/net/t2code/alias/Util.java @@ -0,0 +1,18 @@ +package net.t2code.alias; + +import lombok.Getter; + +public class Util { + @Getter + public static double requiredT2CodeLibVersion = 10.6; + @Getter + public static String Prefix = "§8[§4T2Code§7-§aAlias§5Bungee§8]"; + @Getter + public static Integer SpigotID = 00000; + @Getter + public static Integer BstatsID = 00000; + @Getter + public static String Spigot = "https://www.spigotmc.org/resources/" + SpigotID; + @Getter + public static String Discord = "http://dc.t2code.net"; +} diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml new file mode 100644 index 0000000..31b604a --- /dev/null +++ b/src/main/resources/bungee.yml @@ -0,0 +1,6 @@ +name: T2C-AliasBungee +version: ${project.version} +main: net.t2code.alias.Bungee.Main +description: T2Code Alias Plugin +author: JaTiTV +softdepends: [T2CodeLib] diff --git a/target/classes/bungee.yml b/target/classes/bungee.yml new file mode 100644 index 0000000..686d33c --- /dev/null +++ b/target/classes/bungee.yml @@ -0,0 +1,6 @@ +name: T2C-AliasBungee +version: 0.0.1 +main: net.t2code.alias.Bungee.Main +description: T2Code Alias Plugin +author: JaTiTV +softdepends: [T2CodeLib] diff --git a/target/classes/net/t2code/alias/Bungee/Main.class b/target/classes/net/t2code/alias/Bungee/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..dd216530ebf852f8f5181416d08308f117f76e32 GIT binary patch literal 4389 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 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/cmdManagement/Alias_CmdExecuter.class b/target/classes/net/t2code/alias/Bungee/cmdManagement/Alias_CmdExecuter.class new file mode 100644 index 0000000000000000000000000000000000000000..84239281eaaac6ff9e3e2543dab96ffc2e8a48c5 GIT binary patch literal 4174 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 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/cmdManagement/RegisterCommands.class b/target/classes/net/t2code/alias/Bungee/cmdManagement/RegisterCommands.class new file mode 100644 index 0000000000000000000000000000000000000000..8ed8f5d7fb91b4c3219ff5f48118429015b6b4b9 GIT binary patch literal 5405 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

)55ho6 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 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/config/languages/MSG.class b/target/classes/net/t2code/alias/Bungee/config/languages/MSG.class new file mode 100644 index 0000000000000000000000000000000000000000..aedafae9889e6d0704c95a1a3bf7bbe80c6a8714 GIT binary patch literal 1757 zcmb7^-&Y$&6vw|qX$dd_uC+B<>tI^~6|yZVRf$+jp#Go%8;W{39M7_uBvY2zoY`G5 z|BJ8w0iJ#E93On~%|FWHogvK{)CbR=?48No`OLlFxpV*c^Vi=1yoYb6FosJL80WZ* zD-3hbgYN@B3UtTcJ$^33l;KKEX_am;Tv}W@D51o#eAqLxt$sKX3*mlOB_fPZPXpZ& zG;GI4^rE0IO(J3)_2(xsh3N@!j+Zb)Yqd=MbTy1y(hnjPB>tmJcck>gShrQjZJh-j znfOndk13w5#&^4f*^bSgqcV6qMU2hVDBW2vVUA(xnLg3+nSK#XRqXeBQdBB_S4O=` z#f4^vRU4AW@rsRSnl`AbBsh*_tAtk>M3LOuUX*o|wrLp|#X(E9s#Ul8I>&2v^$e|k z>RinKSo}XC>w;AsL zZJ)Z5i8Ny1rrcAZGb7rEnLIM0*;6u-#=#djDi%Ih-x@t5o757=UF)1CXQA&h!<}NU z7y6zl(-K-{q9Y>`Sr0_6a`+Z8Lx>TP?=##hC_|Am(~?4(b{ut#RAF}nX=8eqQ^gaI z4}nhTHHL=;F5EuPw9vXOyHP4y%Fs`WLd1(=f57pf#g_^HUt+J1gdWzV)>53DA4M!R zh40EV>8XfhCRe7N)*o|hSoU0F_n%rnk`Iwi>?aKC z1@J;uQxoY>+M<<-lmrM;86_mjg`(c&*t6s^k^fz1hVe~mFbuOhO3OxedMwSpz2dfe z#9MUICMkSz&@VQtb~K%;vby{*zqQEOnS39UiPl$ zxaO5}yy4xd^QZo^co&_UoqZ+{aKGYaf*$GbkRDZm9#h!NUk+ zg#<;xN;ER8H@Txa-5D#(Rn5>fTkUntJm+dk(@h2`&z)h-nV^$m?a4|#2??th)-9f& zc1pUL?{#$}%S&N2p;pEkhOjWs)$-g{#bS$swOB`1YQ-WqvkYA^U#;hZuOkthRIwDO zO@wee?vQY&g7vtIq5EdmXDlj*PLXV-3ms6S~vcPTIOGdBlg}*+_$K5=` z-k5iIA$xk4I_@JtE9$CmnmX)RxU45(Lgg+AyA|xg-YP(*r)-B87*=Q8Qi+?+h+g0+ z-7s|9!{*U2dO#@Jui#z~TpJgml(bATNt)CQmk;F_*2IohLPBhN5x-x-LG)4tbz4B& zQ+qhKBtul} zl=BhIkuA}4njJMQCz`WdGaHvN$eF-lnF+z7+fmo%*)|!& zWO!Mvt#Y45U{l61@-A2iVFbq|j4F6o6vdv3>{pd^Pz{R;eITU*NHBza$5QFT62<}; zRU#r#Fs2m@znI*T=IE9g#z{OX;V}iLaGIf07_f|7mCSI-n$)RNFsu+gX5sH(Wup2F z&9{2zscjFZq5j3YyZY*-pKncYiD^42s`w;2IfkP}gDD3*9mKQDuNVY6Qk@gdWg z8n8;khBhTy-Wi;gU??bnig`yx7M9fD)YAB=y?$uu6h8wDrz*n`w8a}6$t?wDnRe=V zR#fnW@N8w38#1Uo%MKnCH^L#^*2WE<713}NOnNd^J2K8wkp@9I#zoBIX-6wLLgYyW zPYIC~{)V?M;~DA;)dKydcfxZDo)_#PpPg1^ytv3r;qJ2v1^{y-T-ebz`c!0;ylW&rnmaMX#q0RM$s$EJIULH~FAj80V!C5ms>t zSsBe3)k?bf4;Jg33DGC_c^O{rehzB!X2qPKJIgZt0w-7vd*G!8S+J?IHu^{^Ur-G7 z!aJ(mRTU8Px-6l?KPaelhAp>-ITEByXU?XyV&GA@|9plQMZ2&id{1~Ozb1|hE$ood z`!h!HehH^7x0K<2XJ1p@tKvc!Z3M3xdKXC)VJcFhLZStFGeO&%347j5pz>zIi#HRD zX|4r1j|Lh)q(7BrMst0~Rj{9ksKG}xify0~AJeG#4EO|}(q9OlVSuz&7o@!JLa%2wQUv$F5*JR9Qp#e z4k2*Z7g(}-gjNHM4=&4)T6T3&nSYFDWn@TL6M1L`=_?44Rw5#g%;5xC^!VU3vXMO5 zsL#L>bjhb3L7(&KDM3H&)6WX}1)si9>BlRc#c3KNuhBqGch2GsK8v>_?=9FW0$%F{ zd=xE2ug7M}Q5QDQ3!@bYL~(#Jew-d;lh{aAxe1qu<1)5j23s+Y7=EP()irFxALzt& zlKhjN0)Ihe61KCw==KuW;U@{7d->nYnsE_dP*QiYdVGnmD4Ew_;%j_EwtP!gD5&`x t^AaQpJ@xpGR_ciR5@h_afSXni6okWRd@zHoaD-JLr-}Z4q_rAc{ujhNG_n8y literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/objects/Alias_Objekt.class b/target/classes/net/t2code/alias/Bungee/objects/Alias_Objekt.class new file mode 100644 index 0000000000000000000000000000000000000000..1e83bfcc362cf02c3350af8565d3fb1a090727d1 GIT binary patch literal 3228 zcmeHJOH&+G6#g0ph8ZsJ=j9QNMuiJuOpL||iNXjbW`HCR67wR>&`ug=daUUgN;bN3 z3E^b-n!XMy|vOMQZr)Gvn1170pJpfNi?B3 zj+jCVS{-!nxO;9Y?*_Tl>eh~zEjwtP^8>$p%|Y|T(lOaD(m5YA+7;D-3X`I||K*>0%I4R}Ky-3`0AJM?p%f zE?z17`BcUa%d+yQ!kDyQ<|T7pUHdZ%uW*O9C=_zrvkI?qe*3!jWqG0E=eNBQ`_C!7 zfj1qrTrciS#>Nq@D%`5hi|10C;~j-H_E*lCIiI za$=)Xq{v4lV*iPKPDuKfWiLGcDYkuzloK|6%<4zaany56S)=O|JF2BjZa9dg>HAFN z%=m$~QYmbCrS<9;xHnVGy7>*aL%BUl~UGQ^7+EhQ-7P7;hEwr2|*LxWX3__2t|m5 zEwXfpkY~CUh@~3` zKE;wqHuNQF6hCQTgP)X7{3LQ>N!7%Xf{7)?5=-JFmZV55DNaKlQW^1+m^Aq59s-Zf z{5c)`JF;ge>%ja5$4pto&9p^_Id9Qzbj+g9=oX7XqgyRTjE-B38{KB{s?iCH*NskE zyk&H|g)v%LoHx3|;%%clE#5J@%i=wwyDhF5-D5Flbg#vSM)z4P7~OBNX!L-^b)yF@ zZW=vgv10VF#ciXt#k$cW7Wa%EwRm9kn8jnG$1R@zN_%cbj{bi|_b^})F)SfLw}wvK zKp$NYG;UHPLl>`QOko8Vu!_rc3%H8gNaGG=t&wLPcj@mT3B8MZ)bBnDB<&#{V4u8S zlZt@9#Q7&;&CkS{UucHUh+;F<8N$a7?S-Z(+;apm>zI)T!oy}k z%)po+=3t8;W?!oy=3iV8Gp|h$b1xx?*_RZ={A(A)4CLSXfNy{35X3C(6vRC262wgG z7Q|fa5yUL)6~sL36T}Sc7sMPK5X3AT6vR9n62wd#7Q|fCf|!jXf|!q^f|!Y8f|!fr c*d;s|P2~~Iv6{6-Xgqo!^TgN!Wi=uA8~PC>3jhEB literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/system/AliasRegister.class b/target/classes/net/t2code/alias/Bungee/system/AliasRegister.class new file mode 100644 index 0000000000000000000000000000000000000000..6d8c57e3ad345c8816a26a66a645d9eba5603429 GIT binary patch literal 1895 zcma)7-%}e^6#gzrSduJ-21;A4G_i_-rmVEIqN!~GTMJESBsI2Gi+7W2Si0F|b~m;B zDg6t0@Zv4?g(nf79{Txw{)!YCtoS-Me?sIrlr?`Oewj{`&D}0JGRgp${9>ns>2oH-yGb zgS*;7+iD7-mAPS&>!#Um%Efr;D8r(RdQ8O-h8a@aH0Na~;WC^k`FPr%VQTY^!?#L? z>lIVTU_`;FiW3-P80lfdFkpDX;hyaabD1tEI=$3+MhQeWWu>ESgnos?jto>sz zi3@mF#SAVor2Q8+Ev}nl53e77!M07oEy6pC%L=Zjcu&$9;Eh^P)_P!D<7Qh7;C(8M zA2#cVCKXmV*_r8?xwX}q6pFa2;6oMHaGfC^L2Vj(S7aqxwuI~QrXb#`W(EhtfOvX;U;78ES1_y{){&dQ@-jZ$&!r(0Fw zJQ1X>G!XiZYP!*C_S zk1wn)L-kf8Fl-6S(^f;47wuMyTMajbWt3&(uTZB&MHC^Uf=?8zs;J^#Scg~1=mm>m zs9VzTFoxy-RgqrYg(rlOs73>*F`Ul+vOVj|NA^RDZ)OcQYqd=?C)IOb#RDlFlBU9VmBpFxbKI()k~7lHnODw0MKz1#;yboGWzj&ab!>u3q56_s}}H z^b8YInYmqju!|cV+@df)VfjJfIZ7Se-9~aM^XV==+y47oi7W<*Y=TgMzF%>|HI6|V zv&TpS%k{!nl=%~{wPJ3xI$Xn3=B;tP}t>9|~r~W`mLGC3I NFMW2_>2)8Be*kU81VR7+ literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/system/Load.class b/target/classes/net/t2code/alias/Bungee/system/Load.class new file mode 100644 index 0000000000000000000000000000000000000000..30cb54f7b9db54f2dc741b988c94b0feb5939492 GIT binary patch literal 3266 zcmb_eX;T|V5Pf5g74rJR#xcHaVq1XC+W5lY5Q6|CTNq*iHjW*#k_NF@+Et_#f!z0f zUmx-Z^4U%msN$;pfc&FWrBZpbD}e}?E0r%hJ+m|2uU}7h&mVvP_B((J_$i1jsM1ia zqXxACJ7>&U(@2|k${3E%$b>6Ud)2Znw_Bhp)I1(U0CgIII<`U=Xt$+nxa|oiDUGxh zH+lJl3pgVTdF_VMROv;=IDu~;5XBjNwmHPL#Aa5XesHAnC>)r36)e?jxk`RB^B*K zgND62p20r)uFq<49zC&oz@hnadymBL5NLlufX)`8N zczPWbS#O)MVs}>^Njs$@gl2l??+`fbK`6z36?a`4S_LkzM{gpN^r2*=?HWCb`N?o5 z**_-}1y_=v7E}e%21CPH9p}(45L(OQwcrZu$jKDxm$|T$$(VLh;6`Xo!d4vb+GtBj zQJby)z*~!Bjne=18Kwiaj8oG5n zk81+EmUAUyyV47$HfyE}a(GH$ZzxiEz6 z_KZXX>K)skg{NiW;i#2S_s4lELYJ}rx4bUn_v_A}jtFin)sF$kVTc7zY+OIQv~M2Q z5EVFC;rNOxTME{YWcf+tgSd%Xsvr&voO&8ZBhBLhyudIg9DB-2wasVJD(PcN$EeCz zzYLXYM@3O8@uD0Y#~lrKbxf#h)x924--1yZ!a2!s_0O5CtvO;98tnw>pTMLX2KtrNzkzPlJ zD=fzGAc!fXG)(KTl;w_1oK@|p;PsMdS@Qi-iNzIv62wEKHDq+yN@-|-xCaexz5H1QDW|h%bH!65uSiHvSd*YiJDm6)ghBa=n zx)t-vr`H6|ZNgD06uw&TCJ0okzRSQyEnD6yWa2V6YR1!CsgF7dGd*tREHy7JR=d*{ zJJyMH>v}~+>mnUzrzN4_r;8OHZv}%qip&QoS?;>QoPDQxnj*ALt%z+4*!?qtp3r!wh=U6_{un2ppk-narx$Rhi1Uxp(ZUlA)kSm_ z(bLk%bJw5X<^+E<)GlJEGoZj!d0>tcJFt%r$VR@2_Or_$V23}5YdDMn9Kk3bMGEMB zAB@UD&Ik+dQBsbK;eASqhcSFWsmhZ+#7AU9t$ob38c+I!Yqhj=1E1nEXw)t6Ildr* zFZn+J@fQwg_==X;%zYY!?Qsg+eS$p`bi00J5w|@Owihw>3j#M=7I43a$XLN1Fl zW$`hbBJ$-~5p!kn5iQj-82eaz57E~q#2L$0@({;)T*4KO-RQ%0j!_KbHbFRNk=bNeF6gdo0%Ngo9OHFP3YjCBV`Yv*Ip0f-5UZ&noYVPp9-F#B?@i}oF&tZ_Z zqUfQWK3eKU3}M{iGeJe5n@AhU#y9xZv#X@h?Gk~){9!6hlSBq@%MLcgowUUk2Q mc*SRMY04;kU*?|CSMdcj-mqWMp)QT6xWRil`+;j)@Z&#J0cKAC literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/system/Metrics$1.class b/target/classes/net/t2code/alias/Bungee/system/Metrics$1.class new file mode 100644 index 0000000000000000000000000000000000000000..4ea174a23a864446568df1861cb68c4a61259f99 GIT binary patch literal 231 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 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/system/Metrics$DrilldownPie.class b/target/classes/net/t2code/alias/Bungee/system/Metrics$DrilldownPie.class new file mode 100644 index 0000000000000000000000000000000000000000..67b5d988a82e34e737863e4686430339e96bb3ac GIT binary patch literal 3152 zcmcIm-E$LF6#w0ukIlyhp-^m49aG;_#(_`nX2RPqT?{?AK;^Zg~JTuxw~7k!Gf`)(`oMBbI&=ybIq+Fe^f2?WXOBYIZ_6mR`1d3k}<; zRSUD489@F8M^z&=d^h(YiMRATOv)flFLlR5kp)-LPZiP!_E#N4qCcl%+xNM z$92IFD{F?KO&j#N#RF+Lx{)o{%yPrBgz01pzCupH8iu_cq8zbn=CSEHQFabAbYn(X z38b)AW@8;gs6R86#CmK{(5+%4o@LnVZtzLi3}G23!-oD$AQc_}1(s$=wH!=n^(1=m zoQmhMnL*L*v1;9Ey0~ZM$`%z{v5huQ`?H!QLAhSH?AQ%~M7bnhM6ZIERP^EHHvg_c zOm~E(IW>!6W1DT!my?4G1{4gc7?NRhwE|pLq1a|Mdr~YoQg?@ntV~7NB!Plg8P>N< zXivRkGTJ1Du~Q|Ak!G|aoTGw7J=mk-HSDD=l8B)%NEkm$D<*D~VXX@ipq50~r{WEX z5F>X}n$Zvn-lQb8REwq~Dzd71>{oFB1=7_`PuER!Q5Jkm#UUJKNNV-EFlP?w!kA$= z7L3lPb1^f%T4v=WQc=Yb9A$`1OS&-}rkbqQVQ-7PuI~xCi%Eu0R*3sQ0a<;hxfqTU z59VcwY=(GAub7(Cu;@5ndHQkQ7g#28`O^RmavdtTCO#c6xH+7BIr~yoAmM-VMFzn3gwCUZQ)*#sVa&-2}vdtEWEM0+~ z;`5PCbvtCUz6|^Ezuw#bnQNIgl}@R9XB^ZVjUnOE!R;1wceIz$Ya+CJ)m8GFGs9@7 zNo<`B-U72_nd~f`cek;+je`o5^62>pD^%6$vdAqy5CO@}T1$|l=Kg@Q z$1>+d|3t1nMn#5m?HK=H?zaA?orTBz=PBkh?Fdf{Z8g4AB}Xe?q=0759<5L@O0|Yn7Ke0sr>p+MVu#E%O^c=}tb(E0wjdw!rs%9mQc2sMCTj33 z(Z%pLR!}E)38>%-L!mQ}K;QMb5|GfwS|Hd)Zy!!CEjqjM^+V%3G~+ly{{)Q^jVDP` zrZGfga$xWd*uc=&P;S#Sgj4jpMlSL5h;R)FK8-1oZS~Y~8t>AK3~>f$$))^~KpgMU zw*>Sg63~NwpJX54s0YmH4n%@2z6))n;1Stgxw0~ zY4QTY61LMx45!0O=$A`3 zI+~8VCU^0={37b!MSc-)E#lzm&>rRH!+YJzXGn+ggT8O67+u8Mix@wB^P#!fjnogK z>)4>TLch0Ymti-blk}tmzknF8pqtNPJD)=@H_*qcC~^}gcnzm`9oP9Ke9kT0*7=D8wJ!*gW1s71Es`TMI%#uaOt)Q&4=T|4co{u^5;ptx_eS`ev5PN{_3Q`Js z*aLe1D#$#fmk~X?W4@Fm3WjMS*MR%j`v*4N2allYCWgTzXLb7KxCD#F0fOPQkw#d) Z;BCxP04W+T(>P2|xrJyPO_E$i{4Y$XYT5t* literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/system/Metrics$JsonObjectBuilder$JsonObject.class b/target/classes/net/t2code/alias/Bungee/system/Metrics$JsonObjectBuilder$JsonObject.class new file mode 100644 index 0000000000000000000000000000000000000000..e90899593948c5446c6d37e11175ddab8176773d GIT binary patch literal 1000 zcmb_b+iuf95Itijc4ADM-nbMfErcp@B}@A~yz(*lw?TR3^4^hR-&d%(aGiS!*U%!9+1n>fz9xT`{YCh_42z@Q{Fn=B;$1)VL z5?Q!g=!ukJ_BqStX?Q5}R7F|)AWQW7@rjJ`-9p93GW{n)a9$~`^4Elw&hSK>i7*y= z5*~4?o@{qV9vW!6@J!7cgw_;NQ4;Jlg@5too|<8^`&Mh2_G6J{GIQ~e@bbFzaIrzyoGqKMaA|W` z=rrcy386C^S-Xb~-jN0`GH-@i6u#LU;Z5d9i@gDR7F#bkhZ}5thyRs53k!VCF&6e7 zYW6;w_JA3HTNN5hSZ0s&N>*aF6@IHYL$<_k_23))FMO%!Oi9=WC5>MJDjL>N$8C-n zL3@nmvT%Z}bI?>wmAzADuUCk_A{^Y|)=WtUcd^P07VedG@8bd6RmQJj9gkpsnKe9S J+vYf0jX&fI>kR+^ literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/system/Metrics$JsonObjectBuilder.class b/target/classes/net/t2code/alias/Bungee/system/Metrics$JsonObjectBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..8b5ae74aa84497f0ac916fc3c3c19ffec7836daf GIT binary patch literal 5812 zcmb_gYj_-08Gg@9lG$!1&30+irX+2MX`AdO*|cCOS!hjTFR5t~O)rKNWwMzj+iqsV z?rdp5L4MEzZ7o`C%x)&^7V|VbO?PI_ zob!F}_kQpBzO(z{f6hD$;3~WkgaTDVnT~Q)2!sw9M~qm?u*PEjBZtg{El_c7(n{K! z1=Qx2eHsD+%V#GI+L@#^wl$YbjhdMtG^mSE30*^#j>V`J*kqY@%-)blkD4(fl{B)k ztvPGVG-KJRtZh!jcAK=2$TscDrY+Z_XG}mFam@lt7g>(C6b*TZ;sIPPP-f*)sUY3f z>sW==0!v+Ej=#N@nN1jzCQYv^VYRG~rg5#nvJ%c)_65*PCK@I9h>j>) z$%KnnU~Q=t#dsx)?K)!U5D3_5H~r+GxtO(h5F2o%hO2bE6C3A9E5A&0BI!RU0r!-! z5WpsZIw$6|qs9_JccNWGT%h|>h31o90N3UHImogl{B6OzG<50Mitc<&IXjt(b!9Tf zRF;fp?Tl$m2(&j3`}lLUofnt0!kri+8Jr&vb3bm=u^l@E$|D_6HH({qUX5FyH1UCAm)je)x2F;strj;;Du~9JL1h-$u`!Pgg3D>ef zhd&07!Pzx_4S9?QFih;j0o=gL4MA+d2W9eZ6liE3&Wp|;M2}?`QX()SQvL{W50&#ytg&g}0Upz5kR_|>ZQj|(j1sSvr+w_$W zD_=fXCL4?tMK?Od+F@D^vd-E;9LAaeZeq1{Hr!!zs!06-FtJKwX8<{pd0P;jxLH=5 zqXJv}NhW{He7tv_TXH?ipez=*=(rUh;ucDo)|fr+betaf;=?*_$4B@gLG^U8CzY{W zbO-P;qB+nQz@74XAb?MB>m0~+baVvqDcq&u(>m^!rDutc9LqMx%#1*#o!)64b&&>e z4{geovcBCXyToT%2%5Y7dUB`cdjaQnv!@AE_a-f~FE=q_X7(5(DUO7D(+MNB&&VX@ zvo}~~k0(i9=X^OS>W3_GLATTNu>lG6l_0!jA=Xu9T!NqF%1a};^0hdD8%uaDUbP@B z)*0%*9t8iPMz_v@a;>RLj zlnB$`qP%o347A%f1uiRLnfdgNNBiUnhTCDF6r_bER2gPQA1Gz_ZJ}{N>}(%?TQCUd zejZu$oRhM^4mPPvRoq;y2(~=I1CC%LTbeQ^Mn;V$UlC~H@h>=-&SerjXUm$Wd*}Fe zSv`0z+L}(=SvzA)a(p~Jnys$DbPzK*rQx)WGdMfv%$u~1qz{|1UdInt7zYh`ieNda zobW%rQIuOsNzQ)uDExt~T`-mB_(4buXY#~8-rSgagJyYhtN zy}`9x@ZRBhr!RbkI23%9e#zNl2hi6%K)X340aZq#b*HdC@5>+IGgzdY@cF1L_^2%S zsHBgt(}#@pVb65RGhJJV^=dcP)@fXmcjOQ19D_Q~pq|5W<$0gO+JeK{g2P&T1CP8p zs7F1|)8vROp{L;aTIrd*Za#x|1E;Z5LAdV}22Nw2g7etWH=BX$Nqw87{{TOV=x;=T z^uJ7`uMp|0RMKlidx1)N9TDXX>`;E=Adk2J3dnm3$b0Y@9w+h$_4Z9BMxC3O<6aC; zUNnXeoPi-@7`@aOR&oWhWgOpFrps zs+>yGN2Tm{?&S83dfPX{drF;e%2<+QA#%mOmX!gj0!>x1L@mcMwF0Zv0M_!CybiSz zyHp+hYLyd?yQ>EZG8!nzXaL_S?CNr;OR7Q);Jf&q7sf4=kE~m5MPZyp=a7TdCN}C@ z%-~3GM6h&5Wo>gYI>l05MvOJYxPsVf5mi?@nA|$o=3!dP?{9J|ioA@MurTtME*FQW zCJMO~Z}tjYuXC})Q1i@&v&@bSJ#KCAH~vW z_~U%8KZQ@a!wvPJ)z0u|<_s^2)=%T!{dX$j_UR2lA{1fH;3kBtQ!b{S2k|P^Woxl1==2rjNej_^{lnV|T zw_(+Jo>lySRunvg6TC{zoaFx>;#vIIxqA*j!B4%hpWy}kg0mW#mP)*cm#D^0-u;T# QmpP750Kdj-cpbI>14;Q1)&Kwi literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/system/Metrics$MetricsBase.class b/target/classes/net/t2code/alias/Bungee/system/Metrics$MetricsBase.class new file mode 100644 index 0000000000000000000000000000000000000000..cd9f4d675a44c4b921e83c45a52973da0a5843a9 GIT binary patch literal 12753 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 literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/system/Metrics$SingleLineChart.class b/target/classes/net/t2code/alias/Bungee/system/Metrics$SingleLineChart.class new file mode 100644 index 0000000000000000000000000000000000000000..9a203addf0eff7f481abd3e219e8dec9db76d5cd GIT binary patch literal 1638 zcmbVMTTc@~6#ix@EG^5eKot?Wh(Nima@PVX1x!tmhZ+(er`t(cT(-^bERnzBufRkh zYGQo$HyPuZcD02dsXVl2=Ioj8JNF;IzI+3)i0v3OH0g*KXhsXeyep(B=dDsfnB1|s zZ*B%|Q3%sN@ufI2cZKw9%O6VzzAPQ354a~8TGnjWmKzLxli5Rl%uR>8MKed1ZZVbI zkD?V(9WeuKFc_8_q{z{0M`UeRgfy)dcO0H~1jA63Cy=&dS|!&CJWsgNOos-kHgup< zN0)(a#2E%FUj56OA)=5OdMA^0{_o`vg(XuudKtQFVP#w?io%Pb2MGhWaGRmkcI7^I z0&=WrGMUkFhheqBC|~*|x5~5`*iJzK_v5ar#$W|)zZF9a&BqE}eHt+^iu(+0yj&J; zVaFCufno28#AlM(oBEJaOb-l{>5*Jxd%72(M{~g}diBd5eMIkE_w8bT7U>Sz?oaENqU0x0Y zjcvcPL|NJ;*Vplwp{LgFf4?xqa;3nt#Ez{d&lQx59Z5AE9^w%}s*@tp zFi&SiSk)-PD)j;)w4^6OVxMr7gA-F9p?^j@!*}$Yp>J*AJ(}6+SM&D@tou)owgAD4eWliga7~l literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Bungee/system/Metrics.class b/target/classes/net/t2code/alias/Bungee/system/Metrics.class new file mode 100644 index 0000000000000000000000000000000000000000..4eb22d3a03a741ec43bb2c5452cea43de3893e00 GIT binary patch literal 8440 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 AAOHXW literal 0 HcmV?d00001 diff --git a/target/classes/net/t2code/alias/Util.class b/target/classes/net/t2code/alias/Util.class new file mode 100644 index 0000000000000000000000000000000000000000..7bc3a93962e772345b76d969817f44990543a9fb GIT binary patch literal 1395 zcmaJ>TTc@~6#k|yy|G+cD0hvBU_t51%_2pFQqh`5j39|IK5Vx`S+Z<#cMJZbKB_bU zqlpiF^hX)b>=s%|bsy%;ocYdmzO%po{P+c65wF7Vz#D*1LI?Z|y@$$)BI}A#l(+MT zT(ueetD2$NYYg7_^j-)-gaQal=!C=&Gq^3=^J=NUWkuH%OMYi-I>V63Kb19;7k1}2 z=`N?`_qb_kC4+%wgpY0sJ?JIpZ%n?geP)Q}8j*KwQ!|Pwfs0D$Lq9`s=U6M2>}-ai zuL+qoY+mH1109es=s?q!t=Lx9i8Cx=#EIkD3zuUOZV6Q&qgiUnEcn+a7o0DMafYc{ zW%)y`vgjsWt0ZS@6=g$|R;w(f%SMrNLVOHk0`~%#lrV++43S3i^_0l}iK3VJ_CCWv zJUiVc=>Vn~1{;=c+3B*T7q}Tl9Nr)vGE5xU_OZ1h%crNO3Cn52k(wx(McL$5scfp; zk_9>;LB=C$sd9YGjRM1LyeVkCr_Fg>iiefyqf-dauud9bJm#bT_|6dcLTA=wD-zp4@(L;Z zImoWBElBz&AdStN$Ve+POvp?-WULh_5%PJv=tHf@ZbELgLyop0d#QCVt{SJ-Yftv$ zb`^o>ohrJ#-*LB!h$~`05r2PyndpOa%$^}~j=6IzRxuP^u3}WQ+HKbexdZ~VikIv} S6kQmmx12+S5HIP@gX~`?Q64k^ literal 0 HcmV?d00001