diff --git a/.gitignore b/.gitignore index af949cf..47188b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,8 @@ -target/ +/spigot-server/ +/target/ +/.settings/ +.project +.classpath # Created by https://www.gitignore.io/api/java,macos,intellij # Edit at https://www.gitignore.io/?templates=java,macos,intellij @@ -123,7 +127,7 @@ hs_err_pid* .LSOverride # Icon must end with two \r -Icon +Icon # Thumbnails ._* diff --git a/libs/ProtocolSupport-LATEST.jar b/libs/ProtocolSupport-LATEST.jar deleted file mode 100644 index 1eae141..0000000 Binary files a/libs/ProtocolSupport-LATEST.jar and /dev/null differ diff --git a/libs/TinyProtocol-1.0.0-SNAPSHOT.jar b/libs/com/comphenix/tinyprotocol/TinyProtocol/1.0.0-SNAPSHOT/TinyProtocol-1.0.0-SNAPSHOT.jar similarity index 100% rename from libs/TinyProtocol-1.0.0-SNAPSHOT.jar rename to libs/com/comphenix/tinyprotocol/TinyProtocol/1.0.0-SNAPSHOT/TinyProtocol-1.0.0-SNAPSHOT.jar diff --git a/libs/com/comphenix/tinyprotocol/TinyProtocol/1.0.0-SNAPSHOT/TinyProtocol-1.0.0-SNAPSHOT.pom b/libs/com/comphenix/tinyprotocol/TinyProtocol/1.0.0-SNAPSHOT/TinyProtocol-1.0.0-SNAPSHOT.pom new file mode 100644 index 0000000..3346ae6 --- /dev/null +++ b/libs/com/comphenix/tinyprotocol/TinyProtocol/1.0.0-SNAPSHOT/TinyProtocol-1.0.0-SNAPSHOT.pom @@ -0,0 +1,9 @@ + + + 4.0.0 + com.comphenix.tinyprotocol + TinyProtocol + 1.0.0-SNAPSHOT + POM was created from install:install-file + diff --git a/libs/com/comphenix/tinyprotocol/TinyProtocol/1.0.0-SNAPSHOT/maven-metadata-local.xml b/libs/com/comphenix/tinyprotocol/TinyProtocol/1.0.0-SNAPSHOT/maven-metadata-local.xml new file mode 100644 index 0000000..fde9dd1 --- /dev/null +++ b/libs/com/comphenix/tinyprotocol/TinyProtocol/1.0.0-SNAPSHOT/maven-metadata-local.xml @@ -0,0 +1,24 @@ + + + com.comphenix.tinyprotocol + TinyProtocol + 1.0.0-SNAPSHOT + + + true + + 20191221141945 + + + jar + 1.0.0-SNAPSHOT + 20191221141945 + + + pom + 1.0.0-SNAPSHOT + 20191221141945 + + + + diff --git a/libs/com/comphenix/tinyprotocol/TinyProtocol/maven-metadata-local.xml b/libs/com/comphenix/tinyprotocol/TinyProtocol/maven-metadata-local.xml new file mode 100644 index 0000000..abbb65b --- /dev/null +++ b/libs/com/comphenix/tinyprotocol/TinyProtocol/maven-metadata-local.xml @@ -0,0 +1,11 @@ + + + com.comphenix.tinyprotocol + TinyProtocol + + + 1.0.0-SNAPSHOT + + 20191221141945 + + diff --git a/libs/BungeeYAML-1.0.jar b/libs/fr/onecraft/BungeeYAML/1.0.0/BungeeYAML-1.0.0.jar similarity index 100% rename from libs/BungeeYAML-1.0.jar rename to libs/fr/onecraft/BungeeYAML/1.0.0/BungeeYAML-1.0.0.jar diff --git a/libs/fr/onecraft/BungeeYAML/1.0.0/BungeeYAML-1.0.0.pom b/libs/fr/onecraft/BungeeYAML/1.0.0/BungeeYAML-1.0.0.pom new file mode 100644 index 0000000..b4700b7 --- /dev/null +++ b/libs/fr/onecraft/BungeeYAML/1.0.0/BungeeYAML-1.0.0.pom @@ -0,0 +1,9 @@ + + + 4.0.0 + fr.onecraft + BungeeYAML + 1.0.0 + POM was created from install:install-file + diff --git a/libs/fr/onecraft/BungeeYAML/maven-metadata-local.xml b/libs/fr/onecraft/BungeeYAML/maven-metadata-local.xml new file mode 100644 index 0000000..4fbd9a0 --- /dev/null +++ b/libs/fr/onecraft/BungeeYAML/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + fr.onecraft + BungeeYAML + + 1.0.0 + + 1.0.0 + + 20191221141825 + + diff --git a/libs/XCore-1.0.jar b/libs/fr/onecraft/XCore/1.0.0/XCore-1.0.0.jar similarity index 100% rename from libs/XCore-1.0.jar rename to libs/fr/onecraft/XCore/1.0.0/XCore-1.0.0.jar diff --git a/libs/fr/onecraft/XCore/1.0.0/XCore-1.0.0.pom b/libs/fr/onecraft/XCore/1.0.0/XCore-1.0.0.pom new file mode 100644 index 0000000..a4544dd --- /dev/null +++ b/libs/fr/onecraft/XCore/1.0.0/XCore-1.0.0.pom @@ -0,0 +1,9 @@ + + + 4.0.0 + fr.onecraft + XCore + 1.0.0 + POM was created from install:install-file + diff --git a/libs/fr/onecraft/XCore/maven-metadata-local.xml b/libs/fr/onecraft/XCore/maven-metadata-local.xml new file mode 100644 index 0000000..eb331a6 --- /dev/null +++ b/libs/fr/onecraft/XCore/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + fr.onecraft + XCore + + 1.0.0 + + 1.0.0 + + 20191221141700 + + diff --git a/pom.xml b/pom.xml index 031bd65..fb2a4a2 100644 --- a/pom.xml +++ b/pom.xml @@ -1,285 +1,254 @@ - 4.0.0 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - fr.onecraft - ClientStats - 2.9.0 + fr.onecraft + ClientStats + 2.9.1-SNAPSHOT - - - clientstats + + + clientstats - - UTF-8 - ${projectEncoding} - ${projectEncoding} + + UTF-8 + ${projectEncoding} + ${projectEncoding} - - 1.7 + + 1.8 - - 1.14.4-R0.1-SNAPSHOT + + 1.14.4-R0.1-SNAPSHOT - - 1.14-SNAPSHOT + + 1.14-SNAPSHOT - - ${basedir}/../../Libs + - - ${basedir}/../../../MC/Plugins - + + ${project.name} + src/main/java + clean package - - ${project.name} - src/main/java - clean install + + + . + true + src/main/resources/ + + **/*.yml + + + - - - . - true - src/main/resources/ - - **/*.yml - - - + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + ${jdkVersion} + ${jdkVersion} + UTF-8 + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.1 + + false + + + com.github.ProtocolSupport:ProtocolSupport + + com.comphenix.tinyprotocol:TinyProtocol + com.google.code.gson:gson + org.apache.commons:commons-lang3 + it.unimi.dsi:fastutil + + + + + fr.onecraft.core + fr.onecraft.${pluginPackage}.core + + + fr.onecraft.config + fr.onecraft.${pluginPackage}.bungee.config + + + + + *:* + + META-INF/ + javax/annotation/** + + + + + + + package + + shade + + + + + + - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - ${jdkVersion} - ${jdkVersion} - UTF-8 - - - - org.apache.maven.plugins - maven-shade-plugin - 2.4.1 - - true - false - - - fr.onecraft.core - fr.onecraft.${pluginPackage}.core - - - fr.onecraft.config - fr.onecraft.${pluginPackage}.bungee.config - - - - - *:* - - META-INF/ - javax/annotation/** - - - - - - - package - - shade - - - - - - maven-resources-plugin - 2.6 - - - copy-files-on-build - package - - copy-resources - - - ${export} - - - ${project.build.directory} - ${project.build.finalName}.jar - false - - - - - - - - maven-dependency-plugin - - - process-sources - - copy-dependencies - - - XCore, ProtocolSupport, BungeeYAML, TinyProtocol - ${project.basedir}/libs/ - - - - + + + profile-dev + + true + + + + + fr.onecraft + XCore + 1.0.0 + + + + com.github.ProtocolSupport + ProtocolSupport + 2356a84f71 + + + + fr.onecraft + BungeeYAML + 1.0.0 + + + + com.comphenix.tinyprotocol + TinyProtocol + 1.0.0-SNAPSHOT + + + + + profile-test + + + + fr.onecraft + XCore + 1.0.0 + + + + com.github.ProtocolSupport + ProtocolSupport + 2356a84f71 + + + + fr.onecraft + BungeeYAML + 1.0.0 + + + + com.comphenix.tinyprotocol + TinyProtocol + 1.0.0-SNAPSHOT + + + + - - - - - - profile-dev - - true - - - - - fr.onecraft - XCore - 1.0 - compile - - - - protocolsupport - ProtocolSupport - LATEST - system - ${libs}/ProtocolSupport/latest/ProtocolSupport.jar - - - - fr.onecraft - BungeeYAML - 1.0 - compile - - - - com.comphenix.tinyprotocol - TinyProtocol - 1.0.0-SNAPSHOT - compile - - - - - profile-test - - - - fr.onecraft - XCore - 1.0 - system - ${project.basedir}/libs/XCore-1.0.jar - - - - protocolsupport - ProtocolSupport - LATEST - system - ${project.basedir}/libs/ProtocolSupport-LATEST.jar - - - - fr.onecraft - BungeeYAML - 1.0 - system - ${project.basedir}/libs/BungeeYAML-1.0.jar - - - - com.comphenix.tinyprotocol - TinyProtocol - 1.0.0-SNAPSHOT - system - ${project.basedir}/libs/TinyProtocol-1.0.0-SNAPSHOT.jar - - - - - - - - - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - - - bungeecord-repo - https://oss.sonatype.org/content/repositories/snapshots - - - - dmulloy2-repo - http://repo.dmulloy2.net/content/groups/public/ - - - - viaversion-repo - https://repo.viaversion.com/ - - - - - - org.spigotmc - spigot-api - ${spigotVersion} - provided - - - - net.md-5 - bungeecord-api - ${bungeeVersion} - provided - - - - com.comphenix.protocol - ProtocolLib-API - 4.3.0 - provided - - - - us.myles - viaversion - 2.1.3 - provided - - - - junit - junit - 4.12 - test - - - - org.mockito - mockito-all - RELEASE - test - - + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + bungeecord-repo + https://oss.sonatype.org/content/repositories/snapshots + + + + dmulloy2-repo + http://repo.dmulloy2.net/content/groups/public/ + + + + viaversion-repo + https://repo.viaversion.com/ + + + + jitpack.io + https://jitpack.io + + + + local-repo + file://${project.basedir}/libs + + + + + + org.spigotmc + spigot-api + ${spigotVersion} + provided + + + + net.md-5 + bungeecord-api + ${bungeeVersion} + provided + + + + com.comphenix.protocol + ProtocolLib-API + 4.3.0 + provided + + + + us.myles + viaversion + 2.1.3 + provided + + + + + org.apache.httpcomponents + httpclient + 4.5.10 + + + + junit + junit + 4.12 + test + + + + org.mockito + mockito-all + 1.10.19 + test + + diff --git a/src/main/java/fr/onecraft/clientstats/ClientStats.java b/src/main/java/fr/onecraft/clientstats/ClientStats.java index 361a50b..8106ecc 100644 --- a/src/main/java/fr/onecraft/clientstats/ClientStats.java +++ b/src/main/java/fr/onecraft/clientstats/ClientStats.java @@ -10,11 +10,11 @@ public class ClientStats { private static ClientStatsAPI api; public static ClientStatsAPI getApi() { - return api; + return api; } public static void setApi(ClientStatsAPI api) { - ClientStats.api = api; + ClientStats.api = api; } } diff --git a/src/main/java/fr/onecraft/clientstats/ClientStatsAPI.java b/src/main/java/fr/onecraft/clientstats/ClientStatsAPI.java index ab62ffe..84f9e6e 100644 --- a/src/main/java/fr/onecraft/clientstats/ClientStatsAPI.java +++ b/src/main/java/fr/onecraft/clientstats/ClientStatsAPI.java @@ -1,15 +1,16 @@ package fr.onecraft.clientstats; -import fr.onecraft.clientstats.common.base.ServerType; -import fr.onecraft.clientstats.common.user.MixedUser; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.text.DateFormat; import java.util.Map; import java.util.Map.Entry; import java.util.UUID; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import fr.onecraft.clientstats.common.base.ServerType; +import fr.onecraft.clientstats.common.user.MixedUser; + public interface ClientStatsAPI { /** @@ -83,7 +84,8 @@ public interface ClientStatsAPI { /** * Get date when maximum of online players was reached *

