From 7f21cee5a7b6f143be32280c3e5d1bf13b6b17f3 Mon Sep 17 00:00:00 2001 From: Aurora Date: Wed, 26 Nov 2025 15:39:58 +0000 Subject: [PATCH 1/5] Update for configurate --- build.gradle | 1 + gradle/libs.versions.toml | 4 +++- .../extension/connect/GeyserConnect.java | 8 ++++---- .../extension/connect/PacketHandler.java | 2 +- .../extension/connect/config/Config.java | 8 ++++---- .../extension/connect/config/ConfigLoader.java | 14 ++++++++------ .../connect/config/CustomServersSection.java | 4 ++-- .../connect/config/VirtualHostSection.java | 4 ++-- .../storage/AbstractSQLStorageManager.java | 11 +++++------ .../connect/storage/AbstractStorageManager.java | 17 +++++------------ .../connect/storage/JsonStorageManager.java | 12 +++++++----- .../extension/connect/utils/Server.java | 1 - .../geysermc/extension/connect/utils/Utils.java | 6 +++--- 13 files changed, 45 insertions(+), 47 deletions(-) diff --git a/build.gradle b/build.gradle index 1c1af0d..1a127f7 100644 --- a/build.gradle +++ b/build.gradle @@ -32,6 +32,7 @@ dependencies { exclude group: 'io.netty' exclude group: 'io.netty.incubator' } + compileOnly libs.yamlConfigurate implementation libs.sqlite implementation libs.mysql diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2c713f2..39ae931 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,13 +1,15 @@ [versions] -geyser = "2.7.0-SNAPSHOT" +geyser = "2.9.1-SNAPSHOT" sqlite = "3.49.1.0" mysql = "9.2.0" +yamlConfigurate = "4.2.0-GeyserMC-20251111.004649-11" [libraries] geyser-core = { group = "org.geysermc.geyser", name = "core", version.ref = "geyser" } geyser-api = { group = "org.geysermc.geyser", name = "api", version.ref = "geyser" } sqlite = { group = "org.xerial", name = "sqlite-jdbc", version.ref = "sqlite" } mysql = { group = "com.mysql", name = "mysql-connector-j", version.ref = "mysql" } +yamlConfigurate = { module = "org.spongepowered:configurate-yaml", version.ref = "yamlConfigurate" } [bundles] geyser = [ diff --git a/src/main/java/org/geysermc/extension/connect/GeyserConnect.java b/src/main/java/org/geysermc/extension/connect/GeyserConnect.java index fdceabe..f6c8129 100644 --- a/src/main/java/org/geysermc/extension/connect/GeyserConnect.java +++ b/src/main/java/org/geysermc/extension/connect/GeyserConnect.java @@ -103,16 +103,16 @@ public void onPostInitialize(GeyserPostInitializeEvent event) { // Remove all saved logins to prevent issues connecting // Maybe worth adding support for this later - geyserInstance.getConfig().getSavedUserLogins().clear(); + geyserInstance.config().savedUserLogins().clear(); - if (geyserInstance.getConfig().isPassthroughMotd() || geyserInstance.getConfig().isPassthroughPlayerCounts()) { + if (geyserInstance.config().motd().passthroughMotd() || geyserInstance.config().motd().passthroughPlayerCounts()) { this.logger().warning("Either `passthrough-motd` or `passthrough-player-counts` is enabled in the config, this will likely produce errors"); } // If we are using floodgate then disable the extension. // GeyserConnect also doesn't support the connection sequence that occurs when the default RemoteServer // auth-type is offline (and there is no reason to change it when GeyserConnect is in use). - if (geyserInstance.getConfig().getRemote().authType() != AuthType.ONLINE) { + if (geyserInstance.config().java().authType() != AuthType.ONLINE) { this.logger().error("auth-type is not set to 'online' in the Geyser config, this will break GeyserConnect. Disabling!"); this.disable(); } @@ -122,7 +122,7 @@ public void onPostInitialize(GeyserPostInitializeEvent event) { public void onSessionInitialize(SessionInitializeEvent event) { GeyserSession session = (GeyserSession) event.connection(); if (config().hardPlayerLimit()) { - if (session.getGeyser().getSessionManager().size() >= session.getGeyser().getConfig().getMaxPlayers()) { + if (session.getGeyser().getSessionManager().size() >= session.getGeyser().config().motd().maxPlayers()) { session.disconnect("disconnectionScreen.serverFull"); } } diff --git a/src/main/java/org/geysermc/extension/connect/PacketHandler.java b/src/main/java/org/geysermc/extension/connect/PacketHandler.java index 4a4d9b3..f9077c3 100644 --- a/src/main/java/org/geysermc/extension/connect/PacketHandler.java +++ b/src/main/java/org/geysermc/extension/connect/PacketHandler.java @@ -67,7 +67,7 @@ public PacketHandler(GeyserConnect geyserConnect, GeyserSession session, Bedrock } @Override - public void onDisconnect(String reason) { + public void onDisconnect(CharSequence reason) { // The user has disconnected without having connected to an actual server. If they have connected to // a server (transfer packet or geyser proxy), then the original packet handler has been restored. ServerManager.unloadServers(session); diff --git a/src/main/java/org/geysermc/extension/connect/config/Config.java b/src/main/java/org/geysermc/extension/connect/config/Config.java index 7e19148..34ef9e3 100644 --- a/src/main/java/org/geysermc/extension/connect/config/Config.java +++ b/src/main/java/org/geysermc/extension/connect/config/Config.java @@ -25,15 +25,15 @@ package org.geysermc.extension.connect.config; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.gson.annotations.SerializedName; import org.geysermc.extension.connect.utils.Server; import java.util.List; public record Config( - @JsonProperty("welcome-file") String welcomeFile, - @JsonProperty("hard-player-limit") boolean hardPlayerLimit, + @SerializedName("welcome-file") String welcomeFile, + @SerializedName("hard-player-limit") boolean hardPlayerLimit, List servers, - @JsonProperty("custom-servers") CustomServersSection customServers, + @SerializedName("custom-servers") CustomServersSection customServers, VirtualHostSection vhost) { } \ No newline at end of file diff --git a/src/main/java/org/geysermc/extension/connect/config/ConfigLoader.java b/src/main/java/org/geysermc/extension/connect/config/ConfigLoader.java index af74967..c30e4f2 100644 --- a/src/main/java/org/geysermc/extension/connect/config/ConfigLoader.java +++ b/src/main/java/org/geysermc/extension/connect/config/ConfigLoader.java @@ -25,10 +25,9 @@ package org.geysermc.extension.connect.config; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import org.geysermc.geyser.api.extension.Extension; +import org.spongepowered.configurate.CommentedConfigurationNode; +import org.spongepowered.configurate.yaml.YamlConfigurationLoader; import java.io.File; import java.io.FileWriter; @@ -74,9 +73,12 @@ public static T load(Extension extension, Class extensionClass, Class // Load the config file try { - return new ObjectMapper(new YAMLFactory()) - .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) - .readValue(configFile, configClass); + YamlConfigurationLoader loader = YamlConfigurationLoader.builder() + .file(configFile) + .build(); + + CommentedConfigurationNode rootNode = loader.load(); + return rootNode.get(configClass); } catch (IOException e) { extension.logger().error("Failed to load config", e); return null; diff --git a/src/main/java/org/geysermc/extension/connect/config/CustomServersSection.java b/src/main/java/org/geysermc/extension/connect/config/CustomServersSection.java index e846019..4f151d2 100644 --- a/src/main/java/org/geysermc/extension/connect/config/CustomServersSection.java +++ b/src/main/java/org/geysermc/extension/connect/config/CustomServersSection.java @@ -25,12 +25,12 @@ package org.geysermc.extension.connect.config; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.gson.annotations.SerializedName; import org.geysermc.extension.connect.storage.AbstractStorageManager; public record CustomServersSection( boolean enabled, int max, - @JsonProperty("storage-type") AbstractStorageManager.StorageType storageType, + @SerializedName("storage-type") AbstractStorageManager.StorageType storageType, MySQLConnectionSection mysql) { } diff --git a/src/main/java/org/geysermc/extension/connect/config/VirtualHostSection.java b/src/main/java/org/geysermc/extension/connect/config/VirtualHostSection.java index 0dc001f..57b6936 100644 --- a/src/main/java/org/geysermc/extension/connect/config/VirtualHostSection.java +++ b/src/main/java/org/geysermc/extension/connect/config/VirtualHostSection.java @@ -25,11 +25,11 @@ package org.geysermc.extension.connect.config; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.gson.annotations.SerializedName; import java.util.List; public record VirtualHostSection( boolean enabled, - @JsonProperty("domains") List domains) { + @SerializedName("domains") List domains) { } diff --git a/src/main/java/org/geysermc/extension/connect/storage/AbstractSQLStorageManager.java b/src/main/java/org/geysermc/extension/connect/storage/AbstractSQLStorageManager.java index d7cb7d8..3c0777d0 100644 --- a/src/main/java/org/geysermc/extension/connect/storage/AbstractSQLStorageManager.java +++ b/src/main/java/org/geysermc/extension/connect/storage/AbstractSQLStorageManager.java @@ -25,13 +25,12 @@ package org.geysermc.extension.connect.storage; -import com.fasterxml.jackson.core.type.TypeReference; +import com.google.gson.reflect.TypeToken; import org.geysermc.extension.connect.GeyserConnect; import org.geysermc.extension.connect.utils.Server; import org.geysermc.extension.connect.utils.ServerManager; import org.geysermc.extension.connect.utils.Utils; -import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -72,9 +71,9 @@ public void saveServers(org.geysermc.api.connection.Connection session) { // replace into works on MySQL and SQLite try (PreparedStatement updatePlayersServers = connection.prepareStatement("REPLACE INTO players(xuid, servers) VALUES(?, ?)")) { updatePlayersServers.setString(1, session.xuid()); - updatePlayersServers.setString(2, Utils.OBJECT_MAPPER.writeValueAsString(ServerManager.getServers(session))); + updatePlayersServers.setString(2, Utils.GSON.toJson(ServerManager.getServers(session))); updatePlayersServers.executeUpdate(); - } catch (IOException | SQLException exception) { + } catch (SQLException exception) { GeyserConnect.instance().logger().error("Couldn't save servers for " + session.bedrockUsername(), exception); } } @@ -88,13 +87,13 @@ public List loadServers(org.geysermc.api.connection.Connection session) ResultSet rs = getPlayersServers.executeQuery(); while (rs.next()) { - List loadedServers = Utils.OBJECT_MAPPER.readValue(rs.getString("servers"), new TypeReference<>() { + List loadedServers = Utils.GSON.fromJson(rs.getString("servers"), new TypeToken<>() { }); if (loadedServers != null) { servers.addAll(loadedServers); } } - } catch (IOException | SQLException exception) { + } catch (SQLException exception) { GeyserConnect.instance().logger().error("Couldn't load servers for " + session.bedrockUsername(), exception); } diff --git a/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java b/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java index 6a77b57..50f7dd0 100644 --- a/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java +++ b/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java @@ -25,7 +25,7 @@ package org.geysermc.extension.connect.storage; -import com.fasterxml.jackson.annotation.JsonValue; +import com.google.gson.annotations.SerializedName; import org.geysermc.api.connection.Connection; import org.geysermc.extension.connect.utils.Server; @@ -48,24 +48,17 @@ public List loadServers(Connection session) { } public enum StorageType { - JSON("json", JsonStorageManager.class), - SQLITE("sqlite", SQLiteStorageManager.class), - MYSQL("mysql", MySQLStorageManager.class); + @SerializedName("json") JSON(JsonStorageManager.class), + @SerializedName("sqlite") SQLITE(SQLiteStorageManager.class), + @SerializedName("mysql") MYSQL(MySQLStorageManager.class); - @JsonValue - private final String configName; private final Class storageManager; - StorageType(String configName, Class storageManager) { - this.configName = configName; + StorageType(Class storageManager) { this.storageManager = storageManager; } - public String configName() { - return configName; - } - public Class storageManager() { return storageManager; } diff --git a/src/main/java/org/geysermc/extension/connect/storage/JsonStorageManager.java b/src/main/java/org/geysermc/extension/connect/storage/JsonStorageManager.java index a9254b9..fffeef8 100644 --- a/src/main/java/org/geysermc/extension/connect/storage/JsonStorageManager.java +++ b/src/main/java/org/geysermc/extension/connect/storage/JsonStorageManager.java @@ -25,13 +25,15 @@ package org.geysermc.extension.connect.storage; -import com.fasterxml.jackson.core.type.TypeReference; +import com.google.gson.reflect.TypeToken; import org.geysermc.api.connection.Connection; import org.geysermc.extension.connect.GeyserConnect; import org.geysermc.extension.connect.utils.Server; import org.geysermc.extension.connect.utils.ServerManager; import org.geysermc.extension.connect.utils.Utils; +import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; @@ -50,8 +52,8 @@ public void setupStorage() { @Override public void saveServers(Connection session) { - try { - Utils.OBJECT_MAPPER.writeValue(dataFolder.resolve(session.xuid() + ".json").toFile(), ServerManager.getServers(session)); + try (FileWriter writer = new FileWriter(dataFolder.resolve(session.xuid() + ".json").toFile())) { + writer.write(Utils.GSON.toJson(ServerManager.getServers(session))); } catch (IOException ignored) { } } @@ -60,8 +62,8 @@ public void saveServers(Connection session) { public List loadServers(Connection session) { List servers = new ArrayList<>(); - try { - List loadedServers = Utils.OBJECT_MAPPER.readValue(dataFolder.resolve(session.xuid() + ".json").toFile(), new TypeReference<>() { + try (FileReader reader = new FileReader(dataFolder.resolve(session.xuid() + ".json").toFile())) { + List loadedServers = Utils.GSON.fromJson(reader, new TypeToken<>() { }); if (loadedServers != null) { servers.addAll(loadedServers); diff --git a/src/main/java/org/geysermc/extension/connect/utils/Server.java b/src/main/java/org/geysermc/extension/connect/utils/Server.java index de7e503..c69171f 100644 --- a/src/main/java/org/geysermc/extension/connect/utils/Server.java +++ b/src/main/java/org/geysermc/extension/connect/utils/Server.java @@ -59,7 +59,6 @@ public boolean resolveSrv() { return true; } - @JsonIgnore public FormImage formImage() { if (imageUrl != null && !imageUrl.isEmpty()) { return FormImage.of(FormImage.Type.URL, imageUrl); diff --git a/src/main/java/org/geysermc/extension/connect/utils/Utils.java b/src/main/java/org/geysermc/extension/connect/utils/Utils.java index 75c8390..8be3d04 100644 --- a/src/main/java/org/geysermc/extension/connect/utils/Utils.java +++ b/src/main/java/org/geysermc/extension/connect/utils/Utils.java @@ -25,8 +25,8 @@ package org.geysermc.extension.connect.utils; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import org.cloudburstmc.protocol.bedrock.packet.BedrockPacketHandler; import org.cloudburstmc.protocol.bedrock.packet.SetLocalPlayerAsInitializedPacket; import org.cloudburstmc.protocol.bedrock.packet.TransferPacket; @@ -47,7 +47,7 @@ import java.util.List; public class Utils { - public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); public static List getServers(ServerCategory category) { return GeyserConnect.instance().config().servers().stream().filter(server -> server.category() == category).toList(); From 1543970cb0e4f98728a0479705e29c77c9d3f1e2 Mon Sep 17 00:00:00 2001 From: Aurora Date: Wed, 26 Nov 2025 16:11:56 +0000 Subject: [PATCH 2/5] Update required API limit in extension.yml due to the bump --- src/main/resources/extension.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/extension.yml b/src/main/resources/extension.yml index b3987a7..5f947cf 100644 --- a/src/main/resources/extension.yml +++ b/src/main/resources/extension.yml @@ -1,6 +1,6 @@ id: geyserconnect name: GeyserConnect main: org.geysermc.extension.connect.GeyserConnect -api: 2.7.0 +api: 2.9.1 version: 1.0.0 authors: [rtm516] From ce7b67a67bda4e428c27345fca9e06fedccb83e7 Mon Sep 17 00:00:00 2001 From: Aurora Date: Wed, 26 Nov 2025 16:42:26 +0000 Subject: [PATCH 3/5] Fix extra newline --- .../extension/connect/storage/AbstractStorageManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java b/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java index 50f7dd0..bd714d1 100644 --- a/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java +++ b/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java @@ -52,7 +52,6 @@ public enum StorageType { @SerializedName("sqlite") SQLITE(SQLiteStorageManager.class), @SerializedName("mysql") MYSQL(MySQLStorageManager.class); - private final Class storageManager; StorageType(Class storageManager) { From 1d659ec05c0be19be464b44777c8b3f50ffb4bcf Mon Sep 17 00:00:00 2001 From: Aurora Date: Wed, 26 Nov 2025 16:49:07 +0000 Subject: [PATCH 4/5] Remove bad import --- src/main/java/org/geysermc/extension/connect/utils/Server.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/geysermc/extension/connect/utils/Server.java b/src/main/java/org/geysermc/extension/connect/utils/Server.java index c69171f..49e5558 100644 --- a/src/main/java/org/geysermc/extension/connect/utils/Server.java +++ b/src/main/java/org/geysermc/extension/connect/utils/Server.java @@ -25,7 +25,6 @@ package org.geysermc.extension.connect.utils; -import com.fasterxml.jackson.annotation.JsonIgnore; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.cumulus.util.FormImage; import org.geysermc.geyser.api.network.AuthType; From a1fbc016e9eaa614b739f5490164750685c84579 Mon Sep 17 00:00:00 2001 From: Aurora Date: Wed, 26 Nov 2025 18:27:30 +0000 Subject: [PATCH 5/5] And now it works --- .../extension/connect/config/Config.java | 9 +-- .../connect/config/ConfigLoader.java | 17 ++++++ .../connect/config/CustomServersSection.java | 5 +- .../config/MySQLConnectionSection.java | 3 + .../connect/config/VirtualHostSection.java | 5 +- .../serializers/ServerCategorySerializer.java | 51 ++++++++++++++++ .../serializers/StorageTypeSerializer.java | 58 +++++++++++++++++++ .../storage/AbstractStorageManager.java | 8 ++- .../extension/connect/utils/Server.java | 2 + .../connect/utils/ServerCategory.java | 3 + 10 files changed, 150 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/geysermc/extension/connect/config/serializers/ServerCategorySerializer.java create mode 100644 src/main/java/org/geysermc/extension/connect/config/serializers/StorageTypeSerializer.java diff --git a/src/main/java/org/geysermc/extension/connect/config/Config.java b/src/main/java/org/geysermc/extension/connect/config/Config.java index 34ef9e3..87ccb4a 100644 --- a/src/main/java/org/geysermc/extension/connect/config/Config.java +++ b/src/main/java/org/geysermc/extension/connect/config/Config.java @@ -25,15 +25,16 @@ package org.geysermc.extension.connect.config; -import com.google.gson.annotations.SerializedName; import org.geysermc.extension.connect.utils.Server; +import org.spongepowered.configurate.objectmapping.ConfigSerializable; import java.util.List; +@ConfigSerializable public record Config( - @SerializedName("welcome-file") String welcomeFile, - @SerializedName("hard-player-limit") boolean hardPlayerLimit, + String welcomeFile, + boolean hardPlayerLimit, List servers, - @SerializedName("custom-servers") CustomServersSection customServers, + CustomServersSection customServers, VirtualHostSection vhost) { } \ No newline at end of file diff --git a/src/main/java/org/geysermc/extension/connect/config/ConfigLoader.java b/src/main/java/org/geysermc/extension/connect/config/ConfigLoader.java index c30e4f2..a20b096 100644 --- a/src/main/java/org/geysermc/extension/connect/config/ConfigLoader.java +++ b/src/main/java/org/geysermc/extension/connect/config/ConfigLoader.java @@ -25,19 +25,27 @@ package org.geysermc.extension.connect.config; +import org.geysermc.extension.connect.config.serializers.ServerCategorySerializer; +import org.geysermc.extension.connect.config.serializers.StorageTypeSerializer; +import org.geysermc.extension.connect.utils.ServerCategory; import org.geysermc.geyser.api.extension.Extension; import org.spongepowered.configurate.CommentedConfigurationNode; +import org.spongepowered.configurate.serialize.ScalarSerializer; +import org.spongepowered.configurate.serialize.SerializationException; +import org.spongepowered.configurate.yaml.NodeStyle; import org.spongepowered.configurate.yaml.YamlConfigurationLoader; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Type; import java.net.URISyntaxException; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import java.util.Collections; +import java.util.function.Predicate; public class ConfigLoader { public static T load(Extension extension, Class extensionClass, Class configClass) { @@ -75,9 +83,18 @@ public static T load(Extension extension, Class extensionClass, Class try { YamlConfigurationLoader loader = YamlConfigurationLoader.builder() .file(configFile) + .indent(2) + .nodeStyle(NodeStyle.BLOCK) + .defaultOptions(options -> + options.serializers(builder -> + builder.register(new StorageTypeSerializer()) + .register(new ServerCategorySerializer()) + ) + ) .build(); CommentedConfigurationNode rootNode = loader.load(); + return rootNode.get(configClass); } catch (IOException e) { extension.logger().error("Failed to load config", e); diff --git a/src/main/java/org/geysermc/extension/connect/config/CustomServersSection.java b/src/main/java/org/geysermc/extension/connect/config/CustomServersSection.java index 4f151d2..532e0c0 100644 --- a/src/main/java/org/geysermc/extension/connect/config/CustomServersSection.java +++ b/src/main/java/org/geysermc/extension/connect/config/CustomServersSection.java @@ -25,12 +25,13 @@ package org.geysermc.extension.connect.config; -import com.google.gson.annotations.SerializedName; import org.geysermc.extension.connect.storage.AbstractStorageManager; +import org.spongepowered.configurate.objectmapping.ConfigSerializable; +@ConfigSerializable public record CustomServersSection( boolean enabled, int max, - @SerializedName("storage-type") AbstractStorageManager.StorageType storageType, + AbstractStorageManager.StorageType storageType, MySQLConnectionSection mysql) { } diff --git a/src/main/java/org/geysermc/extension/connect/config/MySQLConnectionSection.java b/src/main/java/org/geysermc/extension/connect/config/MySQLConnectionSection.java index 62c3452..c08656a 100644 --- a/src/main/java/org/geysermc/extension/connect/config/MySQLConnectionSection.java +++ b/src/main/java/org/geysermc/extension/connect/config/MySQLConnectionSection.java @@ -25,6 +25,9 @@ package org.geysermc.extension.connect.config; +import org.spongepowered.configurate.objectmapping.ConfigSerializable; + +@ConfigSerializable public record MySQLConnectionSection( String user, String pass, diff --git a/src/main/java/org/geysermc/extension/connect/config/VirtualHostSection.java b/src/main/java/org/geysermc/extension/connect/config/VirtualHostSection.java index 57b6936..1cba810 100644 --- a/src/main/java/org/geysermc/extension/connect/config/VirtualHostSection.java +++ b/src/main/java/org/geysermc/extension/connect/config/VirtualHostSection.java @@ -25,11 +25,12 @@ package org.geysermc.extension.connect.config; -import com.google.gson.annotations.SerializedName; +import org.spongepowered.configurate.objectmapping.ConfigSerializable; import java.util.List; +@ConfigSerializable public record VirtualHostSection( boolean enabled, - @SerializedName("domains") List domains) { + List domains) { } diff --git a/src/main/java/org/geysermc/extension/connect/config/serializers/ServerCategorySerializer.java b/src/main/java/org/geysermc/extension/connect/config/serializers/ServerCategorySerializer.java new file mode 100644 index 0000000..1ddbdac --- /dev/null +++ b/src/main/java/org/geysermc/extension/connect/config/serializers/ServerCategorySerializer.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2019-2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/GeyserConnect + */ + +package org.geysermc.extension.connect.config.serializers; + +import io.leangen.geantyref.TypeToken; +import org.geysermc.extension.connect.utils.ServerCategory; +import org.spongepowered.configurate.serialize.ScalarSerializer; +import org.spongepowered.configurate.serialize.Scalars; +import org.spongepowered.configurate.serialize.SerializationException; + +import java.lang.reflect.Type; +import java.util.function.Predicate; + +public class ServerCategorySerializer extends ScalarSerializer { + public ServerCategorySerializer() { + super(new TypeToken<>() {}); + } + + @Override + public ServerCategory deserialize(Type type, Object obj) throws SerializationException { + return (ServerCategory) Scalars.ENUM.deserialize(type, obj); + } + + @Override + protected Object serialize(ServerCategory item, Predicate> typeSupported) { + return item.name(); + } +} diff --git a/src/main/java/org/geysermc/extension/connect/config/serializers/StorageTypeSerializer.java b/src/main/java/org/geysermc/extension/connect/config/serializers/StorageTypeSerializer.java new file mode 100644 index 0000000..44c692c --- /dev/null +++ b/src/main/java/org/geysermc/extension/connect/config/serializers/StorageTypeSerializer.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2019-2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/GeyserConnect + */ + +package org.geysermc.extension.connect.config.serializers; + +import io.leangen.geantyref.TypeToken; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.geysermc.extension.connect.storage.AbstractStorageManager; +import org.spongepowered.configurate.serialize.ScalarSerializer; +import org.spongepowered.configurate.serialize.SerializationException; +import org.spongepowered.configurate.util.EnumLookup; + +import java.lang.reflect.Type; +import java.util.Locale; +import java.util.function.Predicate; + +public final class StorageTypeSerializer extends ScalarSerializer { + public StorageTypeSerializer() { + super(new TypeToken<>() {}); + } + + @Override + public AbstractStorageManager.StorageType deserialize(Type type, Object obj) throws SerializationException { + final String enumConstant = obj.toString(); + final AbstractStorageManager.@Nullable StorageType ret = EnumLookup.lookupEnum(AbstractStorageManager.StorageType.class, enumConstant); + if (ret == null) { + throw new SerializationException(type, "Invalid enum constant provided, expected a value of enum, got " + enumConstant); + } + return ret; + } + + @Override + protected Object serialize(AbstractStorageManager.StorageType item, Predicate> typeSupported) { + return item.name().toLowerCase(Locale.ROOT); + } +} diff --git a/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java b/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java index bd714d1..a82262f 100644 --- a/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java +++ b/src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java @@ -28,6 +28,7 @@ import com.google.gson.annotations.SerializedName; import org.geysermc.api.connection.Connection; import org.geysermc.extension.connect.utils.Server; +import org.spongepowered.configurate.objectmapping.ConfigSerializable; import java.util.ArrayList; import java.util.List; @@ -47,10 +48,11 @@ public List loadServers(Connection session) { return new ArrayList<>(); } + @ConfigSerializable public enum StorageType { - @SerializedName("json") JSON(JsonStorageManager.class), - @SerializedName("sqlite") SQLITE(SQLiteStorageManager.class), - @SerializedName("mysql") MYSQL(MySQLStorageManager.class); + JSON(JsonStorageManager.class), + SQLITE(SQLiteStorageManager.class), + MYSQL(MySQLStorageManager.class); private final Class storageManager; diff --git a/src/main/java/org/geysermc/extension/connect/utils/Server.java b/src/main/java/org/geysermc/extension/connect/utils/Server.java index 49e5558..fb8322b 100644 --- a/src/main/java/org/geysermc/extension/connect/utils/Server.java +++ b/src/main/java/org/geysermc/extension/connect/utils/Server.java @@ -29,7 +29,9 @@ import org.geysermc.cumulus.util.FormImage; import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.api.network.RemoteServer; +import org.spongepowered.configurate.objectmapping.ConfigSerializable; +@ConfigSerializable public record Server( String address, int port, diff --git a/src/main/java/org/geysermc/extension/connect/utils/ServerCategory.java b/src/main/java/org/geysermc/extension/connect/utils/ServerCategory.java index 829e477..507764f 100644 --- a/src/main/java/org/geysermc/extension/connect/utils/ServerCategory.java +++ b/src/main/java/org/geysermc/extension/connect/utils/ServerCategory.java @@ -25,6 +25,9 @@ package org.geysermc.extension.connect.utils; +import org.spongepowered.configurate.objectmapping.ConfigSerializable; + +@ConfigSerializable public enum ServerCategory { OFFICIAL("Official"), GEYSER("Geyser"),