diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/jail/JailedPlayer.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/jail/JailedPlayer.java index 4a8d62a1b..7714313b0 100644 --- a/eternalcore-api/src/main/java/com/eternalcode/core/feature/jail/JailedPlayer.java +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/jail/JailedPlayer.java @@ -1,48 +1,58 @@ package com.eternalcode.core.feature.jail; +import org.bukkit.Location; + import java.time.Duration; import java.time.Instant; import java.util.UUID; -public class JailedPlayer { - - private final UUID player; - private final Instant detainedAt; - private final Duration prisonTime; - private final String detainedBy; - - public JailedPlayer(UUID player, Instant detainedAt, Duration prisonTime, String lockedUpBy) { - this.player = player; - this.detainedAt = detainedAt; - this.prisonTime = prisonTime; - this.detainedBy = lockedUpBy; - } - - public UUID getPlayerUniqueId() { - return this.player; - } - - public Instant getDetainedAt() { - return this.detainedAt; - } - - public String getDetainedBy() { - return this.detainedBy; - } - - public Duration getPrisonTime() { - return this.prisonTime; - } - - public boolean isPrisonExpired() { - return this.detainedAt.plus(this.prisonTime).isBefore(Instant.now()); - } - - public Instant getReleaseTime() { - return Instant.now().plus(this.prisonTime); - } - - public Duration getRemainingTime() { - return Duration.between(Instant.now(), this.detainedAt.plus(this.prisonTime)); - } +public interface JailedPlayer { + + /** + * Gets the player's UUID. + * @return player's UUID. + */ + UUID playerUniqueId(); + + /** + * Gets the time when the player was detained. + * @return time when the player was detained. + */ + Instant detainedAt(); + + /** + * Gets the name of the player who detained the player. + * @return name of player. + */ + String detainedBy(); + + /** + * Gets the time the player is jailed. + * @return time the player is jailed. + */ + Duration prisonTime(); + + /** + * Gets the jail position where the player is teleported when detained. + * @return last location of player. + */ + Location lastLocation(); + + /** + * Checks if the jail has expired. + * @return true if the jail has expired, false otherwise. + */ + boolean isPrisonExpired(); + + /** + * Gets the time when the player was released. + * @return time when the player was released. + */ + Instant releaseTime(); + + /** + * Gets the remaining time of the jail. + * @return remaining time of the jail. + */ + Duration remainingTime(); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0033_Rename_jail_section.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0033_Rename_jail_section.java new file mode 100644 index 000000000..680ecb967 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0033_Rename_jail_section.java @@ -0,0 +1,38 @@ +package com.eternalcode.core.configuration.migrations; + +import static eu.okaeri.configs.migrate.ConfigMigrationDsl.move; + +import eu.okaeri.configs.migrate.builtin.NamedMigration; + +public class Migration_0033_Rename_jail_section extends NamedMigration { + + Migration_0033_Rename_jail_section() { + super( + "Rename jail section", + + move("jailSection.jailLocationSet", "jail.locationSet"), + move("jailSection.jailLocationRemove", "jail.locationRemove"), + move("jailSection.jailLocationNotSet", "jail.locationNotSet"), + move("jailSection.jailLocationOverride", "jail.locationOverride"), + + move("jailSection.jailDetainBroadcast", "jail.detainBroadcast"), + move("jailSection.jailDetainPrivate", "jail.detained"), + move("jailSection.jailDetainCountdown", "jail.detainCountdown"), + move("jailSection.jailDetainOverride", "jail.detainOverride"), + move("jailSection.jailDetainAdmin", "jail.detainAdmin"), + + move("jailSection.jailReleaseBroadcast", "jail.releaseBroadcast"), + move("jailSection.jailReleasePrivate", "jail.released"), + move("jailSection.jailReleaseAll", "jail.releaseAll"), + move("jailSection.jailReleaseNoPlayers", "jail.releaseNoPlayers"), + move("jailSection.jailIsNotPrisoner", "jail.isNotPrisoner"), + + move("jailSection.jailListHeader", "jail.listHeader"), + move("jailSection.jailListEmpty", "jail.listEmpty"), + move("jailSection.jailListPlayerEntry", "jail.listPlayerEntry"), + + move("jailSection.jailCannotUseCommand", "jail.cannotUseCommand"), + move("jailSection.allowedCommands", "jail.restrictedCommands") + ); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java index bb1e22b1d..5241789df 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java @@ -20,5 +20,7 @@ public class Migrations { new Migration_0015_Move_ignore_messages_to_dedicated_section(), new Migration_0031_Move_death_messages_to_dedicated_section(), new Migration_0032_Move_join_quit_messages_to_dedicated_section(), - }; + new Migration_0033_Rename_jail_section() + }; + } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/database/persister/PositionPersister.java b/eternalcore-core/src/main/java/com/eternalcode/core/database/persister/PositionPersister.java new file mode 100644 index 000000000..f9239cd8b --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/database/persister/PositionPersister.java @@ -0,0 +1,70 @@ +package com.eternalcode.core.database.persister; + +import com.eternalcode.commons.bukkit.position.Position; +import com.eternalcode.commons.bukkit.position.PositionAdapter; +import com.j256.ormlite.field.FieldType; +import com.j256.ormlite.field.SqlType; +import com.j256.ormlite.field.types.BaseDataType; +import com.j256.ormlite.support.DatabaseResults; + +import java.sql.SQLException; + +public class PositionPersister extends BaseDataType { + + private static final PositionPersister instance = new PositionPersister(); + + private PositionPersister() { + super(SqlType.LONG_STRING, new Class[] {Position.class}); + } + + @Override + public Object javaToSqlArg(FieldType fieldType, Object javaObject) { + if (javaObject == null) { + return null; + } + + if (!(javaObject instanceof Position position)) { + throw new IllegalArgumentException("Invalid object type: " + javaObject.getClass().getName()); + } + + return position.toString(); + } + + @Override + public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, int columnPos) throws SQLException { + return results.getString(columnPos); + } + + @Override + public Object parseDefaultString(FieldType fieldType, String defaultStr) { + return String.valueOf(defaultStr); + } + + @Override + public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) { + String s = (String) sqlArg; + + if (s == null) { + return null; + } + + String[] params = s.split("/"); + + if (params.length != 6) { + throw new IllegalArgumentException("Invalid position format: " + s); + } + + return new Position( + Double.parseDouble(params[1]), + Double.parseDouble(params[2]), + Double.parseDouble(params[3]), + Float.parseFloat(params[4]), + Float.parseFloat(params[5]), + params[0] + ); + } + + public static PositionPersister getSingleton() { + return instance; + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/database/HomeTable.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/database/HomeTable.java index fd8e913d0..e2c4a343d 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/database/HomeTable.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/database/HomeTable.java @@ -40,4 +40,3 @@ static HomeTable from(Home home) { return new HomeTable(home.getUuid(), home.getOwner(), home.getName(), home.getLocation()); } } - diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/homeadmin/HomeAdminCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/homeadmin/HomeAdminCommand.java index 60fd23b01..e667f914e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/homeadmin/HomeAdminCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/home/homeadmin/HomeAdminCommand.java @@ -144,4 +144,3 @@ private String formattedListUserHomes(UUID uniqueId) { .collect(Collectors.joining(this.pluginConfiguration.format.separator)); } } - diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailCommand.java index c46e24605..63eb0ac27 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailCommand.java @@ -1,7 +1,13 @@ package com.eternalcode.core.feature.jail; +import static com.eternalcode.core.feature.jail.JailPermissionConstant.JAIL_BYPASS_PERMISSION; +import static com.eternalcode.core.feature.jail.JailPermissionConstant.JAIL_COMMAND_PERMISSION; +import static com.eternalcode.core.feature.jail.JailPermissionConstant.JAIL_DETAIN_PERMISSION; +import static com.eternalcode.core.feature.jail.JailPermissionConstant.JAIL_LIST_PERMISSION; +import static com.eternalcode.core.feature.jail.JailPermissionConstant.JAIL_RELEASE_PERMISSION; +import static com.eternalcode.core.feature.jail.JailPermissionConstant.JAIL_SETUP_PERMISSION; + import com.eternalcode.annotations.scan.command.DescriptionDocs; -import com.eternalcode.annotations.scan.permission.PermissionDocs; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; import com.eternalcode.core.util.DurationUtil; @@ -17,15 +23,9 @@ import org.bukkit.entity.Player; @Command(name = "jail") -@PermissionDocs( - name = "Jail Bypass", - permission = JailCommand.JAIL_BYPASS, - description = "Permission allows to bypass jail punishment" -) +@Permission(JAIL_COMMAND_PERMISSION) class JailCommand { - static final String JAIL_BYPASS = "eternalcore.jail.bypass"; - private final JailService jailService; private final NoticeService noticeService; private final JailSettings jailSettings; @@ -41,7 +41,7 @@ class JailCommand { @Async @Execute(name = "setup") - @Permission("eternalcore.jail.setup") + @Permission(JAIL_SETUP_PERMISSION) @DescriptionDocs(description = "Define jail spawn area") void executeJailSetup(@Sender Player player) { Location location = player.getLocation(); @@ -51,15 +51,15 @@ void executeJailSetup(@Sender Player player) { this.noticeService.create() .notice(translation -> (isLastJailSet - ? translation.jailSection().jailLocationOverride() - : translation.jailSection().jailLocationSet())) + ? translation.jail().locationOverride() + : translation.jail().locationSet())) .player(player.getUniqueId()) .send(); } @Async @Execute(name = "setup") - @Permission("eternalcore.jail.setup") + @Permission(JAIL_SETUP_PERMISSION) @DescriptionDocs(description = "Define jail spawn area", arguments = "") void executeJailSetup(@Sender Player player, @Arg Location location) { boolean isLastJailSet = this.jailService.getJailAreaLocation().isPresent(); @@ -69,54 +69,54 @@ void executeJailSetup(@Sender Player player, @Arg Location location) { this.noticeService.create() .notice(translation -> (isLastJailSet - ? translation.jailSection().jailLocationOverride() - : translation.jailSection().jailLocationSet())) + ? translation.jail().locationOverride() + : translation.jail().locationSet())) .player(player.getUniqueId()) .send(); } @Async @Execute(name = "remove") - @Permission("eternalcore.jail.setup") + @Permission(JAIL_SETUP_PERMISSION) @DescriptionDocs(description = "Remove jail spawn area") void executeJailRemove(@Sender Player player) { - if (this.isPrisonAvailable(player)) { + if (this.handleMissingJailLocation(player)) { return; } this.jailService.removeJailArea(); this.noticeService.create() - .notice(translation -> translation.jailSection().jailLocationRemove()) + .notice(translation -> translation.jail().locationRemoved()) .player(player.getUniqueId()) .send(); } @Execute(name = "detain") - @Permission("eternalcore.jail.detain") + @Permission(JAIL_DETAIN_PERMISSION) @DescriptionDocs(description = "Detain self") void executeJailDetainSelf(@Sender Player player) { this.executeJailDetainForTime(player, player, this.jailSettings.defaultJailDuration()); } @Execute(name = "detain") - @Permission("eternalcore.jail.detain") + @Permission(JAIL_DETAIN_PERMISSION) @DescriptionDocs(description = "Detain a player", arguments = "") void executeJailDetain(@Sender Player player, @Arg Player target) { this.executeJailDetainForTime(player, target, this.jailSettings.defaultJailDuration()); } @Execute(name = "detain") - @Permission("eternalcore.jail.detain") + @Permission(JAIL_DETAIN_PERMISSION) @DescriptionDocs(description = "Detain a player for some time", arguments = "