diff --git a/.gitignore b/.gitignore index af51cb7..904cebf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,10 @@ -#Antiguo stuff de NB -/nbproject/private/ -nbproject/ -/build/ -/dist/ +.gradle +.idea +*.iml -#Maven -/target/ -target/ -\.idea/ +/build/ +/bukkit/build +/common/build +/sponge/build +/bungee/build -*.iml diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..ce7b049 --- /dev/null +++ b/build.gradle @@ -0,0 +1,16 @@ +subprojects { + apply plugin: 'java' + + group = 'com.cadiducho' + version = '3.0' + description = '40ServidoresMC' + java.sourceCompatibility = JavaVersion.VERSION_1_8 + + tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' + } + + repositories { + mavenCentral() + } +} \ No newline at end of file diff --git a/bukkit/build.gradle b/bukkit/build.gradle new file mode 100644 index 0000000..7eda5b6 --- /dev/null +++ b/bukkit/build.gradle @@ -0,0 +1,29 @@ +plugins { + id 'java' + id "com.github.johnrengelman.shadow" version "6.1.0" + id "io.freefair.lombok" version "5.3.0" +} + +repositories { + maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } + maven { url 'https://repo.extendedclip.com/content/repositories/placeholderapi/' } +} + +dependencies { + implementation project(':common') + implementation 'org.bstats:bstats-bukkit:2.2.1' + compileOnly 'org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT' + compileOnly 'me.clip:placeholderapi:2.10.9' +} + +shadowJar { + archiveBaseName.set(rootProject.name) + archiveClassifier.set('Bukkit') + archiveVersion.set(version) + + relocate 'org.bstats', 'com.cadiducho.cservidoresmc.lib.bstats' +} + +artifacts { + archives shadowJar +} \ No newline at end of file diff --git a/bukkit/lombok.config b/bukkit/lombok.config new file mode 100644 index 0000000..6aa51d7 --- /dev/null +++ b/bukkit/lombok.config @@ -0,0 +1,2 @@ +# This file is generated by the 'io.freefair.lombok' Gradle plugin +config.stopBubbling = true diff --git a/src/com/cadiducho/cservidoresmc/bukkit/BukkitPlugin.java b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/BukkitPlugin.java similarity index 90% rename from src/com/cadiducho/cservidoresmc/bukkit/BukkitPlugin.java rename to bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/BukkitPlugin.java index fb38d5b..937da75 100644 --- a/src/com/cadiducho/cservidoresmc/bukkit/BukkitPlugin.java +++ b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/BukkitPlugin.java @@ -1,8 +1,10 @@ package com.cadiducho.cservidoresmc.bukkit; -import com.cadiducho.cservidoresmc.bukkit.util.MetricsLite; +import com.cadiducho.cservidoresmc.ApiClient; import com.cadiducho.cservidoresmc.bukkit.util.Updater; -import com.cadiducho.cservidoresmc.bukkit.util.Util; +import com.google.gson.Gson; +import lombok.Getter; +import org.bstats.bukkit.Metrics; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -18,9 +20,9 @@ * @author Cadiducho */ public class BukkitPlugin extends JavaPlugin { - - private final Util met = new Util(this); - private Updater updater; + + @Getter private ApiClient apiClient; + @Getter private Updater updater; private final String tag = "&8[&b40ServidoresMC&8]"; private int configVer = 0; @@ -38,7 +40,9 @@ public static BukkitPlugin get() { public void onEnable() { instance = this; debugLog("Modo Debug activado en el plugin"); - + + apiClient = new ApiClient(new Gson()); + /* * Generar y cargar Config.yml */ @@ -53,7 +57,7 @@ public void onEnable() { installPlaceholderAPI(); - MetricsLite metrics = new MetricsLite(instance); + Metrics metrics = new Metrics(instance, 3909); /* * Finalizar... */ @@ -142,19 +146,8 @@ public void sendMessage(String str, CommandSender sender) { sender.sendMessage(ChatColor.translateAlternateColorCodes('&', tag + " " + str)); } - public Util getMetodos() { - return this.met; - } - public String getPluginVersion(){ return this.getDescription().getVersion(); } - - public String getTag() { - return this.tag; - } - - public Updater getUpdater() { - return this.updater; - } + } diff --git a/src/com/cadiducho/cservidoresmc/bukkit/CommandManager.java b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/CommandManager.java similarity index 100% rename from src/com/cadiducho/cservidoresmc/bukkit/CommandManager.java rename to bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/CommandManager.java diff --git a/src/com/cadiducho/cservidoresmc/bukkit/PlaceholderHook.java b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/PlaceholderHook.java similarity index 85% rename from src/com/cadiducho/cservidoresmc/bukkit/PlaceholderHook.java rename to bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/PlaceholderHook.java index 6e7ab8d..bdd16d4 100644 --- a/src/com/cadiducho/cservidoresmc/bukkit/PlaceholderHook.java +++ b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/PlaceholderHook.java @@ -2,7 +2,6 @@ import me.clip.placeholderapi.expansion.PlaceholderExpansion; import org.bukkit.OfflinePlayer; -import org.jetbrains.annotations.NotNull; public class PlaceholderHook extends PlaceholderExpansion { @@ -18,17 +17,17 @@ public boolean canRegister() { } @Override - public @NotNull String getAuthor() { + public String getAuthor() { return "Cadiducho"; } @Override - public @NotNull String getIdentifier() { + public String getIdentifier() { return "40servidoresmc"; } @Override - public @NotNull String getVersion() { + public String getVersion() { return "1.0.0"; } diff --git a/src/com/cadiducho/cservidoresmc/bukkit/cmd/CommandBase.java b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/CommandBase.java similarity index 94% rename from src/com/cadiducho/cservidoresmc/bukkit/cmd/CommandBase.java rename to bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/CommandBase.java index d13991d..a08fd29 100644 --- a/src/com/cadiducho/cservidoresmc/bukkit/cmd/CommandBase.java +++ b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/CommandBase.java @@ -1,7 +1,6 @@ package com.cadiducho.cservidoresmc.bukkit.cmd; import com.cadiducho.cservidoresmc.bukkit.BukkitPlugin; -import com.cadiducho.cservidoresmc.bukkit.util.Util; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; @@ -20,7 +19,6 @@ public abstract class CommandBase { private final transient String perm; private final transient List aliases; protected static final transient BukkitPlugin plugin = BukkitPlugin.get(); - protected static final transient Util metodos = BukkitPlugin.get().getMetodos(); protected CommandBase(final String name, final String perm, final List aliases) { this.name = name; diff --git a/src/com/cadiducho/cservidoresmc/bukkit/cmd/ReloadCMD.java b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/ReloadCMD.java similarity index 100% rename from src/com/cadiducho/cservidoresmc/bukkit/cmd/ReloadCMD.java rename to bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/ReloadCMD.java diff --git a/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/StatsCMD.java b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/StatsCMD.java new file mode 100644 index 0000000..5bebfb1 --- /dev/null +++ b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/StatsCMD.java @@ -0,0 +1,51 @@ +package com.cadiducho.cservidoresmc.bukkit.cmd; + +import com.cadiducho.cservidoresmc.model.ServerStats; +import com.cadiducho.cservidoresmc.model.ServerVote; +import org.bukkit.command.CommandSender; + +import java.util.Collections; +import java.util.logging.Level; + +/** + * Comando para obtener las estadísticas de tu servidor en 40ServidoresMC + * @author Cadiducho + */ +public class StatsCMD extends CommandBase { + + public StatsCMD() { + super("stats40", "40servidores.stats", Collections.emptyList()); + } + + @Override + public void run(CommandSender sender, String label, String[] args) { + if (!perm(sender, getPermission(), true)) return; + + plugin.getApiClient().fetchServerStats().thenAccept((ServerStats serverStats) -> { + if (serverStats.getServerName() == null) { //clave mal configurada + plugin.sendMessage("&cClave incorrecta. Entra en &bhttps://40servidoresmc.es/miservidor.php &cy cambia esta.", sender); + return; + } + + plugin.sendMessage("&9==> &7" + serverStats.getServerName() + " &festá en el TOP &a" + serverStats.getPosition(), sender); + plugin.sendMessage("&bVotos hoy: &6" + serverStats.getDayVotes(), sender); + plugin.sendMessage("&bVotos premiados hoy: &6" + serverStats.getRewardedDayVotes(), sender); + plugin.sendMessage("&bVotos semanales: &6" + serverStats.getWeekVotes(), sender); + plugin.sendMessage("&bVotos premiados semanales: &6" + serverStats.getRewardedWeekVotes(), sender); + + if (serverStats.getLastVotes() != null) { + StringBuilder usuarios = new StringBuilder(); + for (ServerVote vote : serverStats.getLastVotes()) { + String strellita = vote.isRewarded() ? "&a" : "&c"; + usuarios.append(strellita).append(vote.getName()).append("&6, "); + } + usuarios = new StringBuilder(usuarios.substring(0, usuarios.length() - 2) + "."); + plugin.sendMessage("&bÚltimos 20 votos: " + usuarios, sender); + } + }).exceptionally(ex -> { + plugin.sendMessage("&cHa ocurrido una excepción. Revisa la consola o avisa a un administrador", sender); + plugin.log(Level.SEVERE, "Excepción obteniendo estadisticas: " + ex.getMessage()); + return null; + }); + } +} diff --git a/src/com/cadiducho/cservidoresmc/bukkit/cmd/TestCMD.java b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/TestCMD.java similarity index 100% rename from src/com/cadiducho/cservidoresmc/bukkit/cmd/TestCMD.java rename to bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/TestCMD.java diff --git a/src/com/cadiducho/cservidoresmc/bukkit/cmd/UpdateCMD.java b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/UpdateCMD.java similarity index 100% rename from src/com/cadiducho/cservidoresmc/bukkit/cmd/UpdateCMD.java rename to bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/UpdateCMD.java diff --git a/src/com/cadiducho/cservidoresmc/bukkit/cmd/VoteCMD.java b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/VoteCMD.java similarity index 50% rename from src/com/cadiducho/cservidoresmc/bukkit/cmd/VoteCMD.java rename to bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/VoteCMD.java index 1a8d0c3..aabe547 100644 --- a/src/com/cadiducho/cservidoresmc/bukkit/cmd/VoteCMD.java +++ b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/cmd/VoteCMD.java @@ -1,10 +1,10 @@ package com.cadiducho.cservidoresmc.bukkit.cmd; -import com.cadiducho.cservidoresmc.bukkit.util.ApiResponse; -import com.cadiducho.cservidoresmc.bukkit.util.Cooldown; -import com.cadiducho.cservidoresmc.bukkit.util.Util; +import com.cadiducho.cservidoresmc.Cooldown; +import com.cadiducho.cservidoresmc.model.VoteResponse; +import com.cadiducho.cservidoresmc.model.VoteStatus; +import com.google.gson.Gson; import org.bukkit.command.CommandSender; -import org.json.simple.JSONObject; import java.util.Arrays; import java.util.logging.Level; @@ -31,50 +31,50 @@ public void run(CommandSender sender, String label, String[] args) { return; } - if (cooldown.isCoolingDown(sender)) { + if (cooldown.isCoolingDown(sender.getName())) { plugin.sendMessage("&6No puedes ejecutar este comando tantas veces seguidas!", sender); return; } - cooldown.setOnCooldown(sender); + cooldown.setOnCooldown(sender.getName()); plugin.sendMessage("&7Obteniendo voto...", sender); - Util.readUrl("https://40servidoresmc.es/api2.php?nombre=" + sender.getName() + "&clave=" + plugin.getConfig().getString("clave"), (ApiResponse response) -> { - if (response.getException().isPresent()) { - plugin.sendMessage("&cHa ocurrido una excepción. Avisa a un administrador", sender); - plugin.log(Level.SEVERE, "Excepción intentando votar: " + response.getException().get()); - return; - } + plugin.getApiClient().validateVote(sender.getName()).thenAccept((VoteResponse voteResponse) -> { + System.out.println(new Gson().toJson(voteResponse)); + String web = voteResponse.getWeb(); + VoteStatus status = voteResponse.getStatus(); - JSONObject jsonData = response.getResult(); - String web = (String) jsonData.get("web"); - int status = (int) ((long) jsonData.get("status")); - switch (status) { - case 0: + case NOT_VOTED: plugin.sendMessage("&6No has votado hoy! Puedes hacerlo en &a" + web, sender); break; - case 1: + case SUCCESS: plugin.sendMessage(plugin.getConfig().getString("mensaje"), sender); - plugin.listaComandos.stream() - .map(cmds -> cmds.replace("{0}", sender.getName())) - .forEach(comando -> plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), comando)); + plugin.getServer().getScheduler().runTask(plugin, () -> { + plugin.listaComandos.stream() + .map(cmds -> cmds.replace("{0}", sender.getName())) + .forEach(comando -> plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), comando)); - if (plugin.getConfig().getBoolean("broadcast.activado")) { - plugin.getServer().getOnlinePlayers() - .forEach(p -> plugin.sendMessage(plugin.getConfig().getString("broadcast.mensajeBroadcast").replace("{0}", sender.getName()), p)); - } + if (plugin.getConfig().getBoolean("broadcast.activado")) { + plugin.getServer().getOnlinePlayers() + .forEach(p -> plugin.sendMessage(plugin.getConfig().getString("broadcast.mensajeBroadcast").replace("{0}", sender.getName()), p)); + } + }); break; - case 2: + case ALREADY_VOTED: plugin.sendMessage("&aGracias por votar, pero ya has obtenido tu premio!", sender); break; - case 3: + case INVALID_kEY: plugin.sendMessage("&cClave incorrecta. Entra en &bhttps://40servidoresmc.es/miservidor.php &cy cambia esta.", sender); break; default: plugin.sendMessage("&7Ha ocurrido un error. Prueba más tarde o avisa a un adminsitrador", sender); break; } + }).exceptionally(e -> { + plugin.sendMessage("&cHa ocurrido una excepción. Avisa a un administrador", sender); + plugin.log(Level.SEVERE, "Excepción intentando votar: " + e.getMessage()); + return null; }); } } diff --git a/src/com/cadiducho/cservidoresmc/bukkit/util/Updater.java b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/util/Updater.java similarity index 96% rename from src/com/cadiducho/cservidoresmc/bukkit/util/Updater.java rename to bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/util/Updater.java index 308b84b..1f5d146 100644 --- a/src/com/cadiducho/cservidoresmc/bukkit/util/Updater.java +++ b/bukkit/src/main/java/com/cadiducho/cservidoresmc/bukkit/util/Updater.java @@ -2,8 +2,6 @@ import com.cadiducho.cservidoresmc.bukkit.BukkitPlugin; import org.bukkit.command.CommandSender; -import org.json.simple.JSONObject; - import java.util.Optional; /** @@ -36,7 +34,8 @@ public Updater(BukkitPlugin instance, String vInstalada, String vMinecraft) { public void checkearVersion(CommandSender send, boolean boot) { plugin.debugLog("Buscando nueva versión..."); Optional sender = Optional.ofNullable(send); - Util.readUrl(readurl, (ApiResponse response) -> { + // ToDo: fixme + /*Util.readUrl(readurl, (ApiResponse response) -> { if (response.getException().isPresent()) { plugin.log(ERROR); sender.ifPresent(s -> plugin.sendMessage(ERROR, s)); @@ -67,7 +66,7 @@ public void checkearVersion(CommandSender send, boolean boot) { sender.ifPresent(s -> plugin.sendMessage(NOVERSION, s)); } } - }); + });*/ } } diff --git a/src/config.yml b/bukkit/src/main/resources/config.yml similarity index 100% rename from src/config.yml rename to bukkit/src/main/resources/config.yml diff --git a/src/plugin.yml b/bukkit/src/main/resources/plugin.yml similarity index 98% rename from src/plugin.yml rename to bukkit/src/main/resources/plugin.yml index 9de71dc..cc60276 100644 --- a/src/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: 40ServidoresMC main: com.cadiducho.cservidoresmc.bukkit.BukkitPlugin -version: 2.6 +version: 3.0 author: Cadiducho api-version: 1.13 description: Enlace para servidores de la web 40ServidoresMC! diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 0000000..4332958 --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,7 @@ +plugins { + id "io.freefair.lombok" version "5.3.0" +} + +dependencies { + compileOnly 'com.google.code.gson:gson:2.8.6' +} \ No newline at end of file diff --git a/common/lombok.config b/common/lombok.config new file mode 100644 index 0000000..6aa51d7 --- /dev/null +++ b/common/lombok.config @@ -0,0 +1,2 @@ +# This file is generated by the 'io.freefair.lombok' Gradle plugin +config.stopBubbling = true diff --git a/common/src/main/java/com/cadiducho/cservidoresmc/ApiClient.java b/common/src/main/java/com/cadiducho/cservidoresmc/ApiClient.java new file mode 100644 index 0000000..a160bad --- /dev/null +++ b/common/src/main/java/com/cadiducho/cservidoresmc/ApiClient.java @@ -0,0 +1,70 @@ +package com.cadiducho.cservidoresmc; + +import com.cadiducho.cservidoresmc.model.ServerStats; +import com.cadiducho.cservidoresmc.model.VoteResponse; +import com.google.gson.Gson; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.concurrent.CompletableFuture; + +public class ApiClient { + + private final String API_URL = "https://40servidoresmc.es/api2.php?clave="; + private final Gson gson; + + public ApiClient(Gson gson) { + this.gson = gson; + } + + public String apiKey() { + return ""; //fixme: config + } + + public int timeOut() { + return 30000; //fixme: config + } + + public CompletableFuture validateVote(String player) { + return CompletableFuture.supplyAsync(() -> { + try { + return fetchData("&nombre=" + player, "GET", VoteResponse.class); + } catch (IOException e) { + throw new IllegalStateException("Cannot execute API call", e); + } + }); + } + + public CompletableFuture fetchServerStats() { + return CompletableFuture.supplyAsync(() -> { + try { + return fetchData("&estadisticas=1", "GET", ServerStats.class); + } catch (IOException e) { + throw new IllegalStateException("Cannot execute API call", e); + } + }); + } + + /** + * + * @param params + * @param method + * @param type + * @param + * @return + * @throws IOException + */ + private T fetchData(String params, String method, Class type) throws IOException { + URL url = new URL(API_URL + apiKey() + params); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod(method); + connection.setReadTimeout(timeOut()); + + try (Reader reader = new InputStreamReader(connection.getInputStream())) { + return gson.fromJson(reader, type); + } + } +} diff --git a/common/src/main/java/com/cadiducho/cservidoresmc/Cooldown.java b/common/src/main/java/com/cadiducho/cservidoresmc/Cooldown.java new file mode 100644 index 0000000..3d90310 --- /dev/null +++ b/common/src/main/java/com/cadiducho/cservidoresmc/Cooldown.java @@ -0,0 +1,37 @@ +package com.cadiducho.cservidoresmc; + +import java.util.HashMap; + +public class Cooldown { + + private final int time; + private final HashMap cooldowns; + + public Cooldown(int time) { + this.time = time; + this.cooldowns = new HashMap<>(); + } + + public int getTime() { + return time; + } + + private HashMap getCooldowns() { + return cooldowns; + } + + public int getTimeLeft(String player) { + if (!isCoolingDown(player)) { + return 0; + } + return (int) (((getCooldowns().get(player) - (System.currentTimeMillis() - (getTime() * 1000))) / 1000) + 1); + } + + public void setOnCooldown(String player) { + getCooldowns().put(player, System.currentTimeMillis()); + } + + public boolean isCoolingDown(String player) { + return getCooldowns().containsKey(player) && getCooldowns().get(player) >= (System.currentTimeMillis() - (getTime() * 1000)); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/cadiducho/cservidoresmc/model/ServerStats.java b/common/src/main/java/com/cadiducho/cservidoresmc/model/ServerStats.java new file mode 100644 index 0000000..c395592 --- /dev/null +++ b/common/src/main/java/com/cadiducho/cservidoresmc/model/ServerStats.java @@ -0,0 +1,17 @@ +package com.cadiducho.cservidoresmc.model; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.util.List; + +@Data +public class ServerStats { + @SerializedName("nombre") private String serverName; + @SerializedName("puesto") private int position; + @SerializedName("votoshoy") private int dayVotes; + @SerializedName("votoshoypremiados") private int rewardedDayVotes; + @SerializedName("votossemanales") private int weekVotes; + @SerializedName("votossemanalespremiados") private int rewardedWeekVotes; + @SerializedName("ultimos20votos") private List lastVotes; +} diff --git a/common/src/main/java/com/cadiducho/cservidoresmc/model/ServerVote.java b/common/src/main/java/com/cadiducho/cservidoresmc/model/ServerVote.java new file mode 100644 index 0000000..453e065 --- /dev/null +++ b/common/src/main/java/com/cadiducho/cservidoresmc/model/ServerVote.java @@ -0,0 +1,10 @@ +package com.cadiducho.cservidoresmc.model; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +@Data +public class ServerVote { + @SerializedName("nombre") private String name; + @SerializedName("premiado") private boolean rewarded; +} diff --git a/common/src/main/java/com/cadiducho/cservidoresmc/model/VoteResponse.java b/common/src/main/java/com/cadiducho/cservidoresmc/model/VoteResponse.java new file mode 100644 index 0000000..98a0c91 --- /dev/null +++ b/common/src/main/java/com/cadiducho/cservidoresmc/model/VoteResponse.java @@ -0,0 +1,9 @@ +package com.cadiducho.cservidoresmc.model; + +import lombok.Data; + +@Data +public class VoteResponse { + private final String web; + private final VoteStatus status; +} diff --git a/common/src/main/java/com/cadiducho/cservidoresmc/model/VoteStatus.java b/common/src/main/java/com/cadiducho/cservidoresmc/model/VoteStatus.java new file mode 100644 index 0000000..09b02fd --- /dev/null +++ b/common/src/main/java/com/cadiducho/cservidoresmc/model/VoteStatus.java @@ -0,0 +1,10 @@ +package com.cadiducho.cservidoresmc.model; + +import com.google.gson.annotations.SerializedName; + +public enum VoteStatus { + @SerializedName("0") NOT_VOTED, + @SerializedName("1") SUCCESS, + @SerializedName("2") ALREADY_VOTED, + @SerializedName("3") INVALID_kEY, +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..442d913 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml deleted file mode 100644 index f7e788f..0000000 --- a/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - 4.0.0 - com.cadiducho - 40ServidoresMC - 2.6 - jar - - - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - - placeholderapi - https://repo.extendedclip.com/content/repositories/placeholderapi/ - - - - - - org.spigotmc - spigot-api - 1.16.5-R0.1-SNAPSHOT - provided - - - - - com.googlecode.json-simple - json-simple - 1.1.1 - - - me.clip - placeholderapi - 2.10.9 - provided - - - - src - - - . - true - src - - *.yml - - - - - - UTF-8 - 1.8 - 1.8 - - \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..dbedc3f --- /dev/null +++ b/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = '40ServidoresMC' + +include 'common' +include 'bukkit' \ No newline at end of file diff --git a/src/com/cadiducho/cservidoresmc/bukkit/cmd/StatsCMD.java b/src/com/cadiducho/cservidoresmc/bukkit/cmd/StatsCMD.java deleted file mode 100644 index 3f1ad97..0000000 --- a/src/com/cadiducho/cservidoresmc/bukkit/cmd/StatsCMD.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.cadiducho.cservidoresmc.bukkit.cmd; - -import com.cadiducho.cservidoresmc.bukkit.util.ApiResponse; -import com.cadiducho.cservidoresmc.bukkit.util.Util; -import org.bukkit.command.CommandSender; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import java.util.Collections; -import java.util.logging.Level; - -/** - * Comando para obtener las estadísticas de tu servidor en 40ServidoresMC - * @author Cadiducho - */ -public class StatsCMD extends CommandBase { - - public StatsCMD() { - super("stats40", "40servidores.stats", Collections.emptyList()); - } - - @Override - public void run(CommandSender sender, String label, String[] args) { - if (!perm(sender, getPermission(), true)) return; - - Util.readUrl("https://40servidoresmc.es/api2.php?estadisticas=1&clave=" + plugin.getConfig().getString("clave"), (ApiResponse response) -> { - if (response.getException().isPresent()) { - plugin.sendMessage("&cHa ocurrido una excepción. Revisa la consola o avisa a un administrador", sender); - plugin.log(Level.SEVERE, "Excepción obteniendo estadisticas: " + response.getException().get().getMessage()); - return; - } - - JSONObject jsonData = response.getResult(); - if (jsonData.get("nombre") == null) { //clave mal configurada - plugin.sendMessage("&cClave incorrecta. Entra en &bhttps://40servidoresmc.es/miservidor.php &cy cambia esta.", sender); - return; - } - - plugin.sendMessage("&9==> &7" + jsonData.get("nombre") + " &festá en el TOP &a" + jsonData.get("puesto"), sender); - plugin.sendMessage("&bVotos hoy: &6" + jsonData.get("votoshoy"), sender); - plugin.sendMessage("&bVotos premiados hoy: &6" + jsonData.get("votoshoypremiados"), sender); - plugin.sendMessage("&bVotos semanales: &6" + jsonData.get("votossemanales"), sender); - plugin.sendMessage("&bVotos premiados semanales: &6" + jsonData.get("votossemanalespremiados"), sender); - JSONArray array = (JSONArray) jsonData.get("ultimos20votos"); - StringBuilder usuarios = new StringBuilder(); - for (Object obj : array) { - JSONObject object = (JSONObject) obj; - String strellita = (Integer.parseInt((String) object.get("recompensado")) == 1) ? "&a" : "&c"; - usuarios.append(strellita).append(object.get("usuario")).append("&6, "); - } - usuarios = new StringBuilder(usuarios.substring(0, usuarios.length() - 2) + "."); - plugin.sendMessage("&bÚltimos 20 votos: " + usuarios, sender); - }); - } -} diff --git a/src/com/cadiducho/cservidoresmc/bukkit/util/ApiCallback.java b/src/com/cadiducho/cservidoresmc/bukkit/util/ApiCallback.java deleted file mode 100644 index 60887a4..0000000 --- a/src/com/cadiducho/cservidoresmc/bukkit/util/ApiCallback.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.cadiducho.cservidoresmc.bukkit.util; - -/** - * Callback - * @author Cadiducho - */ -@FunctionalInterface -public interface ApiCallback { - - /** - * Código a ejecutar cuando se realice el callback - * @param res {@link ApiResponse} de la API - */ - void done(ApiResponse res); -} \ No newline at end of file diff --git a/src/com/cadiducho/cservidoresmc/bukkit/util/ApiResponse.java b/src/com/cadiducho/cservidoresmc/bukkit/util/ApiResponse.java deleted file mode 100644 index ad8c3b0..0000000 --- a/src/com/cadiducho/cservidoresmc/bukkit/util/ApiResponse.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.cadiducho.cservidoresmc.bukkit.util; - -import org.json.simple.JSONObject; - -import java.util.Optional; - -/** - * Objeto que contiene la respuesta de la API - * @author Cadiducho - */ -public class ApiResponse { - - private Optional exception; - private JSONObject result; - - public ApiResponse() { - this.exception = Optional.empty(); - } - - public Optional getException() { - return exception; - } - - public void setException(Exception exception) { - this.exception = Optional.ofNullable(exception); - } - - public JSONObject getResult() { - return result; - } - - public void setResult(JSONObject t) { - this.result = t; - } -} diff --git a/src/com/cadiducho/cservidoresmc/bukkit/util/Cooldown.java b/src/com/cadiducho/cservidoresmc/bukkit/util/Cooldown.java deleted file mode 100644 index a4ee5f5..0000000 --- a/src/com/cadiducho/cservidoresmc/bukkit/util/Cooldown.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.cadiducho.cservidoresmc.bukkit.util; - -import org.bukkit.command.CommandSender; - -import java.util.HashMap; - -public class Cooldown { - - private final int time; - private final HashMap cooldowns; - - public Cooldown(int time) { - this.time = time; - this.cooldowns = new HashMap<>(); - } - - public int getTime() { - return time; - } - - private HashMap getCooldowns() { - return cooldowns; - } - - public int getTimeLeft(CommandSender player) { - if (!isCoolingDown(player)) { - return 0; - } - return (int) (((getCooldowns().get(player.getName()) - (System.currentTimeMillis() - (getTime() * 1000))) / 1000) + 1); - } - - public void setOnCooldown(CommandSender player) { - getCooldowns().put(player.getName(), System.currentTimeMillis()); - } - - public boolean isCoolingDown(CommandSender player) { - return getCooldowns().containsKey(player.getName()) && getCooldowns().get(player.getName()) >= (System.currentTimeMillis() - (getTime() * 1000)); - } -} \ No newline at end of file diff --git a/src/com/cadiducho/cservidoresmc/bukkit/util/MetricsLite.java b/src/com/cadiducho/cservidoresmc/bukkit/util/MetricsLite.java deleted file mode 100644 index 5dd5285..0000000 --- a/src/com/cadiducho/cservidoresmc/bukkit/util/MetricsLite.java +++ /dev/null @@ -1,342 +0,0 @@ -package com.cadiducho.cservidoresmc.bukkit.util; - -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.RegisteredServiceProvider; -import org.bukkit.plugin.ServicePriority; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import javax.net.ssl.HttpsURLConnection; -import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.Collection; -import java.util.Timer; -import java.util.TimerTask; -import java.util.UUID; -import java.util.logging.Level; -import java.util.zip.GZIPOutputStream; - -/** - * bStats collects some data for plugin authors. - *

