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.