Skip to content

Commit 375dc08

Browse files
Jakubk15coderabbitai[bot]imDMK
authored
GH-121 Enhanced delivery logic
* Begin coding enhanced delivery logic * Remove delivery object from repo after task completion * use ParcelSendTask * add DurationComposer * Reorder methods * Bump cdn, fix composer registration * Use DeliveryWrapper class in database instead of Delivery * Remove duplicate code, bump deps, downgrade spigot-api to 1.21.4 due to SignGUI incompatibility * Temporarily change default parcel delivery delay * Do not return immutable list if optional is empty * Make debug commands executable from console * Remove Vault left-overs * changes in gradle config * Adjust colors in debug messages * Remove unnecessary messages, fix GUI items propagation * Update build.gradle.kts Migrate to new PaperMC repo endpoint * Update src/main/java/com/eternalcode/parcellockers/configuration/composer/DurationComposer.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Refactor sendParcel to Result * More robust result handling, fix GUI slot painting * Rewrite DurationComposer * Add Copilot-generated unit test * Enhance serialize() method * Disallow negative durations * Delete redundant DurationUtil, remove debug breadcrumbs, properly parse fractal durations * Fix unit test * Fix unit test * Remove debug main method * Update src/main/java/com/eternalcode/parcellockers/command/debug/DebugCommand.java Co-authored-by: DMK <[email protected]> * Update src/main/java/com/eternalcode/parcellockers/parcel/task/ParcelSendTask.java Co-authored-by: DMK <[email protected]> * Update src/main/java/com/eternalcode/parcellockers/parcel/task/ParcelSendTask.java Co-authored-by: DMK <[email protected]> * Update src/main/java/com/eternalcode/parcellockers/command/debug/DebugCommand.java Co-authored-by: DMK <[email protected]> * Update src/main/java/com/eternalcode/parcellockers/command/debug/DebugCommand.java Co-authored-by: DMK <[email protected]> * Update src/main/java/com/eternalcode/parcellockers/command/debug/DebugCommand.java Co-authored-by: DMK <[email protected]> * Update src/main/java/com/eternalcode/parcellockers/command/debug/DebugCommand.java Co-authored-by: DMK <[email protected]> * Update src/main/java/com/eternalcode/parcellockers/gui/implementation/locker/ParcelSendingGuiState.java Co-authored-by: DMK <[email protected]> * Apply DMK's suggestions * Fix build, don't use deprecated methods in SkullAPI * Fix unit tests loading * bump minecraft to 1.21.7 and update papermc repo url --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: DMK <[email protected]>
1 parent 904f704 commit 375dc08

31 files changed

+591
-290
lines changed

build.gradle.kts

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,13 @@ repositories {
1717
maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") }
1818
maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") }
1919
maven { url = uri("https://oss.sonatype.org/content/repositories/central") }
20-
maven { url = uri("https://papermc.io/repo/repository/maven-public/") }
20+
maven { url = uri("https://repo.papermc.io/repository/maven-public/") }
2121
maven { url = uri("https://repo.eternalcode.pl/releases") }
22-
maven { url = uri("https://repository.minecodes.pl/releases") }
23-
maven { url = uri("https://jitpack.io") }
2422
}
2523

