aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorExternalTime <84183548+ExternalTime@users.noreply.github.com>2022-03-08 15:12:02 +0100
committerExternalTime <84183548+ExternalTime@users.noreply.github.com>2022-03-08 15:12:02 +0100
commitf2553cef257df3e52a131ed919dc015ce2a1a5d4 (patch)
tree2029a50a2e25a3c2d949ef1baa32aa7adba298aa
parent165d2a190cf82b90bc47cf7a3875a094fab9b81a (diff)
downloadSkyblocker-f2553cef257df3e52a131ed919dc015ce2a1a5d4.tar.gz
Skyblocker-f2553cef257df3e52a131ed919dc015ce2a1a5d4.tar.bz2
Skyblocker-f2553cef257df3e52a131ed919dc015ce2a1a5d4.zip
Rewrote chat events interface to use fabric events API
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/ChatFilterResult.java20
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java18
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/ChatMessageListener.java48
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java45
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/ChatPatternListener.java30
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/filters/SimpleChatFilter.java17
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java24
8 files changed, 137 insertions, 67 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/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/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();
+ }
}
}