Skip to content

Commit

Permalink
Hotfix to Updates
Browse files Browse the repository at this point in the history
  • Loading branch information
nicoliee committed Dec 2, 2024
1 parent 8575f47 commit 194a4a9
Show file tree
Hide file tree
Showing 5 changed files with 186 additions and 8 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
10 changes: 8 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,16 @@

<groupId>org.nicolie</groupId>
<artifactId>TowersBot</artifactId>
<version>1.0</version>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>TowersBot</name>
<properties>
<java.version>1.8</java.version>
<java.version>8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
<finalName>TowersBot</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
Expand Down Expand Up @@ -84,5 +85,10 @@
<artifactId>mysql-connector-j</artifactId>
<version>8.2.0</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
</dependencies>
</project>
23 changes: 18 additions & 5 deletions src/main/java/org/nicolie/towersbot/commands/TowersBotCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 <lista|delete|add|reload>");
sender.sendMessage(aLa versión actual de TowersBot es: §b" + plugin.getDescription().getVersion());
return true;
}

Expand All @@ -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.");
Expand Down Expand Up @@ -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 <lista|delete|add|reload>");
sender.sendMessage("§cComando desconocido. Uso: /TowersBot <lista|delete|add|reload|update>");
return true;
}
}
Expand Down
155 changes: 155 additions & 0 deletions src/main/java/org/nicolie/towersbot/update/AutoUpdate.java
Original file line number Diff line number Diff line change
@@ -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
}
}
2 changes: 1 addition & 1 deletion src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ main: org.nicolie.towersbot.TowersBot
commands:
TowersBot:
description: Comandos para gestionar TowersBot.
usage: /<command> reload
usage: /<command> <reload|list|delete|add|update|help>
permission: towers.admin
permission-message: No tienes permiso para usar este comando.

0 comments on commit 194a4a9

Please sign in to comment.