From fba09789a2839909cec9f3c5cca0da8ecb724d45 Mon Sep 17 00:00:00 2001 From: Rizzener Date: Sat, 5 Sep 2026 02:18:46 +0700 Subject: [PATCH] feat: input_chat_str command for raw string chat input Adds input_chat_str, mirroring input_chat but storing the raw player input as a string argument instead of parsing it as a number. Input via chat or command; leading '/' from command input is stripped. Null input (timeout/quit) triggers on_failed. --- .../dev/by1337/bmenu/command/Commands.java | 3 + .../handler/input/PlayerStringInput.java | 58 +++++++++++++++++++ src/main/resources/menu/debug.yml | 8 +++ 3 files changed, 69 insertions(+) create mode 100644 src/main/java/dev/by1337/bmenu/handler/input/PlayerStringInput.java diff --git a/src/main/java/dev/by1337/bmenu/command/Commands.java b/src/main/java/dev/by1337/bmenu/command/Commands.java index 39cffb4..d11b613 100644 --- a/src/main/java/dev/by1337/bmenu/command/Commands.java +++ b/src/main/java/dev/by1337/bmenu/command/Commands.java @@ -8,6 +8,7 @@ import dev.by1337.bmenu.handler.FirstMatchHandler; import dev.by1337.bmenu.handler.MenuEventHandler; import dev.by1337.bmenu.handler.input.PlayerNumberInput; +import dev.by1337.bmenu.handler.input.PlayerStringInput; import dev.by1337.bmenu.yaml.dfu.BMenuDFU; import dev.by1337.plc.PlaceholderApplier; import dev.by1337.yaml.YamlValue; @@ -68,6 +69,8 @@ public DataResult decode(YamlValue yaml) { YamlValue cmdValue = map.get(cmd); if (cmd.equals("input_chat")) { tryDecode(cmdValue, PlayerNumberInput.CODEC, err, handlers::add); + } else if (cmd.equals("input_chat_str")) { + tryDecode(cmdValue, PlayerStringInput.CODEC, err, handlers::add); } else if (cmdValue.isMap() && ( cmd.equals("open") || cmd.equals("back") || diff --git a/src/main/java/dev/by1337/bmenu/handler/input/PlayerStringInput.java b/src/main/java/dev/by1337/bmenu/handler/input/PlayerStringInput.java new file mode 100644 index 0000000..4fcb1ec --- /dev/null +++ b/src/main/java/dev/by1337/bmenu/handler/input/PlayerStringInput.java @@ -0,0 +1,58 @@ +package dev.by1337.bmenu.handler.input; + +import dev.by1337.bmenu.BMenu; +import dev.by1337.bmenu.command.Commands; +import dev.by1337.bmenu.command.ExecuteContext; +import dev.by1337.bmenu.command.PlayerContext; +import dev.by1337.bmenu.handler.MenuEventHandler; +import dev.by1337.plc.PlaceholderApplier; +import dev.by1337.yaml.codec.RecordYamlCodecBuilder; +import dev.by1337.yaml.codec.YamlCodec; + +public class PlayerStringInput implements MenuEventHandler { + public static final YamlCodec CODEC = RecordYamlCodecBuilder.mapOf( + PlayerStringInput::new, + YamlCodec.STRING.fieldOf("param", v -> v.param), + Commands.CODEC.fieldOf("on_pass", v -> v.on_pass), + Commands.CODEC.fieldOf("on_failed", v -> v.on_failed) + ); + private final String param; + private final Commands on_pass; + private final Commands on_failed; + + public PlayerStringInput(String param, Commands onPass, Commands onFailed) { + this.param = param; + on_pass = onPass; + on_failed = onFailed; + } + + @Override + public boolean test(PlayerContext ctx0, PlaceholderApplier placeholders) { + var ctx = (ExecuteContext) ctx0; + try (var enter = ctx.tracer().enter("input_chat_str {", "} -> %s")) { + if (ctx.menu.loader().plugin() instanceof BMenu bMenu) { + enter.result(true); + var menu = ctx.menu; + bMenu.playerInputListener().register(ctx.menu.viewer().getUniqueId(), s -> { + try (ExecuteContext newCtx = ExecuteContext.of(menu); + var on = newCtx.tracer.enter("input_chat_str(%s) {", s, "} -> %s")) { + on.result(false); + if (s == null) { + on_failed.test(newCtx, menu); + } else { + if (s.startsWith("/")) s = s.substring(1); + menu.addArgument(param, s); + on_pass.test(newCtx, menu); + on.result(true); + } + } + }); + } else { + ctx.tracer.log("The input_chat_str function is unavailable! Install the BMenu plugin!"); + ctx.menu.loader().plugin().getSLF4JLogger().error("The input_chat_str function is unavailable! Install the BMenu plugin!"); + enter.result(false); + } + } + return true; + } +} \ No newline at end of file diff --git a/src/main/resources/menu/debug.yml b/src/main/resources/menu/debug.yml index fcf3909..75f2527 100644 --- a/src/main/resources/menu/debug.yml +++ b/src/main/resources/menu/debug.yml @@ -241,6 +241,14 @@ items: - '&cNan!' on_failed: - '&cNan' + + - input_chat_str: + param: 'str_result' + on_pass: + - '&aString input: {str_result}' + - reopen: '' + on_failed: + - '&cInput cancelled' - close: '' on_view1: slot: 49