diff --git a/README.md b/README.md index 5baf1df..9dfc872 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![Fabric Mod](https://img.shields.io/badge/modloader-fabric-informational)](https://fabricmc.net/use/) -[![Latest Version](https://img.shields.io/badge/version-1.4.5-brightgreen)](https://github.com/Giggitybyte/ServerChatHistory/releases) +[![Latest Version](https://img.shields.io/badge/version-1.4.6-brightgreen)](https://github.com/Giggitybyte/ServerChatHistory/releases) [![Curseforge Download](https://bit.ly/33eX25e)](https://www.curseforge.com/minecraft/mc-mods/wmch) # Where's My Chat History diff --git a/build.gradle b/build.gradle index dcd9088..574ee22 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 archivesBaseName = 'wmch' -version = '1.4.5' +version = '1.4.6' group = 'obro1961.wmch' project.ext.set('minecraft_version', '1.18.2') project.ext.set('loader_version', '0.13.3') diff --git a/src/main/java/obro1961/wmch/Util.java b/src/main/java/obro1961/wmch/Util.java index 61ff9ad..1f98203 100644 --- a/src/main/java/obro1961/wmch/Util.java +++ b/src/main/java/obro1961/wmch/Util.java @@ -101,18 +101,24 @@ public static Text getStrTextF(String dirty) { Matcher results = finder.matcher(dirty); if (dirty.matches(".*"+finder.pattern()+".*")) { + // if there is text before a formatter then add it alone + if( dirty.split(finder.pattern())[0].length() > 0 ) { + String prfx = dirty.split(finder.pattern())[0]; + out.append(prfx); + dirty = dirty.replace(prfx, ""); + }; + List texts = new ArrayList<>( Arrays.asList(dirty.split(finder.pattern())) ); texts.removeIf(s -> s.equals("")); int i = 0; - // &8(&7x&r$&8) -> _&8(&7x&r#&8) -> [_,(,x,#,)] -> [r,8,7,r,8] -> Text + while(results.find()) { Formatting[] style = new Formatting[results.group().length() / 2]; char[] codes = delAll(results.group(), "&").toCharArray(); for (int j = 0; j < codes.length; ++j) style[j] = Formatting.byCode(codes[j]); - out.append( new LiteralText(texts.get(i)).formatted(style) ); - ++i; + out.append( new LiteralText(texts.get(i++)).formatted(style) ); } - System.out.println(results.results()); + return out; } else return Text.of(dirty); diff --git a/src/main/java/obro1961/wmch/config/ClothConfig.java b/src/main/java/obro1961/wmch/config/ClothConfig.java index 3aea996..89b4385 100644 --- a/src/main/java/obro1961/wmch/config/ClothConfig.java +++ b/src/main/java/obro1961/wmch/config/ClothConfig.java @@ -1,21 +1,5 @@ package obro1961.wmch.config; -import static obro1961.wmch.config.Option.BOUNDARY; -import static obro1961.wmch.config.Option.BOUNDARYCOLOR; -import static obro1961.wmch.config.Option.BOUNDARYSTR; -import static obro1961.wmch.config.Option.COUNTER; -import static obro1961.wmch.config.Option.COUNTERCOLOR; -import static obro1961.wmch.config.Option.COUNTERSTR; -import static obro1961.wmch.config.Option.HOVER; -import static obro1961.wmch.config.Option.HOVERSTR; -import static obro1961.wmch.config.Option.LENIANTEQUALS; -import static obro1961.wmch.config.Option.MAXMSGS; -import static obro1961.wmch.config.Option.NAMESTR; -import static obro1961.wmch.config.Option.TIME; -import static obro1961.wmch.config.Option.TIMECOLOR; -import static obro1961.wmch.config.Option.TIMEFORMAT; -import static obro1961.wmch.config.Option.TIMESTR; - import me.shedaniel.clothconfig2.api.ConfigBuilder; import me.shedaniel.clothconfig2.api.ConfigCategory; import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; @@ -43,29 +27,30 @@ public Screen getWMCHConfigScreen(Screen prevScreen) { ConfigCategory time = bldr.getOrCreateCategory(new TranslatableText("text.wmch.time_category")); ConfigCategory hover = bldr.getOrCreateCategory(new TranslatableText("text.wmch.hover_category")); - //ConfigCategory counter = bldr.getOrCreateCategory(new TranslatableText("text.wmch.counter_category")); + ConfigCategory counter = bldr.getOrCreateCategory(new TranslatableText("text.wmch.counter_category")); ConfigCategory boundary = bldr.getOrCreateCategory(new TranslatableText("text.wmch.boundary_category")); ConfigCategory other = bldr.getOrCreateCategory(new TranslatableText("text.wmch.other_category")); - eBldr = TIME.updateEntryBuilder(eBldr, time, TIME); - eBldr = TIMESTR.updateEntryBuilder(eBldr, time, TIMESTR); - eBldr = TIMEFORMAT.updateEntryBuilder(eBldr, time, TIMEFORMAT); - eBldr = TIMECOLOR.updateEntryBuilder(eBldr, time, TIMECOLOR); + eBldr = Option.TIME.updateEntryBuilder(eBldr, time, Option.TIME); + eBldr = Option.TIMESTR.updateEntryBuilder(eBldr, time, Option.TIMESTR); + eBldr = Option.TIMEFORMAT.updateEntryBuilder(eBldr, time, Option.TIMEFORMAT); + eBldr = Option.TIMECOLOR.updateEntryBuilder(eBldr, time, Option.TIMECOLOR); - eBldr = HOVER.updateEntryBuilder(eBldr, hover, HOVER); - eBldr = HOVERSTR.updateEntryBuilder(eBldr, hover, HOVERSTR); + eBldr = Option.HOVER.updateEntryBuilder(eBldr, hover, Option.HOVER); + eBldr = Option.HOVERSTR.updateEntryBuilder(eBldr, hover, Option.HOVERSTR); - /* eBldr = COUNTER.updateEntryBuilder(eBldr, counter, COUNTER); - eBldr = COUNTERSTR.updateEntryBuilder(eBldr, counter, COUNTERSTR); - eBldr = COUNTERCOLOR.updateEntryBuilder(eBldr, counter, COUNTERCOLOR); - eBldr = LENIANTEQUALS.updateEntryBuilder(eBldr, counter, LENIANTEQUALS); */ + eBldr = Option.COUNTER.updateEntryBuilder(eBldr, counter, Option.COUNTER); + eBldr = Option.COUNTERSTR.updateEntryBuilder(eBldr, counter, Option.COUNTERSTR); + eBldr = Option.COUNTERCOLOR.updateEntryBuilder(eBldr, counter, Option.COUNTERCOLOR); + //eBldr = Option.DUPETHRESHOLD.updateEntryBuilder(eBldr, counter, Option.DUPETHRESHOLD); + eBldr = Option.LENIANTEQUALS.updateEntryBuilder(eBldr, counter, Option.LENIANTEQUALS); - eBldr = BOUNDARY.updateEntryBuilder(eBldr, boundary, BOUNDARY); - eBldr = BOUNDARYSTR.updateEntryBuilder(eBldr, boundary, BOUNDARYSTR); - eBldr = BOUNDARYCOLOR.updateEntryBuilder(eBldr, boundary, BOUNDARYCOLOR); + eBldr = Option.BOUNDARY.updateEntryBuilder(eBldr, boundary, Option.BOUNDARY); + eBldr = Option.BOUNDARYSTR.updateEntryBuilder(eBldr, boundary, Option.BOUNDARYSTR); + eBldr = Option.BOUNDARYCOLOR.updateEntryBuilder(eBldr, boundary, Option.BOUNDARYCOLOR); - eBldr = NAMESTR.updateEntryBuilder(eBldr, other, NAMESTR); - eBldr = MAXMSGS.updateEntryBuilder(eBldr, other, MAXMSGS); + eBldr = Option.NAMESTR.updateEntryBuilder(eBldr, other, Option.NAMESTR); + eBldr = Option.MAXMSGS.updateEntryBuilder(eBldr, other, Option.MAXMSGS); bldr.setSavingRunnable(() -> { diff --git a/src/main/java/obro1961/wmch/config/Config.java b/src/main/java/obro1961/wmch/config/Config.java index 600d1f9..32df9e4 100644 --- a/src/main/java/obro1961/wmch/config/Config.java +++ b/src/main/java/obro1961/wmch/config/Config.java @@ -14,6 +14,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.text.LiteralText; +import net.minecraft.text.Style; import net.minecraft.text.Text; import obro1961.wmch.Util; import obro1961.wmch.WMCH; @@ -37,6 +38,7 @@ public class Config { public boolean counter; public String counterStr; public int counterColor; + public int dupeThreshold; public boolean leniantEquals; public boolean boundary; public String boundaryStr; @@ -55,12 +57,13 @@ public Config() { this.counter = Option.COUNTER.getDefault(); this.counterStr = Option.COUNTERSTR.getDefault(); this.counterColor = Option.COUNTERCOLOR.getDefault(); + this.dupeThreshold = Option.DUPETHRESHOLD.getDefault(); + this.leniantEquals = Option.LENIANTEQUALS.getDefault(); this.boundary = Option.BOUNDARY.getDefault(); this.boundaryStr = Option.BOUNDARYSTR.getDefault(); this.boundaryColor = Option.BOUNDARYCOLOR.getDefault(); this.nameStr = Option.NAMESTR.getDefault(); this.maxMsgs = Option.MAXMSGS.getDefault(); - this.leniantEquals = Option.LENIANTEQUALS.getDefault(); } /** @@ -82,10 +85,11 @@ public static void validate() { Option.BOUNDARYSTR.onSave(cfg.boundaryStr, Option.BOUNDARYSTR); Option.BOUNDARYCOLOR.onSave(cfg.boundaryColor, Option.BOUNDARYCOLOR); - /* Option.COUNTER.onSave(cfg.counter, Option.COUNTER); + Option.COUNTER.onSave(cfg.counter, Option.COUNTER); Option.COUNTERSTR.onSave(cfg.counterStr, Option.COUNTERSTR); Option.COUNTERCOLOR.onSave(cfg.counterColor, Option.COUNTERCOLOR); - Option.LENIANTEQUALS.onSave(cfg.leniantEquals, Option.LENIANTEQUALS); */ + //Option.DUPETHRESHOLD.onSave(cfg.dupeThreshold, Option.DUPETHRESHOLD); + Option.LENIANTEQUALS.onSave(cfg.leniantEquals, Option.LENIANTEQUALS); Option.NAMESTR.onSave(cfg.nameStr, Option.NAMESTR); Option.MAXMSGS.onSave(cfg.maxMsgs, Option.MAXMSGS); @@ -98,7 +102,7 @@ public static void validate() { /** Formats timeStr, then uses that to format timeFormat, adds a space, then finally colors it */ public Text getTimeF(Date when) { return ((LiteralText)Util.getStrTextF(Option.TIMEFORMAT.get() + (new SimpleDateFormat(cfg.timeStr).format(when)) + " ")) - .fillStyle(net.minecraft.text.Style.EMPTY.withColor(Option.TIMECOLOR.get())); + .fillStyle(Style.EMPTY.withColor(Option.TIMECOLOR.get())); } public String getHoverF(Date when) { return new SimpleDateFormat(Option.HOVERSTR.get()).format(when); @@ -107,23 +111,19 @@ public String getNameF(String name) { return Option.NAMESTR.get().replaceAll("\\$", name); } public Text getDupeF(int dupes) { - return Util.getStrTextF(" " + Option.COUNTERSTR.get().replaceAll("\\$", Integer.toString(dupes))); + return ((LiteralText)Util.getStrTextF(" " + Option.COUNTERSTR.get().replaceAll("\\$", Integer.toString(dupes)))) + .fillStyle(Style.EMPTY.withColor(Option.COUNTERCOLOR.get())); } - /** Prints any changes between altering Options. */ + /** Prints any changes between altering of Options */ protected static void logDiffs() { // only log if changes were made - if (Option.diff == "Changes made:") { - Option.diff = "No changes made!"; - } else { - Option.diff.lines().forEach(ln -> {}); - } - - lg.info(Option.diff); + if (Option.diff == "Changes made:") lg.info("No changes made!"); + else lg.info(Option.diff); Option.diff = "Changes made:"; } - /** Sets the {@code cfg} field in {@link Config} to the file at {@code ./config/wmch.json}. */ + /** Sets the {@code cfg} field in {@link Config} to the file at {@code ./config/wmch.json} */ public static void read() { File cfgFile = new File( FabricLoader.getInstance().getConfigDir().toFile().getAbsolutePath() + File.separator + "wmch.json" ); Gson gson = new Gson(); @@ -150,7 +150,7 @@ public static void read() { } /** - * Saves a Config to {@code ./config/wmch.json}. + * Saves a Config to {@code ./config/wmch.json} * @param c The Config to save */ public static void write(Config c) { diff --git a/src/main/java/obro1961/wmch/config/Option.java b/src/main/java/obro1961/wmch/config/Option.java index e021cba..cb6ad3d 100644 --- a/src/main/java/obro1961/wmch/config/Option.java +++ b/src/main/java/obro1961/wmch/config/Option.java @@ -98,7 +98,7 @@ public ConfigEntryBuilder updateEntryBuilder(ConfigEntryBuilder builder, ConfigC break; } case "java.lang.Integer": { - category.addEntry( me.getKey() == "maxMsgs" + category.addEntry( me.getKey() == "maxMsgs" || me.getKey() == "dupeThreshold" ? builder.startIntField(getName(), (int)value) .setDefaultValue((int)def) .setTooltip(getTooltip()) @@ -169,18 +169,21 @@ public static void printTableEntries() { public static final Option COUNTER = new Option<>(true, "counter", TIME.getSaveConsumer()); public static final Option COUNTERSTR = new Option<>("&8(&7x&e$&8)", "counterStr", (inc, me) -> { if(inc.contains("$")) { - String out = Util.delAll(inc, "\s{3,}"); + String out = Util.delAll(inc, "\s{2,}"); Util.getStrTextF(out); me.setInDefConfig(out); } }); public static final Option COUNTERCOLOR = new Option<>(Formatting.YELLOW.getColorValue(), "counterColor", TIMECOLOR.getSaveConsumer()); + public static final Option DUPETHRESHOLD = new Option<>(3, "dupeThreshold", (inc, me) -> { + if(inc > 1 && inc < Option.MAXMSGS.get()) me.setInDefConfig(inc); + }); + public static final Option LENIANTEQUALS = new Option<>(false, "leniantEquals", TIME.getSaveConsumer()); public static final Option BOUNDARY = new Option<>(true, "boundary", TIME.getSaveConsumer()); public static final Option BOUNDARYSTR = new Option<>("&b[==============]", "boundaryStr", (inc, me) -> { if(inc.length() > 0) { - String out = Util.delAll(inc, "\s{2,}").trim(); - Util.getStrTextF(out); - me.setInDefConfig(inc); + Util.getStrTextF(inc.strip()); + me.setInDefConfig(inc.strip()); } }); public static final Option BOUNDARYCOLOR = new Option<>(Formatting.DARK_AQUA.getColorValue(), "boundaryColor", TIMECOLOR.getSaveConsumer()); @@ -188,12 +191,11 @@ public static void printTableEntries() { public static final Option MAXMSGS = new Option<>(1024, "maxMsgs", (inc, me) -> { if(4097 > inc && inc > 99) me.setInDefConfig(inc); }); - public static final Option LENIANTEQUALS = new Option<>(false, "leniantEquals", TIME.getSaveConsumer()); public static final List> OPTIONS = new ArrayList<>(Arrays.asList( TIME, TIMESTR, TIMECOLOR, TIMEFORMAT, HOVER, HOVERSTR, - COUNTER, COUNTERSTR, COUNTERCOLOR, LENIANTEQUALS, + COUNTER, COUNTERSTR, COUNTERCOLOR, DUPETHRESHOLD, LENIANTEQUALS, BOUNDARY, BOUNDARYSTR, BOUNDARYCOLOR, NAMESTR, MAXMSGS )); diff --git a/src/main/java/obro1961/wmch/mixins/ChatHudMixin.java b/src/main/java/obro1961/wmch/mixins/ChatHudMixin.java index c3abbae..68bc39c 100644 --- a/src/main/java/obro1961/wmch/mixins/ChatHudMixin.java +++ b/src/main/java/obro1961/wmch/mixins/ChatHudMixin.java @@ -128,23 +128,59 @@ public OrderedText transform(OrderedText old) { client.keyboard.setClipboard(raw); client.inGameHud.addChatMessage( MessageType.GAME_INFO, - new LiteralText( "'%s' copied!".formatted(raw.trim()) ).formatted(Formatting.GREEN), + new LiteralText( "'%s' copied!".formatted(raw.strip()) ).formatted(Formatting.GREEN), net.minecraft.util.Util.NIL_UUID ); } return old; } - @Inject( - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/font/TextHandler;getStyleAt(Lnet/minecraft/text/OrderedText;I)Lnet/minecraft/text/Style;" - ), + at = @At(value="INVOKE", target="Lnet/minecraft/client/font/TextHandler;getStyleAt(Lnet/minecraft/text/OrderedText;I)Lnet/minecraft/text/Style;"), method = "getText", - locals = LocalCapture.CAPTURE_FAILEXCEPTION + locals = LocalCapture.CAPTURE_FAILSOFT ) private void grabText(double x,double y,CallbackInfoReturnable