From 8bf0b3b31d37d21b53fd299f688b05c26bd4ae6b Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Tue, 16 Sep 2025 00:08:52 +0200 Subject: [PATCH] Add configurable settings for invalid usage message generation --- .../implementation/PluginConfiguration.java | 9 +++++ .../invalidusage/InvalidUsageConfig.java | 29 +++++++++++++++ .../InvalidUsageHandlerImpl.java | 37 +++++++++++++++---- .../invalidusage/InvalidUsageHintMode.java | 6 +++ .../invalidusage/InvalidUsageSettings.java | 9 +++++ 5 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageConfig.java rename eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/{ => invalidusage}/InvalidUsageHandlerImpl.java (58%) create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageHintMode.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageSettings.java diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java index 5370be646..1eff77e78 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java @@ -39,6 +39,8 @@ import com.eternalcode.core.feature.warp.WarpSettings; import com.eternalcode.core.injector.annotations.Bean; import com.eternalcode.core.injector.annotations.component.ConfigurationFile; +import com.eternalcode.core.litecommand.handler.invalidusage.InvalidUsageConfig; +import com.eternalcode.core.litecommand.handler.invalidusage.InvalidUsageSettings; import com.eternalcode.core.translation.TranslationConfig; import com.eternalcode.core.translation.TranslationSettings; import eu.okaeri.configs.OkaeriConfig; @@ -79,6 +81,12 @@ public class PluginConfiguration extends AbstractConfigurationFile { @Comment("# Settings responsible for the database connection") DatabaseConfig database = new DatabaseConfig(); + @Bean(proxied = InvalidUsageSettings.class) + @Comment("") + @Comment("# Invalid usage message generation configuration") + @Comment("# Settings for command usage hinting") + InvalidUsageConfig invalidUsage = new InvalidUsageConfig(); + @Bean(proxied = SpawnJoinSettings.class) @Comment("") @Comment("# Spawn & Join Configuration") @@ -235,6 +243,7 @@ public static class Items extends OkaeriConfig { @Comment("# Settings responsible for player vanish functionality") VanishConfig vanish = new VanishConfig(); + @Override public File getConfigFile(File dataFolder) { return new File(dataFolder, "config.yml"); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageConfig.java new file mode 100644 index 000000000..fe3566de2 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageConfig.java @@ -0,0 +1,29 @@ +package com.eternalcode.core.litecommand.handler.invalidusage; + +import eu.okaeri.configs.OkaeriConfig; +import eu.okaeri.configs.annotation.Comment; +import lombok.Getter; +import lombok.experimental.Accessors; + +@SuppressWarnings({"FieldMayBeFinal", "FieldCanBeLocal"}) +@Getter +@Accessors(fluent = true) +public class InvalidUsageConfig extends OkaeriConfig implements InvalidUsageSettings { + + @Comment({ + "# How to display invalid usage hints:", + "# - MOST_RELEVANT: show only the most relevant (first) usage (default).", + "# - DETAILED: show header and a list of top N usages." + }) + public InvalidUsageHintMode usageHintMode = InvalidUsageHintMode.MOST_RELEVANT; + + @Comment({ + "# When usageHintMode is DETAILED: maximum number of usages to show in the list." + }) + public int detailedMaxEntries = 5; + + @Comment({ + "# When usageHintMode is DETAILED: whether to show the usage header before the list." + }) + public boolean detailedShowHeader = true; +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/InvalidUsageHandlerImpl.java b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageHandlerImpl.java similarity index 58% rename from eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/InvalidUsageHandlerImpl.java rename to eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageHandlerImpl.java index 6cbe38b37..03b6e9c99 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/InvalidUsageHandlerImpl.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageHandlerImpl.java @@ -1,11 +1,11 @@ -package com.eternalcode.core.litecommand.handler; +package com.eternalcode.core.litecommand.handler.invalidusage; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.lite.LiteHandler; import com.eternalcode.core.notice.NoticeService; import com.eternalcode.core.placeholder.Placeholders; -import com.eternalcode.core.viewer.ViewerService; import com.eternalcode.core.viewer.Viewer; +import com.eternalcode.core.viewer.ViewerService; import dev.rollczi.litecommands.handler.result.ResultHandlerChain; import dev.rollczi.litecommands.invalidusage.InvalidUsage; import dev.rollczi.litecommands.invalidusage.InvalidUsageHandler; @@ -20,19 +20,30 @@ class InvalidUsageHandlerImpl implements InvalidUsageHandler { private final ViewerService viewerService; private final NoticeService noticeService; + private final InvalidUsageSettings invalidUsageSettings; @Inject - InvalidUsageHandlerImpl(ViewerService viewerService, NoticeService noticeService) { + InvalidUsageHandlerImpl( + ViewerService viewerService, + NoticeService noticeService, + InvalidUsageSettings invalidUsageSettings + ) { this.viewerService = viewerService; this.noticeService = noticeService; + this.invalidUsageSettings = invalidUsageSettings; } @Override - public void handle(Invocation invocation, InvalidUsage result, ResultHandlerChain chain) { + public void handle( + Invocation invocation, + InvalidUsage result, + ResultHandlerChain chain) { Viewer viewer = this.viewerService.any(invocation.sender()); Schematic schematic = result.getSchematic(); - if (schematic.isOnlyFirst()) { + InvalidUsageHintMode mode = this.invalidUsageSettings.usageHintMode(); + + if (mode == InvalidUsageHintMode.MOST_RELEVANT || schematic.isOnlyFirst()) { this.noticeService.create() .viewer(viewer) .notice(translation -> translation.argument().usageMessage()) @@ -41,11 +52,21 @@ public void handle(Invocation invocation, InvalidUsage translation.argument().usageMessageHead()); + if (this.invalidUsageSettings.detailedShowHeader()) { + this.noticeService.viewer(viewer, translation -> translation.argument().usageMessageHead()); + } + + int limit = Math.max(1, this.invalidUsageSettings.detailedMaxEntries()); + int shown = 0; for (String schema : schematic.all()) { - this.noticeService.viewer(viewer, translation -> translation.argument().usageMessageEntry(), SCHEME.toFormatter(schema)); + if (shown++ >= limit) { + break; + } + this.noticeService.viewer( + viewer, + translation -> translation.argument().usageMessageEntry(), + SCHEME.toFormatter(schema)); } } - } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageHintMode.java b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageHintMode.java new file mode 100644 index 000000000..2fb3be45f --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageHintMode.java @@ -0,0 +1,6 @@ +package com.eternalcode.core.litecommand.handler.invalidusage; + +public enum InvalidUsageHintMode { + MOST_RELEVANT, + DETAILED +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageSettings.java new file mode 100644 index 000000000..59f3e91b0 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/handler/invalidusage/InvalidUsageSettings.java @@ -0,0 +1,9 @@ +package com.eternalcode.core.litecommand.handler.invalidusage; + +public interface InvalidUsageSettings { + InvalidUsageHintMode usageHintMode(); + + int detailedMaxEntries(); + + boolean detailedShowHeader(); +}