Skip to content

Commit 9772ed6

Browse files
committed
Handle edge case of parcel too large, returning items to player's inventory
1 parent 1383dde commit 9772ed6

7 files changed

Lines changed: 55 additions & 9 deletions

File tree

src/main/java/io/github/md5sha256/democracypost/database/DatabaseAdapter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ public void transferExpiredPackages(@Nonnull Duration returnPackageExpiryDuratio
5555
}
5656
}
5757

58+
public boolean isParcelTooLarge(@Nonnull PostalPackage postalPackage) {
59+
return this.schema.isParcelTooLarge(postalPackage);
60+
}
61+
5862
@Nonnull
5963
public List<PostalPackage> getPackagesForRecipient(@Nonnull UUID recipient) throws SQLException {
6064
try (Connection connection = this.dataSource.getConnection()) {

src/main/java/io/github/md5sha256/democracypost/database/DatabaseSchema.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,6 @@ void removePackage(@Nonnull Connection connection,
3232
@Nonnull
3333
PackageExpiryData getPackageExpiryData(@Nonnull Connection connection, @Nonnull UUID receiver, @Nonnull Duration fromExpiry)
3434
throws SQLException;
35+
36+
boolean isParcelTooLarge(@Nonnull PostalPackage postalPackage);
3537
}

src/main/java/io/github/md5sha256/democracypost/database/MariaSchema.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.github.md5sha256.democracypost.serializer.Serializers;
66
import org.bukkit.inventory.ItemStack;
77
import org.jetbrains.annotations.NotNull;
8+
import org.jspecify.annotations.NonNull;
89
import org.spongepowered.configurate.ConfigurateException;
910
import org.spongepowered.configurate.ConfigurationNode;
1011
import org.spongepowered.configurate.gson.GsonConfigurationLoader;
@@ -32,7 +33,6 @@
3233

3334
public class MariaSchema implements DatabaseSchema {
3435

35-
3636
private static final String CREATE_POST_PACKAGES_TABLE = """
3737
CREATE TABLE POST_PACKAGE (
3838
package_id BINARY(16) NOT NULL,
@@ -107,6 +107,12 @@ public String formatJdbcUrl(@NotNull String url) {
107107
return "jdbc:mariadb://" + url;
108108
}
109109

110+
@Override
111+
public boolean isParcelTooLarge(@NonNull PostalPackage postalPackage) {
112+
// 65535 is the BLOB max size
113+
return getBytes(postalPackage.content().items()).length > 65535;
114+
}
115+
110116
@Override
111117
public void initializeSchema(@Nonnull Connection connection) throws SQLException {
112118
try (PreparedStatement statementCreateTables = connection.prepareStatement(CREATE_POST_PACKAGES_TABLE);

src/main/java/io/github/md5sha256/democracypost/model/PostalPackageFactory.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,20 @@
55
import javax.annotation.Nonnull;
66
import java.util.List;
77
import java.util.UUID;
8+
import java.util.concurrent.CompletableFuture;
89

910
public interface PostalPackageFactory {
1011

12+
enum PostResult {
13+
SUCCESS,
14+
TOO_LARGE,
15+
UNKNOWN_ERROR,
16+
}
17+
1118
@Nonnull
1219
PostalPackage createPackage(@Nonnull UUID sender, @Nonnull UUID recipient, @Nonnull List<ItemStack> contents, boolean isReturn);
1320

14-
void createAndPostPackage(@Nonnull UUID sender, @Nonnull UUID recipient, @Nonnull List<ItemStack> contents, boolean isReturn);
21+
@Nonnull
22+
CompletableFuture<PostResult> createAndPostPackage(@Nonnull UUID sender, @Nonnull UUID recipient, @Nonnull List<ItemStack> contents, boolean isReturn);
1523

1624
}

src/main/java/io/github/md5sha256/democracypost/model/SimplePostalPackageFactory.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.Date;
1818
import java.util.List;
1919
import java.util.UUID;
20+
import java.util.concurrent.CompletableFuture;
2021
import java.util.logging.Logger;
2122

2223
public class SimplePostalPackageFactory implements PostalPackageFactory {
@@ -54,25 +55,35 @@ public PostalPackage createPackage(@NotNull UUID sender,
5455
}
5556

5657
@Override
57-
public void createAndPostPackage(@NotNull UUID sender,
58-
@NotNull UUID recipient,
59-
@NotNull List<ItemStack> contents,
60-
boolean isReturnPackage) {
58+
@Nonnull
59+
public CompletableFuture<PostResult> createAndPostPackage(@NotNull UUID sender,
60+
@NotNull UUID recipient,
61+
@NotNull List<ItemStack> contents,
62+
boolean isReturnPackage) {
63+
CompletableFuture<PostResult> future = new CompletableFuture<>();
6164
Logger logger = this.plugin.getLogger();
6265
BukkitScheduler scheduler = this.plugin.getServer().getScheduler();
66+
PostalPackage postalPackage = createPackage(sender, recipient, contents, isReturnPackage);
67+
if (this.adapter.isParcelTooLarge(postalPackage)) {
68+
future.complete(PostResult.TOO_LARGE);
69+
return future;
70+
}
6371
scheduler.runTaskAsynchronously(this.plugin, () -> {
6472
try {
65-
PostalPackage postalPackage = createPackage(sender, recipient, contents, isReturnPackage);
73+
6674
logger.fine("Posting package: " + postalPackage.id() + " sender: " + sender + " receiver: " + recipient);
6775
this.adapter.addPackage(postalPackage);
76+
future.complete(PostResult.SUCCESS);
6877
scheduler.runTask(this.plugin, () -> {
6978
OfflinePlayer senderPlayer = this.plugin.getServer().getOfflinePlayer(sender);
7079
this.mailService.notifyNewParcel(recipient, senderPlayer.getName());
7180
});
7281
} catch (SQLException ex) {
7382
logger.warning("Failed to post package!");
83+
future.complete(PostResult.UNKNOWN_ERROR);
7484
ex.printStackTrace();
7585
}
7686
});
87+
return future;
7788
}
7889
}

src/main/java/io/github/md5sha256/democracypost/ui/PostPrompt.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public PostPrompt(
5757
return this;
5858
}
5959
Conversable sender = context.getForWhom();
60-
if (!(context.getForWhom() instanceof Player player)) {
60+
if (!(sender instanceof Player player)) {
6161
return END_OF_CONVERSATION;
6262
}
6363
OfflinePlayer offlinePlayer = this.server.getOfflinePlayerIfCached(input);
@@ -77,7 +77,20 @@ public PostPrompt(
7777
sender.sendRawMessage(this.messageContainer.plaintextMessageFor("prompt.post-parcel.insufficient-balance"));
7878
return END_OF_CONVERSATION;
7979
}
80-
this.postalPackageFactory.createAndPostPackage(player.getUniqueId(), recipient, this.contents, false);
80+
this.postalPackageFactory.createAndPostPackage(player.getUniqueId(), recipient, this.contents, false)
81+
.thenAccept(result -> {
82+
var messageKey = switch (result) {
83+
case SUCCESS -> null;
84+
case TOO_LARGE -> "prompt.post-parcel.parcel-too-large";
85+
case UNKNOWN_ERROR -> "prompt.post-parcel.send-parcel-failed";
86+
};
87+
if (messageKey == null) {
88+
return;
89+
}
90+
player.getInventory().addItem(this.contents.toArray(ItemStack[]::new));
91+
var message = this.messageContainer.plaintextMessageFor(messageKey);
92+
sender.sendRawMessage(message);
93+
});
8194
sender.sendRawMessage(this.messageContainer.plaintextMessageFor("prompt.post-parcel.send-parcel-success"));
8295
return END_OF_CONVERSATION;
8396
}

src/main/resources/en.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ prompt:
2222
unknown-player: 'Unknown player: %player%'
2323
send-parcel-self: "You can't mail a parcel to yourself!"
2424
send-parcel-success: "Parcel mailed!"
25+
send-parcel-failed: "Parcel mailing failed, the parcel has been returned to your inventory."
26+
parcel-too-large: "Parcel too large to send, please split up your items into smaller parcels!"
2527

2628
menu:
2729

0 commit comments

Comments
 (0)