From 4a1734c61a3867ba16f6c19dd2dcee1f70f63bcd Mon Sep 17 00:00:00 2001 From: Igor Michalski <65646893+igoyek@users.noreply.github.com> Date: Thu, 21 Aug 2025 09:31:30 +0200 Subject: [PATCH 01/11] Add jail command restriction type and refactor config Introduced JailCommandRestrictionType enum to support both whitelist and blacklist command restrictions for jailed players. Updated JailConfig and JailSettings to use 'restrictedCommands' and 'restrictionType' instead of 'allowedCommands'. Modified JailController logic to handle both restriction types. Took 12 minutes --- .../core/feature/jail/JailCommandRestrictionType.java | 6 ++++++ .../com/eternalcode/core/feature/jail/JailConfig.java | 7 +++++-- .../eternalcode/core/feature/jail/JailController.java | 9 ++++++++- .../com/eternalcode/core/feature/jail/JailSettings.java | 5 +++-- 4 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailCommandRestrictionType.java diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailCommandRestrictionType.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailCommandRestrictionType.java new file mode 100644 index 000000000..68e1cec34 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailCommandRestrictionType.java @@ -0,0 +1,6 @@ +package com.eternalcode.core.feature.jail; + +public enum JailCommandRestrictionType { + WHITELIST, + BLACKLIST +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailConfig.java index d32d0719a..4fac04d56 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailConfig.java @@ -14,6 +14,9 @@ public class JailConfig extends OkaeriConfig implements JailSettings { @Comment("# Default jail duration, set if no duration is specified") public Duration defaultJailDuration = Duration.ofMinutes(30); - @Comment("# Allowed commands in jail") - public Set allowedCommands = Set.of("help", "msg", "r", "tell", "me", "helpop"); + @Comment("# Command restriction type, either WHITELIST or BLACKLIST") + public JailCommandRestrictionType restrictionType = JailCommandRestrictionType.WHITELIST; + + @Comment("# Restricted commands for jailed players") + public Set restrictedCommands = Set.of("help", "msg", "r", "tell", "me", "helpop"); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailController.java index 8116906b4..1282f9487 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailController.java @@ -45,8 +45,15 @@ public void onPlayerPreCommand(PlayerCommandPreprocessEvent event) { } String command = event.getMessage().split(" ")[0].substring(1); + Set restrictedCommands = this.jailSettings.restrictedCommands(); + JailCommandRestrictionType restrictionType = this.jailSettings.restrictionType(); - if (this.jailSettings.allowedCommands().contains(command)) { + boolean shouldBlockCommand = switch (restrictionType) { + case WHITELIST -> !restrictedCommands.contains(command); + case BLACKLIST -> restrictedCommands.contains(command); + }; + + if (!shouldBlockCommand) { return; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailSettings.java index 594b72d3c..00bb48cd8 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailSettings.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailSettings.java @@ -1,13 +1,14 @@ package com.eternalcode.core.feature.jail; import java.time.Duration; -import java.util.List; import java.util.Set; public interface JailSettings { Duration defaultJailDuration(); - Set allowedCommands(); + JailCommandRestrictionType restrictionType(); + + Set restrictedCommands(); } From ad0b8c222cd33919dc7d1dd05309b29b24b7d945 Mon Sep 17 00:00:00 2001 From: Igor Michalski <65646893+igoyek@users.noreply.github.com> Date: Thu, 21 Aug 2025 11:03:48 +0200 Subject: [PATCH 02/11] The prison system has been improved MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added a record of the player's previous location. Configuration values ​​and messages have been migrated. Added constant permission values ​​and used static imports for better appearance. Other cosmetic or quality improvements have been made. Took 49 minutes --- .../core/feature/jail/JailedPlayer.java | 19 ++++- ...e_allowed_to_restricted_jail_commands.java | 13 ++++ ...n_0010_Move_jail_to_dedicated_section.java | 37 +++++++++ .../configuration/migrations/Migrations.java | 3 +- .../core/feature/jail/JailCommand.java | 76 +++++++++---------- .../core/feature/jail/JailController.java | 2 +- .../feature/jail/JailPermissionConstant.java | 41 ++++++++++ .../core/feature/jail/JailServiceImpl.java | 38 ++++++---- .../core/feature/jail/JailTask.java | 4 +- .../core/feature/jail/PrisonerTable.java | 17 ++++- .../feature/jail/messages/ENJailMessages.java | 36 ++++----- .../feature/jail/messages/JailMessages.java | 36 ++++----- .../feature/jail/messages/PLJailMessages.java | 36 ++++----- .../core/translation/Translation.java | 2 +- .../implementation/ENTranslation.java | 3 +- .../implementation/PLTranslation.java | 5 +- 16 files changed, 248 insertions(+), 120 deletions(-) create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0009_Rename_allowed_to_restricted_jail_commands.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_jail_to_dedicated_section.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/jail/JailPermissionConstant.java 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..83855376b 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,5 +1,8 @@ package com.eternalcode.core.feature.jail; +import org.bukkit.Location; +import org.jetbrains.annotations.Nullable; + import java.time.Duration; import java.time.Instant; import java.util.UUID; @@ -10,12 +13,19 @@ public class JailedPlayer { private final Instant detainedAt; private final Duration prisonTime; private final String detainedBy; + @Nullable + private final Location lastLocation; + + public JailedPlayer(UUID player, Instant detainedAt, Duration prisonTime, String detainedBy) { + this(player, detainedAt, prisonTime, detainedBy, null); + } - public JailedPlayer(UUID player, Instant detainedAt, Duration prisonTime, String lockedUpBy) { + public JailedPlayer(UUID player, Instant detainedAt, Duration prisonTime, String detainedBy, @Nullable Location lastLocation) { this.player = player; this.detainedAt = detainedAt; this.prisonTime = prisonTime; - this.detainedBy = lockedUpBy; + this.detainedBy = detainedBy; + this.lastLocation = lastLocation; } public UUID getPlayerUniqueId() { @@ -34,6 +44,11 @@ public Duration getPrisonTime() { return this.prisonTime; } + @Nullable + public Location getLastLocation() { + return this.lastLocation; + } + public boolean isPrisonExpired() { return this.detainedAt.plus(this.prisonTime).isBefore(Instant.now()); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0009_Rename_allowed_to_restricted_jail_commands.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0009_Rename_allowed_to_restricted_jail_commands.java new file mode 100644 index 000000000..7b9a28a21 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0009_Rename_allowed_to_restricted_jail_commands.java @@ -0,0 +1,13 @@ +package com.eternalcode.core.configuration.migrations; + +import static eu.okaeri.configs.migrate.ConfigMigrationDsl.move; +import eu.okaeri.configs.migrate.builtin.NamedMigration; + +class Migration_0009_Rename_allowed_to_restricted_jail_commands extends NamedMigration { + + Migration_0009_Rename_allowed_to_restricted_jail_commands() { + super("Rename allowed to restricted jail commands", + move("jail.allowedCommands", "jail.restrictedCommands") + ); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_jail_to_dedicated_section.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_jail_to_dedicated_section.java new file mode 100644 index 000000000..b81fe58e4 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_jail_to_dedicated_section.java @@ -0,0 +1,37 @@ +package com.eternalcode.core.configuration.migrations; + +import eu.okaeri.configs.migrate.builtin.NamedMigration; + +import static eu.okaeri.configs.migrate.ConfigMigrationDsl.move; + +public class Migration_0010_Move_jail_to_dedicated_section extends NamedMigration { + + Migration_0010_Move_jail_to_dedicated_section() { + super( + "Move jail to dedicated 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.detainPrivate"), + move("jailSection.jailDetainCountdown", "jail.detainCountdown"), + move("jailSection.jailDetainOverride", "jail.detainOverride"), + move("jailSection.jailDetainAdmin", "jail.detainAdmin"), + + move("jailSection.jailReleaseBroadcast", "jail.releaseBroadcast"), + move("jailSection.jailReleasePrivate", "jail.releasePrivate"), + 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") + ); + } +} 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 fc15363ae..fcc34b2b6 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 @@ -10,7 +10,8 @@ public class Migrations { new Migration_0003_Move_tprp_to_dedicated_section(), new Migration_0006_Move_alert_to_broadcast_section(), new Migration_0007_Move_clear_to_dedicated_section(), - new Migration_0008_Move_repair_to_dedicated_section() + new Migration_0008_Move_repair_to_dedicated_section(), + new Migration_0009_Rename_allowed_to_restricted_jail_commands(), }; } 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 7e4358954..1fc8b92b8 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,12 @@ 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_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; @@ -11,21 +16,16 @@ import dev.rollczi.litecommands.annotations.context.Context; import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; -import java.time.Duration; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.entity.Player; +import java.time.Duration; + @Command(name = "jail") -@PermissionDocs( - name = "Jail Bypass", - permission = JailCommand.JAIL_BYPASS, - description = "Permission allows to bypass jail punishment" -) +@Permission(JAIL_BYPASS_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(@Context Player player) { Location location = player.getLocation(); @@ -51,15 +51,15 @@ void executeJailSetup(@Context 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(@Context Player player, @Arg Location location) { boolean isLastJailSet = this.jailService.getJailAreaLocation().isPresent(); @@ -69,15 +69,15 @@ void executeJailSetup(@Context 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(@Context Player player) { if (this.isPrisonAvailable(player)) { @@ -87,36 +87,36 @@ void executeJailRemove(@Context Player player) { 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(@Context 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(@Context 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 = "