diff options
Diffstat (limited to 'src/main/java/me/xmrvizzy/skyblocker')
24 files changed, 262 insertions, 164 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java index e1d1b612..be0bb0dd 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker; +import me.xmrvizzy.skyblocker.chat.ChatMessageListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock; import me.xmrvizzy.skyblocker.skyblock.api.StatsCommand; @@ -17,5 +18,6 @@ public class SkyblockerInitializer implements ClientModInitializer { WikiLookup.init(); ItemRegistry.init(); StatsCommand.init(); + ChatMessageListener.init(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatFilterResult.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatFilterResult.java new file mode 100644 index 00000000..0a31409a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatFilterResult.java @@ -0,0 +1,20 @@ +package me.xmrvizzy.skyblocker.chat; + +public enum ChatFilterResult { + // Skip this one / no action + PASS, + // Filter + FILTER, + // Move to action bar + ACTION_BAR; + // Skip remaining checks, don't filter + // null + + public String toString() { + return switch (this) { + case PASS -> "Disabled"; + case FILTER -> "Filter"; + case ACTION_BAR -> "Move to action bar"; + }; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java deleted file mode 100644 index 84034f41..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package me.xmrvizzy.skyblocker.chat; - -import java.util.regex.Pattern; - -public abstract class ChatListener { - protected static final String NUMBER = "-?[0-9]{1,3}(?>,[0-9]{3})*(?:\\.[1-9])?"; - private Pattern pattern; - public ChatListener(String pattern) { - this.pattern = Pattern.compile(pattern); - } - public Pattern getPattern() { - return pattern; - } - - public abstract boolean isEnabled(); - //Returns whether message should get filtered - public abstract boolean onMessage(String[] groups); -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java new file mode 100644 index 00000000..9fa72398 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java @@ -0,0 +1,48 @@ +package me.xmrvizzy.skyblocker.chat; + +import me.xmrvizzy.skyblocker.chat.filters.*; +import me.xmrvizzy.skyblocker.skyblock.api.ApiKeyListener; +import me.xmrvizzy.skyblocker.skyblock.dungeon.Reparty; +import me.xmrvizzy.skyblocker.skyblock.dungeon.ThreeWeirdos; +import me.xmrvizzy.skyblocker.skyblock.dungeon.Trivia; +import me.xmrvizzy.skyblocker.skyblock.dwarven.Fetchur; +import me.xmrvizzy.skyblocker.skyblock.dwarven.Puzzler; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.text.Text; + +public interface ChatMessageListener { + Event<ChatMessageListener> EVENT = EventFactory.createArrayBacked(ChatMessageListener.class, + (listeners) -> (message, asString) -> { + for (ChatMessageListener listener : listeners) { + ChatFilterResult result = listener.onMessage(message, asString); + if (result != ChatFilterResult.PASS) return result; + } + return ChatFilterResult.PASS; + }); + + static void init() { + ChatMessageListener[] listeners = new ChatMessageListener[]{ + // Features + new ApiKeyListener(), + new Fetchur(), + new Puzzler(), + new Reparty(), + new ThreeWeirdos(), + new Trivia(), + // Filters + new AbilityFilter(), + new AdFilter(), + new AoteFilter(), + new ComboFilter(), + new HealFilter(), + new ImplosionFilter(), + new MoltenWaveFilter(), + new TeleportPadFilter(), + }; + for (ChatMessageListener listener : listeners) + EVENT.register(listener); + } + + ChatFilterResult onMessage(Text message, String asString); +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java deleted file mode 100644 index 92618305..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.xmrvizzy.skyblocker.chat; - -import me.xmrvizzy.skyblocker.chat.filters.*; -import me.xmrvizzy.skyblocker.skyblock.api.ApiKeyListener; -import me.xmrvizzy.skyblocker.skyblock.dungeon.Reparty; -import me.xmrvizzy.skyblocker.skyblock.dungeon.ThreeWeirdos; -import me.xmrvizzy.skyblocker.skyblock.dungeon.Trivia; -import me.xmrvizzy.skyblocker.skyblock.dwarven.Fetchur; -import me.xmrvizzy.skyblocker.skyblock.dwarven.Puzzler; - -import java.util.regex.Matcher; - -public class ChatParser { - private final static ChatListener[] listeners = new ChatListener[]{ - new Reparty(), - new ThreeWeirdos(), - new AoteFilter(), - new ImplosionFilter(), - new MoltenWaveFilter(), - new HealFilter(), - new AbilityFilter(), - new AdFilter(), - new TeleportPadFilter(), - new ComboFilter(), - new Fetchur(), - new Puzzler(), - new Trivia(), - new ApiKeyListener() - }; - - public boolean shouldFilter(String message) { - for (ChatListener listener : listeners) { - if (listener.isEnabled()) { - Matcher m = listener.getPattern().matcher(message); - if (m.matches()) { - String[] groups = new String[m.groupCount() + 1]; - for (int i = 0; i < groups.length; i++) - groups[i] = m.group(i); - return listener.onMessage(groups); - } - } - } - return false; - } -}
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatPatternListener.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatPatternListener.java new file mode 100644 index 00000000..19237de4 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatPatternListener.java @@ -0,0 +1,30 @@ +package me.xmrvizzy.skyblocker.chat; + +import net.minecraft.text.Text; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public abstract class ChatPatternListener implements ChatMessageListener { + protected static String NUMBER = "-?[0-9]{1,3}(?>,[0-9]{3})*(?:\\.[1-9])?"; + public final Pattern pattern; + + public ChatPatternListener(String pattern) { + this.pattern = Pattern.compile(pattern); + } + + @Override + public final ChatFilterResult onMessage(Text message, String asString) { + ChatFilterResult state = state(); + if (state == ChatFilterResult.PASS) return ChatFilterResult.PASS; + Matcher m = pattern.matcher(asString); + if (m.matches() && onMatch(message, m)) { + return state; + } + return ChatFilterResult.PASS; + } + + protected abstract ChatFilterResult state(); + + protected abstract boolean onMatch(Text message, Matcher matcher); +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java index d0178dd6..3a357a00 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java @@ -1,15 +1,15 @@ package me.xmrvizzy.skyblocker.chat.filters; -import me.xmrvizzy.skyblocker.chat.ChatListener; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -public class AbilityFilter extends ChatFilter { +public class AbilityFilter extends SimpleChatFilter { public AbilityFilter() { super("^(?:This ability is on cooldown for " + NUMBER + "s\\.|No more charges, next one in " + NUMBER + "s!)$"); } @Override - public boolean isEnabled() { + protected ChatFilterResult state() { return SkyblockerConfig.get().messages.hideAbility; } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java index cf13e26e..5f9f463d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java @@ -1,29 +1,38 @@ package me.xmrvizzy.skyblocker.chat.filters; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import net.minecraft.text.Text; +import java.util.regex.Matcher; import java.util.regex.Pattern; -public class AdFilter extends ChatFilter { +public class AdFilter extends ChatPatternListener { private static final Pattern[] AD_FILTERS = new Pattern[]{ Pattern.compile("^(?:i(?:m|'m| am)? |(?:is )?any(?: ?one|1) )?(?:buy|sell|lowball|trade?)(?:ing)?(?:\\W|$)", Pattern.CASE_INSENSITIVE), Pattern.compile("(.)\\1{7,}"), Pattern.compile("\\W(?:on|in|check|at) my (?:ah|bin)(?:\\W|$)", Pattern.CASE_INSENSITIVE), }; + public AdFilter() { + // Groups: + // 1. Player name + // 2. Message super("^§[67ab](?:\\[(?:MVP|VIP)(?:§[0-9a-f]\\+{1,2}§[6ab])?] )?([a-zA-Z0-9_]{2,16})§[7f]: (.*)$"); } @Override - public boolean isEnabled() { - return SkyblockerConfig.get().messages.hideAds; + public boolean onMatch(Text _message, Matcher matcher) { + String message = matcher.group(2); + for (Pattern adFilter : AD_FILTERS) + if (adFilter.matcher(message).find()) + return true; + return false; } @Override - public boolean onMessage(String[] groups) { - for(Pattern adFilter : AD_FILTERS) - if(adFilter.matcher(groups[2]).find()) - return true; - return false; + protected ChatFilterResult state() { + return SkyblockerConfig.get().messages.hideAds; } }
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java index 4545399e..029cf433 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java @@ -1,15 +1,15 @@ package me.xmrvizzy.skyblocker.chat.filters; -import me.xmrvizzy.skyblocker.chat.ChatListener; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -public class AoteFilter extends ChatFilter { +public class AoteFilter extends SimpleChatFilter { public AoteFilter() { super("^There are blocks in the way!$"); } @Override - public boolean isEnabled() { + public ChatFilterResult state() { return SkyblockerConfig.get().messages.hideAOTE; } -}
\ No newline at end of file +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ChatFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ChatFilter.java deleted file mode 100644 index fac9a3a3..00000000 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ChatFilter.java +++ /dev/null @@ -1,12 +0,0 @@ -package me.xmrvizzy.skyblocker.chat.filters; - -import me.xmrvizzy.skyblocker.chat.ChatListener; - -public abstract class ChatFilter extends ChatListener { - public ChatFilter(String pattern) { - super(pattern); - } - public boolean onMessage(String[] groups) { - return true; - } -} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilter.java index c09cb69c..c05afdbf 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilter.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ComboFilter.java @@ -1,15 +1,16 @@ package me.xmrvizzy.skyblocker.chat.filters; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -public class ComboFilter extends ChatFilter { +public class ComboFilter extends SimpleChatFilter { public ComboFilter() { super("^(\\+\\d+ Kill Combo \\+\\d+(% ✯ Magic Find| coins per kill)" + "|Your Kill Combo has expired! You reached a \\d+ Kill Combo!)$"); } @Override - public boolean isEnabled() { + public ChatFilterResult state() { return SkyblockerConfig.get().messages.hideCombo; } -}
\ No newline at end of file +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java index b4e1c575..62b41749 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java @@ -1,15 +1,15 @@ package me.xmrvizzy.skyblocker.chat.filters; -import me.xmrvizzy.skyblocker.chat.ChatListener; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -public class HealFilter extends ChatFilter { +public class HealFilter extends SimpleChatFilter { public HealFilter() { super("^(?:You healed yourself for " + NUMBER + " health!|[a-zA-Z0-9_]{2,16} healed you for " + NUMBER + " health!)$"); } @Override - public boolean isEnabled() { + public ChatFilterResult state() { return SkyblockerConfig.get().messages.hideHeal; } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java index ffdc5f40..9cc684ed 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java @@ -1,15 +1,15 @@ package me.xmrvizzy.skyblocker.chat.filters; -import me.xmrvizzy.skyblocker.chat.ChatListener; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -public class ImplosionFilter extends ChatFilter { +public class ImplosionFilter extends SimpleChatFilter { public ImplosionFilter() { super("^Your Implosion hit " + NUMBER + " enem(?:y|ies) for " + NUMBER + " damage\\.$"); } @Override - public boolean isEnabled() { + public ChatFilterResult state() { return SkyblockerConfig.get().messages.hideImplosion; } -}
\ No newline at end of file +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java index b6fbddaf..19789dba 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java @@ -1,15 +1,15 @@ package me.xmrvizzy.skyblocker.chat.filters; -import me.xmrvizzy.skyblocker.chat.ChatListener; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -public class MoltenWaveFilter extends ChatFilter { +public class MoltenWaveFilter extends SimpleChatFilter { public MoltenWaveFilter() { super("^Your Molten Wave hit " + NUMBER + " enemy(?:y|ies) for " + NUMBER + " damage\\.$"); } @Override - public boolean isEnabled() { + public ChatFilterResult state() { return SkyblockerConfig.get().messages.hideMoltenWave; } -}
\ No newline at end of file +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/SimpleChatFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/SimpleChatFilter.java new file mode 100644 index 00000000..e23dbf33 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/SimpleChatFilter.java @@ -0,0 +1,17 @@ +package me.xmrvizzy.skyblocker.chat.filters; + +import me.xmrvizzy.skyblocker.chat.ChatPatternListener; +import net.minecraft.text.Text; + +import java.util.regex.Matcher; + +public abstract class SimpleChatFilter extends ChatPatternListener { + public SimpleChatFilter(String pattern) { + super(pattern); + } + + @Override + protected final boolean onMatch(Text message, Matcher matcher) { + return true; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilter.java index 2913d2bb..f7fab6d5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilter.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/TeleportPadFilter.java @@ -1,15 +1,16 @@ package me.xmrvizzy.skyblocker.chat.filters; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; -public class TeleportPadFilter extends ChatFilter { +public class TeleportPadFilter extends SimpleChatFilter { public TeleportPadFilter() { super("^(Warped from the .* Teleport Pad to the .* Teleport Pad!" + "|This Teleport Pad does not have a destination set!)$"); } @Override - public boolean isEnabled() { + public ChatFilterResult state() { return SkyblockerConfig.get().messages.hideTeleportPad; } }
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 270631b4..130b3064 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -5,6 +5,7 @@ import me.shedaniel.autoconfig.ConfigData; import me.shedaniel.autoconfig.annotation.Config; import me.shedaniel.autoconfig.annotation.ConfigEntry; import me.shedaniel.autoconfig.serializer.GsonConfigSerializer; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import java.util.ArrayList; import java.util.List; @@ -125,14 +126,22 @@ public class SkyblockerConfig implements ConfigData { } public static class Messages { - public boolean hideAbility = false; - public boolean hideHeal = false; - public boolean hideAOTE = false; - public boolean hideImplosion = false; - public boolean hideMoltenWave = false; - public boolean hideAds = false; - public boolean hideTeleportPad = false; - public boolean hideCombo = false; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public ChatFilterResult hideAbility = ChatFilterResult.PASS; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public ChatFilterResult hideHeal = ChatFilterResult.PASS; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public ChatFilterResult hideAOTE = ChatFilterResult.PASS; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public ChatFilterResult hideImplosion = ChatFilterResult.PASS; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public ChatFilterResult hideMoltenWave = ChatFilterResult.PASS; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public ChatFilterResult hideAds = ChatFilterResult.PASS; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public ChatFilterResult hideTeleportPad = ChatFilterResult.PASS; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public ChatFilterResult hideCombo = ChatFilterResult.PASS; } public enum Info { diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java index 9170f1db..2a9984b3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java @@ -1,11 +1,16 @@ package me.xmrvizzy.skyblocker.mixin; -import me.xmrvizzy.skyblocker.chat.ChatParser; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.chat.ChatMessageListener; import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.hud.ChatHudListener; +import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.network.MessageType; import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -15,14 +20,25 @@ import java.util.UUID; @Mixin(ChatHudListener.class) public class ChatHudListenerMixin { - private final ChatParser parser = new ChatParser(); + @Shadow + @Final + private MinecraftClient client; @Inject(method = "onChatMessage", at = @At("HEAD"), cancellable = true) public void onMessage(MessageType messageType, Text message, UUID senderUuid, CallbackInfo ci) { if (!Utils.isOnSkyblock) return; - if (parser.shouldFilter(message.getString())) - ci.cancel(); + String asString = message.getString(); + ChatFilterResult result = ChatMessageListener.EVENT.invoker().onMessage(message, asString); + switch (result) { + case ACTION_BAR: + ClientPlayerEntity player = client.player; + // Couldn't have received original message if client was null + assert player != null; + player.sendMessage(message, true); + case FILTER: + ci.cancel(); + } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/ApiKeyListener.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/ApiKeyListener.java index f20c41d2..520229f6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/ApiKeyListener.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/ApiKeyListener.java @@ -1,24 +1,28 @@ package me.xmrvizzy.skyblocker.skyblock.api; import me.shedaniel.autoconfig.AutoConfig; -import me.xmrvizzy.skyblocker.chat.ChatListener; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; -public class ApiKeyListener extends ChatListener { +import java.util.regex.Matcher; + +public class ApiKeyListener extends ChatPatternListener { public ApiKeyListener() { super("^Your new API key is (.*)$"); } @Override - public boolean isEnabled() { - return true; + protected ChatFilterResult state() { + return null; } @Override - public boolean onMessage(String[] groups) { - SkyblockerConfig.get().general.apiKey = groups[1]; + protected boolean onMatch(Text message, Matcher matcher) { + SkyblockerConfig.get().general.apiKey = matcher.group(1); AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); MinecraftClient.getInstance().player.sendMessage(new TranslatableText("skyblocker.api.got_key"), false); return false; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java index 65b9648f..f5fd1151 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java @@ -1,16 +1,18 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; import me.xmrvizzy.skyblocker.SkyblockerMod; -import me.xmrvizzy.skyblocker.chat.ChatListener; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.text.Text; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class Reparty extends ChatListener { +public class Reparty extends ChatPatternListener { private static final MinecraftClient client = MinecraftClient.getInstance(); private static final SkyblockerMod skyblocker = SkyblockerMod.getInstance(); public static final Pattern PLAYER = Pattern.compile(" ([a-zA-Z0-9_]{2,16}) ●"); @@ -36,17 +38,17 @@ public class Reparty extends ChatListener { } @Override - public boolean isEnabled() { - return repartying; + public ChatFilterResult state() { + return repartying ? ChatFilterResult.FILTER : ChatFilterResult.PASS; } @Override - public boolean onMessage(String[] groups) { - if (groups[1] != null) { + public boolean onMatch(Text message, Matcher matcher) { + if (matcher.group(1) != null) { playersSoFar = 0; - players = new String[Integer.parseInt(groups[1]) - 1]; - } else if (groups[2] != null) { - Matcher m = PLAYER.matcher(groups[2]); + players = new String[Integer.parseInt(matcher.group(1)) - 1]; + } else if (matcher.group(2) != null) { + Matcher m = PLAYER.matcher(matcher.group(2)); while (m.find()) { players[playersSoFar++] = m.group(1); } @@ -65,10 +67,10 @@ public class Reparty extends ChatListener { sendCommand(playerEntity, "/p disband", 1); StringBuilder sb = new StringBuilder(); int invites = (players.length - 1) / 5 + 1; - for(int i = 0; i < invites; i++) { + for (int i = 0; i < invites; i++) { sb.setLength(0); sb.append("/p invite"); - for(int j = 0; j < 5 && i * 5 + j < players.length; j++) { + for (int j = 0; j < 5 && i * 5 + j < players.length; j++) { sb.append(' '); sb.append(players[i * 5 + j]); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java index ea63b35e..8f1f3711 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java @@ -1,24 +1,27 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; -import me.xmrvizzy.skyblocker.chat.ChatListener; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -public class ThreeWeirdos extends ChatListener { +import java.util.regex.Matcher; + +public class ThreeWeirdos extends ChatPatternListener { public ThreeWeirdos() { super("^§e\\[NPC] §c([A-Z][a-z]+)§f: (?:The reward is(?: not in my chest!|n't in any of our chests\\.)|My chest (?:doesn't have the reward\\. We are all telling the truth\\.|has the reward and I'm telling the truth!)|At least one of them is lying, and the reward is not in §c§c[A-Z][a-z]+'s §rchest\\!|Both of them are telling the truth\\. Also, §c§c[A-Z][a-z]+ §rhas the reward in their chest\\!)$"); } @Override - public boolean isEnabled() { - return SkyblockerConfig.get().locations.dungeons.solveThreeWeirdos; + public ChatFilterResult state() { + return SkyblockerConfig.get().locations.dungeons.solveThreeWeirdos ? null : ChatFilterResult.PASS; } @Override - public boolean onMessage(String[] groups) { + public boolean onMatch(Text message, Matcher matcher) { MinecraftClient client = MinecraftClient.getInstance(); assert client.world != null; assert client.player != null; @@ -27,13 +30,13 @@ public class ThreeWeirdos extends ChatListener { client.player.getBoundingBox().expand(3), entity -> { Text customName = entity.getCustomName(); - if (customName != null && customName.getString().equals(groups[1])) { + if (customName != null && customName.getString().equals(matcher.group(1))) { return true; } return false; } ).forEach( - entity -> entity.setCustomName(Text.of(Formatting.GREEN + groups[1])) + entity -> entity.setCustomName(Text.of(Formatting.GREEN + matcher.group(1))) ); return false; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java index bb3d10d2..51ff1c6a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java @@ -1,15 +1,18 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; -import me.xmrvizzy.skyblocker.chat.ChatListener; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.text.LiteralText; +import net.minecraft.text.Text; import net.minecraft.util.Formatting; import java.util.*; +import java.util.regex.Matcher; -public class Trivia extends ChatListener { +public class Trivia extends ChatPatternListener { private static final Map<String, String[]> answers; private List<String> solutions = Collections.emptyList(); @@ -18,21 +21,22 @@ public class Trivia extends ChatListener { } @Override - public boolean isEnabled() { - return SkyblockerConfig.get().locations.dungeons.solveTrivia; + public ChatFilterResult state() { + return SkyblockerConfig.get().locations.dungeons.solveTrivia ? ChatFilterResult.FILTER : ChatFilterResult.PASS; } @Override - public boolean onMessage(String[] groups) { - if (groups[3] != null) { - if (!solutions.contains(groups[3])) { + public boolean onMatch(Text message, Matcher matcher) { + String riddle = matcher.group(3); + if (riddle != null) { + if (!solutions.contains(riddle)) { ClientPlayerEntity player = MinecraftClient.getInstance().player; assert player != null; - MinecraftClient.getInstance().player.sendMessage(new LiteralText(" " + Formatting.GOLD + groups[2] + Formatting.RED + " " + groups[3]), false); + MinecraftClient.getInstance().player.sendMessage(new LiteralText(" " + Formatting.GOLD + matcher.group(2) + Formatting.RED + " " + riddle), false); return true; } } else - updateSolutions(groups[1]); + updateSolutions(matcher.group(0)); return false; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java index 266006b4..ce1dde11 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.dwarven; -import me.xmrvizzy.skyblocker.chat.ChatListener; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; @@ -8,24 +9,26 @@ import net.minecraft.text.TranslatableText; import java.util.HashMap; import java.util.Map; +import java.util.regex.Matcher; -public class Fetchur extends ChatListener { - private static Map<String, String> answers; +public class Fetchur extends ChatPatternListener { + private static final Map<String, String> answers; public Fetchur() { super("^§e\\[NPC] Fetchur§f: (?:its|theyre) ([a-zA-Z, \\-]*)$"); } @Override - public boolean isEnabled() { - return SkyblockerConfig.get().locations.dwarvenMines.solveFetchur; + public ChatFilterResult state() { + return SkyblockerConfig.get().locations.dwarvenMines.solveFetchur ? ChatFilterResult.FILTER : ChatFilterResult.PASS; } @Override - public boolean onMessage(String[] groups) { + public boolean onMatch(Text message, Matcher matcher) { MinecraftClient client = MinecraftClient.getInstance(); assert client.player != null; - String answer = answers.getOrDefault(groups[1], groups[1]); + String riddle = matcher.group(1); + String answer = answers.getOrDefault(riddle, riddle); client.player.sendMessage(Text.of("§e[NPC] Fetchur§f: " + answer), false); return true; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java index 3e117955..f61e007e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java @@ -1,27 +1,31 @@ package me.xmrvizzy.skyblocker.skyblock.dwarven; -import me.xmrvizzy.skyblocker.chat.ChatListener; +import me.xmrvizzy.skyblocker.chat.ChatFilterResult; +import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; import net.minecraft.client.world.ClientWorld; +import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; -public class Puzzler extends ChatListener { +import java.util.regex.Matcher; + +public class Puzzler extends ChatPatternListener { public Puzzler() { super("^§e\\[NPC] §dPuzzler§f: ((?:§d▲|§5▶|§b◀|§a▼){10})$"); } @Override - public boolean isEnabled() { - return SkyblockerConfig.get().locations.dwarvenMines.solvePuzzler; + public ChatFilterResult state() { + return SkyblockerConfig.get().locations.dwarvenMines.solvePuzzler ? null : ChatFilterResult.PASS; } @Override - public boolean onMessage(String[] groups) { + public boolean onMatch(Text message, Matcher matcher) { int x = 181; int z = 135; - for (char c : groups[1].toCharArray()) { + for (char c : matcher.group(1).toCharArray()) { if (c == '▲') z++; else if (c == '▼') z--; else if (c == '◀') x++; |