2624
dependencies {
2725
// minecraft development api
28-
compileOnly("org.spigotmc:spigot-api:1.21.4-R0.1-SNAPSHOT")
26+
compileOnly("org.spigotmc:spigot-api:1.21.7-R0.1-SNAPSHOT")
2927
implementation("net.kyori:adventure-platform-bukkit:4.4.0")
3028
implementation("net.kyori:adventure-text-minimessage:4.23.0")
3129
implementation("dev.rollczi:litecommands-bukkit:3.10.0")
@@ -38,9 +36,6 @@ dependencies {
3836
implementation("dev.triumphteam:triumph-gui:3.1.11")
3937
implementation("de.rapha149.signgui:signgui:2.5.3")
4038

41-
// economy
42-
compileOnly("com.github.MilkBowl:VaultAPI:1.7.1")
43-
4439
// CDN
4540
implementation("net.dzikoysk:cdn:1.14.9")
4641

@@ -86,6 +81,7 @@ dependencies {
8681
testImplementation("org.junit.jupiter:junit-jupiter-api:5.13.2")
8782
testImplementation("org.junit.jupiter:junit-jupiter-params:5.13.2")
8883
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.13.2")
84+
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
8985

9086
testImplementation("org.testcontainers:junit-jupiter:1.21.3")
9187
testImplementation("org.testcontainers:mysql:1.21.3")
@@ -119,17 +115,10 @@ tasks {
119115
minecraftVersion("1.21.4")
120116
}
121117

122-
cleanPaperPluginsCache {
118+
clean {
123119
doLast {
124120
project.file("run/plugins").deleteRecursively()
125-
}
126-
}
127-
128-
cleanPaperCache {
129-
doLast {
130-
project.file("run/cache").deleteRecursively()
131121
project.file("run/logs").deleteRecursively()
132-
project.file("run/versions").deleteRecursively()
133122
}
134123
}
135124

@@ -138,7 +127,7 @@ tasks {
138127
}
139128

140129
shadowJar {
141-
archiveFileName.set("ParcelLockers v${project.version} (MC 1.21.3-1.21.4).jar")
130+
archiveFileName.set("ParcelLockers v${project.version}.jar")
142131

143132
exclude(
144133
"org/intellij/lang/annotations/**",

src/main/java/com/eternalcode/parcellockers/ParcelLockers.java

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.eternalcode.parcellockers.content.repository.ParcelContentRepository;
1313
import com.eternalcode.parcellockers.content.repository.ParcelContentRepositoryOrmLite;
1414
import com.eternalcode.parcellockers.database.DatabaseManager;
15+
import com.eternalcode.parcellockers.delivery.repository.DeliveryRepositoryOrmLite;
1516
import com.eternalcode.parcellockers.gui.implementation.locker.LockerMainGui;
1617
import com.eternalcode.parcellockers.gui.implementation.remote.MainGui;
1718
import com.eternalcode.parcellockers.gui.implementation.remote.ParcelListGui;
@@ -27,10 +28,12 @@
2728
import com.eternalcode.parcellockers.notification.NotificationAnnouncer;
2829
import com.eternalcode.parcellockers.parcel.Parcel;
2930
import com.eternalcode.parcellockers.parcel.ParcelManager;
31+
import com.eternalcode.parcellockers.parcel.ParcelStatus;
3032
import com.eternalcode.parcellockers.parcel.command.ParcelCommand;
3133
import com.eternalcode.parcellockers.parcel.command.argument.ParcelArgument;
3234
import com.eternalcode.parcellockers.parcel.repository.ParcelCache;
3335
import com.eternalcode.parcellockers.parcel.repository.ParcelRepositoryOrmLite;
36+
import com.eternalcode.parcellockers.parcel.task.ParcelSendTask;
3437
import com.eternalcode.parcellockers.updater.UpdaterService;
3538
import com.eternalcode.parcellockers.user.UserManager;
3639
import com.eternalcode.parcellockers.user.controller.LoadUserController;
@@ -52,21 +55,21 @@
5255
import io.sentry.Sentry;
5356
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
5457
import net.kyori.adventure.text.minimessage.MiniMessage;
55-
import net.milkbowl.vault.economy.Economy;
5658
import org.bstats.bukkit.Metrics;
5759
import org.bukkit.Server;
5860
import org.bukkit.command.CommandSender;
59-
import org.bukkit.plugin.RegisteredServiceProvider;
6061
import org.bukkit.plugin.java.JavaPlugin;
62+
import org.slf4j.helpers.NOPLogger;
6163

6264
import java.sql.SQLException;
6365
import java.time.Duration;
66+
import java.util.ArrayList;
6467
import java.util.Arrays;
68+
import java.util.List;
6569
import java.util.concurrent.TimeUnit;
6670
import java.util.logging.Level;
6771
import java.util.logging.Logger;
6872
import java.util.stream.Stream;
69-
import org.slf4j.helpers.NOPLogger;
7073

7174
public final class ParcelLockers extends JavaPlugin {
7275

@@ -75,7 +78,7 @@ public final class ParcelLockers extends JavaPlugin {
7578
private LiteCommands<CommandSender> liteCommands;
7679
private BukkitAudiences audiences;
7780
private SkullAPI skullAPI;
78-
private Economy economy;
81+
7982
private DatabaseManager databaseManager;
8083

8184
@Override
@@ -141,15 +144,16 @@ public void onEnable() {
141144
ParcelRepositoryOrmLite parcelRepository = new ParcelRepositoryOrmLite(databaseManager, scheduler, parcelCache);
142145
parcelRepository.updateCaches();
143146

147+
DeliveryRepositoryOrmLite deliveryRepository = new DeliveryRepositoryOrmLite(databaseManager, scheduler);
148+
144149
ParcelContentRepository parcelContentRepository = new ParcelContentRepositoryOrmLite(databaseManager, scheduler);
145-
ParcelManager parcelManager = new ParcelManager(config, announcer, parcelRepository, parcelContentRepository, scheduler);
150+
ParcelManager parcelManager = new ParcelManager(config, announcer, parcelRepository, deliveryRepository, parcelContentRepository, scheduler);
146151

147152
ItemStorageRepository itemStorageRepository = new ItemStorageRepositoryOrmLite(databaseManager, scheduler);
148153

149154
UserRepository userRepository = new UserRepositoryOrmLite(databaseManager, scheduler);
150155
UserManager userManager = new UserManager(userRepository);
151156

152-
153157
MainGui mainGUI = new MainGui(this, server, miniMessage, config, parcelRepository, lockerRepository, userManager);
154158
ParcelListGui parcelListGUI = new ParcelListGui(this, server, miniMessage, config, parcelRepository, lockerRepository, userManager, mainGUI);
155159

@@ -168,12 +172,6 @@ public void onEnable() {
168172
.missingPermission(new PermissionMessage(announcer, config))
169173
.build();
170174

171-
/*if (!this.setupEconomy()) {
172-
this.getLogger().severe("Disabling due to no Vault dependency or its implementator(s) found!");
173-
server.getPluginManager().disablePlugin(this);
174-
return;
175-
}*/
176-
177175
LockerMainGui lockerMainGUI = new LockerMainGui(this, miniMessage, config, itemStorageRepository, parcelRepository, lockerRepository, announcer, parcelContentRepository, userRepository, this.skullAPI, parcelManager);
178176

179177
Stream.of(
@@ -187,6 +185,24 @@ public void onEnable() {
187185
new Metrics(this, 17677);
188186
new UpdaterService(this.getDescription());
189187

188+
parcelRepository.findAll().thenAccept(optionalParcels -> {
189+
List<Parcel> parcels = optionalParcels.orElseGet(ArrayList::new).stream()
190+
.filter(parcel -> parcel.status() != ParcelStatus.DELIVERED)
191+
.toList();
192+
193+
parcels.forEach(parcel ->
194+
deliveryRepository.find(parcel.uuid()).thenAccept(optionalDelivery ->
195+
optionalDelivery.ifPresent(delivery -> {
196+
long delay = Math.max(0, delivery.deliveryTimestamp().toEpochMilli() - System.currentTimeMillis());
197+
scheduler.runLaterAsync(
198+
new ParcelSendTask(parcel, delivery, parcelRepository, deliveryRepository, config),
199+
Duration.ofMillis(delay)
200+
);
201+
})
202+
)
203+
);
204+
});
205+
190206
long millis = started.elapsed(TimeUnit.MILLISECONDS);
191207
this.getLogger().log(Level.INFO, "Successfully enabled ParcelLockers in {0}ms", millis);
192208
}
@@ -227,24 +243,6 @@ private void softwareCheck() {
227243
logger.info("Your server is running on supported software, congratulations!");
228244
logger.info("Server version: " + this.getServer().getVersion());
229245
}
230-
231-
private boolean setupEconomy() {
232-
if (this.getServer().getPluginManager().getPlugin("Vault") == null) {
233-
return false;
234-
}
235-
236-
RegisteredServiceProvider<Economy> rsp = this.getServer().getServicesManager().getRegistration(Economy.class);
237-
if (rsp == null) {
238-
return false; // Vault is installed but no economy plugin is registered (e.g. EssentialsX) - majk
239-
}
240-
241-
this.economy = rsp.getProvider();
242-
return true;
243-
}
244-
245-
public Economy getEconomy() {
246-
return this.economy;
247-
}
248246
}
249247

250248

src/main/java/com/eternalcode/parcellockers/ParcelLockersCommand.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.eternalcode.parcellockers.configuration.ConfigurationManager;
44
import com.eternalcode.parcellockers.configuration.implementation.PluginConfiguration;
55
import com.eternalcode.parcellockers.notification.NotificationAnnouncer;
6-
import dev.rollczi.litecommands.annotations.async.Async;
76
import dev.rollczi.litecommands.annotations.command.Command;
87
import dev.rollczi.litecommands.annotations.context.Context;
98
import dev.rollczi.litecommands.annotations.execute.Execute;
@@ -26,8 +25,7 @@ public ParcelLockersCommand(ConfigurationManager configManager, PluginConfigurat
2625
this.announcer = announcer;
2726
}
2827

29-
@Async
30-
@Execute(name = "reload", aliases = { "rl" })
28+
@Execute(name = "reload")
3129
void reload(@Context CommandSender sender) {
3230
this.configManager.reload();
3331
this.announcer.sendMessage(sender, this.config.messages.reload);

src/main/java/com/eternalcode/parcellockers/command/debug/DebugCommand.java

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import dev.rollczi.litecommands.annotations.execute.Execute;
1212
import dev.rollczi.litecommands.annotations.permission.Permission;
1313
import org.bukkit.Material;
14+
import org.bukkit.command.CommandSender;
1415
import org.bukkit.entity.Player;
1516
import org.bukkit.inventory.ItemStack;
1617

@@ -37,44 +38,44 @@ public DebugCommand(ParcelRepository parcelRepository, LockerRepository lockerRe
3738
this.announcer = announcer;
3839
}
3940

40-
@Execute(name = "deleteparcels")
41-
void deleteParcels(@Context Player player) {
41+
@Execute(name = "delete parcels")
42+
void deleteParcels(@Context CommandSender sender) {
4243
this.parcelRepository.removeAll().exceptionally(throwable -> {
43-
this.announcer.sendMessage(player, "&cFailed to delete parcels");
44+
this.announcer.sendMessage(sender, "&4Failed to delete parcels");
4445
return null;
45-
}).thenRun(() -> this.announcer.sendMessage(player, "&aParcels deleted"));
46+
}).thenRun(() -> this.announcer.sendMessage(sender, "&cParcels deleted"));
4647
}
4748

48-
@Execute(name = "deletelockers")
49-
void deleteLockers(@Context Player player) {
49+
@Execute(name = "delete lockers")
50+
void deleteLockers(@Context CommandSender sender) {
5051
this.lockerRepository.removeAll().exceptionally(throwable -> {
51-
this.announcer.sendMessage(player, "&cFailed to delete lockers");
52+
this.announcer.sendMessage(sender, "&4Failed to delete lockers");
5253
return null;
53-
}).thenRun(() -> this.announcer.sendMessage(player, "&aLockers deleted"));
54+
}).thenRun(() -> this.announcer.sendMessage(sender, "&cLockers deleted"));
5455
}
5556

56-
@Execute(name = "deleteitemstorages")
57-
void deleteItemStorages(@Context Player player) {
57+
@Execute(name = "delete itemstorages")
58+
void deleteItemStorages(@Context CommandSender sender) {
5859
this.itemStorageRepository.removeAll().exceptionally(throwable -> {
59-
this.announcer.sendMessage(player, "&cFailed to delete item storages");
60+
this.announcer.sendMessage(sender, "&4Failed to delete item storages");
6061
return null;
61-
}).thenRun(() -> this.announcer.sendMessage(player, "&aItem storages deleted"));
62+
}).thenRun(() -> this.announcer.sendMessage(sender, "&cItem storages deleted"));
6263
}
6364

64-
@Execute(name = "deleteparcelcontents")
65-
void deleteParcelContents(@Context Player player) {
65+
@Execute(name = "delete parcelcontents")
66+
void deleteParcelContents(@Context CommandSender sender) {
6667
this.contentRepository.removeAll().exceptionally(throwable -> {
67-
this.announcer.sendMessage(player, "&cFailed to delete parcel contents");
68+
this.announcer.sendMessage(sender, "&4Failed to delete parcel contents");
6869
return null;
69-
}).thenRun(() -> this.announcer.sendMessage(player, "&aParcel contents deleted"));
70+
}).thenRun(() -> this.announcer.sendMessage(sender, "&cParcel contents deleted"));
7071
}
7172

72-
@Execute(name = "deleteall")
73-
void deleteAll(@Context Player player) {
74-
this.deleteItemStorages(player);
75-
this.deleteLockers(player);
76-
this.deleteParcels(player);
77-
this.deleteParcelContents(player);
73+
@Execute(name = "delete all")
74+
void deleteAll(@Context CommandSender sender) {
75+
this.deleteItemStorages(sender);
76+
this.deleteLockers(sender);
77+
this.deleteParcels(sender);
78+
this.deleteParcelContents(sender);
7879
}
7980

8081
@Execute(name = "getrandomitem")

src/main/java/com/eternalcode/parcellockers/configuration/ConfigurationManager.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.eternalcode.parcellockers.configuration;
22

3+
import com.eternalcode.parcellockers.configuration.composer.DurationComposer;
34
import com.eternalcode.parcellockers.configuration.composer.PositionComposer;
5+
import com.eternalcode.parcellockers.shared.Position;
46
import net.dzikoysk.cdn.Cdn;
57
import net.dzikoysk.cdn.CdnFactory;
68

79
import java.io.File;
10+
import java.time.Duration;
811
import java.util.HashSet;
912
import java.util.Set;
1013

@@ -13,7 +16,8 @@ public class ConfigurationManager {
1316
private static final Cdn CDN = CdnFactory
1417
.createYamlLike()
1518
.getSettings()
16-
.withComposer(PositionComposer.class, new PositionComposer())
19+
.withComposer(Position.class, new PositionComposer())
20+
.withComposer(Duration.class, new DurationComposer())
1721
.build();
1822

1923
private final Set<ReloadableConfig> configs = new HashSet<>();

0 commit comments

Comments
 (0)