diff --git a/.gitignore b/.gitignore
index 524f096..e23d387 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,7 @@
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
+/.vscode
+/.idea
+dependency-reduced-pom.xml
+/target
diff --git a/pom.xml b/pom.xml
index 8758afd..ad11238 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,15 +6,16 @@
org.nicolie
TowersBot
- 1.0
+ 1.0.0
jar
TowersBot
- 1.8
+ 8
UTF-8
+ TowersBot
org.apache.maven.plugins
@@ -84,5 +85,10 @@
mysql-connector-j
8.2.0
+
+ org.json
+ json
+ 20210307
+
diff --git a/src/main/java/org/nicolie/towersbot/commands/TowersBotCommand.java b/src/main/java/org/nicolie/towersbot/commands/TowersBotCommand.java
index 6380307..76a0d83 100644
--- a/src/main/java/org/nicolie/towersbot/commands/TowersBotCommand.java
+++ b/src/main/java/org/nicolie/towersbot/commands/TowersBotCommand.java
@@ -4,7 +4,9 @@
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.plugin.java.JavaPlugin;
import org.nicolie.towersbot.TowersBot;
+import org.nicolie.towersbot.update.AutoUpdate;
public class TowersBotCommand implements CommandExecutor {
private final TowersBot plugin;
@@ -16,14 +18,14 @@ public TowersBotCommand(TowersBot plugin) {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
// Verificar permisos al inicio
- if (!sender.hasPermission("towers.admin")) {
+ if (!sender.hasPermission("towers.admin") && !sender.isOp()) {
sender.sendMessage("§cNo tienes permiso para usar este comando.");
return true;
}
// Verificar que se pasen argumentos
if (args.length == 0) {
- sender.sendMessage("§cUso: /TowersBot ");
+ sender.sendMessage("§aLa versión actual de TowersBot es: §b" + plugin.getDescription().getVersion());
return true;
}
@@ -43,7 +45,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
return true;
- case "lista":
+ case "list":
String tablas = config.getString("DB_TABLES", "");
if (tablas.isEmpty()) {
sender.sendMessage("§eNo hay tablas configuradas en DB_TABLES.");
@@ -120,16 +122,27 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
sender.sendMessage("§aTabla añadida: " + nuevaTabla);
return true;
+ case "update":
+ String currentVersion = plugin.getDescription().getVersion();
+ sender.sendMessage("§aLa versión actual de TowersBot es: §b" + currentVersion);
+
+ // Iniciar la verificación de actualizaciones
+ AutoUpdate updateChecker = new AutoUpdate((JavaPlugin) plugin);
+ updateChecker.checkForUpdates();
+
+ return true;
+
case "help":
sender.sendMessage("§aComandos disponibles:");
sender.sendMessage("§e/TowersBot lista §7- Muestra las tablas configuradas.");
sender.sendMessage("§e/TowersBot delete {numero} §7- Elimina una tabla de la configuración.");
sender.sendMessage("§e/TowersBot add {tabla} §7- Añade una tabla a la configuración.");
sender.sendMessage("§e/TowersBot reload §7- Recarga la configuración del plugin.");
+ sender.sendMessage("§e/TowersBot update §7- Verifica actualizaciones del plugin.");
return true;
-
+
default:
- sender.sendMessage("§cComando desconocido. Uso: /TowersBot ");
+ sender.sendMessage("§cComando desconocido. Uso: /TowersBot ");
return true;
}
}
diff --git a/src/main/java/org/nicolie/towersbot/update/AutoUpdate.java b/src/main/java/org/nicolie/towersbot/update/AutoUpdate.java
new file mode 100644
index 0000000..51a379e
--- /dev/null
+++ b/src/main/java/org/nicolie/towersbot/update/AutoUpdate.java
@@ -0,0 +1,155 @@
+package org.nicolie.towersbot.update;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+public class AutoUpdate {
+
+ private final JavaPlugin plugin;
+
+ public AutoUpdate(JavaPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ public void checkForUpdates() {
+ String currentVersion = plugin.getDescription().getVersion();
+ String apiUrl = "https://github.com/nicoliee/TowersBot/releases/latest";
+
+ Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
+ try {
+ // Abrir conexión a la API de GitHub
+ HttpURLConnection connection = (HttpURLConnection) new URL(apiUrl).openConnection();
+ connection.setRequestProperty("User-Agent", "Mozilla/5.0");
+
+ // Leer la respuesta de la API
+ StringBuilder responseBuilder = new StringBuilder();
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ responseBuilder.append(line);
+ }
+ }
+ String response = responseBuilder.toString();
+
+ // Obtener la última versión y la URL de descarga del JSON
+ String latestVersion = parseVersionFromJson(response);
+ if (latestVersion == null) {
+ plugin.getLogger().severe("No se pudo obtener la última versión del JSON.");
+ notifyAdmins("§cError al verificar actualizaciones. Consulta la consola para más información.");
+ return;
+ }
+
+ if (compareVersions(currentVersion, latestVersion) >= 0) {
+ // Si la versión actual es igual o mayor que la última
+ plugin.getLogger().info("TowersBot está actualizado.");
+ notifyAdmins("§aTowersBot está actualizado a la versión más reciente. §8[§b" + latestVersion + "§8]");
+ } else {
+ plugin.getLogger().info("Nueva versión disponible: " + latestVersion);
+ notifyAdmins("§eNueva versión de TowersBot disponible: " + latestVersion);
+
+ String downloadUrl = parseDownloadUrlFromJson(response);
+ if (downloadUrl == null) {
+ plugin.getLogger().severe("No se pudo obtener la URL de descarga del JSON.");
+ notifyAdmins("§cError al verificar actualizaciones. Consulta la consola para más información.");
+ return;
+ }
+
+ // Descargar la nueva versión
+ notifyAdmins("§eDescargando nueva versión de TowersBot...");
+ downloadNewVersion(downloadUrl);
+ plugin.getLogger().info("Nueva versión descargada. Notificando a los administradores...");
+ notifyAdmins("§aNueva versión descargada. Reinicia el servidor para aplicar los cambios.");
+ }
+ } catch (Exception e) {
+ plugin.getLogger().severe("Error verificando actualizaciones: " + e.getMessage());
+ notifyAdmins("§cOcurrió un error al verificar actualizaciones. Consulta la consola para más información.");
+ }
+ });
+ }
+
+ private void notifyAdmins(String message) {
+ // Notificar a todos los jugadores con el permiso `towers.admin`
+ Bukkit.getOnlinePlayers().stream()
+ .filter(player -> player.hasPermission("towers.admin"))
+ .forEach(player -> player.sendMessage(message));
+ }
+
+ private String parseVersionFromJson(String json) {
+ try {
+ JSONObject jsonObject = new JSONObject(json);
+ return jsonObject.getString("tag_name"); // Obtiene la versión del campo `tag_name`
+ } catch (Exception e) {
+ plugin.getLogger().severe("Error al analizar la versión del JSON: " + e.getMessage());
+ return null;
+ }
+ }
+
+ private String parseDownloadUrlFromJson(String json) {
+ try {
+ JSONObject jsonObject = new JSONObject(json);
+ JSONArray assets = jsonObject.getJSONArray("assets");
+ if (assets.length() > 0) {
+ JSONObject firstAsset = assets.getJSONObject(0);
+ return firstAsset.getString("browser_download_url"); // URL del primer asset
+ }
+ return null;
+ } catch (Exception e) {
+ plugin.getLogger().severe("Error al analizar la URL de descarga del JSON: " + e.getMessage());
+ return null;
+ }
+ }
+
+ private void downloadNewVersion(String downloadUrl) {
+ try {
+ // Configurar la ruta para guardar el nuevo archivo .jar
+ File pluginFile = new File("plugins/" + plugin.getName() + ".jar");
+
+ // Abrir una conexión para descargar el archivo
+ try (BufferedInputStream in = new BufferedInputStream(new URL(downloadUrl).openStream());
+ FileOutputStream fileOutputStream = new FileOutputStream(pluginFile)) {
+ byte[] dataBuffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
+ fileOutputStream.write(dataBuffer, 0, bytesRead);
+ }
+ }
+
+ plugin.getLogger().info("El nuevo archivo del plugin ha sido descargado con éxito.");
+ } catch (IOException e) {
+ plugin.getLogger().severe("Error al descargar la nueva versión: " + e.getMessage());
+ }
+ }
+
+ /**
+ * Compara dos versiones en formato "x.y.z".
+ * Devuelve:
+ * - Un valor negativo si `version1` < `version2`
+ * - Cero si `version1` == `version2`
+ * - Un valor positivo si `version1` > `version2`
+ */
+ private int compareVersions(String version1, String version2) {
+ // Elimina el prefijo "v" u otros caracteres no numéricos
+ version1 = version1.replaceAll("[^0-9.]", "");
+ version2 = version2.replaceAll("[^0-9.]", "");
+
+ String[] parts1 = version1.split("\\.");
+ String[] parts2 = version2.split("\\.");
+ int length = Math.max(parts1.length, parts2.length);
+
+ for (int i = 0; i < length; i++) {
+ int v1 = i < parts1.length ? Integer.parseInt(parts1[i]) : 0;
+ int v2 = i < parts2.length ? Integer.parseInt(parts2[i]) : 0;
+
+ if (v1 != v2) {
+ return v1 - v2;
+ }
+ }
+ return 0; // Las versiones son iguales
+ }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index d279207..3cb507c 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -4,6 +4,6 @@ main: org.nicolie.towersbot.TowersBot
commands:
TowersBot:
description: Comandos para gestionar TowersBot.
- usage: / reload
+ usage: /
permission: towers.admin
permission-message: No tienes permiso para usar este comando.