From 12e430669954fb3490dde713dad2448d5721ff8f Mon Sep 17 00:00:00 2001 From: Technofied <40795318+Technofied@users.noreply.github.com> Date: Sat, 20 Jun 2026 15:35:17 +0800 Subject: [PATCH 1/2] fix: skip items that could not be deserialised --- .../democracypost/DemocracyPost.java | 2 +- .../database/DatabaseAdapter.java | 5 +++-- .../democracypost/database/MariaSchema.java | 22 +++++++++++++++++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/github/md5sha256/democracypost/DemocracyPost.java b/src/main/java/io/github/md5sha256/democracypost/DemocracyPost.java index c0a7719..fc6e606 100644 --- a/src/main/java/io/github/md5sha256/democracypost/DemocracyPost.java +++ b/src/main/java/io/github/md5sha256/democracypost/DemocracyPost.java @@ -173,7 +173,7 @@ public void onDisable() { @Nonnull private DatabaseAdapter initDatabase() throws IOException { - DatabaseAdapter adapter = new DatabaseAdapter(this.settings.databaseSettings()); + DatabaseAdapter adapter = new DatabaseAdapter(this.settings.databaseSettings(), getLogger()); try { adapter.init(); } catch (SQLException ex) { diff --git a/src/main/java/io/github/md5sha256/democracypost/database/DatabaseAdapter.java b/src/main/java/io/github/md5sha256/democracypost/database/DatabaseAdapter.java index 11ce49c..9862746 100644 --- a/src/main/java/io/github/md5sha256/democracypost/database/DatabaseAdapter.java +++ b/src/main/java/io/github/md5sha256/democracypost/database/DatabaseAdapter.java @@ -12,6 +12,7 @@ import java.time.Duration; import java.util.List; import java.util.UUID; +import java.util.logging.Logger; public class DatabaseAdapter implements Closeable { @@ -20,9 +21,9 @@ public class DatabaseAdapter implements Closeable { private HikariDataSource dataSource; - public DatabaseAdapter(@Nonnull DatabaseSettings databaseSettings) { + public DatabaseAdapter(@Nonnull DatabaseSettings databaseSettings, @Nonnull Logger logger) { this.databaseSettings = databaseSettings; - this.schema = new MariaSchema(); + this.schema = new MariaSchema(logger); } public void init() throws SQLException { diff --git a/src/main/java/io/github/md5sha256/democracypost/database/MariaSchema.java b/src/main/java/io/github/md5sha256/democracypost/database/MariaSchema.java index 2d0800d..25da581 100644 --- a/src/main/java/io/github/md5sha256/democracypost/database/MariaSchema.java +++ b/src/main/java/io/github/md5sha256/democracypost/database/MariaSchema.java @@ -26,13 +26,20 @@ import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.ArrayList; -import java.util.Collections; import java.util.Date; import java.util.List; import java.util.UUID; +import java.util.logging.Logger; + public class MariaSchema implements DatabaseSchema { + private final Logger logger; + + public MariaSchema(@Nonnull Logger logger) { + this.logger = logger; + } + private static final String CREATE_POST_PACKAGES_TABLE = """ CREATE TABLE POST_PACKAGE ( package_id BINARY(16) NOT NULL, @@ -225,7 +232,18 @@ private List getItemStacks(@Nonnull byte[] bytes) { .defaultOptions(options -> options.serializers(Serializers.defaults())); try { ConfigurationNode node = builder.buildAndLoadString(s); - return node.getList(ItemStack.class, Collections.emptyList()); + List items = new ArrayList<>(); + for (ConfigurationNode child : node.childrenList()) { + try { + ItemStack item = child.get(ItemStack.class); + if (item != null) { + items.add(item); + } + } catch (ConfigurateException ex) { + this.logger.warning("Skipping item that could not be deserialized: " + ex.getMessage()); + } + } + return items; } catch (ConfigurateException ex) { throw new IllegalStateException("Failed to deserialize item stacks!", ex); } From b0caeff5706da225837f315746f0b872596286c2 Mon Sep 17 00:00:00 2001 From: Technofied <40795318+Technofied@users.noreply.github.com> Date: Sat, 20 Jun 2026 18:04:28 +0800 Subject: [PATCH 2/2] feat: undeserialisable config option --- .../io/github/md5sha256/democracypost/DemocracyPost.java | 2 +- .../io/github/md5sha256/democracypost/PostSettings.java | 3 ++- .../md5sha256/democracypost/database/DatabaseAdapter.java | 4 ++-- .../md5sha256/democracypost/database/MariaSchema.java | 7 ++++++- src/main/resources/settings.yml | 1 + 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/github/md5sha256/democracypost/DemocracyPost.java b/src/main/java/io/github/md5sha256/democracypost/DemocracyPost.java index fc6e606..5e470cf 100644 --- a/src/main/java/io/github/md5sha256/democracypost/DemocracyPost.java +++ b/src/main/java/io/github/md5sha256/democracypost/DemocracyPost.java @@ -173,7 +173,7 @@ public void onDisable() { @Nonnull private DatabaseAdapter initDatabase() throws IOException { - DatabaseAdapter adapter = new DatabaseAdapter(this.settings.databaseSettings(), getLogger()); + DatabaseAdapter adapter = new DatabaseAdapter(this.settings.databaseSettings(), getLogger(), this.settings.postSettings().skipUndeserializableItems()); try { adapter.init(); } catch (SQLException ex) { diff --git a/src/main/java/io/github/md5sha256/democracypost/PostSettings.java b/src/main/java/io/github/md5sha256/democracypost/PostSettings.java index 9b19c73..57fc08d 100644 --- a/src/main/java/io/github/md5sha256/democracypost/PostSettings.java +++ b/src/main/java/io/github/md5sha256/democracypost/PostSettings.java @@ -12,7 +12,8 @@ public record PostSettings( @Setting @Required long packageExpirySeconds, @Setting @Required long returnPackageExpirySeconds, @Setting @Required long expiryNotificationExpiryThresholdSeconds, - @Setting @Required double postPrice + @Setting @Required double postPrice, + @Setting @Required boolean skipUndeserializableItems ) { @Nonnull diff --git a/src/main/java/io/github/md5sha256/democracypost/database/DatabaseAdapter.java b/src/main/java/io/github/md5sha256/democracypost/database/DatabaseAdapter.java index 9862746..30145e0 100644 --- a/src/main/java/io/github/md5sha256/democracypost/database/DatabaseAdapter.java +++ b/src/main/java/io/github/md5sha256/democracypost/database/DatabaseAdapter.java @@ -21,9 +21,9 @@ public class DatabaseAdapter implements Closeable { private HikariDataSource dataSource; - public DatabaseAdapter(@Nonnull DatabaseSettings databaseSettings, @Nonnull Logger logger) { + public DatabaseAdapter(@Nonnull DatabaseSettings databaseSettings, @Nonnull Logger logger, boolean skipUndeserializableItems) { this.databaseSettings = databaseSettings; - this.schema = new MariaSchema(logger); + this.schema = new MariaSchema(logger, skipUndeserializableItems); } public void init() throws SQLException { diff --git a/src/main/java/io/github/md5sha256/democracypost/database/MariaSchema.java b/src/main/java/io/github/md5sha256/democracypost/database/MariaSchema.java index 25da581..3dd7e45 100644 --- a/src/main/java/io/github/md5sha256/democracypost/database/MariaSchema.java +++ b/src/main/java/io/github/md5sha256/democracypost/database/MariaSchema.java @@ -35,9 +35,11 @@ public class MariaSchema implements DatabaseSchema { private final Logger logger; + private final boolean skipUndeserializableItems; - public MariaSchema(@Nonnull Logger logger) { + public MariaSchema(@Nonnull Logger logger, boolean skipUndeserializableItems) { this.logger = logger; + this.skipUndeserializableItems = skipUndeserializableItems; } private static final String CREATE_POST_PACKAGES_TABLE = """ @@ -240,6 +242,9 @@ private List getItemStacks(@Nonnull byte[] bytes) { items.add(item); } } catch (ConfigurateException ex) { + if (!this.skipUndeserializableItems) { + throw new IllegalStateException("Failed to deserialize item stacks!", ex); + } this.logger.warning("Skipping item that could not be deserialized: " + ex.getMessage()); } } diff --git a/src/main/resources/settings.yml b/src/main/resources/settings.yml index 1dec62f..d624596 100644 --- a/src/main/resources/settings.yml +++ b/src/main/resources/settings.yml @@ -13,6 +13,7 @@ post-settings: return-package-expiry-seconds: 2592000 expiry-notification-expiry-threshold-seconds: 259200 post-price: 0.50 + skip-undeserializable-items: true save-duration-seconds: 600 join-message-delay-seconds: 10