From b527a7ab94243af99c86376a68a8f714b212424b Mon Sep 17 00:00:00 2001 From: MattMX Date: Wed, 18 Sep 2024 15:52:12 +0100 Subject: [PATCH 1/2] :bug: Fixed `UpdateChecker` + Backup invalid configs --- .../mattmx/reconnect/ReconnectVelocity.java | 20 ++++++---- .../reconnect/util/updater/UpdateChecker.java | 40 ++++++++++--------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java b/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java index 2a1c109..5c6e7fc 100644 --- a/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java +++ b/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java @@ -77,12 +77,16 @@ public ReconnectVelocity(@Nullable ProxyServer server, @Nullable Logger logger, checker = new UpdateChecker(); - if (checker.get("https://api.github.com/repos/Matt-MX/ReconnectVelocity/releases/latest") - .isLatest(this.getClass().getAnnotation(Plugin.class).version())) { - getLogger().info("Running the latest version! ReconnectVelocity " + checker.getLatest()); - } else { - getLogger().info("Newer version available! ReconnectVelocity " + checker.getLatest()); - getLogger().info("Get it here: " + checker.getLink()); + String url = "https://api.github.com/repos/Matt-MX/ReconnectVelocity/releases/latest"; + try { + if (checker.get(url).isLatest(this.getClass().getAnnotation(Plugin.class).version())) { + getLogger().info("Running the latest version! ReconnectVelocity " + checker.getLatest()); + } else { + getLogger().info("Newer version available! ReconnectVelocity " + checker.getLatest()); + getLogger().info("Get it here: " + checker.getLink()); + } + } catch (Exception failure) { + getLogger().info("Unable to get latest release!"); } } @@ -119,7 +123,9 @@ public void saveDefaultConfig() { try { this.config = loader.load().get(ReconnectConfig.class); } catch (ConfigurateException e) { - throw new RuntimeException(e); + getLogger().error("There were errors when loading the existing config. Renaming and resetting!"); + configLocation.renameTo(configLocation.getParentFile().toPath().resolve("config-old.yml").toFile()); + saveDefaultConfig(); } } diff --git a/src/main/java/com/mattmx/reconnect/util/updater/UpdateChecker.java b/src/main/java/com/mattmx/reconnect/util/updater/UpdateChecker.java index 3df5bfb..29b5aca 100644 --- a/src/main/java/com/mattmx/reconnect/util/updater/UpdateChecker.java +++ b/src/main/java/com/mattmx/reconnect/util/updater/UpdateChecker.java @@ -7,6 +7,8 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; @@ -20,34 +22,34 @@ public class UpdateChecker { public UpdateChecker get(String url) { try { StringBuilder builder = new StringBuilder(); - URL u = new URL(url); + URL u = new URI(url).toURL(); URLConnection connection = u.openConnection(); - BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line; - while ((line = reader.readLine()) != null) { - builder.append(line + "\n"); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + while ((line = reader.readLine()) != null) { + builder.append(line); + } } + content = builder.toString(); - getData(); - return this; - } catch (IOException e) { - e.printStackTrace(); - } - return this; - } - private void getData() { - if (content == null) return; - JsonElement root = JsonParser.parseString(content); + JsonElement root = JsonParser.parseString(content); + + if (!root.isJsonObject()) throw new RuntimeException("Unable to get latest version!"); - if (root.isJsonObject()) return; + JsonObject obj = root.getAsJsonObject(); - JsonObject obj = root.getAsJsonObject(); + if (obj.get("tag_name") != null) { + this.latest = obj.get("tag_name").getAsString(); + this.link = obj.get("html_url").getAsString(); + } - if (obj.get("tag_name") != null) { - this.latest = obj.get("tag_name").getAsString(); - this.link = obj.get("html_url").getAsString(); + return this; + } catch (IOException | URISyntaxException ex) { + ex.printStackTrace(); } + return this; } public boolean isLatest(String version) { From 4e5da507438db8d5c721d6f7a11c5e885a979451 Mon Sep 17 00:00:00 2001 From: MattMX Date: Wed, 18 Sep 2024 15:59:09 +0100 Subject: [PATCH 2/2] :fire: Add PostgreSQL #17 --- build.gradle.kts | 1 + gradle/libs.versions.toml | 6 +- .../com/mattmx/reconnect/ReconnectConfig.java | 3 + .../mattmx/reconnect/ReconnectListener.java | 1 + .../mattmx/reconnect/ReconnectVelocity.java | 22 +++-- .../reconnect/storage/PostgreSQLStorage.java | 84 +++++++++++++++++++ 6 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/mattmx/reconnect/storage/PostgreSQLStorage.java diff --git a/build.gradle.kts b/build.gradle.kts index 98b7bc7..b82de50 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { implementation(libs.storage.mysql) implementation(libs.storage.maria) implementation(libs.storage.sqlite) + implementation(libs.storage.postgresql) implementation(libs.storage.hikari) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0b4528d..3f07689 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,9 +8,10 @@ litebans = "0.5.0" luckperms = "5.4" yaml = "1.7.2" -mysql = "8.0.29" +mysql = "8.0.33" maria = "3.3.3" -sqlite = "3.41.2.2" +sqlite = "3.45.2.0" +postgresql = "42.7.3" hikari = "5.1.0" [libraries] @@ -23,6 +24,7 @@ storage-yaml = { module = "me.carleslc.Simple-YAML:Simple-Yaml", version.ref = " storage-mysql = { module = "mysql:mysql-connector-java", version.ref = "mysql" } storage-maria = { module = "org.mariadb.jdbc:mariadb-java-client", version.ref = "maria" } storage-sqlite = { module = "org.xerial:sqlite-jdbc", version.ref = "sqlite" } +storage-postgresql = { module = "org.postgresql:postgresql", version.ref = "postgresql" } storage-hikari = { module = "com.zaxxer:HikariCP", version.ref = "hikari" } [plugins] diff --git a/src/main/java/com/mattmx/reconnect/ReconnectConfig.java b/src/main/java/com/mattmx/reconnect/ReconnectConfig.java index 056c032..4cda67f 100644 --- a/src/main/java/com/mattmx/reconnect/ReconnectConfig.java +++ b/src/main/java/com/mattmx/reconnect/ReconnectConfig.java @@ -8,6 +8,9 @@ @ConfigSerializable public class ReconnectConfig { + @Comment("Should we check for the latest version?") + boolean checkUpdates = true; + @Comment("Do we want to send players a message when they are reconnected to a server?") public boolean messageOnReconnect = true; public List reconnectMessage = List.of("You were reconnected to %server%."); diff --git a/src/main/java/com/mattmx/reconnect/ReconnectListener.java b/src/main/java/com/mattmx/reconnect/ReconnectListener.java index d96ddd2..9e4ec71 100644 --- a/src/main/java/com/mattmx/reconnect/ReconnectListener.java +++ b/src/main/java/com/mattmx/reconnect/ReconnectListener.java @@ -93,6 +93,7 @@ public void onChangeServer(@NotNull ServerConnectedEvent event) { @Subscribe public void onPlayerLogin(@NotNull LoginEvent event) { + if (!plugin.getConfig().checkUpdates) return; UpdateChecker checker = plugin.getUpdateChecker(); diff --git a/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java b/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java index 5c6e7fc..16b723b 100644 --- a/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java +++ b/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java @@ -69,6 +69,8 @@ public ReconnectVelocity(@Nullable ProxyServer server, @Nullable Logger logger, StorageManager.registerStorageMethod(new MariaDbStorage()); StorageManager.registerStorageMethod(new SQLiteStorage()); StorageManager.registerStorageMethod(new YamlStorage()); + StorageManager.registerStorageMethod(new PostgreSQLStorage()); + if (proxy.getPluginManager().isLoaded("luckperms")) { StorageManager.registerStorageMethod(new LuckPermsStorage()); } @@ -77,16 +79,18 @@ public ReconnectVelocity(@Nullable ProxyServer server, @Nullable Logger logger, checker = new UpdateChecker(); - String url = "https://api.github.com/repos/Matt-MX/ReconnectVelocity/releases/latest"; - try { - if (checker.get(url).isLatest(this.getClass().getAnnotation(Plugin.class).version())) { - getLogger().info("Running the latest version! ReconnectVelocity " + checker.getLatest()); - } else { - getLogger().info("Newer version available! ReconnectVelocity " + checker.getLatest()); - getLogger().info("Get it here: " + checker.getLink()); + if (getConfig().checkUpdates) { + String url = "https://api.github.com/repos/Matt-MX/ReconnectVelocity/releases/latest"; + try { + if (checker.get(url).isLatest(this.getClass().getAnnotation(Plugin.class).version())) { + getLogger().info("Running the latest version! ReconnectVelocity " + checker.getLatest()); + } else { + getLogger().info("Newer version available! ReconnectVelocity " + checker.getLatest()); + getLogger().info("Get it here: " + checker.getLink()); + } + } catch (Exception failure) { + getLogger().info("Unable to get latest release!"); } - } catch (Exception failure) { - getLogger().info("Unable to get latest release!"); } } diff --git a/src/main/java/com/mattmx/reconnect/storage/PostgreSQLStorage.java b/src/main/java/com/mattmx/reconnect/storage/PostgreSQLStorage.java new file mode 100644 index 0000000..5e82188 --- /dev/null +++ b/src/main/java/com/mattmx/reconnect/storage/PostgreSQLStorage.java @@ -0,0 +1,84 @@ +package com.mattmx.reconnect.storage; + +import com.mattmx.reconnect.ReconnectConfig; +import com.mattmx.reconnect.ReconnectVelocity; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +public class PostgreSQLStorage extends StorageMethod { + private HikariDataSource ds; + + @Override + public void init() { + ReconnectConfig config = ReconnectVelocity.get().getConfig(); + + HikariConfig hikariConfig = new HikariConfig(); + hikariConfig.setDriverClassName(org.mariadb.jdbc.Driver.class.getName()); + if (config.storage.data.connectionParameters.useJdbcString) { + hikariConfig.setJdbcUrl(config.storage.data.connectionParameters.jdbcString); + } else { + hikariConfig.setJdbcUrl("jdbc:postgresql://" + config.storage.data.address + "/" + config.storage.data.database); + } + hikariConfig.setUsername(config.storage.data.username); + hikariConfig.setPassword(config.storage.data.password); + hikariConfig.setConnectionTimeout(config.storage.data.connectionParameters.connectionTimeout); + hikariConfig.setIdleTimeout(config.storage.data.connectionParameters.idleTimeout); + hikariConfig.setKeepaliveTime(config.storage.data.connectionParameters.keepAliveTime); + hikariConfig.setMaxLifetime(config.storage.data.connectionParameters.maxLifetime); + hikariConfig.setMinimumIdle(config.storage.data.connectionParameters.minimumIdle); + hikariConfig.setMaximumPoolSize(config.storage.data.connectionParameters.maximumPoolSize); + hikariConfig.setPoolName("reconnect"); + + ds = new HikariDataSource(hikariConfig); + try (Connection con = ds.getConnection()) { + Statement statement = con.createStatement(); + statement.executeUpdate("CREATE TABLE IF NOT EXISTS reconnect_data(" + + "uuid VARCHAR(255)," + + "lastserver TEXT," + + "PRIMARY KEY(uuid))"); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + @Override + public void setLastServer(String uuid, String servername) { + try (Connection con = ds.getConnection()) { + Statement statement = con.createStatement(); + statement.executeUpdate( + "INSERT INTO reconnect_data VALUES ('" + uuid + "','" + servername + "')" + + "ON CONFLICT (uuid) DO UPDATE SET lastserver = '" + servername + "'"); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + @Override + public String getLastServer(String uuid) { + try (Connection con = ds.getConnection()) { + Statement statement = con.createStatement(); + ResultSet rs = statement.executeQuery("SELECT lastserver FROM reconnect_data WHERE uuid = '" + uuid + "'"); + if (rs.next()) { + return rs.getString("lastserver"); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } + + @Override + public void save() { + ds.close(); + } + + @Override + public String getMethod() { + return "postgresql"; + } +} \ No newline at end of file