Chat-Transform/src/client/java/io/gitlab/jfronny/chattransform/mixin/ChatScreenMixin.java

45 lines
1.8 KiB
Java

package io.gitlab.jfronny.chattransform.mixin;
import io.gitlab.jfronny.chattransform.Cfg;
import io.gitlab.jfronny.chattransform.ITextFieldWidget;
import net.minecraft.client.gui.screen.ChatScreen;
import net.minecraft.client.gui.widget.TextFieldWidget;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.*;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@Mixin(ChatScreen.class)
public abstract class ChatScreenMixin {
@Shadow protected TextFieldWidget chatField;
@Inject(at = @At("RETURN"), method = "init()V")
void init(CallbackInfo ci) {
if (Cfg.mode == Cfg.Mode.Live) ((ITextFieldWidget) chatField).chattransform$activate();
}
@Redirect(method = "keyPressed(III)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/TextFieldWidget;getText()Ljava/lang/String;"))
String finalizeTransforms(TextFieldWidget instance) {
String str = ((ITextFieldWidget) chatField).chattransform$finalize();
if (Cfg.mode == Cfg.Mode.OnSend) {
for (Map.Entry<String, String> e : Cfg.substitutions
.entrySet()
.stream()
.collect(Collectors.groupingBy(s -> s.getKey().length()))
.entrySet()
.stream()
.sorted(Map.Entry.<Integer, List<Map.Entry<String, String>>>comparingByKey().reversed())
.map(Map.Entry::getValue)
.flatMap(Collection::stream)
.toList()) {
str = str.replaceAll(Pattern.quote(e.getKey()), e.getValue());
}
}
return str;
}
}