From ef47598b7835abb85670c56e72f9bf4cdbbf1139 Mon Sep 17 00:00:00 2001 From: amyavi <144570677+amyavi@users.noreply.github.com> Date: Sun, 26 Jan 2025 01:10:54 -0300 Subject: [PATCH] refactor: rewrite chomensbot suggestion handling --- .../chipmunkmod/data/ChomeNSBotCommand.java | 53 ++++++++++++++----- .../mixin/ChatInputSuggestorMixin.java | 3 +- .../chipmunkmod/mixin/ChatScreenMixin.java | 8 +-- .../modules/ChomeNSBotCommandSuggestions.java | 45 ++++------------ .../chipmunkmod/util/TextUtilities.java | 9 ++++ 5 files changed, 67 insertions(+), 51 deletions(-) diff --git a/src/main/java/land/chipmunk/chipmunkmod/data/ChomeNSBotCommand.java b/src/main/java/land/chipmunk/chipmunkmod/data/ChomeNSBotCommand.java index 27456c1..49d30f4 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/data/ChomeNSBotCommand.java +++ b/src/main/java/land/chipmunk/chipmunkmod/data/ChomeNSBotCommand.java @@ -1,25 +1,54 @@ package land.chipmunk.chipmunkmod.data; -import java.util.ArrayList; +import land.chipmunk.chipmunkmod.ChipmunkMod; +import land.chipmunk.chipmunkmod.util.TextUtilities; +import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; + import java.util.List; +import java.util.Objects; -public class ChomeNSBotCommand { - public final String name; - public final TrustLevel trustLevel; - public final List<String> aliases = new ArrayList<>(); +public record ChomeNSBotCommand(String name, TrustLevel trustLevel, List<String> aliases) { + public static @Nullable ChomeNSBotCommand fromText(final Text component) { + final String name = TextUtilities.plainOrNull(component); + if (name == null) return null; - public ChomeNSBotCommand ( - String name, - TrustLevel trustLevel - ) { - this.name = name; - this.trustLevel = trustLevel; + final List<Text> children = component.getSiblings(); + if (children.size() < 2) return null; // must have at least trust level and alias boolean + + final TrustLevel trustLevel = TrustLevel.fromText(children.getFirst()); + if (trustLevel == null) return null; + + final String hasAliasesString = TextUtilities.plainOrNull(children.get(1)); + if (hasAliasesString == null) return null; + + final boolean hasAliases = Boolean.parseBoolean(hasAliasesString); + if (!hasAliases) return new ChomeNSBotCommand(name, trustLevel, List.of()); + + final List<String> aliases = children.stream() + .skip(2) + .map(TextUtilities::plainOrNull) + .filter(Objects::nonNull) + .toList(); + return new ChomeNSBotCommand( + ChipmunkMod.CONFIG.bots.chomens.prefix + name, trustLevel, aliases); } public enum TrustLevel { PUBLIC, TRUSTED, ADMIN, - OWNER + OWNER; + + public static TrustLevel fromText(final Text component) { + final String trustLevelString = TextUtilities.plainOrNull(component); + if (trustLevelString == null) return null; + + try { + return TrustLevel.valueOf(trustLevelString); + } catch (final IllegalArgumentException ignored) {} + + return null; + } } } diff --git a/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatInputSuggestorMixin.java b/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatInputSuggestorMixin.java index bcb0d43..314aaf6 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatInputSuggestorMixin.java +++ b/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatInputSuggestorMixin.java @@ -6,6 +6,7 @@ import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import land.chipmunk.chipmunkmod.ChipmunkMod; import land.chipmunk.chipmunkmod.command.CommandManager; +import land.chipmunk.chipmunkmod.data.ChomeNSBotCommand; import land.chipmunk.chipmunkmod.modules.ChomeNSBotCommandSuggestions; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.MinecraftClient; @@ -62,7 +63,7 @@ public class ChatInputSuggestorMixin { final List<String> commands = ChomeNSBotCommandSuggestions.INSTANCE.commands .stream() - .map((command) -> command.name) + .map(ChomeNSBotCommand::name) .toList(); pendingSuggestions = CommandSource.suggestMatching( diff --git a/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatScreenMixin.java b/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatScreenMixin.java index f47d04d..8b6eafb 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatScreenMixin.java +++ b/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatScreenMixin.java @@ -105,15 +105,15 @@ public abstract class ChatScreenMixin extends Screen { final List<ChomeNSBotCommand> commands = ChomeNSBotCommandSuggestions.INSTANCE.commands; final List<String> moreOrTrustedCommands = commands.stream() - .filter((command) -> command.trustLevel != ChomeNSBotCommand.TrustLevel.PUBLIC) - .map((command) -> command.name.toLowerCase()) + .filter(command -> command.trustLevel() != ChomeNSBotCommand.TrustLevel.PUBLIC) + .map(command -> command.name().toLowerCase()) .toList(); final List<String> aliases = new ArrayList<>(); for (ChomeNSBotCommand command : commands) { - if (command.trustLevel == ChomeNSBotCommand.TrustLevel.PUBLIC) continue; + if (command.trustLevel() == ChomeNSBotCommand.TrustLevel.PUBLIC) continue; - aliases.addAll(command.aliases); + aliases.addAll(command.aliases()); } final String chatCommand = chatText.toLowerCase().split("\\s")[0]; diff --git a/src/main/java/land/chipmunk/chipmunkmod/modules/ChomeNSBotCommandSuggestions.java b/src/main/java/land/chipmunk/chipmunkmod/modules/ChomeNSBotCommandSuggestions.java index 49b187c..a22e368 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/modules/ChomeNSBotCommandSuggestions.java +++ b/src/main/java/land/chipmunk/chipmunkmod/modules/ChomeNSBotCommandSuggestions.java @@ -1,6 +1,5 @@ package land.chipmunk.chipmunkmod.modules; -import land.chipmunk.chipmunkmod.ChipmunkMod; import land.chipmunk.chipmunkmod.data.ChomeNSBotCommand; import land.chipmunk.chipmunkmod.listeners.Listener; import land.chipmunk.chipmunkmod.listeners.ListenerManager; @@ -9,11 +8,11 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.text.PlainTextContent; import net.minecraft.text.Text; import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class ChomeNSBotCommandSuggestions implements Listener { public static final String ID = "chomens_bot_request_command_suggestion"; @@ -57,40 +56,18 @@ public class ChomeNSBotCommandSuggestions implements Listener { @Override public void chatMessageReceived(Text message) { - try { - final List<Text> children = message.getSiblings(); + final List<Text> children = message.getSiblings(); + if (children.isEmpty()) return; - if (children.isEmpty()) return; + final Text textComponent = children.getFirst(); + if (!textComponent.getString().equals(ID)) return; - final Text textComponent = children.getFirst(); + commands = children.stream() + .skip(1) + .map(ChomeNSBotCommand::fromText) + .filter(Objects::nonNull) + .toList(); - if (!textComponent.getString().equals(ID)) return; - - commands = children.subList(1, children.size()) - .stream() - .map( - (eachComponent) -> { - final ChomeNSBotCommand command = new ChomeNSBotCommand( - ChipmunkMod.CONFIG.bots.chomens.prefix + ((PlainTextContent) eachComponent.getContent()).string(), - ChomeNSBotCommand.TrustLevel.valueOf(eachComponent.getSiblings().getFirst().getString()) - ); - - if (!Boolean.parseBoolean(eachComponent.getSiblings().get(1).getString())) return command; - - final List<Text> subList = eachComponent.getSiblings().subList(2, eachComponent.getSiblings().size()); - - for (Text aliasComponent : subList) { - final String alias = aliasComponent.getString(); - - command.aliases.add(alias); - } - - return command; - } - ) - .toList(); - - receivedSuggestions = true; - } catch (Exception ignored) {} + receivedSuggestions = true; } } diff --git a/src/main/java/land/chipmunk/chipmunkmod/util/TextUtilities.java b/src/main/java/land/chipmunk/chipmunkmod/util/TextUtilities.java index a5ef87a..d72e10a 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/util/TextUtilities.java +++ b/src/main/java/land/chipmunk/chipmunkmod/util/TextUtilities.java @@ -4,7 +4,9 @@ import com.google.common.base.Suppliers; import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registries; import net.minecraft.text.MutableText; +import net.minecraft.text.PlainTextContent; import net.minecraft.text.Text; +import net.minecraft.text.TextContent; public class TextUtilities { public static MutableText fromJson (String json) { @@ -13,4 +15,11 @@ public class TextUtilities { Suppliers.ofInstance(DynamicRegistryManager.of(Registries.REGISTRIES)).get() ); } + + public static String plainOrNull(final Text text) { + final TextContent content = text.getContent(); + if (!(content instanceof PlainTextContent plainContent)) return null; + + return plainContent.string(); + } } -- 2.47.2