- * Check out https://bStats.org/ to learn more about bStats! - */ -@SuppressWarnings({"WeakerAccess", "unused"}) -public class MetricsLite { - - static { - // You can use the property to disable the check in your test environment - if (System.getProperty("bstats.relocatecheck") == null || !System.getProperty("bstats.relocatecheck").equals("false")) { - // Maven's Relocate is clever and changes strings, too. So we have to use this little "trick" ... :D - final String defaultPackage = new String( - new byte[]{'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's', '.', 'b', 'u', 'k', 'k', 'i', 't'}); - final String examplePackage = new String(new byte[]{'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); - // We want to make sure nobody just copy & pastes the example and use the wrong package names - if (MetricsLite.class.getPackage().getName().equals(defaultPackage) || MetricsLite.class.getPackage().getName().equals(examplePackage)) { - throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); - } - } - } - - // The version of this bStats class - public static final int B_STATS_VERSION = 1; - - // The url to which the data is sent - private static final String URL = "https://bStats.org/submitData/bukkit"; - - // Is bStats enabled on this server? - private boolean enabled; - - // Should failed requests be logged? - private static boolean logFailedRequests; - - // Should the sent data be logged? - private static boolean logSentData; - - // Should the response text be logged? - private static boolean logResponseStatusText; - - // The uuid of the server - private static String serverUUID; - - // The plugin - private final Plugin plugin; - - /** - * Class constructor. - * - * @param plugin The plugin which stats should be submitted. - */ - public MetricsLite(Plugin plugin) { - if (plugin == null) { - throw new IllegalArgumentException("Plugin cannot be null!"); - } - this.plugin = plugin; - - // Get the config file - File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); - File configFile = new File(bStatsFolder, "config.yml"); - YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); - - // Check if the config file exists - if (!config.isSet("serverUuid")) { - - // Add default values - config.addDefault("enabled", true); - // Every server gets it's unique random id. - config.addDefault("serverUuid", UUID.randomUUID().toString()); - // Should failed request be logged? - config.addDefault("logFailedRequests", false); - // Should the sent data be logged? - config.addDefault("logSentData", false); - // Should the response text be logged? - config.addDefault("logResponseStatusText", false); - - // Inform the server owners about bStats - config.options().header( - "bStats collects some data for plugin authors like how many servers are using their plugins.\n" + - "To honor their work, you should not disable it.\n" + - "This has nearly no effect on the server performance!\n" + - "Check out https://bStats.org/ to learn more :)" - ).copyDefaults(true); - try { - config.save(configFile); - } catch (IOException ignored) { } - } - - // Load the data - serverUUID = config.getString("serverUuid"); - logFailedRequests = config.getBoolean("logFailedRequests", false); - enabled = config.getBoolean("enabled", true); - if (enabled) { - boolean found = false; - // Search for all other bStats Metrics classes to see if we are the first one - for (Class service : Bukkit.getServicesManager().getKnownServices()) { - try { - service.getField("B_STATS_VERSION"); // Our identifier :) - found = true; // We aren't the first - break; - } catch (NoSuchFieldException ignored) { } - } - // Register our service - Bukkit.getServicesManager().register(MetricsLite.class, this, plugin, ServicePriority.Normal); - if (!found) { - // We are the first! - startSubmitting(); - } - } - } - - /** - * Checks if bStats is enabled. - * - * @return Whether bStats is enabled or not. - */ - public boolean isEnabled() { - return enabled; - } - - /** - * Starts the Scheduler which submits our data every 30 minutes. - */ - private void startSubmitting() { - final Timer timer = new Timer(true); // We use a timer cause the Bukkit scheduler is affected by server lags - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - if (!plugin.isEnabled()) { // Plugin was disabled - timer.cancel(); - return; - } - // Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler - // Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;) - Bukkit.getScheduler().runTask(plugin, () -> submitData()); - } - }, 1000 * 60 * 5, 1000 * 60 * 30); - // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start - // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted! - // WARNING: Just don't do it! - } - - /** - * Gets the plugin specific data. - * This method is called using Reflection. - * - * @return The plugin specific data. - */ - public JSONObject getPluginData() { - JSONObject data = new JSONObject(); - - String pluginName = plugin.getDescription().getName(); - String pluginVersion = plugin.getDescription().getVersion(); - - data.put("pluginName", pluginName); // Append the name of the plugin - data.put("pluginVersion", pluginVersion); // Append the version of the plugin - JSONArray customCharts = new JSONArray(); - data.put("customCharts", customCharts); - - return data; - } - - /** - * Gets the server specific data. - * - * @return The server specific data. - */ - private JSONObject getServerData() { - // Minecraft specific data - int playerAmount; - try { - // Around MC 1.8 the return type was changed to a collection from an array, - // This fixes java.lang.NoSuchMethodError: org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; - Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); - playerAmount = onlinePlayersMethod.getReturnType().equals(Collection.class) - ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() - : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; - } catch (Exception e) { - playerAmount = Bukkit.getOnlinePlayers().size(); // Just use the new method if the Reflection failed - } - int onlineMode = Bukkit.getOnlineMode() ? 1 : 0; - String bukkitVersion = Bukkit.getVersion(); - - // OS/Java specific data - String javaVersion = System.getProperty("java.version"); - String osName = System.getProperty("os.name"); - String osArch = System.getProperty("os.arch"); - String osVersion = System.getProperty("os.version"); - int coreCount = Runtime.getRuntime().availableProcessors(); - - JSONObject data = new JSONObject(); - - data.put("serverUUID", serverUUID); - - data.put("playerAmount", playerAmount); - data.put("onlineMode", onlineMode); - data.put("bukkitVersion", bukkitVersion); - - data.put("javaVersion", javaVersion); - data.put("osName", osName); - data.put("osArch", osArch); - data.put("osVersion", osVersion); - data.put("coreCount", coreCount); - - return data; - } - - /** - * Collects the data and sends it afterwards. - */ - private void submitData() { - final JSONObject data = getServerData(); - - JSONArray pluginData = new JSONArray(); - // Search for all other bStats Metrics classes to get their plugin data - for (Class service : Bukkit.getServicesManager().getKnownServices()) { - try { - service.getField("B_STATS_VERSION"); // Our identifier :) - - for (RegisteredServiceProvider provider : Bukkit.getServicesManager().getRegistrations(service)) { - try { - pluginData.add(provider.getService().getMethod("getPluginData").invoke(provider.getProvider())); - } catch (NullPointerException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { - } - } - } catch (NoSuchFieldException ignored) { } - } - - data.put("plugins", pluginData); - - // Create a new thread for the connection to the bStats server - new Thread(new Runnable() { - @Override - public void run() { - try { - // Send the data - sendData(plugin, data); - } catch (Exception e) { - // Something went wrong! :( - if (logFailedRequests) { - plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e); - } - } - } - }).start(); - } - - /** - * Sends the data to the bStats server. - * - * @param plugin Any plugin. It's just used to get a logger instance. - * @param data The data to send. - * @throws Exception If the request failed. - */ - private static void sendData(Plugin plugin, JSONObject data) throws Exception { - if (data == null) { - throw new IllegalArgumentException("Data cannot be null!"); - } - if (Bukkit.isPrimaryThread()) { - throw new IllegalAccessException("This method must not be called from the main thread!"); - } - if (logSentData) { - plugin.getLogger().info("Sending data to bStats: " + data.toString()); - } - HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection(); - - // Compress the data to save bandwidth - byte[] compressedData = compress(data.toString()); - - // Add headers - connection.setRequestMethod("POST"); - connection.addRequestProperty("Accept", "application/json"); - connection.addRequestProperty("Connection", "close"); - connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request - connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); - connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format - connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION); - - // Send data - connection.setDoOutput(true); - DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); - outputStream.write(compressedData); - outputStream.flush(); - outputStream.close(); - - InputStream inputStream = connection.getInputStream(); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); - - StringBuilder builder = new StringBuilder(); - String line; - while ((line = bufferedReader.readLine()) != null) { - builder.append(line); - } - bufferedReader.close(); - if (logResponseStatusText) { - plugin.getLogger().info("Sent data to bStats and received response: " + builder.toString()); - } - } - - /** - * Gzips the given String. - * - * @param str The string to gzip. - * @return The gzipped String. - * @throws IOException If the compression failed. - */ - private static byte[] compress(final String str) throws IOException { - if (str == null) { - return null; - } - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - GZIPOutputStream gzip = new GZIPOutputStream(outputStream); - gzip.write(str.getBytes(StandardCharsets.UTF_8)); - gzip.close(); - return outputStream.toByteArray(); - } - -} \ No newline at end of file diff --git a/src/com/cadiducho/cservidoresmc/bukkit/util/Util.java b/src/com/cadiducho/cservidoresmc/bukkit/util/Util.java deleted file mode 100644 index 19880b8..0000000 --- a/src/com/cadiducho/cservidoresmc/bukkit/util/Util.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.cadiducho.cservidoresmc.bukkit.util; - -import com.cadiducho.cservidoresmc.bukkit.BukkitPlugin; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; - -/** - * Clase con utilidades - * @author Cadiducho - */ -public class Util { - - private static BukkitPlugin plugin; - - private static final JSONParser jsonParser = new JSONParser(); - - public Util(BukkitPlugin instance) { - plugin = instance; - } - - /** - * Leer una URL en un hilo asíncrono - * @param urlString URL a leer - * @param callback Callback que se ejecutará en hilo principal - */ - public static void readUrl(final String urlString, final ApiCallback callback) { - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { - ApiResponse result = new ApiResponse(); - try { - URL obj = new URL(urlString); - HttpURLConnection con = (HttpURLConnection) obj.openConnection(); - - con.setRequestMethod("GET"); - con.setReadTimeout(plugin.getConfig().getInt("readTimeOut")); - - BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); - String inputLine; - StringBuilder response = new StringBuilder(); - - while ((inputLine = in.readLine()) != null) { - response.append(inputLine); - } - in.close(); - - try { - Object ret = jsonParser.parse(response.toString()); - result.setResult((JSONObject) ret); - } catch (ParseException ex) { - result.setException(ex); - } - } catch (IOException ex) { - result.setException(ex); - } - - Bukkit.getScheduler().runTask(plugin, () -> callback.done(result)); - }); - } - -}