commit 65c43dfd82d91dc1c6473ad7ba139d09cab7cfa8 Author: JaTiTV Date: Sun Nov 28 02:13:21 2021 +0100 Initial Commit 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/T2CodeLib.xml b/.idea/artifacts/T2CodeLib.xml new file mode 100644 index 0000000..03e425d --- /dev/null +++ b/.idea/artifacts/T2CodeLib.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/../../Libarys + + + + + \ No newline at end of file diff --git a/.idea/artifacts/T2CodeLib_1_0_0_32.xml b/.idea/artifacts/T2CodeLib_1_0_0_32.xml new file mode 100644 index 0000000..ec9b69d --- /dev/null +++ b/.idea/artifacts/T2CodeLib_1_0_0_32.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/../../Testserver/1.17.1/Server/plugins + + + + + \ No newline at end of file diff --git a/.idea/artifacts/T2CodeLib_7_3.xml b/.idea/artifacts/T2CodeLib_7_3.xml new file mode 100644 index 0000000..9974c64 --- /dev/null +++ b/.idea/artifacts/T2CodeLib_7_3.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/../../Plugins/T2CodeLib/.jar + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b6c2c11 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..30bab2a --- /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..36c01dd --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/1_13_R2.xml b/.idea/libraries/1_13_R2.xml new file mode 100644 index 0000000..0a46628 --- /dev/null +++ b/.idea/libraries/1_13_R2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_github_MilkBowl_VaultAPI_1_7.xml b/.idea/libraries/Maven__com_github_MilkBowl_VaultAPI_1_7.xml new file mode 100644 index 0000000..a7198bd --- /dev/null +++ b/.idea/libraries/Maven__com_github_MilkBowl_VaultAPI_1_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_code_gson_gson_2_8_0.xml b/.idea/libraries/Maven__com_google_code_gson_gson_2_8_0.xml new file mode 100644 index 0000000..6e5d5b7 --- /dev/null +++ b/.idea/libraries/Maven__com_google_code_gson_gson_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_guava_21_0.xml b/.idea/libraries/Maven__com_google_guava_guava_21_0.xml new file mode 100644 index 0000000..a923456 --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_guava_21_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1_1.xml b/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1_1.xml new file mode 100644 index 0000000..f3f3738 --- /dev/null +++ b/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml b/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml new file mode 100644 index 0000000..2ec8376 --- /dev/null +++ b/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_buffer_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_buffer_4_1_65_Final.xml new file mode 100644 index 0000000..cc3e6ff --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_buffer_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_codec_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_codec_4_1_65_Final.xml new file mode 100644 index 0000000..321cc00 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_codec_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_common_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_common_4_1_65_Final.xml new file mode 100644 index 0000000..016342a --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_common_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_resolver_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_resolver_4_1_65_Final.xml new file mode 100644 index 0000000..9a2409b --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_resolver_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_transport_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_transport_4_1_65_Final.xml new file mode 100644 index 0000000..a002ea9 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_transport_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_transport_native_unix_common_4_1_65_Final.xml b/.idea/libraries/Maven__io_netty_netty_transport_native_unix_common_4_1_65_Final.xml new file mode 100644 index 0000000..bae1261 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_transport_native_unix_common_4_1_65_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_10.xml b/.idea/libraries/Maven__junit_junit_4_10.xml new file mode 100644 index 0000000..ed8bf5f --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_4_10.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__me_clip_placeholderapi_2_9_2.xml b/.idea/libraries/Maven__me_clip_placeholderapi_2_9_2.xml new file mode 100644 index 0000000..5306a48 --- /dev/null +++ b/.idea/libraries/Maven__me_clip_placeholderapi_2_9_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_brigadier_1_0_16_SNAPSHOT.xml b/.idea/libraries/Maven__net_md_5_brigadier_1_0_16_SNAPSHOT.xml new file mode 100644 index 0000000..844cdda --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_brigadier_1_0_16_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_bungeecord_api_1_17_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__net_md_5_bungeecord_api_1_17_R0_1_SNAPSHOT.xml new file mode 100644 index 0000000..78f2de9 --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_bungeecord_api_1_17_R0_1_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_bungeecord_chat_1_16_R0_4.xml b/.idea/libraries/Maven__net_md_5_bungeecord_chat_1_16_R0_4.xml new file mode 100644 index 0000000..9a850ea --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_bungeecord_chat_1_16_R0_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_bungeecord_config_1_17_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__net_md_5_bungeecord_config_1_17_R0_1_SNAPSHOT.xml new file mode 100644 index 0000000..4ee7632 --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_bungeecord_config_1_17_R0_1_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_bungeecord_event_1_17_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__net_md_5_bungeecord_event_1_17_R0_1_SNAPSHOT.xml new file mode 100644 index 0000000..7a85ff2 --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_bungeecord_event_1_17_R0_1_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_md_5_bungeecord_protocol_1_17_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__net_md_5_bungeecord_protocol_1_17_R0_1_SNAPSHOT.xml new file mode 100644 index 0000000..34c4a5e --- /dev/null +++ b/.idea/libraries/Maven__net_md_5_bungeecord_protocol_1_17_R0_1_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_sf_trove4j_core_3_1_0.xml b/.idea/libraries/Maven__net_sf_trove4j_core_3_1_0.xml new file mode 100644 index 0000000..9460109 --- /dev/null +++ b/.idea/libraries/Maven__net_sf_trove4j_core_3_1_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_1.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_1.xml new file mode 100644 index 0000000..acdf443 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_yaml_snakeyaml_1_28.xml b/.idea/libraries/Maven__org_yaml_snakeyaml_1_28.xml new file mode 100644 index 0000000..1f853f7 --- /dev/null +++ b/.idea/libraries/Maven__org_yaml_snakeyaml_1_28.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__se_llbit_jo_nbt_1_3_0.xml b/.idea/libraries/Maven__se_llbit_jo_nbt_1_3_0.xml new file mode 100644 index 0000000..d3ebcf7 --- /dev/null +++ b/.idea/libraries/Maven__se_llbit_jo_nbt_1_3_0.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..0eedd60 --- /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..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/T2CodeLib.iml b/T2CodeLib.iml new file mode 100644 index 0000000..5a56b3f --- /dev/null +++ b/T2CodeLib.iml @@ -0,0 +1,52 @@ + + + + + + + SPIGOT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..046009f --- /dev/null +++ b/pom.xml @@ -0,0 +1,114 @@ + + + 4.0.0 + + net.t2code + T2CodeLib + 1.0-SNAPSHOT + jar + + T2CodeLib + + Libarie from T2Code Plugins + + 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 + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + jitpack.io + https://jitpack.io + + + placeholderapi + http://repo.extendedclip.com/content/repositories/placeholderapi/ + + + bungeecord-repo + https://oss.sonatype.org/content/repositories/snapshots + + + + + + org.spigotmc + spigot-api + 1.17.1-R0.1-SNAPSHOT + provided + + + com.github.MilkBowl + VaultAPI + 1.7 + provided + + + me.clip + placeholderapi + 2.9.2 + provided + + + net.md-5 + bungeecord-api + 1.17-R0.1-SNAPSHOT + jar + provided + + + net.md-5 + bungeecord-api + 1.17-R0.1-SNAPSHOT + javadoc + provided + + + diff --git a/src/main/java/net/t2code/lib/Bungee/BMain.java b/src/main/java/net/t2code/lib/Bungee/BMain.java new file mode 100644 index 0000000..d56d855 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/BMain.java @@ -0,0 +1,42 @@ +package net.t2code.lib.Bungee; + +import net.md_5.bungee.api.plugin.Plugin; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Bungee.system.BLoad; +import net.t2code.lib.Util; + +public final class BMain extends Plugin { + + + public static Plugin plugin; + public static String Version; + public static String Autor; + + 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; + + + @Override + public void onEnable() { + // Plugin startup logic + plugin = this; + Version = plugin.getDescription().getVersion(); + Autor = plugin.getDescription().getAuthor(); + BLoad.onLoad(plugin, Prefix, Autor, Version, Spigot, Discord, SpigotID,BstatsID); + } + + @Override + public void onDisable() { + // Plugin shutdown logic + Bsend.console(Prefix + "§4============================= " + Prefix + " §4============================="); + Bsend.console(Prefix + " §2Autor: §6" + String.valueOf(Autor).replace("[", "").replace("]", "")); + Bsend.console(Prefix + " §2Version: §6" + Version); + Bsend.console(Prefix + " §2Spigot: §6" + Spigot); + Bsend.console(Prefix + " §2Discord: §6" + Discord); + Bsend.console(Prefix + " §4Plugin successfully disabled."); + Bsend.console(Prefix + "§4============================= " + Prefix + " §4============================="); + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/commands/BTab.java b/src/main/java/net/t2code/lib/Bungee/Lib/commands/BTab.java new file mode 100644 index 0000000..2065dd8 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/commands/BTab.java @@ -0,0 +1,66 @@ +package net.t2code.lib.Bungee.Lib.commands; + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +public class BTab { + public static Iterable tab(CommandSender sender, String[] args, String perm,Boolean onlinePlayer){ + List matches = new ArrayList<>(); + Iterator var6 = ProxyServer.getInstance().getPlayers().iterator(); + while (var6.hasNext()) { + ProxiedPlayer player1 = (ProxiedPlayer) var6.next(); + if (passend(player1.getName(), args[0]) && hasPermission(sender, perm)){ + matches.add(player1.getName()); + } + } + return matches; + } + + public static Iterable tab(CommandSender sender, String[] args, HashMap permMap) { + List matches = new ArrayList<>(); + for (String command : permMap.keySet()) { + if (hasPermission(sender, permMap.get(command)) && passend(command, args[0])) { + matches.add(command); + } + } + return matches; + } + + public static Iterable tab(CommandSender sender, String[] args, String perm, String command) { + List matches = new ArrayList<>(); + if (hasPermission(sender, perm) && passend(command, args[0])) { + matches.add(command); + } + return matches; + } + + public static Boolean passend(String command, String arg) { + for (int i = 0; i < arg.toUpperCase().length(); i++) { + if (arg.toUpperCase().length() >= command.toUpperCase().length()) { + return false; + } else { + if (arg.toUpperCase().charAt(i) != command.toUpperCase().charAt(i)) { + return false; + } + } + } + return true; + } + + + public static boolean hasPermission(CommandSender sender, String permission) { + String[] Permissions = permission.split(";"); + for (String perm : Permissions) { + if (sender.hasPermission(perm)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/commands/Bcmd.java b/src/main/java/net/t2code/lib/Bungee/Lib/commands/Bcmd.java new file mode 100644 index 0000000..7d2fd51 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/commands/Bcmd.java @@ -0,0 +1,13 @@ +package net.t2code.lib.Bungee.Lib.commands; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +public class Bcmd { + public static void Console(String cmd){ + ProxyServer.getInstance().getPluginManager().dispatchCommand(ProxyServer.getInstance().getConsole(), cmd); + } + public static void Player(ProxiedPlayer player, String cmd){ + ProxyServer.getInstance().getPluginManager().dispatchCommand(player, cmd); + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.java b/src/main/java/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.java new file mode 100644 index 0000000..2e64c77 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.java @@ -0,0 +1,38 @@ +package net.t2code.lib.Bungee.Lib.messages; + +import java.util.List; + +public class BT2CodeTemplate { + + + public static Long onLoadHeader(String prefix, String autor, String version, String spigot, String discord) { + Long long_ = Long.valueOf(System.currentTimeMillis()); + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + Bsend.console(prefix + " §2Autor: §6" + autor.replace("[", "").replace("]", "")); + Bsend.console(prefix + " §2Version: §6" + version); + Bsend.console(prefix + " §2Spigot: §6" + spigot); + Bsend.console(prefix + " §2Discord: §6" + discord); + Bsend.console(prefix + " §8-------------------------------"); + return long_; + } + public static void onLoadSeparateStroke(String prefix) { + Bsend.console(prefix + " §8-------------------------------"); + } + + public static void onLoadFooter(String prefix, Long long_) { + Bsend.console(prefix + " §8-------------------------------"); + Bsend.console(prefix + " §2Plugin loaded successfully." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + } + + public static void onDisable(String prefix, String autor, String version, String spigot, String discord) { + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + Bsend.console(prefix + " §2Autor: §6" + autor.replace("[", "").replace("]", "")); + Bsend.console(prefix + " §2Version: §6" + version); + Bsend.console(prefix + " §2Spigot: §6" + spigot); + Bsend.console(prefix + " §2Discord: §6" + discord); + Bsend.console(prefix + " §4Plugin successfully disabled."); + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + } + +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/messages/Bsend.java b/src/main/java/net/t2code/lib/Bungee/Lib/messages/Bsend.java new file mode 100644 index 0000000..788567c --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/messages/Bsend.java @@ -0,0 +1,61 @@ +package net.t2code.lib.Bungee.Lib.messages; + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.Title; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Plugin; + + +import java.util.logging.Level; + +public class Bsend { + public static void console(String msg) { + ProxyServer.getInstance().getConsole().sendMessage(msg); + } + + public static void player(ProxiedPlayer player, String msg) { + player.sendMessage(msg); + } + + public static void title(ProxiedPlayer player, Title msg) { + player.sendTitle(msg); + } + + public static void sender(CommandSender sender, String msg) { + sender.sendMessage(msg); + } + + public static void debug(Plugin plugin, String msg) { + debug(plugin, msg, null); + } + + public static void debug(Plugin plugin, String msg, Integer stage) { + // if (!new File(Main.getPath(), "config.yml").exists()) return; + if (stage == null) { + //todo if (plugin.getConfig().getBoolean("Plugin.Debug")){ + // ProxyServer.getInstance().getConsole().sendMessage(plugin.getDescription().getName() + " §5DEBUG: §6" + msg); + // } + return; + } + // todo if (plugin.getConfig().getInt("Plugin.Debug") >= stage) { + // ProxyServer.getInstance().getConsole().sendMessage(plugin.getDescription().getName() + " §5DEBUG: §6" + msg); + // } + } + + public static void debugmsg(Plugin plugin, String msg) { + ProxyServer.getInstance().getConsole().sendMessage(plugin.getDescription().getName() + " §5DEBUG-MSG: §6" + msg); + } + + public static void info(Plugin plugin, String msg) { + plugin.getLogger().log(Level.INFO, msg); + } + + public static void warning(Plugin plugin, String msg) { + plugin.getLogger().log(Level.WARNING, msg); + } + + public static void error(Plugin plugin, String msg) { + plugin.getLogger().log(Level.SEVERE, msg); + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/replace/BReplace.java b/src/main/java/net/t2code/lib/Bungee/Lib/replace/BReplace.java new file mode 100644 index 0000000..13cd164 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/replace/BReplace.java @@ -0,0 +1,36 @@ +package net.t2code.lib.Bungee.Lib.replace; + +import java.util.ArrayList; +import java.util.List; + +public class BReplace { + + public static String replace(String prefix, String Text) { + return Text.replace("[prefix]", prefix).replace("&", "§").replace("[ue]", "ü") + .replace("[UE]", "Ü").replace("[oe]", "ö").replace("[OE]", "Ö") + .replace("[ae]", "ä").replace("[AE]", "Ä"); + } + + + + public static List replace(String prefix, List Text) { + List output = new ArrayList<>(); + for (String input : Text) { + output.add(input.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä")); + } + return output; + } + + public static List replacePrice(String prefix,List Text, String price) { + List rp = new ArrayList(); + for (String s : Text) { + rp.add(s.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä") + .replace("[price]", String.valueOf(price))); + } + return rp; + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateAPI.java b/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateAPI.java new file mode 100644 index 0000000..275d96c --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateAPI.java @@ -0,0 +1,104 @@ +package net.t2code.lib.Bungee.Lib.update; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.plugin.Plugin; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Spigot.Lib.update.UpdateObject; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Scanner; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; + +public class BUpdateAPI { + public static HashMap bungeePluginVersionen = new HashMap(); + public static void sendUpdateMsg(String Prefix, String Spigot, String Discord, String foundVersion, String update_version) { + Bsend.console("§4=========== " + Prefix + " §4==========="); + Bsend.console("§6A new version was found!"); + Bsend.console("§6Your version: §c" + foundVersion + " §7- §6Current version: §a" + update_version); + Bsend.console("§6You can download it here: §e" + Spigot); + Bsend.console("§6You can find more information on Discord: §e" + Discord); + Bsend.console("§4=========== " + Prefix + " §4==========="); + } + private static Boolean noUpdate = true; + private static String pluginVersion; + public static void onUpdateCheckTimer(Plugin plugin, String Prefix, String Spigot, String Discord, Integer SpigotID) { + ProxyServer.getInstance().getScheduler().schedule(plugin, new Runnable() { + public void run() { + (new BUpdateAPI(plugin, SpigotID)).getVersion((update_version) -> { + pluginVersion = plugin.getDescription().getVersion(); + UpdateObject update = new UpdateObject( + plugin.getDescription().getName(), + pluginVersion, + update_version + ); + bungeePluginVersionen.put(plugin.getDescription().getName(), update); + if (!pluginVersion.replace("_Bungee", "").equalsIgnoreCase(update_version)) { + sendUpdateMsg(Prefix, Spigot, Discord, pluginVersion, update_version); + noUpdate = true; + } else { + if (noUpdate) { + Bsend.console(Prefix + " §2No update found."); + noUpdate = false; + } + } + },Prefix, pluginVersion); + } + }, 0, 20 * 60 * 60L, TimeUnit.SECONDS); + } + private Plugin plugin; + private int resourceId; + + public BUpdateAPI(Plugin plugin, int resourceId) { + this.plugin = plugin; + this.resourceId = resourceId; + } + + public void getVersion(Consumer consumer, String Prefix, String pluginVersion) { + ProxyServer.getInstance().getScheduler().runAsync(this.plugin, () -> { + try { + InputStream inputStream = (new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.resourceId)).openStream(); + try { + Scanner scanner = new Scanner(inputStream); + + try { + if (scanner.hasNext()) { + consumer.accept(scanner.next()); + } + } catch (Throwable var8) { + try { + scanner.close(); + } catch (Throwable var7) { + var8.addSuppressed(var7); + } + throw var8; + } + scanner.close(); + } catch (Throwable var9) { + if (inputStream != null) { + try { + inputStream.close(); + } catch (Throwable var6) { + var9.addSuppressed(var6); + } + } + throw var9; + } + if (inputStream != null) { + inputStream.close(); + } + } catch (IOException var10) { + UpdateObject update = new UpdateObject( + plugin.getDescription().getName(), + pluginVersion, + "§4No public version found!" + ); + bungeePluginVersionen.put(plugin.getDescription().getName(), update); + this.plugin.getLogger().severe(Prefix + "§4 Cannot look for updates: " + var10.getMessage()); + } + }); + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateObject.java b/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateObject.java new file mode 100644 index 0000000..fc0bb6e --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/Lib/update/BUpdateObject.java @@ -0,0 +1,12 @@ +package net.t2code.lib.Bungee.Lib.update; + +public class BUpdateObject { + public String pluginName; + public String pluginVersion; + public String publicVersion; + public BUpdateObject(String pluginName, String pluginVersion, String publicVersion){ + this.pluginName = pluginName; + this.pluginVersion = pluginVersion; + this.publicVersion = publicVersion; + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/system/BLoad.java b/src/main/java/net/t2code/lib/Bungee/system/BLoad.java new file mode 100644 index 0000000..7b68951 --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/system/BLoad.java @@ -0,0 +1,26 @@ +package net.t2code.lib.Bungee.system; + +import net.md_5.bungee.api.plugin.Plugin; +import net.t2code.lib.Bungee.Lib.messages.Bsend; +import net.t2code.lib.Bungee.Lib.update.BUpdateAPI; + +public class BLoad { + public static void onLoad(Plugin plugin, String prefix, String autor, String version, String spigot, String discord, Integer spigotID,Integer bstatsID){ + Long long_ = Long.valueOf(System.currentTimeMillis()); + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + Bsend.console(prefix + " §2Autor: §6" + String.valueOf(autor).replace("[", "").replace("]", "")); + Bsend.console(prefix + " §2Version: §6" + version); + Bsend.console(prefix + " §2Spigot: §6" + spigot); + Bsend.console(prefix + " §2Discord: §6" + discord); + + + + + BMetrics.Bstats(plugin, bstatsID); + + BUpdateAPI.onUpdateCheckTimer(plugin, prefix, spigot, discord, spigotID); + + Bsend.console(prefix + " §2Plugin loaded successfully." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + Bsend.console(prefix + "§4============================= " + prefix + " §4============================="); + } +} diff --git a/src/main/java/net/t2code/lib/Bungee/system/BMetrics.java b/src/main/java/net/t2code/lib/Bungee/system/BMetrics.java new file mode 100644 index 0000000..d0d996d --- /dev/null +++ b/src/main/java/net/t2code/lib/Bungee/system/BMetrics.java @@ -0,0 +1,851 @@ +package net.t2code.lib.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 BMetrics { + + public static void Bstats(Plugin plugin, int bstatsID) { + int pluginId = bstatsID; // <-- Replace with the id of your plugin! + BMetrics metrics = new BMetrics(plugin, pluginId); + } + + 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 BMetrics(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/lib/Spigot/Lib/commands/Cmd.java b/src/main/java/net/t2code/lib/Spigot/Lib/commands/Cmd.java new file mode 100644 index 0000000..10f50db --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/commands/Cmd.java @@ -0,0 +1,14 @@ +package net.t2code.lib.Spigot.Lib.commands; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class Cmd { + public static void console(String cmd) { + Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), cmd); + } + + public static void player(Player player, String cmd) { + player.chat("/" + cmd); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/commands/Tab.java b/src/main/java/net/t2code/lib/Spigot/Lib/commands/Tab.java new file mode 100644 index 0000000..28fd7e6 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/commands/Tab.java @@ -0,0 +1,104 @@ +package net.t2code.lib.Spigot.Lib.commands; + + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +public class Tab { + + public static void tab(List matches, CommandSender sender, int arg, String[] args, String perm, Boolean onlinePlayer) { + if (args.length == arg + 1) { + Iterator var6 = Bukkit.getOnlinePlayers().iterator(); + while (var6.hasNext()) { + Player player1 = (Player) var6.next(); + if (passend(player1.getName(), args[arg]) && hasPermission(sender, perm)) { + matches.add(player1.getName()); + } + } + } + } + + public static void tab(List matches, CommandSender sender, int argEquals, String equalsValue, int arg, String[] args, String perm, Boolean onlinePlayer) { + if (args.length == arg + 1) { + if (args[argEquals].toLowerCase().equals(equalsValue)) { + Iterator var6 = Bukkit.getOnlinePlayers().iterator(); + while (var6.hasNext()) { + Player player1 = (Player) var6.next(); + if (passend(player1.getName(), args[arg]) && hasPermission(sender, perm)) { + matches.add(player1.getName()); + } + } + } + } + } + + //public static void tab(List matches,CommandSender sender, int arg, String[] args, HashMap permMap) { + // + // for (String command : permMap.keySet()) { + // if (hasPermission(sender, permMap.get(command)) && passend(command, args[arg])) { + // matches.add(command); + // } + // } + //} + + public static void tab(List matches, CommandSender sender, int arg, String[] args, HashMap permMap) { + if (args.length == arg + 1) { + for (String command : permMap.keySet()) { + if (hasPermission(sender, permMap.get(command)) && passend(command, args[arg])) { + matches.add(command); + } + } + } + } + + public static void tab(List matches, CommandSender sender, int argEquals, String equalsValue, int arg, String[] args, HashMap permMap) { + if (args.length == arg + 1) { + if (args[argEquals].toLowerCase().equals(equalsValue)) { + for (String command : permMap.keySet()) { + if (hasPermission(sender, permMap.get(command)) && passend(command, args[arg])) { + matches.add(command); + } + } + } + } + } + + public static List tab(CommandSender sender, int arg, String[] args, String perm, String command) { + List matches = new ArrayList<>(); + if (hasPermission(sender, perm) && passend(command, args[arg])) { + matches.add(command); + } + return matches; + } + + + private static Boolean passend(String command, String arg) { + for (int i = 0; i < arg.toUpperCase().length(); i++) { + if (arg.toUpperCase().length() >= command.toUpperCase().length()) { + return false; + } else { + if (arg.toUpperCase().charAt(i) != command.toUpperCase().charAt(i)) { + return false; + } + } + } + return true; + } + + + public static boolean hasPermission(CommandSender sender, String permission) { + String[] Permissions = permission.split(";"); + for (String perm : Permissions) { + if (sender.hasPermission(perm)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/items/ItemVersion.java b/src/main/java/net/t2code/lib/Spigot/Lib/items/ItemVersion.java new file mode 100644 index 0000000..9b8657a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/items/ItemVersion.java @@ -0,0 +1,15 @@ +package net.t2code.lib.Spigot.Lib.items; + +import net.t2code.lib.Spigot.Lib.minecraftVersion.MCVersion; +import org.bukkit.Material; + +public class ItemVersion { + public static Material Head; + public static void scan(){ + if (MCVersion.minecraft1_8 || MCVersion.minecraft1_9 || MCVersion.minecraft1_10 || MCVersion.minecraft1_11 || MCVersion.minecraft1_12) { + Head = Material.valueOf("SKULL"); + } else Head = Material.valueOf("PLAYER_HEAD"); + } + + +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.java b/src/main/java/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.java new file mode 100644 index 0000000..47a915a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.java @@ -0,0 +1,89 @@ +package net.t2code.lib.Spigot.Lib.messages; + +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.TextComponent; +import net.t2code.lib.Spigot.Lib.update.UpdateAPI; +import net.t2code.lib.Spigot.system.Main; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.util.List; +import java.util.logging.Level; + +public class T2CodeTemplate { + public static Long onLoadHeader(String prefix, List autor, String version, String spigot, String discord) { + Long long_ = Long.valueOf(System.currentTimeMillis()); + // send.console(prefix +" §4===================== " + prefix + " §4====================="); + send.console(prefix + " §4 _______ §7___ §4_____ "); + send.console(prefix + " §4 |__ __|§7__ \\ §4/ ____|"); + send.console(prefix + " §4 | | §7 ) §4| | "); + send.console(prefix + " §4 | | §7 / /§4| | "); + send.console(prefix + " §4 | | §7/ /_§4| |____ "); + send.console(prefix + " §4 |_| §7|____|§4\\_____|"); + send.console(prefix + " §4 §e------------------"); + send.console(prefix + " §4 §e| §2Autor: §6" + String.valueOf(autor).replace("[", "").replace("]", "")); + send.console(prefix + " §4 §e| §2Version: §6" + version); + send.console(prefix + " §4 §e| §2Spigot: §6" + spigot); + send.console(prefix + " §4 §e| §2Discord: §6" + discord); + send.console(prefix + " §4 §e-------------------"); + //onLoadSeparateStroke(prefix); + return long_; + } + + public static Long onLoadHeader(String prefix) { + Long long_ = Long.valueOf(System.currentTimeMillis()); + send.console(prefix + "§4===================== " + prefix + " §4====================="); + return long_; + } + + public static void onLoadSeparateStroke(String prefix) { + send.console(prefix + " §8-------------------------------"); + } + + public static void onLoadFooter(String prefix, Long long_, String version) { + onLoadSeparateStroke(prefix); + send.console(prefix + " §2Plugin loaded successfully." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + // send.console(prefix +" §4===================== " + prefix + "§4====================="); + } + + public static void onLoadFooter(String prefix, Long long_) { + onLoadSeparateStroke(prefix); + send.console(prefix + " §2Plugin loaded successfully." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + // send.console(prefix +" §4===================== " + prefix + "§4====================="); + } + + public static void onDisable(String prefix, List autor, String version, String spigot, String discord) { + //send.console(prefix + "§4===================== " + prefix + " §7- §6" + version + " §4====================="); + //send.console(prefix + " §2Autor: §6" + String.valueOf(autor).replace("[", "").replace("]", "")); + //send.console(prefix + " §2Version: §6" + version); + //send.console(prefix + " §2Spigot: §6" + spigot); + //send.console(prefix + " §2Discord: §6" + discord); + //send.console(prefix + " §4Plugin successfully disabled."); + //send.console(prefix + "§4===================== " + prefix + " §7- §6" + version + " §4====================="); + send.console(prefix + " §2Version: §6" + version); + send.console(prefix + " §4Plugin successfully disabled."); + } + + public static void sendInfo(CommandSender sender, String prefix, String spigot, String discord, List autor, String pluginVersion, String publicVersion) { + send.sender(sender, prefix + "§4======= " + prefix + " §4======="); + send.sender(sender, prefix + " §2Autor: §6" + String.valueOf(autor).replace("[", "").replace("]", "")); + + if (publicVersion.equalsIgnoreCase(pluginVersion)) { + send.sender(sender, prefix + " §2Version: §6" + pluginVersion); + } else { + if (sender instanceof Player) { + Player player = (Player) sender; + UpdateAPI.sendUpdateMsg(prefix, spigot, discord, pluginVersion, publicVersion, player); + } + } + send.sender(sender, prefix + " §2Spigot: §6" + spigot); + send.sender(sender, prefix + " §2Discord: §6" + discord); + send.sender(sender, prefix + "§4======= " + prefix + " §4======="); + } + + + + +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/messages/TextBuilder.java b/src/main/java/net/t2code/lib/Spigot/Lib/messages/TextBuilder.java new file mode 100644 index 0000000..280b45a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/messages/TextBuilder.java @@ -0,0 +1,45 @@ +package net.t2code.lib.Spigot.Lib.messages; + +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; + +public class TextBuilder { + + private final String text; + private String hover; + private String click; + private ClickEvent.Action action; + + public TextBuilder(String text) { + this.text = text; + } + + public TextBuilder addHover(String hover) { + this.hover = hover; + return this; + } + + public TextBuilder addClickEvent(ClickEvent.Action clickEventAction, String value) { + this.action = clickEventAction; + this.click = value; + return this; + } + + public TextComponent build() { + TextComponent textComponent = new TextComponent(); + textComponent.setText(this.text); + if (this.hover != null) { + textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(this.hover).create())); + } + if (this.click != null && (this.action != null)) { + textComponent.setClickEvent(new ClickEvent(action, this.click)); + } + return textComponent; + } + + public enum ClickEventType { + OPEN_URL, OPEN_FILE, RUN_COMMAND, SUGGEST_COMMAND, CHANGE_PAGE, COPY_TO_CLIPBOARD + } +} \ No newline at end of file diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/messages/send.java b/src/main/java/net/t2code/lib/Spigot/Lib/messages/send.java new file mode 100644 index 0000000..93fad33 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/messages/send.java @@ -0,0 +1,64 @@ +package net.t2code.lib.Spigot.Lib.messages; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.util.logging.Level; + +public class send { + + /** + * Spigot + */ + + public static void console(String msg) { + Bukkit.getConsoleSender().sendMessage(msg); + } + + public static void player(Player player, String msg) { + player.sendMessage(msg); + } + + public static void title(Player player, String msg, String msg2) { + player.sendTitle(msg, msg2); + } + + public static void title(Player player, String msg, String msg2, int i, int i1, int i2) { + player.sendTitle(msg, msg2, i, i1, i2); + } + + public static void sender(CommandSender sender, String msg) { + sender.sendMessage(msg); + } + + public static void debug(Plugin plugin, String msg) { + debug(plugin, msg, null); + } + + public static void debug(Plugin plugin, String msg, Integer stage) { + // if (!new File(Main.getPath(), "config.yml").exists()) return; + if (stage == null) { + if (plugin.getConfig().getBoolean("Plugin.Debug")) Bukkit.getConsoleSender().sendMessage(plugin.getDescription().getPrefix() + " §5DEBUG: §6" + msg); + return; + } + if (plugin.getConfig().getInt("Plugin.Debug") >= stage) Bukkit.getConsoleSender().sendMessage(plugin.getDescription().getPrefix() + " §5DEBUG: §6" + msg); + } + + public static void debugmsg(Plugin plugin, String msg) { + Bukkit.getConsoleSender().sendMessage(plugin.getDescription().getPrefix() + " §5DEBUG-MSG: §6" + msg); + } + + public static void info(Plugin plugin, String msg) { + plugin.getLogger().log(Level.INFO, msg); + } + + public static void warning(Plugin plugin, String msg) { + plugin.getLogger().log(Level.WARNING, msg); + } + + public static void error(Plugin plugin, String msg) { + plugin.getLogger().log(Level.SEVERE, msg); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.java b/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.java new file mode 100644 index 0000000..ff6854a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.java @@ -0,0 +1,34 @@ +package net.t2code.lib.Spigot.Lib.minecraftVersion; + +import org.bukkit.Bukkit; + +public class MCVersion { + public static String isVersion; + public static String isBuckitVersion; + public static boolean minecraft1_8; + public static boolean minecraft1_9; + public static boolean minecraft1_10; + public static boolean minecraft1_11; + public static boolean minecraft1_12; + public static boolean minecraft1_13; + public static boolean minecraft1_14; + public static boolean minecraft1_15; + public static boolean minecraft1_16; + public static boolean minecraft1_17; + public static boolean minecraft1_18; + public static void onCheck(){ + isVersion = Bukkit.getServer().getVersion(); + isBuckitVersion = Bukkit.getServer().getBukkitVersion(); + minecraft1_8 = Bukkit.getServer().getClass().getPackage().getName().contains("1_8"); + minecraft1_9 = Bukkit.getServer().getClass().getPackage().getName().contains("1_9"); + minecraft1_10 = Bukkit.getServer().getClass().getPackage().getName().contains("1_10"); + minecraft1_11 = Bukkit.getServer().getClass().getPackage().getName().contains("1_11"); + minecraft1_12 = Bukkit.getServer().getClass().getPackage().getName().contains("1_12"); + minecraft1_13 = Bukkit.getServer().getClass().getPackage().getName().contains("1_13"); + minecraft1_14 = Bukkit.getServer().getClass().getPackage().getName().contains("1_14"); + minecraft1_15 = Bukkit.getServer().getClass().getPackage().getName().contains("1_15"); + minecraft1_16 = Bukkit.getServer().getClass().getPackage().getName().contains("1_16"); + minecraft1_17 = Bukkit.getServer().getClass().getPackage().getName().contains("1_17"); + minecraft1_18 = Bukkit.getServer().getClass().getPackage().getName().contains("1_18"); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.java b/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.java new file mode 100644 index 0000000..ba410ea --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.java @@ -0,0 +1,47 @@ +package net.t2code.lib.Spigot.Lib.minecraftVersion; + +import org.bukkit.Bukkit; + +public class NMSVersion { + public static String isNMS; + public static boolean v1_8_R1; + public static boolean v1_8_R2; + public static boolean v1_8_R3; + public static boolean v1_9_R1; + public static boolean v1_9_R2; + public static boolean v1_10_R1; + public static boolean v1_11_R1; + public static boolean v1_12_R1; + public static boolean v1_13_R1; + public static boolean v1_13_R2; + public static boolean v1_14_R1; + public static boolean v1_15_R1; + public static boolean v1_16_R1; + public static boolean v1_16_R2; + public static boolean v1_16_R3; + public static boolean v1_17_R1; + public static boolean v1_18_R1; + public static boolean v1_18_R2; + + public static void onCheck() { + isNMS = Bukkit.getServer().getClass().getPackage().getName(); + v1_8_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_8_R1"); + v1_8_R2 = Bukkit.getServer().getClass().getPackage().getName().contains("1_8_R2"); + v1_8_R3 = Bukkit.getServer().getClass().getPackage().getName().contains("1_8_R3"); + v1_9_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_9_R1"); + v1_9_R2 = Bukkit.getServer().getClass().getPackage().getName().contains("1_9_R2"); + v1_10_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_10_R1"); + v1_11_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_11_R1"); + v1_12_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_12_R1"); + v1_13_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_13_R1"); + v1_13_R2 = Bukkit.getServer().getClass().getPackage().getName().contains("1_13_R2"); + v1_14_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_14_R1"); + v1_15_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_15_R1"); + v1_16_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_16_R1"); + v1_16_R2 = Bukkit.getServer().getClass().getPackage().getName().contains("1_16_R2"); + v1_16_R3 = Bukkit.getServer().getClass().getPackage().getName().contains("1_16_R3"); + v1_17_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_17_R1"); + v1_18_R1 = Bukkit.getServer().getClass().getPackage().getName().contains("1_18_R1"); + v1_18_R2 = Bukkit.getServer().getClass().getPackage().getName().contains("1_18_R2"); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.java b/src/main/java/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.java new file mode 100644 index 0000000..39497df --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.java @@ -0,0 +1,77 @@ +package net.t2code.lib.Spigot.Lib.plugins; + +import net.t2code.lib.Spigot.system.Main; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +import java.util.logging.Level; + +public class PluginCheck { + public static Boolean pluginCheck(String pluginName){ + return Bukkit.getPluginManager().getPlugin(pluginName) != null; + } + public static Plugin pluginInfos(String pluginName){ + return Bukkit.getPluginManager().getPlugin(pluginName); + } + public static Boolean papi(){ + return Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; + } + public static Boolean vault(){ + return Bukkit.getPluginManager().getPlugin("Vault") != null; + } + public static Boolean plotSquared(){ + return Bukkit.getPluginManager().getPlugin("PlotSquared") != null; + } + public static Boolean plugManGUI(){ + return Bukkit.getPluginManager().getPlugin("PlugManGUI") != null; + } + public static Boolean cmi(){ + return Bukkit.getPluginManager().getPlugin("CMI") != null; + } + + + /** + * T2Code Plugins + * @return + */ + public static Boolean cgui(){ + return Bukkit.getPluginManager().getPlugin("CommandGUI") != null; + } + public static Boolean plotSquaredGUI(){ + return Bukkit.getPluginManager().getPlugin("PlotSquaredGUI") != null; + } + public static Boolean wbs(){ + return Bukkit.getPluginManager().getPlugin("WonderBagShop") != null; + } + public static Boolean opSec(){ + return Bukkit.getPluginManager().getPlugin("OPSecurity") != null; + } + public static Boolean papiTest(){ + return Bukkit.getPluginManager().getPlugin("PaPiTest") != null; + } + public static Boolean booster(){ + return Bukkit.getPluginManager().getPlugin("Booster") != null; + } + public static Boolean antiMapCopy(){ + return Bukkit.getPluginManager().getPlugin("AAntiMapCopy") != null; + } + public static Boolean loreEditor(){ + return Bukkit.getPluginManager().getPlugin("LoreEditor") != null; + } + public static Boolean t2cAlias(){ + return Bukkit.getPluginManager().getPlugin("T2C-Alias") != null; + } + public static Boolean t2cWarp(){ + return Bukkit.getPluginManager().getPlugin("T2C-Warp") != null; + } + + public static Boolean pluginNotFound(Plugin plugin, String prefix, String pl, Integer spigotID) { + if (Bukkit.getPluginManager().getPlugin(pl) == null) { + plugin.getLogger().log(Level.SEVERE, "Plugin can not be loaded!"); + Bukkit.getConsoleSender().sendMessage(prefix + " §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.getPluginLoader().disablePlugin(Main.plugin); + return true; + } else return false; + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/register/Register.java b/src/main/java/net/t2code/lib/Spigot/Lib/register/Register.java new file mode 100644 index 0000000..a01af2f --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/register/Register.java @@ -0,0 +1,38 @@ +package net.t2code.lib.Spigot.Lib.register; + +import org.bukkit.Bukkit; +import org.bukkit.permissions.Permission; +import org.bukkit.event.Listener; +import org.bukkit.permissions.PermissionDefault; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.Collections; + +public class Register { + public static void listener(Listener listener, Plugin plugin) { + Bukkit.getServer().getPluginManager().registerEvents(listener, plugin); + } + + public static void permission(String permission, Plugin plugin) { + if (plugin.getServer().getPluginManager().getPermission(permission) == null) { + plugin.getServer().getPluginManager().addPermission(new Permission(permission)); + } + } + + public static void permission(String permission, PermissionDefault setDefault, Plugin plugin) { + permission(permission, plugin); + plugin.getServer().getPluginManager().getPermission(permission).setDefault(setDefault); + } + + public static void permission(String permission, String children, Boolean setBoolean, Plugin plugin) { + permission(permission, plugin); + plugin.getServer().getPluginManager().getPermission(permission).getChildren().put(children, setBoolean); + } + + public static void permission(String permission, PermissionDefault setDefault, String children, Boolean setBoolean, Plugin plugin) { + permission(permission, plugin); + plugin.getServer().getPluginManager().getPermission(permission).setDefault(setDefault); + plugin.getServer().getPluginManager().getPermission(permission).getChildren().put(children, setBoolean); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/replace/Replace.java b/src/main/java/net/t2code/lib/Spigot/Lib/replace/Replace.java new file mode 100644 index 0000000..fb0966a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/replace/Replace.java @@ -0,0 +1,90 @@ +package net.t2code.lib.Spigot.Lib.replace; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Replace { + + public static String replace(String prefix, String Text) { + return Text.replace("[prefix]", prefix).replace("&", "§").replace("[ue]", "ü") + .replace("[UE]", "Ü").replace("[oe]", "ö").replace("[OE]", "Ö") + .replace("[ae]", "ä").replace("[AE]", "Ä"); + } + + + public static String replace(String prefix,Player player, String Text) { + return PlaceholderAPI.setPlaceholders(player, Text.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä")); + } + + + public static List replace(String prefix, List Text) { + List output = new ArrayList<>(); + for (String input : Text) { + output.add(input.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä")); + } + return output; + } + + + public static List replace(String prefix,Player player, List Text) { + List output = new ArrayList(); + if (player == null) { + return Arrays.asList("player is null"); + } + if (Text == null) { + return Arrays.asList("Text is null"); + } + for (String input : Text) { + output.add(PlaceholderAPI.setPlaceholders(player, input.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä"))); + } + return output; + } + + + public static List replacePrice(String prefix,List Text, String price) { + List rp = new ArrayList(); + for (String s : Text) { + rp.add(s.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä") + .replace("[price]", String.valueOf(price))); + } + return rp; + } + + + public static List replacePrice(String prefix,Player player, List Text, String price) { + List rp = new ArrayList(); + for (String s : Text) { + rp.add(PlaceholderAPI.setPlaceholders(player, s.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä") + .replace("[price]", String.valueOf(price)))); + } + return rp; + } + public static String replacePrice(String prefix, String Text, String price) { + return Text.replace("[prefix]", prefix).replace("&", "§").replace("[ue]", "ü") + .replace("[UE]", "Ü").replace("[oe]", "ö").replace("[OE]", "Ö") + .replace("[ae]", "ä").replace("[AE]", "Ä").replace("[price]", String.valueOf(price)); + } + + + public static String replacePrice(String prefix,Player player, String Text, String price) { + return PlaceholderAPI.setPlaceholders(player, Text.replace("[prefix]", prefix).replace("&", "§") + .replace("[ue]", "ü").replace("[UE]", "Ü").replace("[oe]", "ö") + .replace("[OE]", "Ö").replace("[ae]", "ä").replace("[AE]", "Ä") + .replace("[price]", String.valueOf(price))); + } + +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateAPI.java b/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateAPI.java new file mode 100644 index 0000000..f7895bd --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateAPI.java @@ -0,0 +1,167 @@ +package net.t2code.lib.Spigot.Lib.update; + + +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.TextComponent; + +import net.t2code.lib.Spigot.Lib.messages.TextBuilder; +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.system.config.SelectLibConfig; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Scanner; +import java.util.function.Consumer; + +public class UpdateAPI { + public static HashMap PluginVersionen = new HashMap<>(); + + public static void join(Plugin plugin, String prefix, String perm, Player player, String spigot, String discord) { + String pluginVersion = plugin.getDescription().getVersion(); + String publicVersion = UpdateAPI.PluginVersionen.get(plugin.getName()).publicVersion; + if (!player.hasPermission(perm) || !player.isOp()) { + return; + } + if (publicVersion == null) { + new BukkitRunnable() { + @Override + public void run() { + join(plugin, prefix, perm, player, spigot, discord); + } + }.runTaskLater(plugin, 20L); + } else use(plugin, prefix, player, pluginVersion, publicVersion, spigot, discord); + } + + private static void use(Plugin plugin, String prefix, Player player, String pluginVersion, String publicVersion, String spigot, String discord) { + new BukkitRunnable() { + @Override + public void run() { + if (!pluginVersion.equals(publicVersion)) { + if (SelectLibConfig.UpdateCheckOnJoin) { + UpdateAPI.sendUpdateMsg(prefix, spigot, discord, pluginVersion, publicVersion, player); + } + } + } + }.runTaskLater(plugin, 200L); + } + + public static void sendUpdateMsg(String Prefix, String Spigot, String Discord, String pluginVersion, String publicVersion) { + send.console("§4=========== " + Prefix + " §4==========="); + send.console("§6A new version was found!"); + send.console("§6Your version: §c" + pluginVersion + " §7- §6Current version: §a" + publicVersion); + send.console("§6You can download it here: §e" + Spigot); + send.console("§6You can find more information on Discord: §e" + Discord); + send.console("§4=========== " + Prefix + " §4==========="); + } + + public static void sendUpdateMsg(String Prefix, String Spigot, String Discord, String pluginVersion, String publicVersion, Player player) { + if (publicVersion.equals("§4No public version found!")) { + return; + } + send.player(player, Prefix); + TextComponent comp = new TextBuilder(Prefix + " §6A new version was found!") + .addHover("§6You can download it here: §e" + Spigot).addClickEvent(ClickEvent.Action.OPEN_URL, Spigot).build(); + player.spigot().sendMessage(comp); + TextComponent comp1 = new TextBuilder(Prefix + " §c" + pluginVersion + " §7-> §a" + publicVersion) + .addHover("§6You can download it here: §e" + Spigot).addClickEvent(ClickEvent.Action.OPEN_URL, Spigot).build(); + player.spigot().sendMessage(comp1); + TextComponent comp2 = new TextBuilder(Prefix + " §6You can find more information on Discord.") + .addHover("§e" + Discord).addClickEvent(ClickEvent.Action.OPEN_URL, Discord).build(); + player.spigot().sendMessage(comp2); + send.player(player, Prefix); + } + + private static Boolean noUpdate = true; + + public static void onUpdateCheck(Plugin plugin, String Prefix, String Spigot, int SpigotID, String Discord) { + int taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { + public void run() { + + (new UpdateAPI((JavaPlugin) plugin, SpigotID)).getVersion((update_version) -> { + UpdateObject update = new UpdateObject( + plugin.getName(), + plugin.getDescription().getVersion(), + update_version + ); + UpdateAPI.PluginVersionen.put(plugin.getName(), update); + + if (!plugin.getDescription().getVersion().equalsIgnoreCase(update_version)) { + noUpdate = true; + new BukkitRunnable() { + @Override + public void run() { + sendUpdateMsg(Prefix, Spigot, Discord, plugin.getDescription().getVersion(), update_version); + } + }.runTaskLater(plugin, 600L); + } else { + + if (noUpdate) { + send.console(Prefix + " §2No update found."); + noUpdate = false; + } + } + }, Prefix, plugin.getDescription().getVersion()); + } + }, 0L, 20 * 60 * 60L); + } + + private JavaPlugin plugin; + private int resourceId; + + public UpdateAPI(JavaPlugin plugin, int resourceId) { + this.plugin = plugin; + this.resourceId = resourceId; + } + + public void getVersion(Consumer consumer, String Prefix, String pluginVersion) { + Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> { + try { + InputStream inputStream = (new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.resourceId)).openStream(); + try { + Scanner scanner = new Scanner(inputStream); + + try { + if (scanner.hasNext()) { + consumer.accept(scanner.next()); + } + } catch (Throwable var8) { + try { + scanner.close(); + } catch (Throwable var7) { + var8.addSuppressed(var7); + } + throw var8; + } + scanner.close(); + } catch (Throwable var9) { + if (inputStream != null) { + try { + inputStream.close(); + } catch (Throwable var6) { + var9.addSuppressed(var6); + } + } + throw var9; + } + if (inputStream != null) { + inputStream.close(); + } + } catch (IOException var10) { + UpdateObject update = new UpdateObject( + plugin.getName(), + pluginVersion, + "§4No public version found!" + ); + UpdateAPI.PluginVersionen.put(plugin.getName(), update); + this.plugin.getLogger().severe(Prefix + "§4 Cannot look for updates: " + var10.getMessage()); + } + }); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateObject.java b/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateObject.java new file mode 100644 index 0000000..dd74560 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/update/UpdateObject.java @@ -0,0 +1,14 @@ +package net.t2code.lib.Spigot.Lib.update; + +public class UpdateObject { + + public String pluginName; + public String pluginVersion; + public String publicVersion; + + public UpdateObject(String pluginName, String pluginVersion, String publicVersion) { + this.pluginName = pluginName; + this.pluginVersion = pluginVersion; + this.publicVersion = publicVersion; + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/vault/Vault.java b/src/main/java/net/t2code/lib/Spigot/Lib/vault/Vault.java new file mode 100644 index 0000000..4b5301a --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/vault/Vault.java @@ -0,0 +1,68 @@ +package net.t2code.lib.Spigot.Lib.vault; + +import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.permission.Permission; +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.system.Main; +import net.t2code.lib.Spigot.system.languages.SelectLibMsg; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.RegisteredServiceProvider; + +public class Vault { + + public static Boolean vaultEnable; + public static Boolean connected; + + public static boolean buy(String prefix, Player p, Double price) { + if (Main.eco == null) { + if (Bukkit.getPluginManager().getPlugin("Vault") == null) { + send.console(prefix + " §4\n" + prefix + " §4Vault could not be found! §9Please download it here: " + + "§6https://www.spigotmc.org/resources/vault.34315/§4\n" + prefix); + } + p.sendMessage(prefix + "\n" + SelectLibMsg.VaultNotSetUp + "\n" + prefix); + } else { + if (Main.eco.getBalance(p) < price) { + return false; + } else { + Main.eco.withdrawPlayer(p, price); + return true; + } + } + return false; + } + + public static void loadVault() throws InterruptedException { + Long long_ = Long.valueOf(System.currentTimeMillis()); + if (Main.plugin.getServer().getPluginManager().getPlugin("Vault") != null) { + vaultEnable = true; + RegisteredServiceProvider eco = Main.plugin.getServer().getServicesManager().getRegistration(Economy.class); + if (eco != null) { + Main.eco = eco.getProvider(); + if (Main.eco != null) { + connected = true; + send.console(Main.prefix + " §2Vault / Economy successfully connected!" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } else { + connected = false; + send.console(Main.prefix + " §4Economy could not be connected / found! 1" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } + } else { + connected = false; + send.console(Main.prefix + " §4Economy could not be connected / found! 2" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } + RegisteredServiceProvider perm = Main.plugin.getServer().getServicesManager().getRegistration(Permission.class); + if (perm != null) { + Main.perm = perm.getProvider(); + } + } else { + vaultEnable = false; + connected = false; + send.console(Main.prefix + " §4Vault could not be connected! 3" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } + } + + public static void vaultDisable() { + connected = false; + send.console(Main.prefix + " §4Vault / Economy successfully deactivated."); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/Lib/yamlConfiguration/Config.java b/src/main/java/net/t2code/lib/Spigot/Lib/yamlConfiguration/Config.java new file mode 100644 index 0000000..a6a6363 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/Lib/yamlConfiguration/Config.java @@ -0,0 +1,189 @@ +package net.t2code.lib.Spigot.Lib.yamlConfiguration; + +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.Lib.minecraftVersion.MCVersion; +import net.t2code.lib.Spigot.Lib.replace.Replace; +import net.t2code.lib.Spigot.system.languages.SelectLibMsg; +import org.bukkit.Sound; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.util.ArrayList; +import java.util.List; + +public class Config { + public static void set(String path, String value, YamlConfiguration YamlConfiguration) { + if (!YamlConfiguration.contains(path)) { + YamlConfiguration.set(path, value); + } + } + + public static void set(String path, YamlConfiguration YamlConfiguration) { + YamlConfiguration.set(path, null); + } + + public static void set(String path, Integer value, YamlConfiguration YamlConfiguration) { + if (!YamlConfiguration.contains(path)) { + YamlConfiguration.set(path, value); + } + } + + public static void set(String path, Double value, YamlConfiguration YamlConfiguration) { + if (!YamlConfiguration.contains(path)) { + YamlConfiguration.set(path, value); + } + } + + public static void set(String path, Boolean value, YamlConfiguration YamlConfiguration) { + if (!YamlConfiguration.contains(path)) { + YamlConfiguration.set(path, value); + } + } + + public static void set(String path, List value, YamlConfiguration YamlConfiguration) { + if (!YamlConfiguration.contains(path)) { + YamlConfiguration.set(path, value); + } + } + + public static void setSound(String soundName, String sound1_8, String sound1_9, String sound1_13, YamlConfiguration yamlConfiguration) { + Config.set("Sound." + soundName + ".Enable", true, yamlConfiguration); + String sound; + if (MCVersion.minecraft1_8) { + sound = sound1_8.toString(); + } else if (MCVersion.minecraft1_9 || MCVersion.minecraft1_10 || MCVersion.minecraft1_11 || MCVersion.minecraft1_12) { + sound = sound1_9.toString(); + } else sound = sound1_13.toString(); + Config.set("Sound." + soundName + ".Sound", sound, yamlConfiguration); + } + + public static void setSound(String soundName, String sound1_8, String sound1_13, YamlConfiguration yamlConfiguration) { + Config.set("Sound." + soundName + ".Enable", true, yamlConfiguration); + String sound; + if (MCVersion.minecraft1_8) { + sound = sound1_8.toString(); + } else sound = sound1_13.toString(); + Config.set("Sound." + soundName + ".Sound", sound, yamlConfiguration); + } + + public static void setSound(String soundName, String sound, YamlConfiguration yamlConfiguration) { + Config.set("Sound." + soundName + ".Enable", true, yamlConfiguration); + Config.set("Sound." + soundName + ".Sound", sound.toString(), yamlConfiguration); + } + + public static boolean selectSoundEnable( String soundName, YamlConfiguration yamlConfiguration) { + return selectBoolean("Sound." + soundName + ".Enable", yamlConfiguration); + } + + public static String selectSound(String prefix, String soundName, YamlConfiguration yamlConfiguration) { + return select(prefix, "Sound." + soundName + ".Sound", yamlConfiguration); + } + + public static Sound checkSound(String sound1_8, String sound1_9, String sound1_13, String selectSoundFromConfig, String prefix) { + String SOUND; + if (MCVersion.minecraft1_8) { + SOUND = sound1_8; + } else if (MCVersion.minecraft1_9 || MCVersion.minecraft1_10 || MCVersion.minecraft1_11 || MCVersion.minecraft1_12) { + SOUND = sound1_9; + } else SOUND = sound1_13; + + try { + Sound sound_Buy = Sound.valueOf(selectSoundFromConfig); + if (sound_Buy != null) { + return sound_Buy; + } else return null; + } catch (Exception e) { + send.console("§4\n§4\n§4\n" + SelectLibMsg.SoundNotFound.replace("[prefix]", prefix) + .replace("[sound]", "§8Buy: §6" + selectSoundFromConfig) + "§4\n§4\n§4\n"); + return Sound.valueOf(SOUND); + } + } + + public static Sound checkSound(String sound1_8, String sound1_13, String selectSoundFromConfig, String prefix) { + String SOUND; + if (MCVersion.minecraft1_8) { + SOUND = sound1_8; + } else SOUND = sound1_13; + + try { + Sound sound_Buy = Sound.valueOf(selectSoundFromConfig); + if (sound_Buy != null) { + return sound_Buy; + } else return null; + } catch (Exception e) { + send.console("§4\n§4\n§4\n" + SelectLibMsg.SoundNotFound.replace("[prefix]", prefix) + .replace("[sound]", "§8Buy: §6" + selectSoundFromConfig) + "§4\n§4\n§4\n"); + return Sound.valueOf(SOUND); + } + } + + public static Sound checkSound(String sound, String selectSoundFromConfig, String prefix) { + try { + Sound sound_Buy = Sound.valueOf(selectSoundFromConfig); + if (sound_Buy != null) { + return sound_Buy; + } else return null; + } catch (Exception e) { + send.console("§4\n§4\n§4\n" + SelectLibMsg.SoundNotFound.replace("[prefix]", prefix) + .replace("[sound]", "§8Buy: §6" + selectSoundFromConfig) + "§4\n§4\n§4\n"); + return Sound.valueOf(sound); + } + } + + public static String select(String prefix, String path, YamlConfiguration yamlConfiguration) { + return Replace.replace(prefix, yamlConfiguration.getString(path)); + } + + public static void select(String prefix, String value, String path, YamlConfiguration yamlConfiguration) { + value = Replace.replace(prefix, yamlConfiguration.getString(path)); + } + + public static Integer selectInt(String path, YamlConfiguration yamlConfiguration) { + return (yamlConfiguration.getInt(path)); + } + + public static void select(String path, Integer value, YamlConfiguration yamlConfiguration) { + value = (yamlConfiguration.getInt(path)); + } + + public static Boolean selectBoolean(String path, YamlConfiguration yamlConfiguration) { + return (yamlConfiguration.getBoolean(path)); + } + + public static void select(String path, Boolean value, YamlConfiguration yamlConfiguration) { + value = (yamlConfiguration.getBoolean(path)); + } + + public static Double selectDouble(String path, YamlConfiguration yamlConfiguration) { + return (yamlConfiguration.getDouble(path)); + } + + public static void select(String path, Double value, YamlConfiguration yamlConfiguration) { + value = (yamlConfiguration.getDouble(path)); + } + + public static List selectList(String path, YamlConfiguration yamlConfiguration) { + return (yamlConfiguration.getList(path)); + } + + public static void select(String path, List value, YamlConfiguration yamlConfiguration) { + value = (yamlConfiguration.getList(path)); + } + + public static List selectList(String prefix, String path, YamlConfiguration yamlConfiguration) { + List output = new ArrayList<>(); + List input = yamlConfiguration.getStringList(path); + for (String st : input) { + output.add(Replace.replace(prefix, st)); + } + return output; + } + + public static void select(String prefix, List value, String path, YamlConfiguration yamlConfiguration) { + List output = new ArrayList<>(); + List input = yamlConfiguration.getStringList(path); + for (String st : input) { + output.add(Replace.replace(prefix, st)); + } + value = output; + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/CmdExecuter.java b/src/main/java/net/t2code/lib/Spigot/system/CmdExecuter.java new file mode 100644 index 0000000..ae004f6 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/CmdExecuter.java @@ -0,0 +1,110 @@ +package net.t2code.lib.Spigot.system; + +import net.md_5.bungee.protocol.packet.Commands; +import net.t2code.lib.Spigot.Lib.messages.T2CodeTemplate; +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.Lib.update.UpdateAPI; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URI; +import java.nio.file.*; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +public class CmdExecuter implements CommandExecutor, TabCompleter { + private static Plugin plugin = Main.plugin; + private static String prefix = Main.prefix; + private static List autor = Main.autor; + private static String version = Main.version; + private static String spigot = Main.spigot; + private static String discord = Main.discord; + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (args.length == 0) { + T2CodeTemplate.sendInfo(sender, prefix, spigot, discord, autor, version, UpdateAPI.PluginVersionen.get(plugin.getName()).publicVersion); + } else { + if ("debug".equals(args[0].toLowerCase())) { + if (args.length != 2) { + send.sender(sender,"§4Use: §7/t2code debug createReportLog"); + return false; + } + if ("createreportlog".equals(args[1].toLowerCase())) { + + CreateReportLog.create(sender); + + } else send.sender(sender,"§4Use: §7/t2code debug createReportLog"); + } else send.sender(sender,"§4Use: §7/t2code debug createReportLog"); + } + return false; + } + + + //TabCompleter + private static HashMap arg1 = new HashMap() {{ + put("debug", "t2code.admin"); + }}; + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String s, String[] args) { + List list = new ArrayList<>(); + if (sender instanceof Player) { + Player p = (Player) sender; + if (args.length == 1) { + for (String command : arg1.keySet()) { + if (hasPermission(p, arg1.get(command)) && passend(command, args[0])) { + list.add(command); + } + } + } + + if (args.length == 2 && args[0].equalsIgnoreCase("debug")) { + if (sender.hasPermission("t2code.admin")) { + if (hasPermission(p, arg1.get("debug")) && passend("debug", args[1])) { + list.add("createReportLog"); + } + } + return list; + } + + } + return list; + } + + private static Boolean passend(String command, String arg) { + for (int i = 0; i < arg.toUpperCase().length(); i++) { + if (arg.toUpperCase().length() >= command.toUpperCase().length()) { + return false; + } else { + if (arg.toUpperCase().charAt(i) != command.toUpperCase().charAt(i)) { + return false; + } + } + } + return true; + } + + + public static boolean hasPermission(Player player, String permission) { + if (player.isOp()) { + return true; + } + String[] Permissions = permission.split(";"); + for (String perm : Permissions) { + if (player.hasPermission(perm)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/CreateReportLog.java b/src/main/java/net/t2code/lib/Spigot/system/CreateReportLog.java new file mode 100644 index 0000000..102d237 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/CreateReportLog.java @@ -0,0 +1,179 @@ +package net.t2code.lib.Spigot.system; + +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.Lib.minecraftVersion.MCVersion; +import net.t2code.lib.Spigot.Lib.minecraftVersion.NMSVersion; +import net.t2code.lib.Spigot.Lib.plugins.PluginCheck; +import net.t2code.lib.Spigot.Lib.vault.Vault; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + + +public class CreateReportLog { + protected static void create(CommandSender sender) { + send.sender(sender, Main.prefix + " §6A DebugLog is created..."); + String timeStampFile = new SimpleDateFormat("HH_mm_ss-dd_MM_yyyy").format(Calendar.getInstance().getTime()); + + File directory = new File(Main.getPath() + "/DebugLogs"); + if (!directory.exists()) { + directory.mkdir(); + } + + File file = new File(Main.getPath(), "/DebugLogs/T2CodeLog.txt"); + PrintWriter pWriter = null; + try { + pWriter = new PrintWriter(new FileWriter(file.getPath())); + String timeStamp = new SimpleDateFormat("HH:mm:ss dd.MM.yyyy").format(Calendar.getInstance().getTime()); + pWriter.println("Created on: " + timeStamp); + pWriter.println(); + pWriter.println("Server Bukkit version: " + MCVersion.isBuckitVersion); + pWriter.println("Server run on: " + MCVersion.isVersion); + pWriter.println("Server NMS: " + NMSVersion.isNMS); + pWriter.println(); + pWriter.println("Online Mode: " + Bukkit.getOnlineMode()); + pWriter.println("Worlds: " + Bukkit.getWorlds()); + pWriter.println(); + if (Vault.vaultEnable) { + pWriter.println("Vault: " + Bukkit.getPluginManager().getPlugin("Vault").getName() + " - " + Bukkit.getPluginManager().getPlugin("Vault").getDescription().getVersion()); + } else pWriter.println("Vault: not connected"); + if (Main.eco != null) { + String st; + st = Main.eco.getName(); + if (Main.eco.getName().equals("CMIEconomy")) st = "CMI"; + pWriter.println("Economy: " + Main.eco.isEnabled() + " - " + Main.eco.getName() + " - " + Bukkit.getPluginManager().getPlugin(st).getDescription().getVersion()); + } else pWriter.println("Economy: not connected via vault"); + if (Main.perm != null) { + pWriter.println("Permission: " + Main.perm.isEnabled() + " - " + Main.perm.getName() + " - " + Bukkit.getPluginManager().getPlugin(Main.perm.getName()).getDescription().getVersion()); + } else pWriter.println("Permission: not connected via vault"); + pWriter.println(); + pWriter.println("Java: " + System.getProperty("java.version")); + pWriter.println("System: " + System.getProperty("os.name")); + pWriter.println("System: " + System.getProperty("os.version")); + pWriter.println("User Home: " + System.getProperty("user.home")); + pWriter.println(); + pWriter.println("T2CodeLib: " + Main.plugin.getDescription().getVersion()); + pWriter.println(); + pWriter.println("Plugins: "); + for (Plugin pl : Bukkit.getPluginManager().getPlugins()) { + pWriter.println(" - " + pl.getName() + " - " + pl.getDescription().getVersion() + " - Enabled: " + pl.isEnabled() + " - Autors: " + pl.getDescription().getAuthors() + " - Website: " + pl.getDescription().getWebsite()); + } + } catch (IOException ioe) { + ioe.printStackTrace(); + } finally { + if (pWriter != null) { + pWriter.flush(); + pWriter.close(); + } + } + + String filePath = Main.getPath() + "/DebugLogs/T2CodeLog.txt"; + String log = "logs/latest.log"; + String zipPath = "plugins/T2CodeLib/DebugLogs/T2CLog-" + timeStampFile + ".zip"; + try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipPath))) { + File fileToZip = new File(filePath); + zip.putNextEntry(new ZipEntry(fileToZip.getName())); + Files.copy(fileToZip.toPath(), zip); + + //File logToZip = new File(log); + //zipOut.putNextEntry(new ZipEntry(logToZip.getName())); + //Files.copy(logToZip.toPath(), zipOut); + + addFileToZip("", "logs/latest.log", zip, false); + + pluginToDebug("T2C-LuckyBox", "T2C-LuckyBox", zip); + pluginToDebug("WonderBagShop", "WonderBagShop", zip); + pluginToDebug("CommandGUI", "CommandGUI", zip); + pluginToDebug("OPSecurity", "OPSecurity", zip); + pluginToDebug("PaPiTest", "PaPiTest", zip); + pluginToDebug("PlotSquaredGUI", "PlotSquaredGUI", zip); + pluginToDebug("T2C-Alias", "T2Code-Alias", zip); + + pluginToDebug("LoreEditor", "LoreEditor", zip); + pluginToDebug("Booster", "Booster", zip); + pluginToDebug("AntiMapCopy", "AntiCopy", zip); + + zip.closeEntry(); + zip.close(); + } catch (IOException e) { + e.printStackTrace(); + } + file.delete(); + if (sender instanceof Player) { + send.sender(sender, Main.prefix + " §6The DebugLog has been created. You can find it under: §e" + zipPath); + send.console(Main.prefix + " §6A DebugLog has been created. You can find it under: §e" + zipPath); + } else send.sender(sender, Main.prefix + " §6The DebugLog has been created. You can find it under: §e" + zipPath); + + } + + private static void pluginToDebug(String pluginName, String jar, ZipOutputStream zip) throws IOException { + if (PluginCheck.pluginCheck(pluginName)) { + Plugin plugin = Bukkit.getPluginManager().getPlugin(pluginName); + File plConfigs = new File(plugin.getDataFolder().getPath()); + if (plConfigs.exists()) { + addFolderToZip("T2Code-Plugins", plugin.getDataFolder().getPath(), zip); + } + File f = new File("plugins/"); + File[] fileArray = f.listFiles(); + + for (File config : fileArray) { + if (config.getName().contains(jar) && config.getName().contains(".jar")) { + addFileToZip("T2Code-Plugins", config.getPath(), zip, false); + } + } + } + } + + private static void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws IOException { + File folder = new File(srcFolder); + if (folder.list() == null) { + addFileToZip(path + "/" + folder.getName(), srcFolder, zip, false); + } else if (folder.list().length == 0) { + addFileToZip(path, srcFolder, zip, true); + } else { + for (String fileName : folder.list()) { + if (path.equals("")) { + addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip, false); + } else { + addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip, false); + } + } + } + } + + private static void addFileToZip(String path, String srcFile, ZipOutputStream zip, boolean flag) throws IOException { + File folder = new File(srcFile); + if (flag) { + zip.putNextEntry(new ZipEntry(path + "/" + folder.getName() + "/")); + } else { + if (folder.isDirectory()) { + addFolderToZip(path, srcFile, zip); + } else { + byte[] buf = new byte[1024]; + int len; + FileInputStream in = new FileInputStream(srcFile); + + if (path.equals("")) { + zip.putNextEntry(new ZipEntry((folder.getName()))); + } else { + zip.putNextEntry(new ZipEntry((path + "/" + folder.getName()))); + } + + while ((len = in.read(buf)) > 0) { + zip.write(buf, 0, len); + } + } + } + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/JoinEvent.java b/src/main/java/net/t2code/lib/Spigot/system/JoinEvent.java new file mode 100644 index 0000000..6b109a2 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/JoinEvent.java @@ -0,0 +1,19 @@ +// This claas was created by JaTiTV + +package net.t2code.lib.Spigot.system; + +import net.t2code.lib.Spigot.Lib.update.UpdateAPI; +import net.t2code.lib.Util; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerLoginEvent; + +public class JoinEvent implements Listener { + + @EventHandler + public void onJoinEvent(PlayerLoginEvent event) { + Player player = event.getPlayer(); + UpdateAPI.join(Main.plugin, Util.Prefix, "t2code.lib.updatemsg", event.getPlayer(), Main.spigot, Main.discord); + } +} \ No newline at end of file diff --git a/src/main/java/net/t2code/lib/Spigot/system/Main.java b/src/main/java/net/t2code/lib/Spigot/system/Main.java new file mode 100644 index 0000000..d5ac921 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/Main.java @@ -0,0 +1,109 @@ +package net.t2code.lib.Spigot.system; + +import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.permission.Permission; +import net.t2code.lib.Spigot.Lib.items.ItemVersion; +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.Lib.minecraftVersion.MCVersion; +import net.t2code.lib.Spigot.Lib.minecraftVersion.NMSVersion; +import net.t2code.lib.Spigot.Lib.messages.T2CodeTemplate; +import net.t2code.lib.Spigot.Lib.plugins.PluginCheck; +import net.t2code.lib.Spigot.Lib.register.Register; +import net.t2code.lib.Spigot.Lib.update.UpdateAPI; +import net.t2code.lib.Spigot.Lib.vault.Vault; +import net.t2code.lib.Spigot.system.config.ConfigCreate; +import net.t2code.lib.Spigot.system.languages.LanguagesCreate; +import net.t2code.lib.Util; +import net.t2code.lib.Spigot.system.config.SelectLibConfig; +import net.t2code.lib.Spigot.system.languages.SelectLibMsg; +import org.bukkit.Bukkit; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.util.List; + +public final class Main extends JavaPlugin { + + public static File getPath() { + return plugin.getDataFolder(); + } + + public static Main plugin; + public static Economy eco = null; + public static Permission perm = null; + + public static List autor; + public static String version; + + 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; + + @Override + public void onEnable() { + // Plugin startup logic + plugin = this; + autor = plugin.getDescription().getAuthors(); + version = plugin.getDescription().getVersion(); + Long long_; + long_ = T2CodeTemplate.onLoadHeader(prefix, autor, version, spigot, discord); + //send.console("§4 _|_|_|_|_| _|_| _|_|_| _| "); + //send.console("§4 _| _| _| _| _|_| _|_|_| _|_| "); + //send.console("§4 _| _| _| _| _| _| _| _|_|_|_| "); + //send.console("§4 _| _| _| _| _| _| _| _| "); + //send.console("§4 _| _|_|_|_| _|_|_| _|_| _|_|_| _|_|_| "); + //T2CodeTemplate.onLoadSeparateStroke(prefix); + try { + Vault.loadVault(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + NMSVersion.onCheck(); + MCVersion.onCheck(); + if (MCVersion.minecraft1_18){ + send.warning(this, "The 1.18 is not yet supported with this version! Please check if there are updates of our plugins! " + + "For further questions please join our Discord: http://dc.t2code.net"); + } + ItemVersion.scan(); + send.console(Main.prefix + " §3Server run on: §6" + MCVersion.isVersion + " / " + NMSVersion.isNMS); + if (eco != null) { + String st; + st = eco.getName(); + if (eco.getName().equals("CMIEconomy")) st = "CMI"; + if (Bukkit.getPluginManager().getPlugin(st) != null){ + send.console(Main.prefix + " §3Economy: §6" + eco.getName() + " - " + Bukkit.getPluginManager().getPlugin(st).getDescription().getVersion() + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } else send.console(Main.prefix + " §3Economy: §6" + eco.getName() + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } else send.console(Main.prefix + " §3Economy: §4not connected via vault!" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + + if (perm != null) { + if (Bukkit.getPluginManager().getPlugin(perm.getName()) != null){ + send.console(Main.prefix + " §3Permission plugin: §6" + perm.getName() + " - " + Bukkit.getPluginManager().getPlugin(perm.getName()).getDescription().getVersion() + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } else send.console(Main.prefix + " §3Permission plugin: §6" + perm.getName() + " - §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } else send.console(Main.prefix + " §3Permission plugin: §4not connected via vault!" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + if (PluginCheck.pluginCheck("PlaceholderAPI")) { + send.console(Main.prefix + " §3PlaceholderAPI: §6connected" + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + + } + + + Main.plugin.getCommand("t2code").setExecutor(new CmdExecuter()); + ConfigCreate.configCreate(); + LanguagesCreate.langCreate(); + SelectLibConfig.onSelect(); + SelectLibMsg.onSelect(prefix); + UpdateAPI.onUpdateCheck(plugin, prefix, spigot, spigotID, discord); + Metrics.Bstats(plugin, bstatsID); + Bukkit.getServer().getPluginManager().registerEvents(new JoinEvent(), plugin); + T2CodeTemplate.onLoadFooter(prefix, long_); + } + + @Override + public void onDisable() { + // Plugin shutdown logic + Vault.vaultDisable(); + T2CodeTemplate.onDisable(prefix, autor, version, spigot, discord); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/Metrics.java b/src/main/java/net/t2code/lib/Spigot/system/Metrics.java new file mode 100644 index 0000000..a4c7f02 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/Metrics.java @@ -0,0 +1,851 @@ +// This claas was created by JaTiTV + + +package net.t2code.lib.Spigot.system; + +import net.t2code.lib.Spigot.system.config.SelectLibConfig; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.lang.reflect.Method; +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 { + + public static void Bstats(Plugin plugin, int bstatsID) { + int pluginId = bstatsID; // <-- Replace with the id of your plugin! + Metrics metrics = new Metrics((JavaPlugin) plugin, pluginId); + metrics.addCustomChart(new SimplePie("updatecheckonjoin", () -> String.valueOf(SelectLibConfig.UpdateCheckOnJoin))); + } + + private final Plugin plugin; + + private final MetricsBase metricsBase; + + /** + * Creates a new Metrics instance. + * + * @param plugin Your plugin instance. + * @param serviceId The id of the service. It can be found at What is my plugin id? + */ + public Metrics(JavaPlugin plugin, int serviceId) { + this.plugin = plugin; + // Get the config file + File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); + File configFile = new File(bStatsFolder, "config.yml"); + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + if (!config.isSet("serverUuid")) { + config.addDefault("enabled", true); + config.addDefault("serverUuid", UUID.randomUUID().toString()); + config.addDefault("logFailedRequests", false); + config.addDefault("logSentData", false); + config.addDefault("logResponseStatusText", false); + // Inform the server owners about bStats + config + .options() + .header( + "bStats (https://bStats.org) collects some basic information for plugin authors, like how\n" + + "many people use their plugin and their total player count. It's recommended to keep bStats\n" + + "enabled, but if you're not comfortable with this, you can turn this setting off. There is no\n" + + "performance penalty associated with having metrics enabled, and data sent to bStats is fully\n" + + "anonymous.") + .copyDefaults(true); + try { + config.save(configFile); + } catch (IOException ignored) { + } + } + // Load the data + boolean enabled = config.getBoolean("enabled", true); + String serverUUID = config.getString("serverUuid"); + boolean logErrors = config.getBoolean("logFailedRequests", false); + boolean logSentData = config.getBoolean("logSentData", false); + boolean logResponseStatusText = config.getBoolean("logResponseStatusText", false); + metricsBase = + new MetricsBase( + "bukkit", + serverUUID, + serviceId, + enabled, + this::appendPlatformData, + this::appendServiceData, + submitDataTask -> Bukkit.getScheduler().runTask(plugin, submitDataTask), + plugin::isEnabled, + (message, error) -> this.plugin.getLogger().log(Level.WARNING, message, error), + (message) -> this.plugin.getLogger().log(Level.INFO, message), + logErrors, + logSentData, + logResponseStatusText); + } + + /** + * Adds a custom chart. + * + * @param chart The chart to add. + */ + public void addCustomChart(CustomChart chart) { + metricsBase.addCustomChart(chart); + } + + private void appendPlatformData(JsonObjectBuilder builder) { + builder.appendField("playerAmount", getPlayerAmount()); + builder.appendField("onlineMode", Bukkit.getOnlineMode() ? 1 : 0); + builder.appendField("bukkitVersion", Bukkit.getVersion()); + builder.appendField("bukkitName", Bukkit.getName()); + builder.appendField("javaVersion", System.getProperty("java.version")); + builder.appendField("osName", System.getProperty("os.name")); + builder.appendField("osArch", System.getProperty("os.arch")); + builder.appendField("osVersion", System.getProperty("os.version")); + builder.appendField("coreCount", Runtime.getRuntime().availableProcessors()); + } + + private void appendServiceData(JsonObjectBuilder builder) { + builder.appendField("pluginVersion", plugin.getDescription().getVersion()); + } + + private int getPlayerAmount() { + try { + // Around MC 1.8 the return type was changed from an array to a collection, + // This fixes java.lang.NoSuchMethodError: + // org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; + Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); + return onlinePlayersMethod.getReturnType().equals(Collection.class) + ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() + : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; + } catch (Exception e) { + // Just use the new method if the reflection failed + return Bukkit.getOnlinePlayers().size(); + } + } + + public static class MetricsBase { + + /** + * The version of the Metrics class. + */ + public static final String METRICS_VERSION = "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; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/net/t2code/lib/Spigot/system/config/ConfigCreate.java b/src/main/java/net/t2code/lib/Spigot/system/config/ConfigCreate.java new file mode 100644 index 0000000..fa4616b --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/config/ConfigCreate.java @@ -0,0 +1,67 @@ +package net.t2code.lib.Spigot.system.config; + +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.system.Main; +import net.t2code.lib.Spigot.Lib.yamlConfiguration.Config; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; + + +public class ConfigCreate { + + private static Boolean UpdateCheckOnJoin = true; + private static Boolean Debug = false; + private static String language = "english"; + + + private static Boolean mySQL = false; + private static String Storage = "YML"; + private static String ip = "localhost"; + private static Integer port = 3306; + private static String database = "database"; + private static String user = "root"; + private static String password = "password"; + private static Boolean SSL = false; + + private static Boolean Bungee = false; + private static String thisServer = "server"; + + public static void configCreate() { + Long long_ = Long.valueOf(System.currentTimeMillis()); + if (new File(Main.getPath(), "config.yml").exists()){ + if (Main.plugin.getConfig().getBoolean("Plugin.Debug")) send.console(Main.prefix + " §5DEBUG: §6" + " §4config.yml are created / updated..."); + } else send.console(Main.prefix + " §4config.yml are created..."); + + + File config = new File(Main.getPath(), "config.yml"); + YamlConfiguration yamlConfiguration = YamlConfiguration.loadConfiguration(config); + + Config.set("Plugin.UpdateCheckOnJoin", UpdateCheckOnJoin, yamlConfiguration); + Config.set("Plugin.language", language, yamlConfiguration); + + Config.set("BungeeCord.Enable", Bungee, yamlConfiguration); + Config.set("BungeeCord.ThisServer", thisServer, yamlConfiguration); + + // Config.set("Storage.MySQL.Enable", mySQL, yamlConfiguration); + // Config.set("Storage.Type", Storage, yamlConfiguration); + // Config.set("Storage.MySQL.IP", ip, yamlConfiguration); + // Config.set("Storage.MySQL.Port", port, yamlConfiguration); + // Config.set("Storage.MySQL.Database", database, yamlConfiguration); + // Config.set("Storage.MySQL.User", user, yamlConfiguration); + // Config.set("Storage.MySQL.Password", password, yamlConfiguration); + // Config.set("Storage.MySQL.SSL", SSL, yamlConfiguration); + + + + try { + yamlConfiguration.save(config); + } catch (IOException e) { + e.printStackTrace(); + } + + send.console(Main.prefix + " §2config.yml were successfully created / updated." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/config/SelectLibConfig.java b/src/main/java/net/t2code/lib/Spigot/system/config/SelectLibConfig.java new file mode 100644 index 0000000..2250889 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/config/SelectLibConfig.java @@ -0,0 +1,24 @@ +package net.t2code.lib.Spigot.system.config; + +import net.t2code.lib.Spigot.system.Main; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; + +public class SelectLibConfig { + + + public static Boolean UpdateCheckOnJoin; + public static Boolean Debug; + public static String language; + + public static void onSelect() { + File config = new File(Main.getPath(), "config.yml"); + YamlConfiguration yamlConfiguration = YamlConfiguration.loadConfiguration(config); + + UpdateCheckOnJoin = yamlConfiguration.getBoolean("Plugin.UpdateCheckOnJoin"); + Debug = yamlConfiguration.getBoolean("Plugin.Debug"); + language = yamlConfiguration.getString("Plugin.language"); + + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/languages/LanguagesCreate.java b/src/main/java/net/t2code/lib/Spigot/system/languages/LanguagesCreate.java new file mode 100644 index 0000000..2cf3c57 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/languages/LanguagesCreate.java @@ -0,0 +1,78 @@ +package net.t2code.lib.Spigot.system.languages; + +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.system.Main; +import net.t2code.lib.Spigot.Lib.yamlConfiguration.Config; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.io.IOException; + +public class LanguagesCreate { + static Plugin plugin = Main.plugin; + + public static void langCreate() { + send.debug(plugin,"§4Language files are created / updated..."); + Long long_ = Long.valueOf(System.currentTimeMillis()); + + /** + * + * ENGLISH + * + */ + + File messagesEN = new File(Main.getPath(), "languages/english_messages.yml"); + YamlConfiguration yamlConfigurationEN = YamlConfiguration.loadConfiguration(messagesEN); + + Config.set("Plugin.VaultNotSetUp", MSG.EN_VaultNotSetUp, yamlConfigurationEN); + Config.set("Plugin.SoundNotFound", MSG.EN_SoundNotFound, yamlConfigurationEN); + + try { + yamlConfigurationEN.save(messagesEN); + } catch (IOException e) { + send.warning(Main.plugin,e.getMessage()); + e.printStackTrace(); + } + + /** + * + * GERMAN + * + */ + + File messagesDE = new File(Main.getPath(), "languages/german_messages.yml"); + YamlConfiguration yamlConfigurationDE = YamlConfiguration.loadConfiguration(messagesDE); + + Config.set("Plugin.VaultNotSetUp", MSG.DE_VaultNotSetUp, yamlConfigurationDE); + Config.set("Plugin.SoundNotFound", MSG.DE_SoundNotFound, yamlConfigurationDE); + + try { + yamlConfigurationDE.save(messagesDE); + } catch (IOException e) { + send.warning(Main.plugin,e.getMessage()); + e.printStackTrace(); + } + + /** + * + * norwegian + * + */ + + File messagesNO = new File(Main.getPath(), "languages/norwegian_messages.yml"); + YamlConfiguration yamlConfigurationNO = YamlConfiguration.loadConfiguration(messagesNO); + + Config.set("Plugin.VaultNotSetUp", MSG.NO_VaultNotSetUp, yamlConfigurationNO); + Config.set("Plugin.SoundNotFound", MSG.NO_SoundNotFound, yamlConfigurationNO); + + try { + yamlConfigurationNO.save(messagesNO); + } catch (IOException e) { + send.warning(Main.plugin,e.getMessage()); + e.printStackTrace(); + } + + send.console(Main.prefix + " §2Language files were successfully created / updated." + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/languages/MSG.java b/src/main/java/net/t2code/lib/Spigot/system/languages/MSG.java new file mode 100644 index 0000000..bb6399b --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/languages/MSG.java @@ -0,0 +1,22 @@ +// This claas was created by JaTiTV + +package net.t2code.lib.Spigot.system.languages; + +public class MSG { + + // EN + public static String EN_VaultNotSetUp = "[prefix] &4Vault / Economy not set up!"; + public static String EN_SoundNotFound = "[prefix] &4The sound &6[sound] &4was not found! Please check the settings."; + + + // DE + public static String DE_VaultNotSetUp = "[prefix] &4Vault / Economy nicht eingerichtet!"; + public static String DE_SoundNotFound = "[prefix] &4Der Sound &6[sound] &4wurde nicht gefunden! Bitte [ue]berpr[ue]fe die Einstellungen."; + + + + // NO + public static String NO_VaultNotSetUp = "[prefix] &4Vault / Økonomi har ikke blitt satt opp!"; + public static String NO_SoundNotFound = "[prefix] &4Lyden &6[sound] &4ble ikke bli funnet! Vennligst sjekk innstillingene."; + +} diff --git a/src/main/java/net/t2code/lib/Spigot/system/languages/SelectLibMsg.java b/src/main/java/net/t2code/lib/Spigot/system/languages/SelectLibMsg.java new file mode 100644 index 0000000..6c5f9b2 --- /dev/null +++ b/src/main/java/net/t2code/lib/Spigot/system/languages/SelectLibMsg.java @@ -0,0 +1,48 @@ +package net.t2code.lib.Spigot.system.languages; + +import net.t2code.lib.Spigot.Lib.messages.send; +import net.t2code.lib.Spigot.Lib.replace.Replace; +import net.t2code.lib.Spigot.system.Main; +import net.t2code.lib.Spigot.system.config.SelectLibConfig; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.Plugin; + +import java.io.File; + +public class SelectLibMsg { + private static Plugin plugin = Main.plugin; +private static String prefix = Main.prefix; + + public static String selectMSG; + + public static String VaultNotSetUp; + public static String SoundNotFound; + + public static void onSelect(String Prefix) { + + send.debug(plugin, "§4Select language..."); + Long long_ = Long.valueOf(System.currentTimeMillis()); + + File msg; + + msg = new File(Main.getPath(), "languages/" + SelectLibConfig.language + "_messages.yml"); + if (!msg.isFile()) { + send.console(Prefix); + send.console(Prefix + " §4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + send.console(Prefix + " §4The selected §c" + SelectLibConfig.language + " §4language file was not found."); + send.console(Prefix + " §6The default language §eEnglish §6is used!"); + send.console(Prefix + " §4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + send.console(Prefix); + msg = new File(Main.getPath(), "languages/" + "english_messages.yml"); + selectMSG = "english"; + } else selectMSG = SelectLibConfig.language; + YamlConfiguration yamlConfiguration_msg = YamlConfiguration.loadConfiguration(msg); + + VaultNotSetUp = Replace.replace(prefix, yamlConfiguration_msg.getString("Plugin.VaultNotSetUp")); + SoundNotFound = Replace.replace(prefix, yamlConfiguration_msg.getString("Plugin.SoundNotFound")); + + + + send.console(Prefix + " §2Language successfully selected to: §6" + selectMSG + " §7- §e" + (System.currentTimeMillis() - long_.longValue()) + "ms"); + } +} diff --git a/src/main/java/net/t2code/lib/Util.java b/src/main/java/net/t2code/lib/Util.java new file mode 100644 index 0000000..498f2ba --- /dev/null +++ b/src/main/java/net/t2code/lib/Util.java @@ -0,0 +1,9 @@ +package net.t2code.lib; + +public class Util { + public static String Prefix = "§8[§4T2Code§5Lib§8]"; + public static Integer SpigotID = 96388; + public static Integer BstatsID = 12518; + public static String Spigot = "https://www.spigotmc.org/resources/" + SpigotID; + 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..926377b --- /dev/null +++ b/src/main/resources/bungee.yml @@ -0,0 +1,5 @@ +name: T2CodeLib +version: 7.3 +main: net.t2code.lib.Bungee.BMain +author: JaTiTV, Jkobs +description: Libarie from T2Code Plugins \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..fa0444c --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,18 @@ +name: T2CodeLib +version: 7.3 +main: net.t2code.lib.Spigot.system.Main +api-version: 1.13 +prefix: T2CodeLib +authors: [ JaTiTV, Jkobs ] +description: Libarie from T2Code Plugins +website: T2Code.net +load: STARTUP +softdepend: [ PlaceholderAPI, PlotSquared, CMI, CMILib, Vault, Economy, XConomy ] +loadbefore: [ T2C-Alias ] + +commands: + t2code: + +permissions: + t2code.admin: + default: op \ No newline at end of file diff --git a/target/classes/bungee.yml b/target/classes/bungee.yml new file mode 100644 index 0000000..926377b --- /dev/null +++ b/target/classes/bungee.yml @@ -0,0 +1,5 @@ +name: T2CodeLib +version: 7.3 +main: net.t2code.lib.Bungee.BMain +author: JaTiTV, Jkobs +description: Libarie from T2Code Plugins \ No newline at end of file diff --git a/target/classes/net/t2code/lib/Bungee/BMain.class b/target/classes/net/t2code/lib/Bungee/BMain.class new file mode 100644 index 0000000..6513b3a Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/BMain.class differ diff --git a/target/classes/net/t2code/lib/Bungee/Lib/commands/BTab.class b/target/classes/net/t2code/lib/Bungee/Lib/commands/BTab.class new file mode 100644 index 0000000..ad119fe Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/Lib/commands/BTab.class differ diff --git a/target/classes/net/t2code/lib/Bungee/Lib/commands/Bcmd.class b/target/classes/net/t2code/lib/Bungee/Lib/commands/Bcmd.class new file mode 100644 index 0000000..9d51404 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/Lib/commands/Bcmd.class differ diff --git a/target/classes/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.class b/target/classes/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.class new file mode 100644 index 0000000..f85fcd0 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/Lib/messages/BT2CodeTemplate.class differ diff --git a/target/classes/net/t2code/lib/Bungee/Lib/messages/Bsend.class b/target/classes/net/t2code/lib/Bungee/Lib/messages/Bsend.class new file mode 100644 index 0000000..f01ff76 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/Lib/messages/Bsend.class differ diff --git a/target/classes/net/t2code/lib/Bungee/Lib/replace/BReplace.class b/target/classes/net/t2code/lib/Bungee/Lib/replace/BReplace.class new file mode 100644 index 0000000..c4782a8 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/Lib/replace/BReplace.class differ diff --git a/target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateAPI$1.class b/target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateAPI$1.class new file mode 100644 index 0000000..4a849b1 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateAPI$1.class differ diff --git a/target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateAPI.class b/target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateAPI.class new file mode 100644 index 0000000..8eca46e Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateAPI.class differ diff --git a/target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateObject.class b/target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateObject.class new file mode 100644 index 0000000..f7185a2 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/Lib/update/BUpdateObject.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BLoad.class b/target/classes/net/t2code/lib/Bungee/system/BLoad.class new file mode 100644 index 0000000..119b66b Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BLoad.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$1.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$1.class new file mode 100644 index 0000000..35159ae Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$1.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedBarChart.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedBarChart.class new file mode 100644 index 0000000..dd108ee Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedBarChart.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedPie.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedPie.class new file mode 100644 index 0000000..644d71b Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$AdvancedPie.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$CustomChart.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$CustomChart.class new file mode 100644 index 0000000..bf25889 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$CustomChart.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$DrilldownPie.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$DrilldownPie.class new file mode 100644 index 0000000..80b7e34 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$DrilldownPie.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$JsonObjectBuilder$JsonObject.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$JsonObjectBuilder$JsonObject.class new file mode 100644 index 0000000..7768b38 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$JsonObjectBuilder$JsonObject.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$JsonObjectBuilder.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$JsonObjectBuilder.class new file mode 100644 index 0000000..b95117c Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$JsonObjectBuilder.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$MetricsBase.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$MetricsBase.class new file mode 100644 index 0000000..6f65898 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$MetricsBase.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$MultiLineChart.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$MultiLineChart.class new file mode 100644 index 0000000..c9e13a5 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$MultiLineChart.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$SimpleBarChart.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$SimpleBarChart.class new file mode 100644 index 0000000..c075daa Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$SimpleBarChart.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$SimplePie.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$SimplePie.class new file mode 100644 index 0000000..04e5972 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$SimplePie.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics$SingleLineChart.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics$SingleLineChart.class new file mode 100644 index 0000000..383378f Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics$SingleLineChart.class differ diff --git a/target/classes/net/t2code/lib/Bungee/system/BMetrics.class b/target/classes/net/t2code/lib/Bungee/system/BMetrics.class new file mode 100644 index 0000000..ef3bde0 Binary files /dev/null and b/target/classes/net/t2code/lib/Bungee/system/BMetrics.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/commands/Cmd.class b/target/classes/net/t2code/lib/Spigot/Lib/commands/Cmd.class new file mode 100644 index 0000000..1985f84 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/commands/Cmd.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/commands/Tab.class b/target/classes/net/t2code/lib/Spigot/Lib/commands/Tab.class new file mode 100644 index 0000000..fbfb28b Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/commands/Tab.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/items/ItemVersion.class b/target/classes/net/t2code/lib/Spigot/Lib/items/ItemVersion.class new file mode 100644 index 0000000..78175ae Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/items/ItemVersion.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.class b/target/classes/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.class new file mode 100644 index 0000000..dfe3858 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/messages/T2CodeTemplate.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder$ClickEventType.class b/target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder$ClickEventType.class new file mode 100644 index 0000000..2cb13f5 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder$ClickEventType.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder.class b/target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder.class new file mode 100644 index 0000000..3428d2e Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/messages/TextBuilder.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/messages/send.class b/target/classes/net/t2code/lib/Spigot/Lib/messages/send.class new file mode 100644 index 0000000..eb24d60 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/messages/send.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.class b/target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.class new file mode 100644 index 0000000..2d325e4 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/MCVersion.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.class b/target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.class new file mode 100644 index 0000000..48931a4 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/minecraftVersion/NMSVersion.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.class b/target/classes/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.class new file mode 100644 index 0000000..2cfc37b Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/plugins/PluginCheck.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/register/Register.class b/target/classes/net/t2code/lib/Spigot/Lib/register/Register.class new file mode 100644 index 0000000..a60ec24 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/register/Register.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/replace/Replace.class b/target/classes/net/t2code/lib/Spigot/Lib/replace/Replace.class new file mode 100644 index 0000000..47b9f5d Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/replace/Replace.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$1.class b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$1.class new file mode 100644 index 0000000..a2f2a0f Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$1.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$2.class b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$2.class new file mode 100644 index 0000000..84769dc Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$2.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$3$1.class b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$3$1.class new file mode 100644 index 0000000..ff4b6e0 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$3$1.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$3.class b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$3.class new file mode 100644 index 0000000..c01b93a Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI$3.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI.class b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI.class new file mode 100644 index 0000000..37c2f4e Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateAPI.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateObject.class b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateObject.class new file mode 100644 index 0000000..d2fef3f Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/update/UpdateObject.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/vault/Vault.class b/target/classes/net/t2code/lib/Spigot/Lib/vault/Vault.class new file mode 100644 index 0000000..bca48eb Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/vault/Vault.class differ diff --git a/target/classes/net/t2code/lib/Spigot/Lib/yamlConfiguration/Config.class b/target/classes/net/t2code/lib/Spigot/Lib/yamlConfiguration/Config.class new file mode 100644 index 0000000..e325255 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/Lib/yamlConfiguration/Config.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/CmdExecuter$1.class b/target/classes/net/t2code/lib/Spigot/system/CmdExecuter$1.class new file mode 100644 index 0000000..efabc3e Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/CmdExecuter$1.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/CmdExecuter.class b/target/classes/net/t2code/lib/Spigot/system/CmdExecuter.class new file mode 100644 index 0000000..47a9b7f Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/CmdExecuter.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/CreateReportLog.class b/target/classes/net/t2code/lib/Spigot/system/CreateReportLog.class new file mode 100644 index 0000000..988e659 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/CreateReportLog.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/JoinEvent.class b/target/classes/net/t2code/lib/Spigot/system/JoinEvent.class new file mode 100644 index 0000000..d4388f0 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/JoinEvent.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Main.class b/target/classes/net/t2code/lib/Spigot/system/Main.class new file mode 100644 index 0000000..e5f1245 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Main.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$1.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$1.class new file mode 100644 index 0000000..face7c9 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$1.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$AdvancedBarChart.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$AdvancedBarChart.class new file mode 100644 index 0000000..76e47fb Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$AdvancedBarChart.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$AdvancedPie.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$AdvancedPie.class new file mode 100644 index 0000000..2132fdb Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$AdvancedPie.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$CustomChart.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$CustomChart.class new file mode 100644 index 0000000..ad5253a Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$CustomChart.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$DrilldownPie.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$DrilldownPie.class new file mode 100644 index 0000000..ea6c400 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$DrilldownPie.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$JsonObjectBuilder$JsonObject.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$JsonObjectBuilder$JsonObject.class new file mode 100644 index 0000000..b3073c0 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$JsonObjectBuilder$JsonObject.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$JsonObjectBuilder.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$JsonObjectBuilder.class new file mode 100644 index 0000000..1db1a75 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$JsonObjectBuilder.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$MetricsBase.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$MetricsBase.class new file mode 100644 index 0000000..cb97fc5 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$MetricsBase.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$MultiLineChart.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$MultiLineChart.class new file mode 100644 index 0000000..d4e3b81 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$MultiLineChart.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$SimpleBarChart.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$SimpleBarChart.class new file mode 100644 index 0000000..d8a1b13 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$SimpleBarChart.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$SimplePie.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$SimplePie.class new file mode 100644 index 0000000..f035d3a Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$SimplePie.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics$SingleLineChart.class b/target/classes/net/t2code/lib/Spigot/system/Metrics$SingleLineChart.class new file mode 100644 index 0000000..e7a6a13 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics$SingleLineChart.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/Metrics.class b/target/classes/net/t2code/lib/Spigot/system/Metrics.class new file mode 100644 index 0000000..567d455 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/Metrics.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/config/ConfigCreate.class b/target/classes/net/t2code/lib/Spigot/system/config/ConfigCreate.class new file mode 100644 index 0000000..a87d8e8 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/config/ConfigCreate.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/config/SelectLibConfig.class b/target/classes/net/t2code/lib/Spigot/system/config/SelectLibConfig.class new file mode 100644 index 0000000..a997acb Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/config/SelectLibConfig.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/languages/LanguagesCreate.class b/target/classes/net/t2code/lib/Spigot/system/languages/LanguagesCreate.class new file mode 100644 index 0000000..533a095 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/languages/LanguagesCreate.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/languages/MSG.class b/target/classes/net/t2code/lib/Spigot/system/languages/MSG.class new file mode 100644 index 0000000..255a539 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/languages/MSG.class differ diff --git a/target/classes/net/t2code/lib/Spigot/system/languages/SelectLibMsg.class b/target/classes/net/t2code/lib/Spigot/system/languages/SelectLibMsg.class new file mode 100644 index 0000000..d80f4d2 Binary files /dev/null and b/target/classes/net/t2code/lib/Spigot/system/languages/SelectLibMsg.class differ diff --git a/target/classes/net/t2code/lib/Util.class b/target/classes/net/t2code/lib/Util.class new file mode 100644 index 0000000..608c3e5 Binary files /dev/null and b/target/classes/net/t2code/lib/Util.class differ diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml new file mode 100644 index 0000000..fa0444c --- /dev/null +++ b/target/classes/plugin.yml @@ -0,0 +1,18 @@ +name: T2CodeLib +version: 7.3 +main: net.t2code.lib.Spigot.system.Main +api-version: 1.13 +prefix: T2CodeLib +authors: [ JaTiTV, Jkobs ] +description: Libarie from T2Code Plugins +website: T2Code.net +load: STARTUP +softdepend: [ PlaceholderAPI, PlotSquared, CMI, CMILib, Vault, Economy, XConomy ] +loadbefore: [ T2C-Alias ] + +commands: + t2code: + +permissions: + t2code.admin: + default: op \ No newline at end of file