summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/moe/nea/ultranotifier/mixin/AccessorChatHudImpl.java23
-rw-r--r--src/main/java/moe/nea/ultranotifier/mixin/AccessorCommandHandler.java18
-rw-r--r--src/main/java/moe/nea/ultranotifier/mixin/ChatHudCategoryTracker.java49
-rw-r--r--src/main/java/moe/nea/ultranotifier/mixin/ChatHudMessageAdded.java23
-rw-r--r--src/main/java/moe/nea/ultranotifier/mixin/ChatScreenTabRenderer.java77
-rw-r--r--src/main/java/moe/nea/ultranotifier/mixin/FilterVisibleMessagePatch.java72
-rw-r--r--src/main/kotlin/AllModules.kt17
-rw-r--r--src/main/kotlin/ChatStore.kt53
-rw-r--r--src/main/kotlin/Constants.kt12
-rw-r--r--src/main/kotlin/UltraNotifier.kt16
-rw-r--r--src/main/kotlin/UltraNotifierEntryPoint.kt4
-rw-r--r--src/main/kotlin/commands/BrigadierPatchbay.kt119
-rw-r--r--src/main/kotlin/commands/Commands.kt51
-rw-r--r--src/main/kotlin/datamodel/ChatType.kt175
-rw-r--r--src/main/kotlin/event/ChatGuiLineEvent.kt8
-rw-r--r--src/main/kotlin/event/CommandRegistrationEvent.kt10
-rw-r--r--src/main/kotlin/event/RegistrationFinishedEvent.kt6
-rw-r--r--src/main/kotlin/event/SubscriptionTarget.kt5
-rw-r--r--src/main/kotlin/event/TickEvent.kt26
-rw-r--r--src/main/kotlin/event/UltraEvent.kt6
-rw-r--r--src/main/kotlin/event/UltraNotifierEvents.kt7
-rw-r--r--src/main/kotlin/event/VisibleChatMessageAddedEvent.kt17
-rw-r--r--src/main/kotlin/gui/ChatUi.kt91
-rw-r--r--src/main/kotlin/gui/MessageUi.kt28
-rw-r--r--src/main/kotlin/gui/ScreenUtil.kt19
-rw-r--r--src/main/kotlin/util/GsonUtil.kt55
-rw-r--r--src/main/kotlin/util/IdentityCharacteristics.kt15
-rw-r--r--src/main/kotlin/util/KSerializable.kt112
-rw-r--r--src/main/kotlin/util/identifierutil.kt11
-rw-r--r--src/main/kotlin/util/iterutil.kt36
-rw-r--r--src/main/kotlin/util/minecrat/MC.kt11
-rw-r--r--src/main/kotlin/util/minecrat/TextUtil.kt70
-rw-r--r--src/main/kotlin/util/minecrat/infer.kt22
-rw-r--r--src/main/kotlin/util/render/ScreenRenderUtils.kt135
-rw-r--r--src/main/resources/assets/ultranotifier/textures/gui/square_panel.pngbin0 -> 711 bytes
-rw-r--r--src/main/resources/fabric.mod.json3
36 files changed, 1365 insertions, 37 deletions
diff --git a/src/main/java/moe/nea/ultranotifier/mixin/AccessorChatHudImpl.java b/src/main/java/moe/nea/ultranotifier/mixin/AccessorChatHudImpl.java
new file mode 100644
index 0000000..ec30dcf
--- /dev/null
+++ b/src/main/java/moe/nea/ultranotifier/mixin/AccessorChatHudImpl.java
@@ -0,0 +1,23 @@
+package moe.nea.ultranotifier.mixin;
+
+import moe.nea.ultranotifier.util.minecrat.AccessorChatHud;
+import net.minecraft.client.gui.hud.ChatHud;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+
+@Mixin(ChatHud.class)
+public abstract class AccessorChatHudImpl implements AccessorChatHud {
+
+ //#if MC>1.17
+ @Shadow
+ protected abstract int getLineHeight();
+ //#endif
+ @Override
+ public int getLineHeight_ultranotifier() {
+ //#if MC>1.17
+ return getLineHeight();
+ //#else
+ //$$return 9; // TODO: better typing here
+ //#endif
+ }
+}
diff --git a/src/main/java/moe/nea/ultranotifier/mixin/AccessorCommandHandler.java b/src/main/java/moe/nea/ultranotifier/mixin/AccessorCommandHandler.java
new file mode 100644
index 0000000..9218421
--- /dev/null
+++ b/src/main/java/moe/nea/ultranotifier/mixin/AccessorCommandHandler.java
@@ -0,0 +1,18 @@
+package moe.nea.ultranotifier.mixin;
+
+//#if FORGE
+//$$import net.minecraft.command.CommandHandler;
+//$$import net.minecraft.command.ICommand;
+//$$import org.jetbrains.annotations.NotNull;
+//$$import org.spongepowered.asm.mixin.Mixin;
+//$$import org.spongepowered.asm.mixin.gen.Accessor;
+//$$
+//$$import java.util.Set;
+//$$
+//$$@Mixin(CommandHandler.class)
+//$$public interface AccessorCommandHandler {
+//$$ @Accessor("commandSet")
+//$$ @NotNull
+//$$ Set<@NotNull ICommand> getCommandSet_ultraNotifier();
+//$$}
+//#endif \ No newline at end of file
diff --git a/src/main/java/moe/nea/ultranotifier/mixin/ChatHudCategoryTracker.java b/src/main/java/moe/nea/ultranotifier/mixin/ChatHudCategoryTracker.java
new file mode 100644
index 0000000..6205506
--- /dev/null
+++ b/src/main/java/moe/nea/ultranotifier/mixin/ChatHudCategoryTracker.java
@@ -0,0 +1,49 @@
+package moe.nea.ultranotifier.mixin;
+
+import moe.nea.ultranotifier.datamodel.CategorizedChatLine;
+import moe.nea.ultranotifier.datamodel.ChatCategoryArbiter;
+import moe.nea.ultranotifier.datamodel.HasCategorizedChatLine;
+import net.minecraft.client.gui.hud.ChatHudLine;
+import net.minecraft.text.Text;
+import org.jetbrains.annotations.NotNull;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+//#if MC> 1.20
+import net.minecraft.client.gui.hud.MessageIndicator;
+import net.minecraft.network.message.MessageSignatureData;
+//#endif
+
+@Mixin(ChatHudLine.class)
+public class ChatHudCategoryTracker<T> implements HasCategorizedChatLine {
+ @Unique
+ CategorizedChatLine categorizedSelf;
+
+ @Inject(method = "<init>", at = @At("RETURN"))
+ private void onInit(
+ int creationTick,
+ //#if MC>1.20
+ Text content,
+ //#elseif MC<1.16
+ //$$net.minecraft.util.text.ITextComponent content,
+ //$$int weird,
+ //#else
+ //$$T content,
+ //$$int weird,
+ //#endif
+ //#if MC>1.20
+ MessageSignatureData signature, MessageIndicator tag,
+ //#endif
+ CallbackInfo ci
+ ) {
+ categorizedSelf = ChatCategoryArbiter.INSTANCE.categorize((Text)content);
+ }
+
+ @Override
+ public @NotNull CategorizedChatLine getCategorizedChatLine_ultraNotifier() {
+ return categorizedSelf;
+ }
+}
diff --git a/src/main/java/moe/nea/ultranotifier/mixin/ChatHudMessageAdded.java b/src/main/java/moe/nea/ultranotifier/mixin/ChatHudMessageAdded.java
index 2b65282..d7ed298 100644
--- a/src/main/java/moe/nea/ultranotifier/mixin/ChatHudMessageAdded.java
+++ b/src/main/java/moe/nea/ultranotifier/mixin/ChatHudMessageAdded.java
@@ -3,7 +3,7 @@ package moe.nea.ultranotifier.mixin;
import moe.nea.ultranotifier.event.ChatGuiLineEvent;
import moe.nea.ultranotifier.event.UltraNotifierEvents;
import net.minecraft.client.gui.hud.ChatHud;
-//#if MC > 11404
+//#if MC >= 1.20
import net.minecraft.client.gui.hud.MessageIndicator;
import net.minecraft.network.message.MessageSignatureData;
//#endif
@@ -18,25 +18,26 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
)
public class ChatHudMessageAdded {
@Inject(
-//#if MC <= 11404
-//#if FORGE
-//$$ method = "printChatMessageWithOptionalDeletion",
-//#else
-//$$ method = "addMessage(Lnet/minecraft/text/Text;I)V",
-//#endif
-//#else
+//#if MC >= 1.20
method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V",
+//#elseif MC >= 1.16
+//$$ method = "addMessage(Lnet/minecraft/text/Text;IIZ)V",
+//#else
+//$$ method = "printChatMessageWithOptionalDeletion",
//#endif
at = @At("HEAD"), cancellable = true)
private void onAddMessage(
Text message,
-//#if MC <= 11404
-//$$ int chatLineId,
-//#else
+//#if MC >= 1.20
MessageSignatureData signatureData, MessageIndicator indicator,
+//#elseif MC >= 1.16
+//$$ int chatLineId, int timestamp, boolean bl,
+//#else
+//$$ int chatLineId,
//#endif
CallbackInfo ci
) {
+ // TODO: in this method prevent messages from being flushed (to preserve more history)
if (UltraNotifierEvents.post(new ChatGuiLineEvent(message)).isCancelled()) {
ci.cancel();
}
diff --git a/src/main/java/moe/nea/ultranotifier/mixin/ChatScreenTabRenderer.java b/src/main/java/moe/nea/ultranotifier/mixin/ChatScreenTabRenderer.java
new file mode 100644
index 0000000..972e40c
--- /dev/null
+++ b/src/main/java/moe/nea/ultranotifier/mixin/ChatScreenTabRenderer.java
@@ -0,0 +1,77 @@
+package moe.nea.ultranotifier.mixin;
+
+import moe.nea.ultranotifier.gui.ChatUi;
+import moe.nea.ultranotifier.util.render.ScreenRenderUtils;
+import net.minecraft.client.gui.screen.ChatScreen;
+import org.objectweb.asm.Opcodes;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+//#if MC>1.16
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.util.math.MatrixStack;
+//#endif
+
+@Mixin(ChatScreen.class)
+public abstract class ChatScreenTabRenderer {
+
+ private ChatUi chatUi_ultraNotifier = new ChatUi((ChatScreen) (Object) this);
+
+ @Unique
+ ChatUi chatUi() {return chatUi_ultraNotifier;}
+
+ @Inject(
+//#if MC > 1.16
+ method = "render",
+//#else
+//$$ method="drawScreen",
+//#endif
+ at = @At("HEAD"))
+ private void onRender(
+//#if MC >1.20
+ DrawContext context,
+//#elseif MC > 1.16
+//$$ MatrixStack context,
+//#endif
+ int mouseX, int mouseY,
+ float delta,
+ CallbackInfo ci) {
+ chatUi().renderButtons(
+ ScreenRenderUtils.umatrix(
+ //#if MC > 1.16
+ context
+ //#endif
+ ),
+ mouseX, mouseY
+ );
+ }
+
+ @Inject(
+ method = "mouseClicked",
+ at = @At(value = "INVOKE",
+ //#if MC > 1.16
+ target = "Lnet/minecraft/client/gui/screen/Screen;mouseClicked(DDI)Z",
+ //#else
+ //$$target = "Lnet/minecraft/client/gui/GuiScreen;mouseClicked(III)V",
+ //#endif
+ opcode = Opcodes.INVOKESPECIAL)
+ )
+ private void onMouseClick(
+ //#if MC > 1.16
+ double mouseX, double mouseY,
+ //#else
+ //$$int mouseX, int mouseY,
+ //#endif
+ int button,
+ //#if MC > 1.16
+ CallbackInfoReturnable<Boolean> cir
+ //#else
+ //$$CallbackInfo cir
+ //#endif
+ ) {
+ chatUi().clickMouse(mouseX, mouseY, button);
+ }
+}
diff --git a/src/main/java/moe/nea/ultranotifier/mixin/FilterVisibleMessagePatch.java b/src/main/java/moe/nea/ultranotifier/mixin/FilterVisibleMessagePatch.java
new file mode 100644
index 0000000..22e06b5
--- /dev/null
+++ b/src/main/java/moe/nea/ultranotifier/mixin/FilterVisibleMessagePatch.java
@@ -0,0 +1,72 @@
+package moe.nea.ultranotifier.mixin;
+
+import moe.nea.ultranotifier.event.UltraNotifierEvents;
+import moe.nea.ultranotifier.event.VisibleChatMessageAddedEvent;
+import net.minecraft.client.gui.hud.ChatHud;
+import net.minecraft.client.gui.hud.ChatHudLine;
+import net.minecraft.text.Text;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.ModifyVariable;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
+
+import java.util.Collections;
+import java.util.List;
+
+@Mixin(ChatHud.class)
+public class FilterVisibleMessagePatch {
+//#if MC > 1.18
+ @Inject(
+ method = "addVisibleMessage",
+ at = @At("HEAD"),
+ cancellable = true
+ )
+ private void onAddVisibleMessage(ChatHudLine message, CallbackInfo ci) {
+ if (UltraNotifierEvents.post(new VisibleChatMessageAddedEvent(message)).isCancelled()) {
+ ci.cancel();
+ }
+ }
+//#else
+//$$ @Unique
+//$$ ChatHudLine lastAddedChatLine;
+//$$
+//$$ @Inject(method = "reset()V",
+//$$ at = @At(value = "INVOKE",
+//$$ target = "Lnet/minecraft/client/gui/hud/ChatHud;addMessage(Lnet/minecraft/text/Text;IIZ)V"),
+//$$ locals = LocalCapture.CAPTURE_FAILHARD)
+//$$ private void saveMessageAboutToBeRefreshed(CallbackInfo ci, int i, ChatHudLine chatLine) {
+//$$ lastAddedChatLine = chatLine;
+//$$ }
+//$$
+//$$ @Inject(method = "addMessage(Lnet/minecraft/text/Text;IIZ)V", at = @At(value = "INVOKE",
+//#if MC > 1.16
+//$$ target = "Lnet/minecraft/client/util/ChatMessages;breakRenderedChatMessageLines(Lnet/minecraft/text/StringVisitable;ILnet/minecraft/client/font/TextRenderer;)Ljava/util/List;"
+//#else
+//$$ target = "Lnet/minecraft/client/gui/GuiUtilRenderComponents;splitText(Lnet/minecraft/util/text/ITextComponent;ILnet/minecraft/client/gui/FontRenderer;ZZ)Ljava/util/List;"
+//#endif
+//$$ ))
+//$$ private void saveMessage(Text chatComponent, int chatLineId, int updateCounter, boolean displayOnly, CallbackInfo ci) {
+//$$ if (lastAddedChatLine != null && lastAddedChatLine.getText() != chatComponent) {
+//$$ throw new RuntimeException("Out of order message received");
+//$$ }
+//$$ if (lastAddedChatLine == null)
+//$$ lastAddedChatLine = new ChatHudLine(chatLineId, chatComponent, updateCounter);
+//$$ }
+//$$
+//$$ @ModifyVariable(
+//$$ method = "addMessage(Lnet/minecraft/text/Text;IIZ)V",
+//$$ at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;isChatFocused()Z")
+//$$ )
+//$$ private List onAddVisibleMessage(List value) {
+//$$ VisibleChatMessageAddedEvent event = new VisibleChatMessageAddedEvent(lastAddedChatLine);
+//$$ lastAddedChatLine = null;
+//$$ if (UltraNotifierEvents.post(event).isCancelled()) {
+//$$ return Collections.emptyList();
+//$$ }
+//$$ return value;
+//$$ }
+//#endif
+}
diff --git a/src/main/kotlin/AllModules.kt b/src/main/kotlin/AllModules.kt
new file mode 100644
index 0000000..01cfb36
--- /dev/null
+++ b/src/main/kotlin/AllModules.kt
@@ -0,0 +1,17 @@
+package moe.nea.ultranotifier
+
+import moe.nea.ultranotifier.commands.Commands
+import moe.nea.ultranotifier.datamodel.ChatCategoryArbiter
+import moe.nea.ultranotifier.event.SubscriptionTarget
+import moe.nea.ultranotifier.event.TickEvent
+import moe.nea.ultranotifier.gui.ScreenUtil
+
+object AllModules {
+ val allModules: List<SubscriptionTarget> = listOf(
+ ChatStore,
+ Commands,
+ ScreenUtil,
+ TickEvent,
+ ChatCategoryArbiter,
+ )
+}
diff --git a/src/main/kotlin/ChatStore.kt b/src/main/kotlin/ChatStore.kt
new file mode 100644
index 0000000..4cc6ee1
--- /dev/null
+++ b/src/main/kotlin/ChatStore.kt
@@ -0,0 +1,53 @@
+package moe.nea.ultranotifier
+
+import com.mojang.brigadier.builder.LiteralArgumentBuilder
+import moe.nea.ultranotifier.commands.UltraCommandSource
+import moe.nea.ultranotifier.commands.literalText
+import moe.nea.ultranotifier.event.ChatGuiLineEvent
+import moe.nea.ultranotifier.event.CommandRegistrationEvent
+import moe.nea.ultranotifier.event.PacketChatLineEvent
+import moe.nea.ultranotifier.event.SubscriptionTarget
+import moe.nea.ultranotifier.event.UltraSubscribe
+import moe.nea.ultranotifier.gui.MessageUi
+import moe.nea.ultranotifier.gui.ScreenUtil
+import moe.nea.ultranotifier.util.IdentityCharacteristics
+import net.minecraft.text.Text
+
+object ChatStore : SubscriptionTarget {
+
+ data class ChatLine(
+ val text: Text,
+ var fromPacket: Boolean = false,
+ var isDisplayed: Boolean = false,
+ )
+
+ val allLines = object : LinkedHashMap<IdentityCharacteristics<Text>, ChatLine>() {
+ override fun removeEldestEntry(eldest: MutableMap.MutableEntry<IdentityCharacteristics<Text>, ChatLine>?): Boolean {
+ return size > 500 // TODO: config
+ }
+ }
+
+ fun insertChatLine(text: Text): ChatLine {
+ return allLines.getOrPut(IdentityCharacteristics(text)) { ChatLine(text) }
+ }
+
+ @UltraSubscribe
+ fun onMessageDisplayed(event: ChatGuiLineEvent) {
+ insertChatLine(event.component).isDisplayed = true
+ }
+
+ @UltraSubscribe
+ fun registerCommands(event: CommandRegistrationEvent) {
+ event.dispatcher.register(LiteralArgumentBuilder.literal<UltraCommandSource?>("ultranotifier")
+ .executes {
+ it.source.sendFeedback(literalText("Opening screen"))
+ ScreenUtil.openScreen = (MessageUi())
+ 0
+ })
+ }
+
+ @UltraSubscribe
+ fun onMessageReceived(event: PacketChatLineEvent) {
+ insertChatLine(event.component).fromPacket = true
+ }
+}
diff --git a/src/main/kotlin/Constants.kt b/src/main/kotlin/Constants.kt
index a1903ce..46d4236 100644
--- a/src/main/kotlin/Constants.kt
+++ b/src/main/kotlin/Constants.kt
@@ -1,6 +1,6 @@
package moe.nea.ultranotifier
-
+// TODO: blossom this shit
object Constants {
const val MOD_ID = "ultranotifier"
const val VERSION = "1.0.0"
@@ -23,5 +23,15 @@ object Constants {
"1.20.6"
//#elseif MC == 11404
//$$ "1.14.4"
+//#elseif MC == 11202
+//$$ "1.12.2"
+//#elseif MC == 11605
+//$$ "1.16.5"
+//#elseif MC == 11602
+//$$ "1.16.2"
+//#elseif MC == 12100
+//$$ "1.21"
+//#elseif MC == 12101
+//$$ "1.21.1"
//#endif
}
diff --git a/src/main/kotlin/UltraNotifier.kt b/src/main/kotlin/UltraNotifier.kt
index dce1fda..ddf8e87 100644
--- a/src/main/kotlin/UltraNotifier.kt
+++ b/src/main/kotlin/UltraNotifier.kt
@@ -1,12 +1,14 @@
package moe.nea.ultranotifier
-import moe.nea.ultranotifier.commands.Commands
+import moe.nea.ultranotifier.event.RegistrationFinishedEvent
+import moe.nea.ultranotifier.event.UltraEvent
+import moe.nea.ultranotifier.event.UltraNotifierEvents
import moe.nea.ultranotifier.init.NeaMixinConfig
import java.io.File
object UltraNotifier {
val logger =
-//#if MC <= 11404
+//#if MC <= 1.17
//$$ org.apache.logging.log4j.LogManager.getLogger("UltraNotifier")!!
//#else
org.slf4j.LoggerFactory.getLogger("UltraNotifier")!!
@@ -17,7 +19,15 @@ object UltraNotifier {
for (mixinPlugin in NeaMixinConfig.getMixinPlugins()) {
logger.info("Loaded ${mixinPlugin.mixins.size} mixins for ${mixinPlugin.mixinPackage}.")
}
- Commands.init()
+ logger.info("All modules: ${AllModules.allModules}")
+ AllModules.allModules.forEach {
+ logger.info("Registering $it")
+ UltraNotifierEvents.register(it)
+ it.init()
+ }
+
+ RegistrationFinishedEvent().post()
+
}
val configFolder = File("config/ultra-notifier").also {
diff --git a/src/main/kotlin/UltraNotifierEntryPoint.kt b/src/main/kotlin/UltraNotifierEntryPoint.kt
index 42ae064..aa84dc5 100644
--- a/src/main/kotlin/UltraNotifierEntryPoint.kt
+++ b/src/main/kotlin/UltraNotifierEntryPoint.kt
@@ -3,14 +3,14 @@ package moe.nea.ultranotifier
//#if FORGE
//$$import net.minecraftforge.fml.common.Mod
//$$
-//#if MC == 10809
+//#if MC < 1.13
//$$import net.minecraftforge.fml.common.event.FMLInitializationEvent
//$$@Mod(modid = Constants.MOD_ID, version = Constants.VERSION, useMetadata = true)
//#else
//$$@Mod(Constants.MOD_ID)
//#endif
//$$class UltraNotifierEntryPoint {
-//#if MC == 10809
+//#if MC < 1.13
//$$ @Mod.EventHandler
//$$ fun onInit(@Suppress("UNUSED_PARAMETER") event: FMLInitializationEvent) {
//#else
diff --git a/src/main/kotlin/commands/BrigadierPatchbay.kt b/src/main/kotlin/commands/BrigadierPatchbay.kt
new file mode 100644
index 0000000..b88d0e7
--- /dev/null
+++ b/src/main/kotlin/commands/BrigadierPatchbay.kt
@@ -0,0 +1,119 @@
+package moe.nea.ultranotifier.commands
+
+//#if MC < 1.16
+//$$import com.mojang.brigadier.CommandDispatcher
+//$$import com.mojang.brigadier.builder.LiteralArgumentBuilder
+//$$import com.mojang.brigadier.tree.CommandNode
+//$$import moe.nea.ultranotifier.event.CommandRegistrationEvent
+//$$import moe.nea.ultranotifier.event.RegistrationFinishedEvent
+//$$import moe.nea.ultranotifier.event.UltraNotifierEvents
+//$$import moe.nea.ultranotifier.event.UltraSubscribe
+//$$import moe.nea.ultranotifier.event.SubscriptionTarget
+//$$import moe.nea.ultranotifier.mixin.AccessorCommandHandler
+//$$import net.minecraft.command.CommandBase
+//$$import net.minecraft.command.CommandHandler
+//$$import net.minecraft.command.ICommandSender
+//$$import net.minecraft.server.MinecraftServer
+//$$import net.minecraft.util.text.ITextComponent
+//$$import net.minecraftforge.client.ClientCommandHandler
+//$$
+//$$fun CommandHandler.getCommandSet() = (this as AccessorCommandHandler).commandSet_ultraNotifier
+//$$
+//$$class BridgedCommandSource(
+//$$ val sender: ICommandSender
+//$$) : UltraCommandSource {
+//$$ override fun sendFeedback(text: ITextComponent) {
+//$$ sender.sendMessage(text)
+//$$ }
+//$$}
+//$$
+//$$class BrigadierCommand(
+//$$ val dispatcher: CommandDispatcher<UltraCommandSource>,
+//$$ val node: CommandNode<UltraCommandSource>
+//$$) : CommandBase() {
+//#if MC >= 1.12
+//$$ override fun checkPermission(server: MinecraftServer, sender: ICommandSender): Boolean {
+//$$ return true
+//$$ }
+//#else
+//$$ override fun canCommandSenderUseCommand(sender: ICommandSender): Boolean {
+//$$ return true
+//$$ }
+//#endif
+//$$
+//$$ override fun getName(): String {
+//$$ return node.name
+//$$ }
+//$$
+//$$ override fun getUsage(sender: ICommandSender): String {
+//$$ return ""
+//$$ }
+//$$
+//$$ private fun getCommandLineText(args: Array<out String>) = "${node.name} ${args.joinToString(" ")}".trim()
+//$$
+//$$
+//#if MC < 1.12
+//$$ override fun processCommand(sender: ICommandSender, args: Array<out String>) {
+//#else
+//$$ override fun execute(server: MinecraftServer, sender: ICommandSender, args: Array<out String>) {
+//#endif
+//$$ val source = BridgedCommandSource(sender)
+//$$ val results = dispatcher.parse(getCommandLineText(args), source)
+//$$ kotlin.runCatching {
+//$$ dispatcher.execute(results)
+//$$ Unit
+//$$ }.recoverCatching {
+//$$ source.sendFeedback(literalText("Could not execute ultra command: ${it.message}"))
+//$$ }
+//$$ }
+//$$}
+//$$
+//$$object BrigadierPatchbay : SubscriptionTarget {
+//$$
+//$$ @UltraSubscribe
+//$$ fun onAfterRegistration(event: RegistrationFinishedEvent) {
+//$$ fullReload()
+//$$ }
+//$$
+//$$ @UltraSubscribe
+//$$ fun onCommands(event: CommandRegistrationEvent) {
+//$$ event.dispatcher
+//$$ .register(LiteralArgumentBuilder.literal<UltraCommandSource>("reloadcommands")
+//$$ .executes {
+//$$ it.source.sendFeedback(literalText("Reloading commands"))
+//$$ fullReload()
+//$$ it.source.sendFeedback(literalText("Reload completed"))
+//$$ 0
+//$$ })
+//$$ }
+//$$
+//$$ fun fullReload() {
+//$$ val handler = ClientCommandHandler.instance
+//$$ unpatch(handler)
+//$$ val dispatcher = createDispatcher()
+//$$ UltraNotifierEvents.post(CommandRegistrationEvent(dispatcher))
+//$$ patch(handler, dispatcher)
+//$$ }
+//$$
+//$$ fun createDispatcher() = CommandDispatcher<UltraCommandSource>()
+//$$
+//$$ fun unpatch(handler: CommandHandler) {
+//$$ handler.getCommandSet()
+//$$ .removeIf {
+//$$ it is BrigadierCommand
+//$$ }
+//$$ handler.commands.entries
+//$$ .removeIf {
+//$$ it.value is BrigadierCommand
+//$$ }
+//$$ }
+//$$
+//$$ fun patch(handler: CommandHandler, dispatcher: CommandDispatcher<UltraCommandSource>) {
+//$$ dispatcher.root.children
+//$$ .map { BrigadierCommand(dispatcher, it) }
+//$$ .forEach(handler::registerCommand)
+//$$ }
+//$$}
+//#endif
+
+
diff --git a/src/main/kotlin/commands/Commands.kt b/src/main/kotlin/commands/Commands.kt
index 75047cd..5975bb2 100644
--- a/src/main/kotlin/commands/Commands.kt
+++ b/src/main/kotlin/commands/Commands.kt
@@ -1,9 +1,11 @@
package moe.nea.ultranotifier.commands
-import com.mojang.brigadier.CommandDispatcher
import com.mojang.brigadier.builder.LiteralArgumentBuilder
import moe.nea.ultranotifier.UltraNotifier
+import moe.nea.ultranotifier.event.CommandRegistrationEvent
+import moe.nea.ultranotifier.event.SubscriptionTarget
import moe.nea.ultranotifier.event.UltraNotifierEvents
+import moe.nea.ultranotifier.event.UltraSubscribe
import net.minecraft.text.Text
interface CustomSource {
@@ -14,35 +16,50 @@ interface CustomSource {
typealias UltraCommandSource =
//#if FORGE
//$$ CustomSource
-//#else
+//#elseif MC > 1.18
net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource
-
+//#else
+//$$ net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource
//#endif
+fun translatableText(key: String, vararg args: String) =
+//#if MC > 1.17
+ Text.translatable(key, *args)
+//#else
+//$$ net.minecraft.text.TranslatableText(key, *args)
+//#endif
+
fun literalText(string: String): Text =
-//#if MC >= 11400
+//#if MC > 1.17
Text.literal(string)
//#else
-//$$ net.minecraft.util.ChatComponentText(string)
+//$$ net.minecraft.text.LiteralText(string)
//#endif
-object Commands {
- fun registerAll(dispatcher: CommandDispatcher<UltraCommandSource>) {
- dispatcher.register(LiteralArgumentBuilder.literal<UltraCommandSource>("hello")
- .executes {
- it.source.sendFeedback(literalText("Hello World"))
- 0
- })
+object Commands : SubscriptionTarget {
+ @UltraSubscribe
+ fun registerTestCommand(event: CommandRegistrationEvent) {
+ event.dispatcher.register(LiteralArgumentBuilder.literal<UltraCommandSource>("hello")
+ .executes {
+ it.source.sendFeedback(literalText("Hello World"))
+ 0
+ })
}
- fun init() {
- UltraNotifierEvents.register(this)
+//#if MC <= 1.18 && FABRIC
+//$$ @UltraSubscribe
+//$$ fun registerEverythingOnce(event: moe.nea.ultranotifier.event.RegistrationFinishedEvent) {
+//$$ CommandRegistrationEvent(net.fabricmc.fabric.api.client.command.v1.ClientCommandManager.DISPATCHER).post()
+//$$ }
+//#endif
+
+ override fun init() {
//#if FORGE
-//$$
-//#else
+//$$ UltraNotifierEvents.register(BrigadierPatchbay)
+//#elseif MC > 1.18
net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback.EVENT.register { dispatcher, registryAccess ->
- registerAll(dispatcher)
+ UltraNotifierEvents.post(CommandRegistrationEvent(dispatcher))
}
//#endif
UltraNotifier.logger.info("Initialized command subsystem")
diff --git a/src/main/kotlin/datamodel/ChatType.kt b/src/main/kotlin/datamodel/ChatType.kt
new file mode 100644
index 0000000..47abe2a
--- /dev/null
+++ b/src/main/kotlin/datamodel/ChatType.kt
@@ -0,0 +1,175 @@
+package moe.nea.ultranotifier.datamodel
+
+import moe.nea.ultranotifier.UltraNotifier
+import moe.nea.ultranotifier.event.SubscriptionTarget
+import moe.nea.ultranotifier.event.TickEvent
+import moe.nea.ultranotifier.event.UltraSubscribe
+import moe.nea.ultranotifier.event.VisibleChatMessageAddedEvent
+import moe.nea.ultranotifier.util.GsonUtil
+import moe.nea.ultranotifier.util.duplicatesBy
+import moe.nea.ultranotifier.util.minecrat.MC
+import moe.nea.ultranotifier.util.minecrat.category
+import moe.nea.ultranotifier.util.minecrat.getFormattedTextCompat
+import moe.nea.ultranotifier.util.minecrat.removeFormattingCodes
+import net.minecraft.text.Text
+import util.KSerializable
+import java.util.function.Predicate
+import java.util.regex.Pattern
+
+data class ChatTypeId(
+ val id: String
+)
+
+@KSerializable
+data class ChatType(
+ val name: String,
+ val patterns: List<ChatPattern>,
+)
+
+data class ChatPattern(
+ val text: String
+) {
+ val pattern = Pattern.compile(text)
+ val predicate: Predicate<String> =
+//#if JAVA > 11
+ pattern.asMatchPredicate()
+//#else
+//$$ Predicate { it: String -> pattern.matcher(it).matches() }
+//#endif
+}
+
+data class CategoryId(val id: String)
+
+@KSerializable
+data class ChatCategory(
+ val id: CategoryId,
+ val label: String,
+ val chatTypes: Set<ChatTypeId>,
+)
+
+data class ChatUniverse(
+ val name: String,
+ val types: Map<ChatTypeId, ChatType>,
+ val categories: List<ChatCategory>,
+) {
+ fun categorize(
+ text: String
+ ): CategorizedChatLine {
+ val types = this.types
+ .asSequence()
+ .filter {
+ it.value.patterns.any {
+ it.predicate.test(text)
+ }
+ }
+ .map {
+ it.key