diff --git a/api/build.gradle.kts b/api/build.gradle.kts index d4e432d..32560bb 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -8,6 +8,9 @@ dependencies { } compileOnly("org.spongepowered:configurate-yaml:4.1.2") // Configurate compileOnly("net.luckperms:api:5.3") // Luckperms + testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") + testImplementation("com.alttd:Galaxy-API:1.19.2-R0.1-SNAPSHOT") } publishing { @@ -24,4 +27,8 @@ publishing { credentials(PasswordCredentials::class) } } +} + +tasks.test { + useJUnitPlatform() } \ No newline at end of file diff --git a/api/src/main/java/com/alttd/chat/config/Config.java b/api/src/main/java/com/alttd/chat/config/Config.java index a2028f0..0c8d4a8 100755 --- a/api/src/main/java/com/alttd/chat/config/Config.java +++ b/api/src/main/java/com/alttd/chat/config/Config.java @@ -543,4 +543,9 @@ public final class Config { NICK_ALLOWED_COLOR_CODESLIST = getList("nicknames.allowed-color-codes", List.of("&0", "&1", "&2", "&3", "&4", "&5", "&6", "&7", "&8", "&9", "&a", "&b", "&c", "&d", "&e", "&f", "&r")); NICK_CURRENT = getString("nicknames.messages.nick-current", NICK_CURRENT); } + + public static String APRIL_FOOLS_RESET = "reverse"; + private static void aprilFools() { + APRIL_FOOLS_RESET = getString("april-fools.reset", APRIL_FOOLS_RESET); + } } diff --git a/api/src/main/java/com/alttd/chat/objects/ModifiableString.java b/api/src/main/java/com/alttd/chat/objects/ModifiableString.java index 7ed12cf..5f048a4 100644 --- a/api/src/main/java/com/alttd/chat/objects/ModifiableString.java +++ b/api/src/main/java/com/alttd/chat/objects/ModifiableString.java @@ -1,12 +1,14 @@ package com.alttd.chat.objects; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.JoinConfiguration; +import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextReplacementConfig; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; -import org.intellij.lang.annotations.RegExp; -import javax.annotation.RegEx; -import java.util.regex.Pattern; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; public class ModifiableString { private Component text; @@ -30,4 +32,33 @@ public class ModifiableString { public Component component() { return text; } + + public void reverse() { + text = reverseComponent(text); + } + + public Component reverseComponent(Component component) { + if (!(component instanceof TextComponent textComponent)) { + return Component.text("") + .append(Component.join(JoinConfiguration.noSeparators(), reverseChildren(component.children()))); + } + + String content = textComponent.content(); + String reversedContent = new StringBuilder(content).reverse().toString(); + + List reversedChildren = reverseChildren(component.children()); + + return Component.text("") + .append(Component.join(JoinConfiguration.noSeparators(), reversedChildren) + .append(Component.text(reversedContent, component.style()))); + } + + public List reverseChildren(List children) { + return children.stream() + .map(this::reverseComponent) + .collect(Collectors.collectingAndThen(Collectors.toList(), list -> { + Collections.reverse(list); + return list; + })); + } } diff --git a/api/src/test/java/ReverseTest.java b/api/src/test/java/ReverseTest.java new file mode 100644 index 0000000..271b266 --- /dev/null +++ b/api/src/test/java/ReverseTest.java @@ -0,0 +1,60 @@ +import com.alttd.chat.objects.ModifiableString; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import net.kyori.adventure.text.minimessage.MiniMessage; + +public class ReverseTest { + + @Test + public void testReverseString() { + String input = "Hello how are you doing today?"; + String expectedOutput = new StringBuilder(input).reverse().toString(); + MiniMessage miniMessage = MiniMessage.miniMessage(); + ModifiableString modifiableString = new ModifiableString(miniMessage.deserialize(input)); + modifiableString.reverse(); + assertEquals(expectedOutput, modifiableString.string()); + } + + @Test + public void testReverseStringWithTags() { + String input = "Hello how are you doing today?"; + MiniMessage miniMessage = MiniMessage.miniMessage(); + Component deserialize = miniMessage.deserialize(input); + ModifiableString modifiableString = new ModifiableString(deserialize); + String expectedOutput = new StringBuilder(PlainTextComponentSerializer.plainText().serialize(deserialize)).reverse().toString(); + modifiableString.reverse(); + assertEquals(expectedOutput, modifiableString.string()); + } + + @Test + public void complexTestReverseStringWithTags() { + String input = "Hello how are you doing today?"; + MiniMessage miniMessage = MiniMessage.miniMessage(); + Component deserialize = miniMessage.deserialize(input); + ModifiableString modifiableString = new ModifiableString(deserialize); + String expectedOutput = new StringBuilder(PlainTextComponentSerializer.plainText().serialize(deserialize)).reverse().toString(); + modifiableString.reverse(); + assertEquals(expectedOutput, modifiableString.string()); + } + + @Test + public void extraComplexTestReverseStringWithTags() { + String input = "This is longer Hello how are you doing today?"; + MiniMessage miniMessage = MiniMessage.miniMessage(); + Component deserialize = miniMessage.deserialize(input, TagResolver.resolver( + Placeholder.component("name", miniMessage.deserialize("Cool_player_name")), + Placeholder.parsed("test", "test replacement") + )); + ModifiableString modifiableString = new ModifiableString(deserialize); + String expectedOutput = new StringBuilder(PlainTextComponentSerializer.plainText().serialize(deserialize)).reverse().toString(); + modifiableString.reverse(); + System.out.println(expectedOutput); + assertEquals(expectedOutput, modifiableString.string()); + } + +} diff --git a/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java b/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java index 6d9aa78..6b6aa58 100755 --- a/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java +++ b/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java @@ -29,6 +29,8 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; +import java.time.LocalDate; +import java.time.Month; import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; @@ -107,7 +109,10 @@ public class ChatListener implements Listener { Set playersToPing = new HashSet<>(); pingPlayers(playersToPing, modifiableString, player); - + LocalDate now = LocalDate.now(); + if (now.getMonth().equals(Month.APRIL) && now.getDayOfMonth() == 1 && !modifiableString.string().startsWith(Config.APRIL_FOOLS_RESET)) { + modifiableString.reverse(); + } input = render(player, modifiableString.component()); for (Player receiver : receivers) { receiver.sendMessage(input);