- * Number returned is the amount of milliseconds since midnight, January 1, 1970 UTC + * Number returned is the amount of milliseconds since midnight, January 1, 1970 + * UTC * * @return Timestamp of maximum player count */ @@ -145,7 +147,8 @@ public interface ClientStatsAPI { /** * Get start of statistics recording *

- * Number returned is the amount of milliseconds since midnight, January 1, 1970 UTC + * Number returned is the amount of milliseconds since midnight, January 1, 1970 + * UTC * * @return Timestamp when the statistics started to be recorded */ diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/BukkitAPI.java b/src/main/java/fr/onecraft/clientstats/bukkit/BukkitAPI.java index 7f88e0d..85537ac 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/BukkitAPI.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/BukkitAPI.java @@ -1,41 +1,43 @@ package fr.onecraft.clientstats.bukkit; +import java.util.logging.Logger; + +import javax.annotation.Nonnull; + +import org.bukkit.ChatColor; + import fr.onecraft.clientstats.common.base.ServerType; import fr.onecraft.clientstats.common.base.VersionProvider; import fr.onecraft.clientstats.common.core.AbstractAPI; -import org.bukkit.ChatColor; - -import javax.annotation.Nonnull; -import java.util.logging.Logger; public class BukkitAPI extends AbstractAPI { private final BukkitPlugin plugin; public BukkitAPI(VersionProvider provider, BukkitPlugin plugin) { - super(provider, plugin); - this.plugin = plugin; + super(provider, plugin); + this.plugin = plugin; } @Nonnull @Override public ServerType getServerType() { - return ServerType.BUKKIT; + return ServerType.BUKKIT; } @Override public boolean isEnabled() { - return plugin.isEnabled(); + return this.plugin.isEnabled(); } @Override public Logger getLogger() { - return plugin.getLogger(); + return this.plugin.getLogger(); } @Override public String colorize(String string) { - return ChatColor.translateAlternateColorCodes('&', string); + return ChatColor.translateAlternateColorCodes('&', string); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/BukkitPlugin.java b/src/main/java/fr/onecraft/clientstats/bukkit/BukkitPlugin.java index 97a60bf..ba0dd9c 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/BukkitPlugin.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/BukkitPlugin.java @@ -1,133 +1,173 @@ package fr.onecraft.clientstats.bukkit; +import java.util.List; +import java.util.logging.Level; + +import org.bukkit.configuration.ConfigurationSection; + import fr.onecraft.clientstats.ClientStats; import fr.onecraft.clientstats.bukkit.dispatcher.CommandDispatcher; import fr.onecraft.clientstats.bukkit.dispatcher.EventDispatcher; -import fr.onecraft.clientstats.bukkit.hook.detector.*; +import fr.onecraft.clientstats.bukkit.hook.detector.ProtocolLibDetector; +import fr.onecraft.clientstats.bukkit.hook.detector.ProtocolSupportDetector; +import fr.onecraft.clientstats.bukkit.hook.detector.ServerDetector; +import fr.onecraft.clientstats.bukkit.hook.detector.TinyProtocolDetector; +import fr.onecraft.clientstats.bukkit.hook.detector.ViaProtocolDetector; +import fr.onecraft.clientstats.bukkit.hook.detector.ViaVersionDetector; +import fr.onecraft.clientstats.bukkit.hook.detector.ViaVersionLegacyDetector; import fr.onecraft.clientstats.bukkit.user.BukkitUserProvider; import fr.onecraft.clientstats.common.base.Configurable; import fr.onecraft.clientstats.common.base.VersionProvider; import fr.onecraft.clientstats.common.core.AbstractAPI; +import fr.onecraft.clientstats.common.core.VersionNameProvider; import fr.onecraft.clientstats.common.user.MixedUser; import fr.onecraft.core.plugin.Core; -import org.bukkit.configuration.ConfigurationSection; - -import java.util.List; public class BukkitPlugin extends Core implements Configurable { @Override public void enable() { - // User provider - MixedUser.setProvider(new BukkitUserProvider(getServer())); - - // Version detection - VersionProvider provider = null; - if (ViaProtocolDetector.isUsable()) provider = ViaProtocolDetector.getProvider(); - else if (ViaVersionDetector.isUsable()) provider = ViaVersionDetector.getProvider(); - else if (ViaVersionLegacyDetector.isUsable()) provider = ViaVersionLegacyDetector.getProvider(); - else if (ProtocolSupportDetector.isUsable()) provider = ProtocolSupportDetector.getProvider(); - else if (ServerDetector.isUsable()) provider = ServerDetector.getProvider(); - else if (getConfig().getBoolean("settings.use-packets", false)) { - - if (ProtocolLibDetector.isUsable()) provider = ProtocolLibDetector.getProvider(); - else if (TinyProtocolDetector.isUsable()) provider = TinyProtocolDetector.getProvider(); - else { - severe("---------------------"); - severe("\"use-packets\" is enabled, but we can't find a way to use them."); - severe("Please install ProtocolLib to enable version detection."); - severe("---------------------"); - } - - } else { - warning("---------------------"); - warning("Your server doesn't seem to support multiple Minecraft versions."); - warning("If it does, please enable \"use-packets\" in the config and restart the server."); - warning("---------------------"); - } - - // Bukkit API - AbstractAPI api = new BukkitAPI(provider, this); - - // Reload config - api.reload(); - - // Register Event - new EventDispatcher(api).register(); - - // Handle command - new CommandDispatcher(api).register("clientstats"); - - // Api is ready - ClientStats.setApi(api); + // User provider + MixedUser.setProvider(new BukkitUserProvider(this.getServer())); + + // Version detection + VersionProvider provider = null; + if (ViaProtocolDetector.isUsable()) + provider = ViaProtocolDetector.getProvider(); + else if (ViaVersionDetector.isUsable()) + provider = ViaVersionDetector.getProvider(); + else if (ViaVersionLegacyDetector.isUsable()) + provider = ViaVersionLegacyDetector.getProvider(); + else if (ProtocolSupportDetector.isUsable()) + provider = ProtocolSupportDetector.getProvider(); + else if (ServerDetector.isUsable()) + provider = ServerDetector.getProvider(); + else if (this.getConfig().getBoolean("settings.use-packets", false)) { + + if (ProtocolLibDetector.isUsable()) + provider = ProtocolLibDetector.getProvider(); + else if (TinyProtocolDetector.isUsable()) + provider = TinyProtocolDetector.getProvider(); + else { + severe("---------------------"); + severe("\"use-packets\" is enabled, but we can't find a way to use them."); + severe("Please install ProtocolLib to enable version detection."); + severe("---------------------"); + } + + } else { + warning("---------------------"); + warning("Your server doesn't seem to support multiple Minecraft versions."); + warning("If it does, please enable \"use-packets\" in the config and restart the server."); + warning("---------------------"); + } + + // Version Provider + for (int i = 1; i <= 5; i++) { + this.getLogger().info("Reloading version list... (Attempt " + i + ")"); + try { + VersionNameProvider.reload(true, this.getLogger()); + break; + } catch (Exception e) { + this.getLogger().log(Level.SEVERE, "Unable to load version list", e); + } + } + + // Bukkit API + AbstractAPI api = new BukkitAPI(provider, this); + + // Reload config + api.reload(); + + // Register Event + new EventDispatcher(api).register(); + + // Handle command + new CommandDispatcher(api).register("clientstats"); + + // Api is ready + ClientStats.setApi(api); } @Override - public void start() {} + public void start() { + } @Override public void disable() { - // Remove api - ClientStats.setApi(null); + // Remove api + ClientStats.setApi(null); } @Override public void migrate() { - // v2.7.3 -> v2.7.4 - Object help = getConfig().get("messages.commands.help"); - if (help instanceof List) { - getConfig().set("messages.commands.help", null); - ConfigurationSection cs = getConfig().getConfigurationSection("messages.commands.joined"); - if (cs != null) { - getConfig().set("messages.commands.joined", null); - } - saveConfig(); - } - - // v2.7.6 -> v2.7.7 - String helpKey = "messages.commands.help.stats"; - String helpMsg = getConfig().getString(helpKey); - if (helpMsg.equals("&b/{1} stats &f- Statistics since server startup")) { - getConfig().set(helpKey, "&b/{1} stats &f- Global statistics"); - } else if (helpMsg.contains("Statistics since server startup")) { - getConfig().set(helpKey, helpMsg.replace("Statistics since server startup", "Global statistics")); - } - - // v2.7.6 -> v2.7.7 - String statsKey = "messages.commands.stats.title"; - String statsMsg = getConfig().getString(statsKey); - if (statsMsg.equals("Statistics since server startup:")) { - getConfig().set(statsKey, "Statistics since {1}:"); - } else if (statsMsg.contains("server startup")) { - getConfig().set(statsKey, statsMsg.replace("server startup", "{1}")); - } - + // v2.7.3 -> v2.7.4 + Object help = this.getConfig().get("messages.commands.help"); + if (help instanceof List) { + this.getConfig().set("messages.commands.help", null); + ConfigurationSection cs = this.getConfig().getConfigurationSection("messages.commands.joined"); + if (cs != null) { + this.getConfig().set("messages.commands.joined", null); + } + } + + // v2.7.6 -> v2.7.7 + String helpKey = "messages.commands.help.stats"; + String helpMsg = this.getConfig().getString(helpKey); + if (helpMsg.equals("&b/{1} stats &f- Statistics since server startup")) { + this.getConfig().set(helpKey, "&b/{1} stats &f- Global statistics"); + } else if (helpMsg.contains("Statistics since server startup")) { + this.getConfig().set(helpKey, helpMsg.replace("Statistics since server startup", "Global statistics")); + } + + // v2.7.6 -> v2.7.7 + String statsKey = "messages.commands.stats.title"; + String statsMsg = this.getConfig().getString(statsKey); + if (statsMsg.equals("Statistics since server startup:")) { + this.getConfig().set(statsKey, "Statistics since {1}:"); + } else if (statsMsg.contains("server startup")) { + this.getConfig().set(statsKey, statsMsg.replace("server startup", "{1}")); + } + + // v2.9.0 -> v2.9.1 + String reloadKey = "messages.reload"; + String reloadMsg = this.getConfig().getString(reloadKey); + if (reloadMsg != null) { + this.getConfig().set(reloadKey, null); + this.getConfig().set("messages.reload.config", reloadMsg); + this.getConfig().set("messages.reload.version-start", "Reloading version name provider..."); + this.getConfig().set("messages.reload.version-end", "Reloaded version name provider"); + this.getConfig().set("messages.reload.version-failed", + "Cannot reload version name provider, version names will not work !"); + } + + this.saveConfig(); } @Override public void options() { - // Copy headers and new values - getConfig().options().copyDefaults(true).copyHeader(true); + // Copy headers and new values + this.getConfig().options().copyDefaults(true).copyHeader(true); } @Override public String getConfigString(String path) { - return getConfig().getString(path); + return this.getConfig().getString(path); } @Override public String getConfigString(String path, String def) { - return getConfig().getString(path, def); + return this.getConfig().getString(path, def); } @Override public void setConfigValue(String path, Object value) { - getConfig().set(path, value); + this.getConfig().set(path, value); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/dispatcher/CommandDispatcher.java b/src/main/java/fr/onecraft/clientstats/bukkit/dispatcher/CommandDispatcher.java index c516ee2..305fdc6 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/dispatcher/CommandDispatcher.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/dispatcher/CommandDispatcher.java @@ -1,30 +1,31 @@ package fr.onecraft.clientstats.bukkit.dispatcher; +import java.util.List; + +import org.bukkit.command.Command; + import fr.onecraft.clientstats.ClientStatsAPI; import fr.onecraft.clientstats.bukkit.user.BukkitUser; import fr.onecraft.clientstats.common.core.CommandHandler; import fr.onecraft.core.command.CommandUser; import fr.onecraft.core.command.TabCommandRegister; -import org.bukkit.command.Command; - -import java.util.List; public class CommandDispatcher extends TabCommandRegister { private final CommandHandler handler; public CommandDispatcher(ClientStatsAPI plugin) { - this.handler = new CommandHandler(plugin); + this.handler = new CommandHandler(plugin); } @Override protected void execute(CommandUser user, List args, Command command, String alias) { - handler.execute(BukkitUser.of(user.getSender()), args, alias); + this.handler.execute(BukkitUser.of(user.getSender()), args, alias); } @Override public List complete(CommandUser user, List args, String token, Command cmd, String label) { - return handler.complete(BukkitUser.of(user.getSender()), args, token); + return this.handler.complete(BukkitUser.of(user.getSender()), args, token); } } \ No newline at end of file diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/dispatcher/EventDispatcher.java b/src/main/java/fr/onecraft/clientstats/bukkit/dispatcher/EventDispatcher.java index 1def687..bb5d1e1 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/dispatcher/EventDispatcher.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/dispatcher/EventDispatcher.java @@ -1,31 +1,32 @@ package fr.onecraft.clientstats.bukkit.dispatcher; -import fr.onecraft.clientstats.bukkit.user.BukkitUser; -import fr.onecraft.clientstats.common.core.AbstractAPI; -import fr.onecraft.clientstats.common.core.EventListener; -import fr.onecraft.core.event.EventRegister; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import fr.onecraft.clientstats.bukkit.user.BukkitUser; +import fr.onecraft.clientstats.common.core.AbstractAPI; +import fr.onecraft.clientstats.common.core.EventListener; +import fr.onecraft.core.event.EventRegister; + public class EventDispatcher extends EventRegister { private final EventListener listener; public EventDispatcher(AbstractAPI api) { - this.listener = new EventListener(api); + this.listener = new EventListener(api); } @EventHandler public void on(PlayerJoinEvent e) { - Player p = e.getPlayer(); - listener.onPlayerJoin(BukkitUser.of(p), !p.hasPlayedBefore()); + Player p = e.getPlayer(); + this.listener.onPlayerJoin(BukkitUser.of(p), !p.hasPlayedBefore()); } @EventHandler public void on(PlayerQuitEvent e) { - listener.onPlayerQuit(BukkitUser.of(e.getPlayer())); + this.listener.onPlayerQuit(BukkitUser.of(e.getPlayer())); } } \ No newline at end of file diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/base/AbstractPacketHandler.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/base/AbstractPacketHandler.java index b7128d2..573d975 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/base/AbstractPacketHandler.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/base/AbstractPacketHandler.java @@ -1,16 +1,5 @@ package fr.onecraft.clientstats.bukkit.hook.base; -import fr.onecraft.core.event.Events; -import fr.onecraft.core.plugin.Core; -import fr.onecraft.core.task.Tasks; -import fr.onecraft.core.tuple.Pair; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.scheduler.BukkitRunnable; - import java.net.InetSocketAddress; import java.util.HashSet; import java.util.Iterator; @@ -19,6 +8,18 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import fr.onecraft.core.event.Events; +import fr.onecraft.core.plugin.Core; +import fr.onecraft.core.task.Tasks; +import fr.onecraft.core.tuple.Pair; + public abstract class AbstractPacketHandler extends AbstractProvider implements Listener { // Protocol map @@ -29,57 +30,61 @@ public abstract class AbstractPacketHandler extends AbstractProvider implements public AbstractPacketHandler() { - super(); + super(); - Events.register(this); + Events.register(this); - registerPacketListener(); + this.registerPacketListener(); - Core.warning("The use of " + getProviderName() + " is experimental, it may not be stable and efficient for large servers."); + Core.warning("The use of " + this.getProviderName() + + " is experimental, it may not be stable and efficient for large servers."); - Tasks.after(1, TimeUnit.MINUTES).every(1, TimeUnit.MINUTES).async(new BukkitRunnable() { - @Override - public void run() { + Tasks.after(1, TimeUnit.MINUTES).every(1, TimeUnit.MINUTES).async(new BukkitRunnable() { + @Override + public void run() { - // In addresses we have all the current connected addresses - Set addresses = new HashSet<>(); - for (Player player : Bukkit.getOnlinePlayers()) { - addresses.add(player.getAddress()); - } + // In addresses we have all the current connected + // addresses + Set addresses = new HashSet<>(); + for (Player player : Bukkit.getOnlinePlayers()) { + addresses.add(player.getAddress()); + } - Iterator>> it = versions.entrySet().iterator(); - long now = System.currentTimeMillis(); + Iterator>> it = AbstractPacketHandler.this.versions + .entrySet().iterator(); + long now = System.currentTimeMillis(); - while (it.hasNext()) { - Map.Entry> entry = it.next(); - // Address tried to connect, but timed out (still not logged in) - if (entry.getValue().getRight() + TIMEOUT < now && !addresses.contains(entry.getKey())) { - it.remove(); - } - } - } - }); + while (it.hasNext()) { + Map.Entry> entry = it.next(); + // Address tried to connect, but timed out (still + // not logged in) + if (((entry.getValue().getRight() + TIMEOUT) < now) && !addresses.contains(entry.getKey())) { + it.remove(); + } + } + } + }); } protected void add(InetSocketAddress address, int protocolVersion) { - versions.put(address, Pair.of(protocolVersion, System.currentTimeMillis())); + this.versions.put(address, Pair.of(protocolVersion, System.currentTimeMillis())); } protected void remove(InetSocketAddress address) { - versions.remove(address); + this.versions.remove(address); } @Override public int getProtocol(Player p) { - Pair pair = versions.get(p.getAddress()); - return pair == null ? 0 : pair.getLeft(); + Pair pair = this.versions.get(p.getAddress()); + return pair == null ? 0 : pair.getLeft(); } @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { - // Player decided to quit the server - versions.remove(event.getPlayer().getAddress()); + // Player decided to quit the server + this.versions.remove(event.getPlayer().getAddress()); } public abstract void registerPacketListener(); diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/base/AbstractProvider.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/base/AbstractProvider.java index 06c5f5c..ff84c56 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/base/AbstractProvider.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/base/AbstractProvider.java @@ -1,24 +1,25 @@ package fr.onecraft.clientstats.bukkit.hook.base; +import java.util.UUID; + +import org.bukkit.entity.Player; + import fr.onecraft.clientstats.common.base.VersionProvider; import fr.onecraft.core.helpers.Players; import fr.onecraft.core.plugin.Core; -import org.bukkit.entity.Player; - -import java.util.UUID; public abstract class AbstractProvider implements VersionProvider { public AbstractProvider() { - if (getProviderName() != null) { - Core.info("Hooked into " + getProviderName() + "!"); - } + if (this.getProviderName() != null) { + Core.info("Hooked into " + this.getProviderName() + "!"); + } } @Override public int getProtocol(UUID player) { - Player p = Players.get(player); - return p != null ? getProtocol(p) : 0; + Player p = Players.get(player); + return p != null ? this.getProtocol(p) : 0; } abstract public int getProtocol(Player p); diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ProtocolLibDetector.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ProtocolLibDetector.java index 5394f2b..cc6cfd4 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ProtocolLibDetector.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ProtocolLibDetector.java @@ -1,17 +1,18 @@ package fr.onecraft.clientstats.bukkit.hook.detector; +import org.bukkit.Bukkit; + import fr.onecraft.clientstats.bukkit.hook.provider.ProtocolLibProvider; import fr.onecraft.clientstats.common.base.VersionProvider; -import org.bukkit.Bukkit; public class ProtocolLibDetector { public static boolean isUsable() { - return Bukkit.getPluginManager().isPluginEnabled("ProtocolLib"); + return Bukkit.getPluginManager().isPluginEnabled("ProtocolLib"); } public static VersionProvider getProvider() { - return new ProtocolLibProvider(); + return new ProtocolLibProvider(); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ProtocolSupportDetector.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ProtocolSupportDetector.java index 5d6051a..32c36d8 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ProtocolSupportDetector.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ProtocolSupportDetector.java @@ -1,17 +1,18 @@ package fr.onecraft.clientstats.bukkit.hook.detector; +import org.bukkit.Bukkit; + import fr.onecraft.clientstats.bukkit.hook.provider.ProtocolSupportProvider; import fr.onecraft.clientstats.common.base.VersionProvider; -import org.bukkit.Bukkit; public class ProtocolSupportDetector { public static boolean isUsable() { - return Bukkit.getPluginManager().isPluginEnabled("ProtocolSupport"); + return Bukkit.getPluginManager().isPluginEnabled("ProtocolSupport"); } public static VersionProvider getProvider() { - return new ProtocolSupportProvider(); + return new ProtocolSupportProvider(); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ServerDetector.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ServerDetector.java index f270387..5c87836 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ServerDetector.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ServerDetector.java @@ -1,24 +1,25 @@ package fr.onecraft.clientstats.bukkit.hook.detector; +import java.lang.reflect.Method; + import fr.onecraft.clientstats.bukkit.hook.provider.ServerProvider; import fr.onecraft.clientstats.common.base.VersionProvider; import fr.onecraft.core.helpers.Reflections; -import java.lang.reflect.Method; - public class ServerDetector { public static boolean isUsable() { - try { - Class networkManager = Class.forName(Reflections.NMS.getPrefix() + ".NetworkManager"); - Method method = networkManager.getMethod("getVersion"); - return method.getReturnType().isAssignableFrom(int.class) || method.getReturnType().isAssignableFrom(Integer.class); - } catch (ClassNotFoundException | NoSuchMethodException | SecurityException e) { - return false; - } + try { + Class networkManager = Class.forName(Reflections.NMS.getPrefix() + ".NetworkManager"); + Method method = networkManager.getMethod("getVersion"); + return method.getReturnType().isAssignableFrom(int.class) + || method.getReturnType().isAssignableFrom(Integer.class); + } catch (ClassNotFoundException | NoSuchMethodException | SecurityException e) { + return false; + } } public static VersionProvider getProvider() { - return new ServerProvider(); + return new ServerProvider(); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/TinyProtocolDetector.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/TinyProtocolDetector.java index 50dac58..a049dd0 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/TinyProtocolDetector.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/TinyProtocolDetector.java @@ -1,6 +1,7 @@ package fr.onecraft.clientstats.bukkit.hook.detector; import com.comphenix.tinyprotocol.Reflection; + import fr.onecraft.clientstats.bukkit.hook.provider.TinyProtocolProvider; import fr.onecraft.clientstats.common.base.VersionProvider; @@ -8,38 +9,39 @@ public class TinyProtocolDetector { public static boolean isUsable() { - try { - // Netty update - Class.forName("io.netty.channel.ChannelInitializer"); - } catch (ClassNotFoundException e) { - return false; - } + try { + // Netty update + Class.forName("io.netty.channel.ChannelInitializer"); + } catch (ClassNotFoundException e) { + return false; + } - try { + try { - // Handshake packets - Class handshake = Reflection.getClass("{nms}.PacketHandshakingInSetProtocol"); - Class ENUM_PROTOCOL = Reflection.getUntypedClass("{nms}.EnumProtocol"); - Reflection.getField(handshake, int.class, 0); - Reflection.getField(handshake, ENUM_PROTOCOL, 0); + // Handshake packets + Class handshake = Reflection.getClass("{nms}.PacketHandshakingInSetProtocol"); + Class ENUM_PROTOCOL = Reflection.getUntypedClass("{nms}.EnumProtocol"); + Reflection.getField(handshake, int.class, 0); + Reflection.getField(handshake, ENUM_PROTOCOL, 0); - // Disconnect while login - Reflection.getClass("{nms}.PacketLoginOutDisconnect"); + // Disconnect while login + Reflection.getClass("{nms}.PacketLoginOutDisconnect"); - // We need to have LOGIN - for (Object value : ENUM_PROTOCOL.getEnumConstants()) { - if ("LOGIN".equalsIgnoreCase(value.toString())) { - return true; - } - } + // We need to have LOGIN + for (Object value : ENUM_PROTOCOL.getEnumConstants()) { + if ("LOGIN".equalsIgnoreCase(value.toString())) { + return true; + } + } - } catch (Exception ignored) {} + } catch (Exception ignored) { + } - return false; + return false; } public static VersionProvider getProvider() { - return new TinyProtocolProvider(); + return new TinyProtocolProvider(); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaProtocolDetector.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaProtocolDetector.java index e97ce34..453dcc5 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaProtocolDetector.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaProtocolDetector.java @@ -1,29 +1,30 @@ package fr.onecraft.clientstats.bukkit.hook.detector; +import org.bukkit.Bukkit; + import fr.onecraft.clientstats.bukkit.hook.provider.ViaProtocolProvider; import fr.onecraft.clientstats.common.base.VersionProvider; import fr.onecraft.core.plugin.Core; -import org.bukkit.Bukkit; public class ViaProtocolDetector { public static boolean isUsable() { - if (Bukkit.getPluginManager().isPluginEnabled("ViaVersion") - && Bukkit.getPluginManager().isPluginEnabled("ProtocolSupport")) { + if (Bukkit.getPluginManager().isPluginEnabled("ViaVersion") + && Bukkit.getPluginManager().isPluginEnabled("ProtocolSupport")) { - try { - // ViaVersion 1.0.0 and up - Class.forName("us.myles.ViaVersion.api.Via"); - return true; - } catch (ClassNotFoundException ignored) { - Core.warning("Please update ViaVersion for better version detection!"); - } - } - return false; + try { + // ViaVersion 1.0.0 and up + Class.forName("us.myles.ViaVersion.api.Via"); + return true; + } catch (ClassNotFoundException ignored) { + Core.warning("Please update ViaVersion for better version detection!"); + } + } + return false; } public static VersionProvider getProvider() { - return new ViaProtocolProvider(); + return new ViaProtocolProvider(); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaVersionDetector.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaVersionDetector.java index a0eb191..1c7d028 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaVersionDetector.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaVersionDetector.java @@ -1,24 +1,26 @@ package fr.onecraft.clientstats.bukkit.hook.detector; +import org.bukkit.Bukkit; + import fr.onecraft.clientstats.bukkit.hook.provider.ViaVersionProvider; import fr.onecraft.clientstats.common.base.VersionProvider; -import org.bukkit.Bukkit; public class ViaVersionDetector { public static boolean isUsable() { - if (Bukkit.getPluginManager().isPluginEnabled("ViaVersion")) { - try { - // ViaVersion 1.0.0 and up - Class.forName("us.myles.ViaVersion.api.Via"); - return true; - } catch (ClassNotFoundException ignored) {} - } - return false; + if (Bukkit.getPluginManager().isPluginEnabled("ViaVersion")) { + try { + // ViaVersion 1.0.0 and up + Class.forName("us.myles.ViaVersion.api.Via"); + return true; + } catch (ClassNotFoundException ignored) { + } + } + return false; } public static VersionProvider getProvider() { - return new ViaVersionProvider(); + return new ViaVersionProvider(); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaVersionLegacyDetector.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaVersionLegacyDetector.java index 0f4e084..28e3d4a 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaVersionLegacyDetector.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/detector/ViaVersionLegacyDetector.java @@ -1,24 +1,26 @@ package fr.onecraft.clientstats.bukkit.hook.detector; +import org.bukkit.Bukkit; + import fr.onecraft.clientstats.bukkit.hook.provider.ViaVersionLegacyProvider; import fr.onecraft.clientstats.common.base.VersionProvider; -import org.bukkit.Bukkit; public class ViaVersionLegacyDetector { public static boolean isUsable() { - if (Bukkit.getPluginManager().isPluginEnabled("ViaVersion")) { - try { - // ViaVersion 0.9.9 and below - Class.forName("us.myles.ViaVersion.api.ViaVersion"); - return true; - } catch (ClassNotFoundException ignored) {} - } - return false; + if (Bukkit.getPluginManager().isPluginEnabled("ViaVersion")) { + try { + // ViaVersion 0.9.9 and below + Class.forName("us.myles.ViaVersion.api.ViaVersion"); + return true; + } catch (ClassNotFoundException ignored) { + } + } + return false; } public static VersionProvider getProvider() { - return new ViaVersionLegacyProvider(); + return new ViaVersionLegacyProvider(); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ProtocolLibProvider.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ProtocolLibProvider.java index d94a8d2..0e05615 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ProtocolLibProvider.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ProtocolLibProvider.java @@ -5,6 +5,7 @@ import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketEvent; + import fr.onecraft.clientstats.bukkit.hook.base.AbstractPacketHandler; import fr.onecraft.core.plugin.Core; @@ -12,38 +13,38 @@ public class ProtocolLibProvider extends AbstractPacketHandler { @Override public String getProviderName() { - return "ProtocolLib"; + return "ProtocolLib"; } @Override public void registerPacketListener() { - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(Core.plugin(), - ListenerPriority.NORMAL, - PacketType.Handshake.Client.SET_PROTOCOL, PacketType.Login.Server.DISCONNECT) { + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(Core.plugin(), ListenerPriority.NORMAL, + PacketType.Handshake.Client.SET_PROTOCOL, PacketType.Login.Server.DISCONNECT) { - @Override - public void onPacketReceiving(PacketEvent event) { + @Override + public void onPacketReceiving(PacketEvent event) { - if (event.getPacketType() == PacketType.Handshake.Client.SET_PROTOCOL) { - // Receiving handshake packet + if (event.getPacketType() == PacketType.Handshake.Client.SET_PROTOCOL) { + // Receiving handshake packet - if (event.getPacket().getProtocols().read(0) == PacketType.Protocol.LOGIN) { - // Intent to login - add(event.getPlayer().getAddress(), event.getPacket().getIntegers().read(0)); - } + if (event.getPacket().getProtocols().read(0) == PacketType.Protocol.LOGIN) { + // Intent to login + ProtocolLibProvider.this.add(event.getPlayer().getAddress(), + event.getPacket().getIntegers().read(0)); + } - } - } + } + } - @Override - public void onPacketSending(PacketEvent event) { - if (event.getPacketType() == PacketType.Login.Server.DISCONNECT) { - // Server kick player or deny login - remove(event.getPlayer().getAddress()); - } - } - }); + @Override + public void onPacketSending(PacketEvent event) { + if (event.getPacketType() == PacketType.Login.Server.DISCONNECT) { + // Server kick player or deny login + ProtocolLibProvider.this.remove(event.getPlayer().getAddress()); + } + } + }); } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ProtocolSupportProvider.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ProtocolSupportProvider.java index e514663..fdfcb99 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ProtocolSupportProvider.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ProtocolSupportProvider.java @@ -1,19 +1,20 @@ package fr.onecraft.clientstats.bukkit.hook.provider; -import fr.onecraft.clientstats.bukkit.hook.base.AbstractProvider; import org.bukkit.entity.Player; + +import fr.onecraft.clientstats.bukkit.hook.base.AbstractProvider; import protocolsupport.api.ProtocolSupportAPI; public class ProtocolSupportProvider extends AbstractProvider { @Override public String getProviderName() { - return "ProtocolSupport"; + return "ProtocolSupport"; } @Override public int getProtocol(Player p) { - return ProtocolSupportAPI.getProtocolVersion(p).getId(); + return ProtocolSupportAPI.getProtocolVersion(p).getId(); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ServerProvider.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ServerProvider.java index 6c11464..ee135f0 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ServerProvider.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ServerProvider.java @@ -1,44 +1,44 @@ package fr.onecraft.clientstats.bukkit.hook.provider; -import fr.onecraft.clientstats.bukkit.hook.base.AbstractProvider; -import org.bukkit.entity.Player; - import java.lang.reflect.Field; import java.lang.reflect.Method; +import org.bukkit.entity.Player; + +import fr.onecraft.clientstats.bukkit.hook.base.AbstractProvider; + public class ServerProvider extends AbstractProvider { @Override public String getProviderName() { - return "Protocol Hack Server"; + return "Protocol Hack Server"; } @Override public int getProtocol(Player p) { - try { - @SuppressWarnings("JavaReflectionMemberAccess") - Method getHandle = p.getClass().getMethod("getHandle"); - Object nmsPlayer = getHandle.invoke(p); + try { + Method getHandle = p.getClass().getMethod("getHandle"); + Object nmsPlayer = getHandle.invoke(p); - Field fieldPlayerConnection = nmsPlayer.getClass().getField("playerConnection"); - Object playerConnection = fieldPlayerConnection.get(nmsPlayer); + Field fieldPlayerConnection = nmsPlayer.getClass().getField("playerConnection"); + Object playerConnection = fieldPlayerConnection.get(nmsPlayer); - Field fieldNetworkManager = playerConnection.getClass().getField("networkManager"); - Object networkManager = fieldNetworkManager.get(playerConnection); + Field fieldNetworkManager = playerConnection.getClass().getField("networkManager"); + Object networkManager = fieldNetworkManager.get(playerConnection); - Method getVersion = networkManager.getClass().getMethod("getVersion"); - Object value = getVersion.invoke(networkManager); + Method getVersion = networkManager.getClass().getMethod("getVersion"); + Object value = getVersion.invoke(networkManager); - Integer version = (Integer) value; + Integer version = (Integer) value; - if (version != null) { - return version; - } - } catch (Exception ex) { - ex.printStackTrace(); - } + if (version != null) { + return version; + } + } catch (Exception ex) { + ex.printStackTrace(); + } - return 0; + return 0; } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/TinyProtocolProvider.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/TinyProtocolProvider.java index e2fe713..0f01e10 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/TinyProtocolProvider.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/TinyProtocolProvider.java @@ -1,22 +1,26 @@ package fr.onecraft.clientstats.bukkit.hook.provider; +import java.net.InetSocketAddress; +import java.net.SocketAddress; + +import org.bukkit.entity.Player; + import com.comphenix.tinyprotocol.Reflection; import com.comphenix.tinyprotocol.TinyProtocol; + import fr.onecraft.clientstats.bukkit.hook.base.AbstractPacketHandler; import fr.onecraft.core.plugin.Core; import io.netty.channel.Channel; -import org.bukkit.entity.Player; - -import java.net.InetSocketAddress; -import java.net.SocketAddress; public class TinyProtocolProvider extends AbstractPacketHandler { // Handshake packets private final Class HANDSHAKE = Reflection.getClass("{nms}.PacketHandshakingInSetProtocol"); private final Class ENUM_PROTOCOL = Reflection.getUntypedClass("{nms}.EnumProtocol"); - private final Reflection.FieldAccessor PROTOCOL_VERSION = Reflection.getField(HANDSHAKE, int.class, 0); - private final Reflection.FieldAccessor NEXT_STATE = Reflection.getField(HANDSHAKE, ENUM_PROTOCOL, 0); + private final Reflection.FieldAccessor PROTOCOL_VERSION = Reflection.getField(this.HANDSHAKE, int.class, + 0); + private final Reflection.FieldAccessor NEXT_STATE = Reflection.getField(this.HANDSHAKE, this.ENUM_PROTOCOL, + 0); private final String HANDSHAKE_LOGIN = "LOGIN"; // Disconnect while login @@ -24,48 +28,50 @@ public class TinyProtocolProvider extends AbstractPacketHandler { @Override public String getProviderName() { - return "TinyProtocol"; + return "TinyProtocol"; } @Override public void registerPacketListener() { - new TinyProtocol(Core.plugin()) { - - @Override - public Object onPacketInAsync(Player sender, Channel channel, Object packet) { - - if (HANDSHAKE.isInstance(packet)) { - if (PROTOCOL_VERSION.hasField(packet) && NEXT_STATE.hasField(packet)) { - Object nextState = NEXT_STATE.get(packet); - if (nextState != null && HANDSHAKE_LOGIN.equalsIgnoreCase(nextState.toString())) { - Integer protocolVersion = PROTOCOL_VERSION.get(packet); - if (protocolVersion != null) { - SocketAddress address = channel.remoteAddress(); - if (address instanceof InetSocketAddress) { - add((InetSocketAddress) address, protocolVersion); - } - } - } - } - } - - return super.onPacketInAsync(sender, channel, packet); - } - - @Override - public Object onPacketOutAsync(Player receiver, Channel channel, Object packet) { - - if (DISCONNECT.isInstance(packet)) { - SocketAddress address = channel.remoteAddress(); - if (address instanceof InetSocketAddress) { - remove((InetSocketAddress) address); - } - } - - return super.onPacketOutAsync(receiver, channel, packet); - } - - }; + new TinyProtocol(Core.plugin()) { + + @Override + public Object onPacketInAsync(Player sender, Channel channel, Object packet) { + + if (TinyProtocolProvider.this.HANDSHAKE.isInstance(packet)) { + if (TinyProtocolProvider.this.PROTOCOL_VERSION.hasField(packet) + && TinyProtocolProvider.this.NEXT_STATE.hasField(packet)) { + Object nextState = TinyProtocolProvider.this.NEXT_STATE.get(packet); + if ((nextState != null) + && TinyProtocolProvider.this.HANDSHAKE_LOGIN.equalsIgnoreCase(nextState.toString())) { + Integer protocolVersion = TinyProtocolProvider.this.PROTOCOL_VERSION.get(packet); + if (protocolVersion != null) { + SocketAddress address = channel.remoteAddress(); + if (address instanceof InetSocketAddress) { + TinyProtocolProvider.this.add((InetSocketAddress) address, protocolVersion); + } + } + } + } + } + + return super.onPacketInAsync(sender, channel, packet); + } + + @Override + public Object onPacketOutAsync(Player receiver, Channel channel, Object packet) { + + if (TinyProtocolProvider.this.DISCONNECT.isInstance(packet)) { + SocketAddress address = channel.remoteAddress(); + if (address instanceof InetSocketAddress) { + TinyProtocolProvider.this.remove((InetSocketAddress) address); + } + } + + return super.onPacketOutAsync(receiver, channel, packet); + } + + }; } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaProtocolProvider.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaProtocolProvider.java index 06ba524..4f02771 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaProtocolProvider.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaProtocolProvider.java @@ -1,41 +1,43 @@ package fr.onecraft.clientstats.bukkit.hook.provider; +import java.util.UUID; + +import org.bukkit.entity.Player; + import fr.onecraft.clientstats.bukkit.hook.base.AbstractProvider; import fr.onecraft.core.helpers.Players; -import org.bukkit.entity.Player; import protocolsupport.api.ProtocolSupportAPI; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaAPI; -import java.util.UUID; - public class ViaProtocolProvider extends AbstractProvider { + @SuppressWarnings("rawtypes") private final ViaAPI viaVersion = Via.getAPI(); @Override public String getProviderName() { - return "ViaVersion + ProtocolSupport"; + return "ViaVersion + ProtocolSupport"; } @Override public int getProtocol(UUID player) { - Player p = Players.get(player); + Player p = Players.get(player); - if (p != null) { - int version = ProtocolSupportAPI.getProtocolVersion(p).getId(); - if (version == -1) { - return viaVersion.getPlayerVersion(player); - } - return version; - } + if (p != null) { + int version = ProtocolSupportAPI.getProtocolVersion(p).getId(); + if (version == -1) { + return this.viaVersion.getPlayerVersion(player); + } + return version; + } - return 0; + return 0; } @Override public int getProtocol(Player p) { - throw new AbstractMethodError("Impossible call to getProtocol(Player)"); + throw new AbstractMethodError("Impossible call to getProtocol(Player)"); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaVersionLegacyProvider.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaVersionLegacyProvider.java index f02a05b..e491071 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaVersionLegacyProvider.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaVersionLegacyProvider.java @@ -1,23 +1,24 @@ package fr.onecraft.clientstats.bukkit.hook.provider; -import fr.onecraft.clientstats.bukkit.hook.base.AbstractProvider; import org.bukkit.entity.Player; + +import fr.onecraft.clientstats.bukkit.hook.base.AbstractProvider; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.ViaVersionAPI; +@SuppressWarnings("deprecation") public class ViaVersionLegacyProvider extends AbstractProvider { - @SuppressWarnings("deprecation") private final ViaVersionAPI viaVersion = ViaVersion.getInstance(); @Override public String getProviderName() { - return "ViaVersion Legacy"; + return "ViaVersion Legacy"; } @Override public int getProtocol(Player p) { - return viaVersion.getPlayerVersion(p); + return this.viaVersion.getPlayerVersion(p); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaVersionProvider.java b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaVersionProvider.java index 36a1aeb..af95e76 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaVersionProvider.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/hook/provider/ViaVersionProvider.java @@ -1,29 +1,31 @@ package fr.onecraft.clientstats.bukkit.hook.provider; -import fr.onecraft.clientstats.bukkit.hook.base.AbstractProvider; +import java.util.UUID; + import org.bukkit.entity.Player; + +import fr.onecraft.clientstats.bukkit.hook.base.AbstractProvider; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaAPI; -import java.util.UUID; - public class ViaVersionProvider extends AbstractProvider { + @SuppressWarnings("rawtypes") private final ViaAPI viaVersion = Via.getAPI(); @Override public String getProviderName() { - return "ViaVersion"; + return "ViaVersion"; } @Override public int getProtocol(UUID player) { - return viaVersion.getPlayerVersion(player); + return this.viaVersion.getPlayerVersion(player); } @Override public int getProtocol(Player p) { - throw new AbstractMethodError("Impossible call to getProtocol(Player)"); + throw new AbstractMethodError("Impossible call to getProtocol(Player)"); } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/user/BukkitUser.java b/src/main/java/fr/onecraft/clientstats/bukkit/user/BukkitUser.java index bc32c9d..4c2fe74 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/user/BukkitUser.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/user/BukkitUser.java @@ -1,46 +1,47 @@ package fr.onecraft.clientstats.bukkit.user; -import fr.onecraft.clientstats.common.user.MixedUser; +import java.util.UUID; + import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.UUID; +import fr.onecraft.clientstats.common.user.MixedUser; public class BukkitUser extends MixedUser { public static MixedUser of(CommandSender sender) { - return sender == null ? null : new BukkitUser(sender); + return sender == null ? null : new BukkitUser(sender); } private BukkitUser(CommandSender sender) { - this.sender = sender; + this.sender = sender; } private final CommandSender sender; @Override public void sendMessage(String msg) { - sender.sendMessage(msg); + this.sender.sendMessage(msg); } @Override public boolean hasPermission(String permission) { - return sender.hasPermission(permission); + return this.sender.hasPermission(permission); } @Override public boolean isPlayer() { - return sender instanceof Player; + return this.sender instanceof Player; } @Override public UUID getUniqueId() { - return sender instanceof Player ? ((Player) sender).getUniqueId() : null; + return this.sender instanceof Player ? ((Player) this.sender).getUniqueId() : null; } @Override public String getName() { - return sender instanceof Player ? sender.getName() : null; + return this.sender instanceof Player ? this.sender.getName() : null; } } diff --git a/src/main/java/fr/onecraft/clientstats/bukkit/user/BukkitUserProvider.java b/src/main/java/fr/onecraft/clientstats/bukkit/user/BukkitUserProvider.java index 7920aa2..7a052e1 100644 --- a/src/main/java/fr/onecraft/clientstats/bukkit/user/BukkitUserProvider.java +++ b/src/main/java/fr/onecraft/clientstats/bukkit/user/BukkitUserProvider.java @@ -1,45 +1,48 @@ package fr.onecraft.clientstats.bukkit.user; -import fr.onecraft.clientstats.common.user.MixedUser; -import fr.onecraft.clientstats.common.user.UserProvider; -import org.bukkit.Server; -import org.bukkit.entity.Player; - import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.UUID; +import org.bukkit.Server; +import org.bukkit.entity.Player; + +import fr.onecraft.clientstats.common.user.MixedUser; +import fr.onecraft.clientstats.common.user.UserProvider; + public class BukkitUserProvider implements UserProvider { private final Server server; public BukkitUserProvider(Server server) { - this.server = server; + this.server = server; } @Override public Collection getOnlineIds() { - List users = new ArrayList<>(getOnlineCount()); - for (Player player : server.getOnlinePlayers()) users.add(player.getUniqueId()); - return users; + List users = new ArrayList<>(this.getOnlineCount()); + for (Player player : this.server.getOnlinePlayers()) + users.add(player.getUniqueId()); + return users; } @Override public Collection getOnlineNames() { - List users = new ArrayList<>(getOnlineCount()); - for (Player player : server.getOnlinePlayers()) users.add(player.getName()); - return users; + List users = new ArrayList<>(this.getOnlineCount()); + for (Player player : this.server.getOnlinePlayers()) + users.add(player.getName()); + return users; } @Override public int getOnlineCount() { - return server.getOnlinePlayers().size(); + return this.server.getOnlinePlayers().size(); } @Override public MixedUser getUser(String name) { - return BukkitUser.of(server.getPlayer(name)); + return BukkitUser.of(this.server.getPlayer(name)); } } diff --git a/src/main/java/fr/onecraft/clientstats/bungee/BungeeAPI.java b/src/main/java/fr/onecraft/clientstats/bungee/BungeeAPI.java index f094b11..7932453 100644 --- a/src/main/java/fr/onecraft/clientstats/bungee/BungeeAPI.java +++ b/src/main/java/fr/onecraft/clientstats/bungee/BungeeAPI.java @@ -1,41 +1,42 @@ package fr.onecraft.clientstats.bungee; +import java.util.logging.Logger; + +import javax.annotation.Nonnull; + import fr.onecraft.clientstats.common.base.ServerType; import fr.onecraft.clientstats.common.base.VersionProvider; import fr.onecraft.clientstats.common.core.AbstractAPI; import net.md_5.bungee.api.ChatColor; -import javax.annotation.Nonnull; -import java.util.logging.Logger; - public class BungeeAPI extends AbstractAPI { private final BungeePlugin plugin; public BungeeAPI(BungeePlugin plugin, VersionProvider provider) { - super(provider, plugin); - this.plugin = plugin; + super(provider, plugin); + this.plugin = plugin; } @Nonnull @Override public ServerType getServerType() { - return ServerType.BUNGEE; + return ServerType.BUNGEE; } @Override public boolean isEnabled() { - return plugin.isEnabled(); + return this.plugin.isEnabled(); } @Override public Logger getLogger() { - return plugin.getLogger(); + return this.plugin.getLogger(); } @Override public String colorize(String string) { - return ChatColor.translateAlternateColorCodes('&', string); + return ChatColor.translateAlternateColorCodes('&', string); } } diff --git a/src/main/java/fr/onecraft/clientstats/bungee/BungeePlugin.java b/src/main/java/fr/onecraft/clientstats/bungee/BungeePlugin.java index 3887a9a..7e5b155 100644 --- a/src/main/java/fr/onecraft/clientstats/bungee/BungeePlugin.java +++ b/src/main/java/fr/onecraft/clientstats/bungee/BungeePlugin.java @@ -1,5 +1,8 @@ package fr.onecraft.clientstats.bungee; +import java.util.UUID; +import java.util.logging.Level; + import fr.onecraft.clientstats.ClientStats; import fr.onecraft.clientstats.bungee.dispatcher.CommandDispatcher; import fr.onecraft.clientstats.bungee.dispatcher.EventDispatcher; @@ -8,12 +11,11 @@ import fr.onecraft.clientstats.common.base.Configurable; import fr.onecraft.clientstats.common.base.VersionProvider; import fr.onecraft.clientstats.common.core.AbstractAPI; +import fr.onecraft.clientstats.common.core.VersionNameProvider; import fr.onecraft.clientstats.common.user.MixedUser; import fr.onecraft.config.plugin.PluginConfigurable; import net.md_5.bungee.api.ProxyServer; -import java.util.UUID; - public class BungeePlugin extends PluginConfigurable implements Configurable { // Plugin state @@ -22,101 +24,112 @@ public class BungeePlugin extends PluginConfigurable implements Configurable { @Override public void onEnable() { - // User provider - MixedUser.setProvider(new BungeeUserProvider(getProxy())); - - // Version provider - VersionProvider provider; - if (ViaVersionDetector.isUsable()) { - provider = ViaVersionDetector.getProvider(); - } else { - provider = new VersionProvider() { - @Override - public String getProviderName() { - return "Bungeecord"; - } - - @Override - public int getProtocol(UUID player) { - return ProxyServer.getInstance().getPlayer(player).getPendingConnection().getVersion(); - } - }; - } - getLogger().info("Hooked into " + provider.getProviderName() + " !"); - - // Bungeecord API - AbstractAPI api = new BungeeAPI(this, provider); - - // Reload config - api.reload(); - - // Register Event - getProxy().getPluginManager().registerListener(this, new EventDispatcher(api)); - - // Handle command - getProxy().getPluginManager().registerCommand(this, new CommandDispatcher(api)); - - // Api is ready - enabled = true; - ClientStats.setApi(api); + // User provider + MixedUser.setProvider(new BungeeUserProvider(this.getProxy())); + + // Version provider + VersionProvider provider; + if (ViaVersionDetector.isUsable()) { + provider = ViaVersionDetector.getProvider(); + } else { + provider = new VersionProvider() { + @Override + public String getProviderName() { + return "Bungeecord"; + } + + @Override + public int getProtocol(UUID player) { + return ProxyServer.getInstance().getPlayer(player).getPendingConnection().getVersion(); + } + }; + } + this.getLogger().info("Hooked into " + provider.getProviderName() + " !"); + + // Version Provider + for (int i = 1; i <= 5; i++) { + this.getLogger().info("Reloading version list... (Attempt " + i + ")"); + try { + VersionNameProvider.reload(true, this.getLogger()); + break; + } catch (Exception e) { + this.getLogger().log(Level.SEVERE, "Unable to load version list", e); + } + } + + // Bungeecord API + AbstractAPI api = new BungeeAPI(this, provider); + + // Reload config + api.reload(); + + // Register Event + this.getProxy().getPluginManager().registerListener(this, new EventDispatcher(api)); + + // Handle command + this.getProxy().getPluginManager().registerCommand(this, new CommandDispatcher(api)); + + // Api is ready + this.enabled = true; + ClientStats.setApi(api); } @Override public void onDisable() { - // Remove api - ClientStats.setApi(null); - enabled = false; + // Remove api + ClientStats.setApi(null); + this.enabled = false; } public boolean isEnabled() { - return enabled; + return this.enabled; } @Override public void migrate() { - // v2.7.6 -> v2.7.7 - String helpKey = "messages.commands.help.stats"; - String helpMsg = getConfig().getString(helpKey); - if (helpMsg.equals("&b/{1} stats &f- Statistics since server startup")) { - getConfig().set(helpKey, "&b/{1} stats &f- Global statistics"); - } else if (helpMsg.contains("Statistics since server startup")) { - getConfig().set(helpKey, helpMsg.replace("Statistics since server startup", "Global statistics")); - } - - // v2.7.6 -> v2.7.7 - String statsKey = "messages.commands.stats.title"; - String statsMsg = getConfig().getString(statsKey); - if (statsMsg.equals("Statistics since server startup:")) { - getConfig().set(statsKey, "Statistics since {1}:"); - } else if (statsMsg.contains("server startup")) { - getConfig().set(statsKey, statsMsg.replace("server startup", "{1}")); - } + // v2.7.6 -> v2.7.7 + String helpKey = "messages.commands.help.stats"; + String helpMsg = this.getConfig().getString(helpKey); + if (helpMsg.equals("&b/{1} stats &f- Statistics since server startup")) { + this.getConfig().set(helpKey, "&b/{1} stats &f- Global statistics"); + } else if (helpMsg.contains("Statistics since server startup")) { + this.getConfig().set(helpKey, helpMsg.replace("Statistics since server startup", "Global statistics")); + } + + // v2.7.6 -> v2.7.7 + String statsKey = "messages.commands.stats.title"; + String statsMsg = this.getConfig().getString(statsKey); + if (statsMsg.equals("Statistics since server startup:")) { + this.getConfig().set(statsKey, "Statistics since {1}:"); + } else if (statsMsg.contains("server startup")) { + this.getConfig().set(statsKey, statsMsg.replace("server startup", "{1}")); + } } @Override public void options() { - // Copy headers and new values - getConfig().options().copyDefaults(true).copyHeader(true); + // Copy headers and new values + this.getConfig().options().copyDefaults(true).copyHeader(true); } @Override public String getConfigString(String path) { - return getConfig().getString(path); + return this.getConfig().getString(path); } @Override public String getConfigString(String path, String def) { - return getConfig().getString(path, def); + return this.getConfig().getString(path, def); } @Override public void setConfigValue(String path, Object value) { - getConfig().set(path, value); + this.getConfig().set(path, value); } } diff --git a/src/main/java/fr/onecraft/clientstats/bungee/dispatcher/CommandDispatcher.java b/src/main/java/fr/onecraft/clientstats/bungee/dispatcher/CommandDispatcher.java index 457c6da..b37f292 100644 --- a/src/main/java/fr/onecraft/clientstats/bungee/dispatcher/CommandDispatcher.java +++ b/src/main/java/fr/onecraft/clientstats/bungee/dispatcher/CommandDispatcher.java @@ -1,5 +1,8 @@ package fr.onecraft.clientstats.bungee.dispatcher; +import java.util.Arrays; +import java.util.List; + import fr.onecraft.clientstats.ClientStatsAPI; import fr.onecraft.clientstats.bungee.user.BungeeUser; import fr.onecraft.clientstats.common.core.CommandHandler; @@ -7,34 +10,31 @@ import net.md_5.bungee.api.plugin.Command; import net.md_5.bungee.api.plugin.TabExecutor; -import java.util.Arrays; -import java.util.List; - public class CommandDispatcher extends Command implements TabExecutor { private final CommandHandler handler; public CommandDispatcher(ClientStatsAPI plugin) { - super("clientstats", null, "cstats", "cs", "bclientstats", "bcstats", "bcs"); - this.handler = new CommandHandler(plugin); + super("clientstats", null, "cstats", "cs", "bclientstats", "bcstats", "bcs"); + this.handler = new CommandHandler(plugin); } @Override public void execute(CommandSender sender, String[] args) { - handler.execute(BungeeUser.of(sender), Arrays.asList(args), "cstats"); + this.handler.execute(BungeeUser.of(sender), Arrays.asList(args), "cstats"); } @Override public Iterable onTabComplete(CommandSender sender, String[] args) { - String token; - List list; - if (args.length == 0) { - list = Arrays.asList(args); - token = null; - } else { - list = Arrays.asList(Arrays.copyOf(args, args.length - 1)); - token = args[args.length - 1]; - } - return handler.complete(BungeeUser.of(sender), list, token); + String token; + List list; + if (args.length == 0) { + list = Arrays.asList(args); + token = null; + } else { + list = Arrays.asList(Arrays.copyOf(args, args.length - 1)); + token = args[args.length - 1]; + } + return this.handler.complete(BungeeUser.of(sender), list, token); } } \ No newline at end of file diff --git a/src/main/java/fr/onecraft/clientstats/bungee/dispatcher/EventDispatcher.java b/src/main/java/fr/onecraft/clientstats/bungee/dispatcher/EventDispatcher.java index 914d642..e064811 100644 --- a/src/main/java/fr/onecraft/clientstats/bungee/dispatcher/EventDispatcher.java +++ b/src/main/java/fr/onecraft/clientstats/bungee/dispatcher/EventDispatcher.java @@ -13,17 +13,17 @@ public class EventDispatcher implements Listener { private final EventListener listener; public EventDispatcher(AbstractAPI api) { - this.listener = new EventListener(api); + this.listener = new EventListener(api); } @EventHandler public void on(PostLoginEvent e) { - listener.onPlayerJoin(BungeeUser.of(e.getPlayer()), false); + this.listener.onPlayerJoin(BungeeUser.of(e.getPlayer()), false); } @EventHandler public void on(PlayerDisconnectEvent e) { - listener.onPlayerQuit(BungeeUser.of(e.getPlayer())); + this.listener.onPlayerQuit(BungeeUser.of(e.getPlayer())); } } \ No newline at end of file diff --git a/src/main/java/fr/onecraft/clientstats/bungee/hooks/ViaVersionDetector.java b/src/main/java/fr/onecraft/clientstats/bungee/hooks/ViaVersionDetector.java index 9e51419..01ffcda 100644 --- a/src/main/java/fr/onecraft/clientstats/bungee/hooks/ViaVersionDetector.java +++ b/src/main/java/fr/onecraft/clientstats/bungee/hooks/ViaVersionDetector.java @@ -6,11 +6,11 @@ public class ViaVersionDetector { public static boolean isUsable() { - return ProxyServer.getInstance().getPluginManager().getPlugin("ViaVersion") != null; + return ProxyServer.getInstance().getPluginManager().getPlugin("ViaVersion") != null; } public static VersionProvider getProvider() { - return new ViaVersionProvider(); + return new ViaVersionProvider(); } } diff --git a/src/main/java/fr/onecraft/clientstats/bungee/hooks/ViaVersionProvider.java b/src/main/java/fr/onecraft/clientstats/bungee/hooks/ViaVersionProvider.java index 75dc00d..7d0699e 100644 --- a/src/main/java/fr/onecraft/clientstats/bungee/hooks/ViaVersionProvider.java +++ b/src/main/java/fr/onecraft/clientstats/bungee/hooks/ViaVersionProvider.java @@ -1,23 +1,24 @@ package fr.onecraft.clientstats.bungee.hooks; +import java.util.UUID; + import fr.onecraft.clientstats.common.base.VersionProvider; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaAPI; -import java.util.UUID; - public class ViaVersionProvider implements VersionProvider { + @SuppressWarnings("rawtypes") private final ViaAPI viaVersion = Via.getAPI(); @Override public String getProviderName() { - return "ViaVersion"; + return "ViaVersion"; } @Override public int getProtocol(UUID player) { - return viaVersion.getPlayerVersion(player); + return this.viaVersion.getPlayerVersion(player); } } diff --git a/src/main/java/fr/onecraft/clientstats/bungee/user/BungeeUser.java b/src/main/java/fr/onecraft/clientstats/bungee/user/BungeeUser.java index 5f0e3bc..5fc3231 100644 --- a/src/main/java/fr/onecraft/clientstats/bungee/user/BungeeUser.java +++ b/src/main/java/fr/onecraft/clientstats/bungee/user/BungeeUser.java @@ -1,47 +1,47 @@ package fr.onecraft.clientstats.bungee.user; +import java.util.UUID; + import fr.onecraft.clientstats.common.user.MixedUser; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; -import java.util.UUID; - public class BungeeUser extends MixedUser { public static MixedUser of(CommandSender sender) { - return sender == null ? null : new BungeeUser(sender); + return sender == null ? null : new BungeeUser(sender); } private BungeeUser(CommandSender sender) { - this.sender = sender; + this.sender = sender; } private final CommandSender sender; @Override public void sendMessage(String msg) { - sender.sendMessage(TextComponent.fromLegacyText(msg)); + this.sender.sendMessage(TextComponent.fromLegacyText(msg)); } @Override public boolean hasPermission(String permission) { - return sender.hasPermission(permission); + return this.sender.hasPermission(permission); } @Override public boolean isPlayer() { - return sender instanceof ProxiedPlayer; + return this.sender instanceof ProxiedPlayer; } @Override public UUID getUniqueId() { - return sender instanceof ProxiedPlayer ? ((ProxiedPlayer) sender).getUniqueId() : null; + return this.sender instanceof ProxiedPlayer ? ((ProxiedPlayer) this.sender).getUniqueId() : null; } @Override public String getName() { - return sender instanceof ProxiedPlayer ? sender.getName() : null; + return this.sender instanceof ProxiedPlayer ? this.sender.getName() : null; } } diff --git a/src/main/java/fr/onecraft/clientstats/bungee/user/BungeeUserProvider.java b/src/main/java/fr/onecraft/clientstats/bungee/user/BungeeUserProvider.java index 7025659..76bdebd 100644 --- a/src/main/java/fr/onecraft/clientstats/bungee/user/BungeeUserProvider.java +++ b/src/main/java/fr/onecraft/clientstats/bungee/user/BungeeUserProvider.java @@ -1,45 +1,47 @@ package fr.onecraft.clientstats.bungee.user; -import fr.onecraft.clientstats.common.user.MixedUser; -import fr.onecraft.clientstats.common.user.UserProvider; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.connection.ProxiedPlayer; - import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.UUID; +import fr.onecraft.clientstats.common.user.MixedUser; +import fr.onecraft.clientstats.common.user.UserProvider; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; + public class BungeeUserProvider implements UserProvider { private final ProxyServer server; public BungeeUserProvider(ProxyServer server) { - this.server = server; + this.server = server; } @Override public Collection getOnlineIds() { - List users = new ArrayList<>(getOnlineCount()); - for (ProxiedPlayer player : server.getPlayers()) users.add(player.getUniqueId()); - return users; + List users = new ArrayList<>(this.getOnlineCount()); + for (ProxiedPlayer player : this.server.getPlayers()) + users.add(player.getUniqueId()); + return users; } @Override public Collection getOnlineNames() { - List users = new ArrayList<>(getOnlineCount()); - for (ProxiedPlayer player : server.getPlayers()) users.add(player.getName()); - return users; + List users = new ArrayList<>(this.getOnlineCount()); + for (ProxiedPlayer player : this.server.getPlayers()) + users.add(player.getName()); + return users; } @Override public int getOnlineCount() { - return server.getOnlineCount(); + return this.server.getOnlineCount(); } @Override public MixedUser getUser(String name) { - return BungeeUser.of(server.getPlayer(name)); + return BungeeUser.of(this.server.getPlayer(name)); } } diff --git a/src/main/java/fr/onecraft/clientstats/common/base/ServerType.java b/src/main/java/fr/onecraft/clientstats/common/base/ServerType.java index cc7973e..85a10ef 100644 --- a/src/main/java/fr/onecraft/clientstats/common/base/ServerType.java +++ b/src/main/java/fr/onecraft/clientstats/common/base/ServerType.java @@ -2,7 +2,6 @@ public enum ServerType { - BUKKIT, - BUNGEE, + BUKKIT, BUNGEE, } diff --git a/src/main/java/fr/onecraft/clientstats/common/core/AbstractAPI.java b/src/main/java/fr/onecraft/clientstats/common/core/AbstractAPI.java index a5b6eec..004e4dd 100644 --- a/src/main/java/fr/onecraft/clientstats/common/core/AbstractAPI.java +++ b/src/main/java/fr/onecraft/clientstats/common/core/AbstractAPI.java @@ -1,5 +1,19 @@ package fr.onecraft.clientstats.common.core; +import static fr.onecraft.clientstats.common.user.MixedUser.getOnlineCount; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.UUID; +import java.util.logging.Logger; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import fr.onecraft.clientstats.ClientStatsAPI; import fr.onecraft.clientstats.common.base.Configurable; import fr.onecraft.clientstats.common.base.VersionProvider; @@ -7,19 +21,11 @@ import fr.onecraft.core.helpers.Locales; import fr.onecraft.core.tuple.Pair; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.logging.Logger; - -import static fr.onecraft.clientstats.common.user.MixedUser.getOnlineCount; - public abstract class AbstractAPI implements ClientStatsAPI { // Default datetime format - protected final static DateFormat DEFAULT_DATETIME_FORMAT = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); + protected final static DateFormat DEFAULT_DATETIME_FORMAT = DateFormat.getDateTimeInstance(DateFormat.SHORT, + DateFormat.SHORT); // Config values protected String PREFIX = "§9[ClientStats] §f"; @@ -45,8 +51,8 @@ public abstract class AbstractAPI implements ClientStatsAPI { private int playtimeRatio = 0; public AbstractAPI(VersionProvider provider, Configurable config) { - this.provider = provider; - this.config = config; + this.provider = provider; + this.config = config; } public abstract Logger getLogger(); @@ -56,203 +62,204 @@ public AbstractAPI(VersionProvider provider, Configurable config) { @Override public void reload() { - // Save config if it doesn't exist - config.saveDefaultConfig(); - - // Reload to get latest values - config.reloadConfig(); - - // Migrate over versions - config.migrate(); - - // Copy headers and new values - config.options(); - - // And save it - config.saveConfig(); - - // Get prefixes - PREFIX = colorize(config.getConfigString("messages.prefix", PREFIX)); - SUBLINE = colorize(config.getConfigString("messages.subline", SUBLINE)); - - // Get date format - String userFormat = config.getConfigString("settings.date-format", "default"); - DateFormat userDateFormat = null; - - if (userFormat.equalsIgnoreCase("default")) { - // Default format - userDateFormat = DEFAULT_DATETIME_FORMAT; - } else { - Locale locale = Locales.valueOf(userFormat); - if (locale != null) { - // It's a locale - DateFormat dateTimeInstance = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale); - if (dateTimeInstance != null) { - userDateFormat = dateTimeInstance; - } - } else if (userFormat.length() > 2) { - // It may be a date format - try { - userDateFormat = new SimpleDateFormat(userFormat); - } catch (IllegalArgumentException ignored) {} - } - } - - if (userDateFormat == null) { - getLogger().warning("Invalid date-format value, reverting to default."); - dateTimeFormat = DEFAULT_DATETIME_FORMAT; - config.setConfigValue("settings.date-format", "default"); - config.saveConfig(); - } else { - dateTimeFormat = userDateFormat; - } + // Save config if it doesn't exist + this.config.saveDefaultConfig(); + + // Reload to get latest values + this.config.reloadConfig(); + + // Migrate over versions + this.config.migrate(); + + // Copy headers and new values + this.config.options(); + + // And save it + this.config.saveConfig(); + + // Get prefixes + this.PREFIX = this.colorize(this.config.getConfigString("messages.prefix", this.PREFIX)); + this.SUBLINE = this.colorize(this.config.getConfigString("messages.subline", this.SUBLINE)); + + // Get date format + String userFormat = this.config.getConfigString("settings.date-format", "default"); + DateFormat userDateFormat = null; + + if (userFormat.equalsIgnoreCase("default")) { + // Default format + userDateFormat = DEFAULT_DATETIME_FORMAT; + } else { + Locale locale = Locales.valueOf(userFormat); + if (locale != null) { + // It's a locale + DateFormat dateTimeInstance = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, + locale); + if (dateTimeInstance != null) { + userDateFormat = dateTimeInstance; + } + } else if (userFormat.length() > 2) { + // It may be a date format + try { + userDateFormat = new SimpleDateFormat(userFormat); + } catch (IllegalArgumentException ignored) { + } + } + } + + if (userDateFormat == null) { + this.getLogger().warning("Invalid date-format value, reverting to default."); + this.dateTimeFormat = DEFAULT_DATETIME_FORMAT; + this.config.setConfigValue("settings.date-format", "default"); + this.config.saveConfig(); + } else { + this.dateTimeFormat = userDateFormat; + } } @Override public void resetStats() { - joined.clear(); - totalJoined = 0; - maxOnlinePlayers = MixedUser.getOnlineCount(); - maxOnlineDate = System.currentTimeMillis(); - averagePlaytime = 0; - playtimeRatio = 0; - startOfRecording = System.currentTimeMillis(); + this.joined.clear(); + this.totalJoined = 0; + this.maxOnlinePlayers = MixedUser.getOnlineCount(); + this.maxOnlineDate = System.currentTimeMillis(); + this.averagePlaytime = 0; + this.playtimeRatio = 0; + this.startOfRecording = System.currentTimeMillis(); } @Override public boolean isVersionDetectionEnabled() { - return isEnabled() && provider != null; + return this.isEnabled() && (this.provider != null); } @Override public int getTotalJoined() { - return totalJoined; + return this.totalJoined; } @Override public int getTotalNewPlayers() { - return totalNewPlayers; + return this.totalNewPlayers; } @Override public int getUniqueJoined() { - return joined.size(); + return this.joined.size(); } @Override public int getMaxOnlinePlayers() { - return maxOnlinePlayers; + return this.maxOnlinePlayers; } @Override public long getMaxOnlineDate() { - return maxOnlineDate; + return this.maxOnlineDate; } @Override public double getAveragePlaytime() { - return averagePlaytime; + return this.averagePlaytime; } @Nonnull @Override public Map getProtocolJoined() { - return Collections.unmodifiableMap(joined); + return Collections.unmodifiableMap(this.joined); } @Nonnull @Override public String getVersionName(int version) { - String versionName = config.getConfigString("versions." + version); - - if (versionName == null || versionName.isEmpty()) { - getLogger().severe("Missing version: versions." + version); - versionName = config.getConfigString("versions.0"); + String versionName = VersionNameProvider.get(version); - if (versionName == null || versionName.isEmpty()) { - getLogger().severe("Missing message: versions.0"); - return "unknown"; - } - } + if (versionName == null) { + this.getLogger().warning("Unknown version: " + version); + versionName = "Unknown"; + } - return versionName; + return versionName; } @Override public int getProtocol(@Nonnull UUID player) { - return isVersionDetectionEnabled() ? provider.getProtocol(player) : 0; + return this.isVersionDetectionEnabled() ? this.provider.getProtocol(player) : 0; } @Nullable @Override public Pair getVersion(@Nonnull UUID player) { - int version = getProtocol(player); - if (version == 0) return null; - String versionName = getVersionName(version); - return Pair.of(version, versionName); + int version = this.getProtocol(player); + if (version == 0) + return null; + String versionName = this.getVersionName(version); + return Pair.of(version, versionName); } public void updatePlayerCount() { - int online = MixedUser.getOnlineCount(); - if (online > maxOnlinePlayers) { - maxOnlinePlayers = online; - maxOnlineDate = System.currentTimeMillis(); - } + int online = MixedUser.getOnlineCount(); + if (online > this.maxOnlinePlayers) { + this.maxOnlinePlayers = online; + this.maxOnlineDate = System.currentTimeMillis(); + } } public void registerJoin(MixedUser p, boolean isNew) { - totalJoined++; - if (isNew) totalNewPlayers++; - if (isVersionDetectionEnabled()) joined.put(p.getUniqueId(), getProtocol(p.getUniqueId())); + this.totalJoined++; + if (isNew) + this.totalNewPlayers++; + if (this.isVersionDetectionEnabled()) + this.joined.put(p.getUniqueId(), this.getProtocol(p.getUniqueId())); } public void registerPlaytime(long playtimeMillis) { - long playtimeSeconds = playtimeMillis / 1000; - playtimeRatio++; - averagePlaytime += (playtimeSeconds - averagePlaytime) / playtimeRatio; + long playtimeSeconds = playtimeMillis / 1000; + this.playtimeRatio++; + this.averagePlaytime += (playtimeSeconds - this.averagePlaytime) / this.playtimeRatio; } @Override public long getStartOfRecording() { - return startOfRecording; + return this.startOfRecording; } @Nonnull @Override public DateFormat getDateTimeFormat() { - return dateTimeFormat; + return this.dateTimeFormat; } @Override public void sendMessage(MixedUser receiver, String messageCode, Object... args) { - processMessage(receiver, messageCode, PREFIX, args); + this.processMessage(receiver, messageCode, this.PREFIX, args); } @Override public void subMessage(MixedUser receiver, String messageCode, Object... args) { - processMessage(receiver, messageCode, SUBLINE, args); + this.processMessage(receiver, messageCode, this.SUBLINE, args); } private void processMessage(MixedUser receiver, String messageCode, String prefix, Object... args) { - String message = config.getConfigString("messages." + messageCode); + String message = this.config.getConfigString("messages." + messageCode); - if (message == null || message.isEmpty()) { - getLogger().warning("Missing message: " + messageCode); - message = config.getConfigString("messages.error.general"); + if ((message == null) || message.isEmpty()) { + this.getLogger().warning("Missing message: " + messageCode); + message = this.config.getConfigString("messages.error.general"); - if (message == null || message.isEmpty()) { - message = "&cAn internal error occurred.."; - } - } + if ((message == null) || message.isEmpty()) { + message = "&cAn internal error occurred.."; + } + } - if (message.isEmpty()) return; + if (message.isEmpty()) + return; - for (int i = 0; i < args.length; i++) { - message = message.replace("{" + (i + 1) + "}", args[i].toString()); - } + for (int i = 0; i < args.length; i++) { + message = message.replace("{" + (i + 1) + "}", args[i].toString()); + } - receiver.sendMessage(prefix + colorize(message)); + receiver.sendMessage(prefix + this.colorize(message)); } } diff --git a/src/main/java/fr/onecraft/clientstats/common/core/CommandHandler.java b/src/main/java/fr/onecraft/clientstats/common/core/CommandHandler.java index 2dc1839..f773747 100644 --- a/src/main/java/fr/onecraft/clientstats/common/core/CommandHandler.java +++ b/src/main/java/fr/onecraft/clientstats/common/core/CommandHandler.java @@ -1,238 +1,281 @@ package fr.onecraft.clientstats.common.core; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.UUID; + +import org.apache.http.concurrent.FutureCallback; + import fr.onecraft.clientstats.ClientStatsAPI; import fr.onecraft.clientstats.common.base.ServerType; import fr.onecraft.clientstats.common.user.MixedUser; import fr.onecraft.core.tuple.MutablePair; import fr.onecraft.core.tuple.Pair; -import java.util.*; - - public class CommandHandler { private static final List EMPTY_LIST = Collections.emptyList(); - private static final List SUB_COMMANDS = Arrays.asList("stats", "version", "online", "player", "reset", "reload"); + private static final List SUB_COMMANDS = Arrays.asList("stats", "version", "online", "player", "reset", + "reload"); private final ClientStatsAPI api; public CommandHandler(ClientStatsAPI api) { - this.api = api; + this.api = api; } private boolean denied(MixedUser sender, String cmd) { - return denied(sender, cmd, true); + return this.denied(sender, cmd, true); } private boolean denied(MixedUser sender, String cmd, boolean verbose) { - if (sender.hasPermission(ClientStatsAPI.PERMISSION_ADMIN) - || sender.hasPermission(ClientStatsAPI.PERMISSION_COMMAND.replace("{cmd}", cmd))) { - return false; - } else { - if (verbose) api.sendMessage(sender, "error.permission"); - return true; - } + if (sender.hasPermission(ClientStatsAPI.PERMISSION_ADMIN) + || sender.hasPermission(ClientStatsAPI.PERMISSION_COMMAND.replace("{cmd}", cmd))) { + return false; + } else { + if (verbose) + this.api.sendMessage(sender, "error.permission"); + return true; + } } private boolean versionDetectionDisabled(MixedUser sender) { - if (!api.isVersionDetectionEnabled()) { - api.sendMessage(sender, "warning.version-disabled"); - return true; - } - return false; + if (!this.api.isVersionDetectionEnabled()) { + this.api.sendMessage(sender, "warning.version-disabled"); + return true; + } + return false; } private List filter(Iterable list, String token, MixedUser commandUser) { - List completions = new ArrayList<>(); - token = token == null || token.isEmpty() ? null : token.toLowerCase(); - for (String s : list) { - if ((token == null || s.toLowerCase().startsWith(token)) && (commandUser == null || !denied(commandUser, s, false))) { - completions.add(s); - } - } - return completions.size() == 1 ? Collections.singletonList(completions.get(0) + " ") : completions; + List completions = new ArrayList<>(); + token = (token == null) || token.isEmpty() ? null : token.toLowerCase(); + for (String s : list) { + if (((token == null) || s.toLowerCase().startsWith(token)) + && ((commandUser == null) || !this.denied(commandUser, s, false))) { + completions.add(s); + } + } + return completions.size() == 1 ? Collections.singletonList(completions.get(0) + " ") : completions; } public List complete(MixedUser sender, List args, String token) { - if (args.size() == 1) { - if (args.get(0).equalsIgnoreCase("player") && !denied(sender, "player")) { - return filter(MixedUser.getOnlineNames(), token, null); - } - } else if (args.size() == 0) { - return filter(SUB_COMMANDS, token, sender); - } - return EMPTY_LIST; + if (args.size() == 1) { + if (args.get(0).equalsIgnoreCase("player") && !this.denied(sender, "player")) { + return this.filter(MixedUser.getOnlineNames(), token, null); + } + } else if (args.size() == 0) { + return this.filter(SUB_COMMANDS, token, sender); + } + return EMPTY_LIST; } public void execute(MixedUser sender, List args, String label) { - if (args.size() == 1) { - - if (args.get(0).equalsIgnoreCase("stats")) { - if (denied(sender, "stats")) return; - - api.sendMessage(sender, "commands.stats.title", api.getDateTimeFormat().format(new Date(api.getStartOfRecording()))); - api.subMessage(sender, "commands.stats.unique", api.getUniqueJoined()); - - if (api.getServerType() != ServerType.BUNGEE) { - api.subMessage(sender, "commands.stats.new", api.getTotalNewPlayers()); - } - - api.subMessage(sender, "commands.stats.total", api.getTotalJoined()); - - String date = api.getDateTimeFormat().format(new Date(api.getMaxOnlineDate())); - api.subMessage(sender, "commands.stats.max", api.getMaxOnlinePlayers(), date); - - long averagePlaytime = Math.round(api.getAveragePlaytime()); - long min = averagePlaytime / 60; - long sec = averagePlaytime % 60; - api.subMessage(sender, "commands.stats.playtime", min, sec); - - // Warn user if stats are low and he has exempt permission - if (api.getUniqueJoined() < 10 && sender.isPlayer() && sender.hasPermission(ClientStatsAPI.EXEMPT_PERMISSION)) { - api.subMessage(sender, "warning.exempted"); - } - - return; - - } else if (args.get(0).equalsIgnoreCase("version")) { - if (denied(sender, "version") || versionDetectionDisabled(sender)) return; - - Map> versions = new TreeMap<>(); - int total = 0; - - for (Integer version : api.getProtocolJoined().values()) { - total++; - Pair pair = versions.get(version); - if (pair == null) { - String versionName = api.getVersionName(version); - versions.put(version, MutablePair.of(versionName, 1)); - } else { - pair.setRight(pair.getRight() + 1); - versions.put(version, pair); - } - } - - api.sendMessage(sender, "commands.version.title"); - - if (total == 0) { - api.subMessage(sender, "commands.version.empty"); - } else { - for (Pair pair : versions.values()) { - api.subMessage(sender, "commands.version.list", pair.getRight(), pair.getLeft(), Math.round(pair.getRight() * 100F / total)); - } - } - - // Warn user if stats are low and he has exempt permission - if (total < 10 && sender.isPlayer() && sender.hasPermission(ClientStatsAPI.EXEMPT_PERMISSION)) { - api.subMessage(sender, "warning.exempted"); - } - - return; - - } else if (args.get(0).equalsIgnoreCase("online")) { - if (denied(sender, "online") || versionDetectionDisabled(sender)) return; - - Map> versions = new TreeMap<>(); - int total = 0; - - for (UUID online : MixedUser.getOnlineIds()) { - total++; - int version = api.getProtocol(online); - Pair pair = versions.get(version); - if (pair == null) { - String versionName = api.getVersionName(version); - versions.put(version, MutablePair.of(versionName, 1)); - } else { - pair.setValue(pair.getRight() + 1); - versions.put(version, pair); - } - } - - api.sendMessage(sender, "commands.online.title"); - - if (total == 0) { - api.subMessage(sender, "commands.online.empty"); - } else { - for (Pair pair : versions.values()) { - api.subMessage(sender, "commands.online.list", pair.getRight(), pair.getLeft(), Math.round(pair.getRight() * 100F / total)); - } - } - - return; - - } else if (args.get(0).equalsIgnoreCase("player")) { - if (denied(sender, "player") || versionDetectionDisabled(sender)) return; - - if (!sender.isPlayer()) { - api.sendMessage(sender, "error.not-a-player"); - return; - } - - Map.Entry version = api.getVersion(sender.getUniqueId()); - if (version == null) { - api.sendMessage(sender, "error.general"); - } else { - api.sendMessage(sender, "commands.player.self", version.getValue()); - } - - return; - - } else if (args.get(0).equalsIgnoreCase("reset")) { - if (denied(sender, "reset")) return; - - api.resetStats(); - api.sendMessage(sender, "commands.reset"); - - return; - - } else if (args.get(0).equalsIgnoreCase("reload")) { - if (denied(sender, "reload")) return; - - api.reload(); - api.sendMessage(sender, "commands.reload"); - - return; - } - - } else if (args.size() == 2) { - - if (args.get(0).equalsIgnoreCase("player")) { - if (denied(sender, "player") || versionDetectionDisabled(sender)) return; - - MixedUser player = MixedUser.getUser(args.get(1)); - if (player == null) { - api.sendMessage(sender, "commands.player.not-found", args.get(1)); - } else { - Map.Entry version = api.getVersion(player.getUniqueId()); - if (version == null) { - api.sendMessage(sender, "error.general"); - } else { - api.sendMessage(sender, "commands.player.other", player.getName(), version.getValue()); - } - } - - return; - - } - } - - boolean isAdmin = sender.hasPermission(ClientStatsAPI.PERMISSION_ADMIN); - List messages = new ArrayList<>(); - - for (String subCommand : SUB_COMMANDS) { - if (isAdmin || sender.hasPermission(ClientStatsAPI.PERMISSION_COMMAND.replace("{cmd}", subCommand))) { - messages.add("commands.help." + subCommand); - } - } - - if (messages.isEmpty()) { - api.sendMessage(sender, "error.permission"); - } else { - api.sendMessage(sender, "commands.help.title"); - for (String message : messages) { - api.subMessage(sender, message, label); - } - } + if (args.size() == 1) { + + if (args.get(0).equalsIgnoreCase("stats")) { + if (this.denied(sender, "stats")) + return; + + this.api.sendMessage(sender, "commands.stats.title", + this.api.getDateTimeFormat().format(new Date(this.api.getStartOfRecording()))); + this.api.subMessage(sender, "commands.stats.unique", this.api.getUniqueJoined()); + + if (this.api.getServerType() != ServerType.BUNGEE) { + this.api.subMessage(sender, "commands.stats.new", this.api.getTotalNewPlayers()); + } + + this.api.subMessage(sender, "commands.stats.total", this.api.getTotalJoined()); + + String date = this.api.getDateTimeFormat().format(new Date(this.api.getMaxOnlineDate())); + this.api.subMessage(sender, "commands.stats.max", this.api.getMaxOnlinePlayers(), date); + + long averagePlaytime = Math.round(this.api.getAveragePlaytime()); + long min = averagePlaytime / 60; + long sec = averagePlaytime % 60; + this.api.subMessage(sender, "commands.stats.playtime", min, sec); + + // Warn user if stats are low and he has exempt permission + if ((this.api.getUniqueJoined() < 10) && sender.isPlayer() + && sender.hasPermission(ClientStatsAPI.EXEMPT_PERMISSION)) { + this.api.subMessage(sender, "warning.exempted"); + } + + return; + + } else if (args.get(0).equalsIgnoreCase("version")) { + if (this.denied(sender, "version") || this.versionDetectionDisabled(sender)) + return; + + Map> versions = new TreeMap<>(); + int total = 0; + + for (Integer version : this.api.getProtocolJoined().values()) { + total++; + Pair pair = versions.get(version); + if (pair == null) { + String versionName = this.api.getVersionName(version); + versions.put(version, MutablePair.of(versionName, 1)); + } else { + pair.setRight(pair.getRight() + 1); + versions.put(version, pair); + } + } + + this.api.sendMessage(sender, "commands.version.title"); + + if (total == 0) { + this.api.subMessage(sender, "commands.version.empty"); + } else { + for (Pair pair : versions.values()) { + this.api.subMessage(sender, "commands.version.list", pair.getRight(), pair.getLeft(), + Math.round((pair.getRight() * 100F) / total)); + } + } + + // Warn user if stats are low and he has exempt permission + if ((total < 10) && sender.isPlayer() && sender.hasPermission(ClientStatsAPI.EXEMPT_PERMISSION)) { + this.api.subMessage(sender, "warning.exempted"); + } + + return; + + } else if (args.get(0).equalsIgnoreCase("online")) { + if (this.denied(sender, "online") || this.versionDetectionDisabled(sender)) + return; + + Map> versions = new TreeMap<>(); + int total = 0; + + for (UUID online : MixedUser.getOnlineIds()) { + total++; + int version = this.api.getProtocol(online); + Pair pair = versions.get(version); + if (pair == null) { + String versionName = this.api.getVersionName(version); + versions.put(version, MutablePair.of(versionName, 1)); + } else { + pair.setValue(pair.getRight() + 1); + versions.put(version, pair); + } + } + + this.api.sendMessage(sender, "commands.online.title"); + + if (total == 0) { + this.api.subMessage(sender, "commands.online.empty"); + } else { + for (Pair pair : versions.values()) { + this.api.subMessage(sender, "commands.online.list", pair.getRight(), pair.getLeft(), + Math.round((pair.getRight() * 100F) / total)); + } + } + + return; + + } else if (args.get(0).equalsIgnoreCase("player")) { + if (this.denied(sender, "player") || this.versionDetectionDisabled(sender)) + return; + + if (!sender.isPlayer()) { + this.api.sendMessage(sender, "error.not-a-player"); + return; + } + + Map.Entry version = this.api.getVersion(sender.getUniqueId()); + if (version == null) { + this.api.sendMessage(sender, "error.general"); + } else { + this.api.sendMessage(sender, "commands.player.self", version.getValue()); + } + + return; + + } else if (args.get(0).equalsIgnoreCase("reset")) { + if (this.denied(sender, "reset")) + return; + + this.api.resetStats(); + this.api.sendMessage(sender, "commands.reset"); + + return; + + } else if (args.get(0).equalsIgnoreCase("reload")) { + if (this.denied(sender, "reload")) + return; + + this.api.reload(); + this.api.sendMessage(sender, "commands.reload.config"); + + this.api.sendMessage(sender, "commands.reload.version-start"); + VersionNameProvider.reloadLater(true, ((AbstractAPI) this.api).getLogger(), new FutureCallback() { + + @Override + public void completed(Void result) { + CommandHandler.this.api.sendMessage(sender, "commands.reload.version-end"); + } + + @Override + public void failed(Exception ex) { + CommandHandler.this.api.sendMessage(sender, "commands.reload.version-failed"); + ex.printStackTrace(); + } + + @Override + public void cancelled() { + CommandHandler.this.api.sendMessage(sender, "commands.reload.version-failed"); + } + + }); + + return; + } + + } else if (args.size() == 2) { + + if (args.get(0).equalsIgnoreCase("player")) { + if (this.denied(sender, "player") || this.versionDetectionDisabled(sender)) + return; + + MixedUser player = MixedUser.getUser(args.get(1)); + if (player == null) { + this.api.sendMessage(sender, "commands.player.not-found", args.get(1)); + } else { + Map.Entry version = this.api.getVersion(player.getUniqueId()); + if (version == null) { + this.api.sendMessage(sender, "error.general"); + } else { + this.api.sendMessage(sender, "commands.player.other", player.getName(), version.getValue()); + } + } + + return; + + } + } + + boolean isAdmin = sender.hasPermission(ClientStatsAPI.PERMISSION_ADMIN); + List messages = new ArrayList<>(); + + for (String subCommand : SUB_COMMANDS) { + if (isAdmin || sender.hasPermission(ClientStatsAPI.PERMISSION_COMMAND.replace("{cmd}", subCommand))) { + messages.add("commands.help." + subCommand); + } + } + + if (messages.isEmpty()) { + this.api.sendMessage(sender, "error.permission"); + } else { + this.api.sendMessage(sender, "commands.help.title"); + for (String message : messages) { + this.api.subMessage(sender, message, label); + } + } } } \ No newline at end of file diff --git a/src/main/java/fr/onecraft/clientstats/common/core/EventListener.java b/src/main/java/fr/onecraft/clientstats/common/core/EventListener.java index 86c8a96..ce633f4 100644 --- a/src/main/java/fr/onecraft/clientstats/common/core/EventListener.java +++ b/src/main/java/fr/onecraft/clientstats/common/core/EventListener.java @@ -1,34 +1,34 @@ package fr.onecraft.clientstats.common.core; -import fr.onecraft.clientstats.ClientStatsAPI; -import fr.onecraft.clientstats.common.user.MixedUser; - import java.util.HashMap; import java.util.Map; import java.util.UUID; +import fr.onecraft.clientstats.ClientStatsAPI; +import fr.onecraft.clientstats.common.user.MixedUser; + public class EventListener { private final Map playtimes = new HashMap<>(); private final AbstractAPI plugin; public EventListener(AbstractAPI plugin) { - this.plugin = plugin; + this.plugin = plugin; } public void onPlayerJoin(MixedUser player, boolean isNew) { - if (!player.hasPermission(ClientStatsAPI.EXEMPT_PERMISSION)) { - plugin.registerJoin(player, isNew); - playtimes.put(player.getUniqueId(), System.currentTimeMillis()); - } - plugin.updatePlayerCount(); + if (!player.hasPermission(ClientStatsAPI.EXEMPT_PERMISSION)) { + this.plugin.registerJoin(player, isNew); + this.playtimes.put(player.getUniqueId(), System.currentTimeMillis()); + } + this.plugin.updatePlayerCount(); } public void onPlayerQuit(MixedUser player) { - Long playtime = playtimes.remove(player.getUniqueId()); - if (playtime != null) { - plugin.registerPlaytime(System.currentTimeMillis() - playtime); - } + Long playtime = this.playtimes.remove(player.getUniqueId()); + if (playtime != null) { + this.plugin.registerPlaytime(System.currentTimeMillis() - playtime); + } } } \ No newline at end of file diff --git a/src/main/java/fr/onecraft/clientstats/common/core/VersionNameProvider.java b/src/main/java/fr/onecraft/clientstats/common/core/VersionNameProvider.java new file mode 100644 index 0000000..8b4ecd4 --- /dev/null +++ b/src/main/java/fr/onecraft/clientstats/common/core/VersionNameProvider.java @@ -0,0 +1,89 @@ +package fr.onecraft.clientstats.common.core; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.concurrent.FutureCallback; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +public class VersionNameProvider { + + public static final String versionURL = "https://raw.githubusercontent.com/PrismarineJS/minecraft-data/master/data/pc/common/protocolVersions.json"; + + private static HashMap versionMap = new HashMap<>(); + private static CloseableHttpClient httpClient = HttpClients.createDefault(); + private static JsonParser parser = new JsonParser(); + private static ExecutorService executor = Executors.newSingleThreadExecutor(); + + private static boolean isReloading = false; + private static Object reloadingBlock = new Object(); + + public static synchronized void reload(boolean silent, Logger logger) throws Exception { + isReloading = true; + logger.log(Level.INFO, "Reloading version names..."); + HashMap old = new HashMap<>(versionMap); + try { + versionMap.clear(); + if (!silent) + logger.log(Level.INFO, "Retrieving latest version list..."); + CloseableHttpResponse response = httpClient.execute(new HttpGet(VersionNameProvider.versionURL)); + JsonArray versions = parser.parse(EntityUtils.toString(response.getEntity())).getAsJsonArray(); + if (!silent) + logger.log(Level.INFO, "Parsing version list..."); + Iterator it = versions.iterator(); + while (it.hasNext()) { + JsonObject obj = it.next().getAsJsonObject(); + if (!obj.get("usesNetty").getAsBoolean()) + continue; + versionMap.put(obj.get("version").getAsInt(), + (versionMap.get(obj.get("version").getAsInt()) != null + ? (versionMap.get(obj.get("version").getAsInt()) + "/") + : "") + obj.get("minecraftVersion").getAsString()); + if (!silent) + logger.log(Level.INFO, + obj.get("version").getAsInt() + " -> " + versionMap.get(obj.get("version").getAsInt())); + } + } catch (Exception e) { + versionMap = old; + isReloading = false; + synchronized (reloadingBlock) { + reloadingBlock.notifyAll(); + } + throw new Exception("Error while reloading version names", e); + } + isReloading = false; + synchronized (reloadingBlock) { + reloadingBlock.notifyAll(); + } + logger.log(Level.INFO, "Reloaded version names."); + } + + public static void reloadLater(boolean silent, Logger logger, FutureCallback callback) { + executor.submit(() -> { + try { + VersionNameProvider.reload(silent, logger); + } catch (Exception e) { + callback.failed(e); + } + callback.completed(null); + }); + } + + public static String get(int version) { + return versionMap.get(version); + } + +} diff --git a/src/main/java/fr/onecraft/clientstats/common/user/MixedUser.java b/src/main/java/fr/onecraft/clientstats/common/user/MixedUser.java index fc5476d..562d966 100644 --- a/src/main/java/fr/onecraft/clientstats/common/user/MixedUser.java +++ b/src/main/java/fr/onecraft/clientstats/common/user/MixedUser.java @@ -8,23 +8,23 @@ public abstract class MixedUser { private static UserProvider provider; public static void setProvider(UserProvider provider) { - MixedUser.provider = provider; + MixedUser.provider = provider; } public static Collection getOnlineIds() { - return provider.getOnlineIds(); + return provider.getOnlineIds(); } public static Collection getOnlineNames() { - return provider.getOnlineNames(); + return provider.getOnlineNames(); } public static int getOnlineCount() { - return provider.getOnlineCount(); + return provider.getOnlineCount(); } public static MixedUser getUser(String name) { - return provider.getUser(name); + return provider.getUser(name); } public abstract void sendMessage(String msg); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 982e30d..e2b9eb1 100755 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -37,7 +37,7 @@ messages: online: "&b/{1} online &f- Version of online players" player: "&b/{1} player [who] &f- Version of player" reset: "&b/{1} reset &f- Reset tracked stats" - reload: "&b/{1} reload &f- Reload configuration" + reload: "&b/{1} reload &f- Reload configuration and version names" stats: title: "Statistics since {1}:" unique: "&b{1}&f unique players joined the server." @@ -58,7 +58,11 @@ messages: other: "{1} is using &a{2}&f." not-found: "Player &c{1}&f wasn't found." reset: "All stats have been reset !" - reload: "Configuration reloaded !" + reload: + config: "Configuration reloaded !" + version-start: "Reloading version name provider..." + version-end: "Reloaded version name provider !" + version-failed: "Cannot reload version name provider, version names will not work !" warning: version-disabled: "Sorry, version detection is §cdisabled§f. Please check server logs for more information." exempted: "You are excluded since you have &eclientstats.exempt&f permission." @@ -66,280 +70,3 @@ messages: permission: "You don't have the permission." not-a-player: "You aren't a player." general: "An error occured.." -versions: - "0": "unknown" - "498": "1.14.4" - "497": "1.14.4-pre7" - "496": "1.14.4-pre6" - "495": "1.14.4-pre5" - "494": "1.14.4-pre4" - "493": "1.14.4-pre3" - "492": "1.14.4-pre2" - "491": "1.14.4-pre1" - "490": "1.14.3" - "489": "1.14.3-pre4" - "488": "1.14.3-pre3" - "487": "1.14.3-pre2" - "486": "1.14.3-pre1" - "485": "1.14.2" - "484": "1.14.2 Pre-Release 4" - "483": "1.14.2 Pre-Release 3" - "482": "1.14.2 Pre-Release 2" - "481": "1.14.2 Pre-Release 1" - "480": "1.14.1" - "479": "1.14.1 Pre-Release 2" - "478": "1.14.1 Pre-Release 1" - "477": "1.14" - "476": "1.14 Pre-Release 5" - "475": "1.14 Pre-Release 4" - "474": "1.14 Pre-Release 3" - "473": "1.14 Pre-Release 2" - "472": "1.14 Pre-Release 1" - "471": "19w14b" - "470": "19w14a" - "469": "19w13b" - "468": "19w13a" - "467": "19w12b" - "466": "19w12a" - "465": "19w11b" - "464": "19w11a" - "463": "19w09a" - "462": "19w08b" - "461": "19w08a" - "460": "19w07a" - "459": "19w06a" - "458": "19w05a" - "457": "19w04b" - "456": "19w04a" - "455": "19w03c" - "454": "19w03b" - "453": "19w03a" - "452": "19w02a" - "451": "18w50a" - "450": "18w49a" - "449": "18w48b" - "448": "18w48a" - "447": "18w47b" - "446": "18w47a" - "445": "18w46a" - "444": "18w45a" - "443": "18w44a" - "442": "18w43c" - "441": "18w43b" - "441": "18w43a" - "404": "1.13.2" - "403": "1.13.2-pre2" - "402": "1.13.2-pre1" - "401": "1.13.1" - "400": "1.13.1-pre2" - "399": "1.13.1-pre1" - "398": "18w33a" - "397": "18w32a" - "396": "18w31a" - "395": "18w30b" - "394": "18w30a" - "393": "1.13" - "392": "1.13-pre10" - "391": "1.13-pre9" - "390": "1.13-pre8" - "389": "1.13-pre7" - "388": "1.13-pre6" - "387": "1.13-pre5" - "386": "1.13-pre4" - "385": "1.13-pre3" - "384": "1.13-pre2" - "383": "1.13-pre1" - "382": "18w22c" - "381": "18w22b" - "380": "18w22a" - "379": "18w21b" - "378": "18w21a" - "377": "18w20c" - "376": "18w20b" - "375": "18w20a" - "374": "18w19b" - "373": "18w19a" - "372": "18w16a" - "371": "18w15a" - "370": "18w14b" - "369": "18w14a" - "368": "18w11a" - "367": "18w10d" - "366": "18w10c" - "365": "18w10b" - "364": "18w10a" - "363": "18w09a" - "362": "18w08b" - "361": "18w08a" - "360": "18w07c" - "359": "18w07b" - "358": "18w07a" - "357": "18w06a" - "356": "18w05a" - "355": "18w03b" - "354": "18w03a" - "353": "18w02a" - "352": "18w01a" - "351": "17w50a" - "350": "17w49b" - "349": "17w49a" - "348": "17w48a" - "347": "17w47b" - "346": "17w47a" - "345": "17w46a" - "344": "17w45b" - "343": "17w45a" - "342": "17w43b" - "341": "17w43a" - "340": "1.12.2" - "339": "1.12.2-pre1, 1.12.2-pre2" - "338": "1.12.1" - "337": "1.12.1-pre1" - "336": "17w31a" - "335": "1.12" - "334": "1.12-pre7" - "333": "1.12-pre6" - "332": "1.12-pre5" - "331": "1.12-pre4" - "330": "1.12-pre3" - "329": "1.12-pre2" - "328": "1.12-pre1" - "327": "17w18b" - "326": "17w18a" - "325": "17w17b" - "324": "17w17a" - "323": "17w16b" - "322": "17w16a" - "321": "17w15a" - "320": "17w14a" - "319": "17w13b" - "318": "17w13a" - "317": "17w06a" - "316": "1.11.1, 1.11.2" - "315": "1.11" - "314": "1.11-pre1" - "313": "16w43a, 16w44a" - "312": "16w42a" - "311": "16w41a" - "310": "16w40a" - "309": "16w39c" - "308": "16w39b" - "307": "16w39a" - "306": "16w38a" - "305": "16w36a" - "304": "16w35a" - "303": "16w33a" - "302": "16w32b" - "301": "16w32a" - "210": "1.10 - 1.10.2" - "205": "1.10-pre2" - "204": "1.10-pre1" - "203": "16w21b" - "202": "16w21a" - "201": "16w20a" - "110": "1.9.3, 1.9.4" - "109": "1.9.2" - "108": "1.9.1" - "107": "1.9" - "106": "1.9 pre4" - "105": "1.9 pre3" - "104": "1.9 pre2" - "103": "1.9 pre1" - "102": "16w07b" - "101": "16w07a" - "100": "16w06a" - "99": "16w05b" - "98": "16w05a" - "97": "16w04a" - "96": "16w03a" - "95": "16w02a" - "94": "15w51b" - "93": "15w51a" - "92": "15w50a" - "91": "15w49b" - "90": "15w49a" - "89": "15w47c" - "88": "15w47b" - "87": "15w47a" - "86": "15w46a" - "85": "15w45a" - "84": "15w44b" - "83": "15w44a" - "82": "15w43c" - "81": "15w43b" - "80": "15w43a" - "79": "15w42a" - "78": "15w41b" - "77": "15w41a" - "76": "15w40b" - "75": "15w40a" - "74": "15w39c" - "73": "15w38b" - "72": "15w38a" - "71": "15w37a" - "70": "15w36d" - "69": "15w36c" - "68": "15w36b" - "67": "15w36a" - "66": "15w35e" - "65": "15w35d" - "64": "15w35c" - "63": "15w35b" - "62": "15w35a" - "61": "15w34d" - "60": "15w34c" - "59": "15w34b" - "58": "15w34a" - "57": "15w33c" - "56": "15w33b" - "55": "15w33a" - "54": "15w32c" - "53": "15w32b" - "52": "15w32a" - "51": "15w31c" - "50": "15w31b" - "49": "15w31a" - "48": "15w14a" - "47": "1.8 - 1.8.9" - "46": "1.8 pre3" - "45": "1.8 pre2" - "44": "1.8 pre1" - "43": "14w34d" - "42": "14w34c" - "41": "14w34b" - "40": "14w34a" - "39": "14w33c" - "38": "14w33b" - "37": "14w33a" - "36": "14w32d" - "35": "14w32c" - "34": "14w32b" - "33": "14w32a" - "32": "14w31a" - "31": "14w30c" - "30": "14w30a" - "29": "14w29a" - "28": "14w28b" - "27": "14w28a" - "26": "14w27a, 14w27b" - "25": "14w26c" - "24": "14w26b" - "23": "14w26a" - "22": "14w25b" - "21": "14w25a" - "20": "14w21b" - "19": "14w21a" - "18": "14w20a" - "17": "14w19a" - "16": "14w18b" - "15": "14w17a" - "14": "14w11a" - "12": "14w08a" - "11": "14w07a" - "10": "14w06a" - "9": "14w05a" - "8": "14w04b" - "7": "14w04a" - "6": "14w03a" - "5": "1.7.6 - 1.7.10" - "4": "1.7.1 - 1.7.5" diff --git a/src/test/java/fr/onecraft/clientstats/common/SortingTest.java b/src/test/java/fr/onecraft/clientstats/common/SortingTest.java index e8ebf67..b7d026d 100644 --- a/src/test/java/fr/onecraft/clientstats/common/SortingTest.java +++ b/src/test/java/fr/onecraft/clientstats/common/SortingTest.java @@ -1,36 +1,37 @@ package fr.onecraft.clientstats.common; -import fr.onecraft.core.tuple.Pair; -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.util.Map; import java.util.TreeMap; -import static org.junit.Assert.assertEquals; +import org.junit.Test; + +import fr.onecraft.core.tuple.Pair; public class SortingTest { @Test public void treeMap() { - Integer[] protocolOrder = new Integer[]{47, 107, 108, 109, 110, 210}; + Integer[] protocolOrder = new Integer[] { 47, 107, 108, 109, 110, 210 }; - Map> versions = new TreeMap<>(); - versions.put(108, Pair.of("1.9.1", 14)); - versions.put(47, Pair.of("1.8 - 1.8.9", 210)); - versions.put(210, Pair.of("1.10 - 1.10.2", 210)); - versions.put(107, Pair.of("1.9", 79)); - versions.put(110, Pair.of("1.9.3, 1.9.4", 478)); - versions.put(109, Pair.of("1.9.2", 56)); + Map> versions = new TreeMap<>(); + versions.put(108, Pair.of("1.9.1", 14)); + versions.put(47, Pair.of("1.8 - 1.8.9", 210)); + versions.put(210, Pair.of("1.10 - 1.10.2", 210)); + versions.put(107, Pair.of("1.9", 79)); + versions.put(110, Pair.of("1.9.3, 1.9.4", 478)); + versions.put(109, Pair.of("1.9.2", 56)); // int total = 0; // for (Pair pair : versions.values()) total += pair.getRight(); - int i = 0; - for (Map.Entry> entry : versions.entrySet()) { - assertEquals(protocolOrder[i++], entry.getKey()); + int i = 0; + for (Map.Entry> entry : versions.entrySet()) { + assertEquals(protocolOrder[i++], entry.getKey()); // int percent = Math.round(entry.getValue().getRight() * 100F / total); - } + } }