Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42736bd566 | ||
|
|
157edbd6b6 | ||
|
|
a7e029b0a1 | ||
|
|
ab98222f06 | ||
|
|
ad91cda0c0 | ||
|
|
9270423928 |
@@ -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 {
|
||||
@@ -25,3 +28,7 @@ publishing {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.test {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
@@ -544,11 +544,8 @@ public final class Config {
|
||||
NICK_CURRENT = getString("nicknames.messages.nick-current", NICK_CURRENT);
|
||||
}
|
||||
|
||||
public static int DEATH_MESSAGES_MAX_PER_PERIOD = 5;
|
||||
public static int DEATH_MESSAGES_LIMIT_PERIOD_MINUTES = 15;
|
||||
|
||||
private static void deathMessagesSettings() {
|
||||
DEATH_MESSAGES_MAX_PER_PERIOD = getInt("death-messages.max-per-period", DEATH_MESSAGES_MAX_PER_PERIOD);
|
||||
DEATH_MESSAGES_LIMIT_PERIOD_MINUTES = getInt("death-messages.limit-period-minutes", DEATH_MESSAGES_LIMIT_PERIOD_MINUTES);
|
||||
public static String APRIL_FOOLS_RESET = "esrever";
|
||||
private static void aprilFools() {
|
||||
APRIL_FOOLS_RESET = getString("april-fools.reset", APRIL_FOOLS_RESET);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,37 @@ 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<Component> reversedChildren = reverseChildren(component.children());
|
||||
|
||||
return Component.text("")
|
||||
.append(Component.join(JoinConfiguration.noSeparators(), reversedChildren)
|
||||
.append(Component.text(reversedContent, component.style())));
|
||||
}
|
||||
|
||||
public List<Component> reverseChildren(List<Component> children) {
|
||||
return children.stream()
|
||||
.map(this::reverseComponent)
|
||||
.collect(Collectors.collectingAndThen(Collectors.toList(), list -> {
|
||||
Collections.reverse(list);
|
||||
return list;
|
||||
}));
|
||||
}
|
||||
|
||||
public void removeStringAtStart(String s) {
|
||||
text = text.replaceText(TextReplacementConfig.builder().match("^" + s).replacement("").build());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,10 +16,6 @@ public class ALogger {
|
||||
logger.warn(message);
|
||||
}
|
||||
|
||||
public static void warn(String message, Throwable throwable) {
|
||||
logger.warn(message, throwable);
|
||||
}
|
||||
|
||||
public static void info(String message) {
|
||||
logger.info(message);
|
||||
}
|
||||
@@ -27,8 +23,4 @@ public class ALogger {
|
||||
public static void error(String message) {
|
||||
logger.error(message);
|
||||
}
|
||||
|
||||
public static void error(String message, Throwable throwable) {
|
||||
logger.error(message, throwable);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
import com.alttd.chat.config.Config;
|
||||
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 testRemoveKeyword() {
|
||||
String input = "Hello how are you doing today?";
|
||||
MiniMessage miniMessage = MiniMessage.miniMessage();
|
||||
|
||||
ModifiableString modifiableString = new ModifiableString(miniMessage.deserialize(Config.APRIL_FOOLS_RESET + " " + input));
|
||||
modifiableString.removeStringAtStart(Config.APRIL_FOOLS_RESET + " ");
|
||||
|
||||
assertEquals(input, modifiableString.string());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemoveKeywordWithTags() {
|
||||
MiniMessage miniMessage = MiniMessage.miniMessage();
|
||||
String input = "<blue>" + Config.APRIL_FOOLS_RESET + " <red>Hello how are</red> you <blue>doing today</blue>?</blue>";
|
||||
String expectedOutput = "Hello how are you doing today?";
|
||||
Component deserialize = miniMessage.deserialize(input);
|
||||
|
||||
ModifiableString modifiableString = new ModifiableString(deserialize);
|
||||
modifiableString.removeStringAtStart(Config.APRIL_FOOLS_RESET + " ");
|
||||
|
||||
assertEquals(expectedOutput, modifiableString.string());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testReverseStringWithTags() {
|
||||
String input = "<red>Hello how are</red> you <blue>doing today</blue>?";
|
||||
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 = "<green><red>Hello <b>how</b> are</red> you <blue>doing today</blue><gold>?</gold></green>";
|
||||
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 = "<gold>This <red>is</red> longer<green> <name> <red>Hello <b>how</b> are</red> you <test> <blue>doing <name> today</blue><gold>?</gold></green></gold>";
|
||||
MiniMessage miniMessage = MiniMessage.miniMessage();
|
||||
Component deserialize = miniMessage.deserialize(input, TagResolver.resolver(
|
||||
Placeholder.component("name", miniMessage.deserialize("<red>Cool<blue><rainbow>_player_</rainbow>name</red>")),
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -29,6 +29,7 @@ import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.time.*;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Pattern;
|
||||
@@ -107,7 +108,14 @@ public class ChatListener implements Listener {
|
||||
|
||||
Set<Player> playersToPing = new HashSet<>();
|
||||
pingPlayers(playersToPing, modifiableString, player);
|
||||
|
||||
LocalDate now = LocalDate.now();
|
||||
if (now.getMonth().equals(Month.APRIL) && now.getDayOfMonth() == 1) {
|
||||
if (modifiableString.string().startsWith(Config.APRIL_FOOLS_RESET + " ")) {
|
||||
modifiableString.removeStringAtStart(Config.APRIL_FOOLS_RESET + " ");
|
||||
} else {
|
||||
modifiableString.reverse();
|
||||
}
|
||||
}
|
||||
input = render(player, modifiableString.component());
|
||||
for (Player receiver : receivers) {
|
||||
receiver.sendMessage(input);
|
||||
|
||||
@@ -11,25 +11,15 @@ import com.alttd.chat.objects.Toggleable;
|
||||
import com.alttd.chat.util.GalaxyUtility;
|
||||
import com.alttd.chat.util.Utility;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.Style;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.SignChangeEvent;
|
||||
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.HashMap;
|
||||
import java.util.Stack;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@@ -96,29 +86,4 @@ public class PlayerListener implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
private final HashMap<UUID, Stack<Instant>> sendPlayerDeaths = new HashMap<>();
|
||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
||||
public void onPlayerDeath(@NotNull PlayerDeathEvent event) {
|
||||
UUID uuid = event.getPlayer().getUniqueId();
|
||||
Stack<Instant> playerDeathsStack = sendPlayerDeaths.computeIfAbsent(uuid, key -> new Stack<>());
|
||||
Instant cutOff = Instant.now().minus(Config.DEATH_MESSAGES_LIMIT_PERIOD_MINUTES, ChronoUnit.MINUTES);
|
||||
|
||||
while (playerDeathsStack.peek().isBefore(cutOff)) {
|
||||
playerDeathsStack.pop();
|
||||
}
|
||||
|
||||
if (playerDeathsStack.size() > Config.DEATH_MESSAGES_MAX_PER_PERIOD || serverConfig.MUTED) {
|
||||
event.deathMessage(Component.empty());
|
||||
return;
|
||||
} else {
|
||||
Component component = event.deathMessage();
|
||||
if (component != null) {
|
||||
component = Component.text("* ").append(component);
|
||||
component = component.style(Style.style(TextColor.color(82, 80, 77), TextDecoration.ITALIC));
|
||||
event.deathMessage(component);
|
||||
}
|
||||
}
|
||||
playerDeathsStack.push(Instant.now());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user