GoogleChat/src/main/java/io/gitlab/jfronny/googlechat/mixin/GameMessageS2CPacketMixin.java

70 lines
3.0 KiB
Java
Raw Normal View History

2021-12-30 22:16:37 +01:00
package io.gitlab.jfronny.googlechat.mixin;
2022-01-29 12:22:56 +01:00
import io.gitlab.jfronny.googlechat.GoogleChat;
2021-12-30 22:16:37 +01:00
import io.gitlab.jfronny.googlechat.GoogleChatConfig;
2022-02-28 19:39:13 +01:00
import io.gitlab.jfronny.libjf.translate.api.TranslateException;
import io.gitlab.jfronny.libjf.translate.api.TranslateService;
2022-01-29 12:22:56 +01:00
import net.fabricmc.api.EnvType;
import net.fabricmc.loader.api.FabricLoader;
2021-12-30 22:16:37 +01:00
import net.minecraft.network.MessageType;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket;
import net.minecraft.text.*;
2021-12-30 22:16:37 +01:00
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
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;
import java.util.List;
2021-12-30 22:16:37 +01:00
import java.util.UUID;
@Mixin(GameMessageS2CPacket.class)
public class GameMessageS2CPacketMixin {
@Shadow @Final @Mutable private Text message;
@Shadow @Final private UUID sender;
2022-01-29 12:22:56 +01:00
@Inject(at = @At("RETURN"), method = "<init>(Lnet/minecraft/text/Text;Lnet/minecraft/network/MessageType;Ljava/util/UUID;)V")
private void init(Text message, MessageType type, UUID sender, CallbackInfo ci) {
2022-02-28 19:39:13 +01:00
googlechat$translate(GoogleChat.TRANSLATE_SERVICE);
2022-01-29 12:22:56 +01:00
}
2021-12-30 22:16:37 +01:00
@Inject(at = @At("RETURN"), method = "<init>(Lnet/minecraft/network/PacketByteBuf;)V")
private void init(PacketByteBuf buf, CallbackInfo ci) {
2022-02-28 19:39:13 +01:00
googlechat$translate(GoogleChat.TRANSLATE_SERVICE);
2022-01-29 12:22:56 +01:00
}
2022-02-28 19:39:13 +01:00
private <T> void googlechat$translate(TranslateService<T> ts) {
2021-12-30 22:16:37 +01:00
if (!GoogleChatConfig.enabled) return;
2022-01-29 12:22:56 +01:00
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT && GoogleChat.isSelf(sender)) {
return;
}
2022-02-28 19:39:13 +01:00
T client = ts.parseLang(GoogleChatConfig.clientLanguage);
if (client == ts.parseLang("auto")) return;
2021-12-30 22:16:37 +01:00
StringBuilder sb = new StringBuilder();
message.asOrderedText().accept((index, style, codePoint) -> {
sb.append((char)codePoint);
return true;
});
2022-01-29 12:22:56 +01:00
try {
2022-02-28 19:39:13 +01:00
LiteralText translatedText = new LiteralText(ts.translate(sb.toString(), ts.parseLang(GoogleChatConfig.serverLanguage), client));
if (GoogleChatConfig.translationTooltip)
message = googlechat$concat(message.getWithStyle(Style.EMPTY.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new LiteralText("Translated: ").append(translatedText)))));
else
message = translatedText.setStyle(Style.EMPTY.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new LiteralText("Original: ").append(message))));
2022-01-29 12:22:56 +01:00
} catch (TranslateException e) {
GoogleChat.LOGGER.error("Could not translate received message", e);
}
2021-12-30 22:16:37 +01:00
}
private Text googlechat$concat(List<Text> texts) {
MutableText res = null;
for (Text text : texts) {
res = res == null ? (MutableText) text : res.append(text);
}
return res;
}
2021-12-30 22:16:37 +01:00
}