diff --git a/build.gradle.kts b/build.gradle.kts index 3bc82bb9..437c446c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,6 +25,7 @@ java { dependencies { compileOnly("org.spongepowered:configurate-hocon:4.1.2") + compileOnly("com.github.ben-manes.caffeine:caffeine:3.0.6") shadow("org.jetbrains:annotations:23.0.0") shadow("net.byteflux:libby-velocity:1.1.5") @@ -39,7 +40,7 @@ dependencies { testImplementation("org.junit.jupiter:junit-jupiter") testImplementation("org.mockito:mockito-core:4.1.0") testImplementation("com.velocitypowered:velocity-api:3.1.2-SNAPSHOT") - + testImplementation("com.github.ben-manes.caffeine:caffeine:3.0.6") } group = "me.dreamerzero.chatregulator" diff --git a/src/main/java/me/dreamerzero/chatregulator/ChatRegulator.java b/src/main/java/me/dreamerzero/chatregulator/ChatRegulator.java index db08851d..fee9e3a5 100644 --- a/src/main/java/me/dreamerzero/chatregulator/ChatRegulator.java +++ b/src/main/java/me/dreamerzero/chatregulator/ChatRegulator.java @@ -3,8 +3,9 @@ import java.nio.file.Path; import java.util.Map; import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; import com.google.inject.Inject; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; @@ -64,7 +65,7 @@ public class ChatRegulator { /** * InfractionPlayer list */ - protected static final Map infractionPlayers = new ConcurrentHashMap<>(); + protected static final Cache infractionPlayers = Caffeine.newBuilder().weakKeys().build(); /** * Constructor for ChatRegulator Plugin @@ -155,7 +156,7 @@ public IFormatter getFormatter(){ } public Map getChatPlayers(){ - return infractionPlayers; + return infractionPlayers.asMap(); } /** @@ -186,10 +187,21 @@ private void loadDependencies() { .version("1.3.13") .id("geantyref") .build(); + final Library caffeine = Library.builder() + .groupId("com{}github{}ben-manes{}caffeine") + .artifactId("caffeine") + .version("3.0.6") + .id("caffeine") + .build(); libraryManager.addMavenCentral(); libraryManager.loadLibrary(hocon); libraryManager.loadLibrary(confCore); libraryManager.loadLibrary(geantyref); + libraryManager.loadLibrary(caffeine); + } + + public void removePlayer(UUID uuid) { + infractionPlayers.invalidate(uuid); } } \ No newline at end of file diff --git a/src/main/java/me/dreamerzero/chatregulator/InfractionPlayer.java b/src/main/java/me/dreamerzero/chatregulator/InfractionPlayer.java index d04cbb70..34bae6f3 100644 --- a/src/main/java/me/dreamerzero/chatregulator/InfractionPlayer.java +++ b/src/main/java/me/dreamerzero/chatregulator/InfractionPlayer.java @@ -3,7 +3,6 @@ import java.time.Duration; import java.time.Instant; import java.util.Objects; -import java.util.Optional; import java.util.UUID; import com.velocitypowered.api.proxy.Player; @@ -52,25 +51,6 @@ public final class InfractionPlayer implements ForwardingAudience.Single { this.username = player.getUsername(); } - /** - * Constructor of an InfractorPlayer based on its {@link UUID} - * @param uuid the uuid on which it will be based - * @throws PlayerNotAvailableException - */ - @Internal - InfractionPlayer(final @NotNull UUID uuid, final @NotNull ProxyServer proxy) throws PlayerNotAvailableException{ - this.player = proxy.getPlayer(uuid).orElseThrow(PlayerNotAvailableException::new); - this.preLastMessage = " ."; - this.lastMessage = " "; - this.preLastCommand = " "; - this.lastCommand = " ."; - this.timeSinceLastMessage = Instant.now(); - this.timeSinceLastCommand = Instant.now(); - this.violationsCount = new ViolationCount(); - this.isOnline = true; - this.username = player.getUsername(); - } - /** * A simple method to obtain the player's name * @return infraction player name @@ -191,19 +171,12 @@ public long getTimeSinceLastCommand(){ * @throws PlayerNotAvailableException if the player is not available */ public static @Nullable InfractionPlayer get(final @NotNull UUID uuid, @NotNull ProxyServer proxy) throws PlayerNotAvailableException{ - InfractionPlayer player = ChatRegulator.infractionPlayers.get(Objects.requireNonNull(uuid)); - if(player != null){ - return player; - } else { - Optional optionalPlayer = proxy.getPlayer(uuid); - if(optionalPlayer.isPresent()){ - player = InfractionPlayer.get(optionalPlayer.get()); - ChatRegulator.infractionPlayers.put(uuid, player); - return player; - } else { - throw new PlayerNotAvailableException(uuid); - } - } + return ChatRegulator.infractionPlayers + .get(Objects.requireNonNull(uuid), + (id) -> new InfractionPlayer( + proxy.getPlayer(id) + .orElseThrow(() -> new PlayerNotAvailableException(id)) + )); } /** @@ -213,21 +186,16 @@ public long getTimeSinceLastCommand(){ */ public static @NotNull InfractionPlayer get(final @NotNull Player player){ final UUID uuid = Objects.requireNonNull(player).getUniqueId(); - InfractionPlayer infractor = ChatRegulator.infractionPlayers.get(uuid); - if(infractor != null){ - if(!infractor.isOnline()) { - infractor.player = player; - } - return infractor; - } else { - infractor = new InfractionPlayer(player); - ChatRegulator.infractionPlayers.put(uuid, infractor); - return infractor; + final InfractionPlayer infractor = ChatRegulator.infractionPlayers + .get(uuid, id -> new InfractionPlayer(player)); + if (!infractor.isOnline()) { + infractor.player = player; } + return infractor; } public static @Nullable InfractionPlayer get(final @NotNull String name){ - return ChatRegulator.infractionPlayers.values().stream() + return ChatRegulator.infractionPlayers.asMap().values().stream() .filter(p -> p.username().equalsIgnoreCase(name)) .findAny().orElse(null); } @@ -240,8 +208,8 @@ public boolean equals(Object o){ if(!(o instanceof final InfractionPlayer other)) { return false; } - return Objects.equals(other.getViolations(), this.getViolations()) - || Objects.equals(other.username, this.username); + return Objects.equals(other.username, this.username) + && Objects.equals(other.getViolations(), this.getViolations()); } @Override diff --git a/src/main/java/me/dreamerzero/chatregulator/ViolationCount.java b/src/main/java/me/dreamerzero/chatregulator/ViolationCount.java index f5746036..a205c917 100644 --- a/src/main/java/me/dreamerzero/chatregulator/ViolationCount.java +++ b/src/main/java/me/dreamerzero/chatregulator/ViolationCount.java @@ -81,8 +81,8 @@ public int getCount(@NotNull InfractionType type){ @Override public boolean equals(Object o){ - if(this==o) return true; - if(!(o instanceof final ViolationCount that)) return false; + if (this==o) return true; + if (!(o instanceof final ViolationCount that)) return false; return this.spamViolations == that.spamViolations && this.capsviolations == that.capsviolations && this.commandViolations == that.commandViolations diff --git a/src/main/java/me/dreamerzero/chatregulator/events/ViolationEvent.java b/src/main/java/me/dreamerzero/chatregulator/events/ViolationEvent.java index 173455d1..7e31dd06 100644 --- a/src/main/java/me/dreamerzero/chatregulator/events/ViolationEvent.java +++ b/src/main/java/me/dreamerzero/chatregulator/events/ViolationEvent.java @@ -14,7 +14,7 @@ /** * Basis for infringement events */ -public class ViolationEvent implements ResultedEvent { +public abstract class ViolationEvent implements ResultedEvent { /** * InfractionPlayer involved in detection */ diff --git a/src/main/java/me/dreamerzero/chatregulator/listener/command/CommandListener.java b/src/main/java/me/dreamerzero/chatregulator/listener/command/CommandListener.java index a47011d9..34e5ab7d 100644 --- a/src/main/java/me/dreamerzero/chatregulator/listener/command/CommandListener.java +++ b/src/main/java/me/dreamerzero/chatregulator/listener/command/CommandListener.java @@ -13,6 +13,7 @@ import me.dreamerzero.chatregulator.config.Configuration; import me.dreamerzero.chatregulator.modules.checks.CommandCheck; import me.dreamerzero.chatregulator.modules.checks.SyntaxCheck; +import me.dreamerzero.chatregulator.result.Result; import me.dreamerzero.chatregulator.utils.CommandUtils; import me.dreamerzero.chatregulator.utils.GeneralUtils.EventBundle; import me.dreamerzero.chatregulator.wrapper.event.CommandWrapper; @@ -87,7 +88,10 @@ && checkAndCall( player, string, InfractionType.SYNTAX, - SyntaxCheck.createCheck(string).join(), + SyntaxCheck.createCheck(string).exceptionallyAsync(e -> { + plugin.getLogger().error("An Error ocurred on Syntax Check", e); + return new Result("", false); + }).join(), SourceType.COMMAND ), plugin @@ -107,7 +111,10 @@ && checkAndCall( player, string, InfractionType.BCOMMAND, - CommandCheck.createCheck(string).join(), + CommandCheck.createCheck(string).exceptionallyAsync(e -> { + plugin.getLogger().error("An Error ocurred on Blocked Commands Check", e); + return new Result("", false); + }).join(), SourceType.COMMAND ), plugin diff --git a/src/main/java/me/dreamerzero/chatregulator/listener/list/LeaveListener.java b/src/main/java/me/dreamerzero/chatregulator/listener/list/LeaveListener.java index 727376b5..e328688e 100644 --- a/src/main/java/me/dreamerzero/chatregulator/listener/list/LeaveListener.java +++ b/src/main/java/me/dreamerzero/chatregulator/listener/list/LeaveListener.java @@ -34,7 +34,8 @@ public EventTask onLeave(final DisconnectEvent event){ plugin.getProxy().getScheduler().buildTask(plugin, () -> { if(plugin.getProxy().getPlayer(uuid).isEmpty()) { - plugin.getLogger().debug("The player {} was eliminated", plugin.getChatPlayers().remove(uuid).username()); + plugin.getLogger().debug("The player {} was eliminated", player.username()); + plugin.removePlayer(uuid); } }).delay( Configuration.getConfig().getGeneralConfig().deleteUsersTime(), diff --git a/src/main/java/me/dreamerzero/chatregulator/modules/checks/CapsCheck.java b/src/main/java/me/dreamerzero/chatregulator/modules/checks/CapsCheck.java index e7e90172..70364ff4 100644 --- a/src/main/java/me/dreamerzero/chatregulator/modules/checks/CapsCheck.java +++ b/src/main/java/me/dreamerzero/chatregulator/modules/checks/CapsCheck.java @@ -33,7 +33,7 @@ private CapsCheck(int limit){ */ @Override public CompletableFuture check(final @NotNull String string) { - return CompletableFuture.completedFuture(Objects.requireNonNull(string) + return CompletableFuture.supplyAsync(() -> Objects.requireNonNull(string) .chars() .filter(Character::isUpperCase) .count() >= this.limit diff --git a/src/main/java/me/dreamerzero/chatregulator/modules/checks/CommandCheck.java b/src/main/java/me/dreamerzero/chatregulator/modules/checks/CommandCheck.java index c20a9e70..c9c680b6 100644 --- a/src/main/java/me/dreamerzero/chatregulator/modules/checks/CommandCheck.java +++ b/src/main/java/me/dreamerzero/chatregulator/modules/checks/CommandCheck.java @@ -33,12 +33,14 @@ private CommandCheck(Collection blocledCommands){ */ @Override public CompletableFuture check(@NotNull String string) { - for (final String blockedCommand : blockedCommands){ - if(CommandUtils.isStartingString(string, blockedCommand)){ - return CompletableFuture.completedFuture(new Result(string, true)); + return CompletableFuture.supplyAsync(() -> { + for (final String blockedCommand : blockedCommands){ + if (CommandUtils.isStartingString(string, blockedCommand)) { + return new Result(string, true); + } } - } - return CompletableFuture.completedFuture(new Result(string, false)); + return new Result(string, false); + }); } @Override diff --git a/src/main/java/me/dreamerzero/chatregulator/modules/checks/FloodCheck.java b/src/main/java/me/dreamerzero/chatregulator/modules/checks/FloodCheck.java index 441be7fa..99ed3da2 100644 --- a/src/main/java/me/dreamerzero/chatregulator/modules/checks/FloodCheck.java +++ b/src/main/java/me/dreamerzero/chatregulator/modules/checks/FloodCheck.java @@ -44,13 +44,15 @@ public static void setFloodRegex(){ * @return a {@link PatternReplaceableResult} with the Result of the check */ @Override - public CompletableFuture check(final @NotNull String string){ - final Matcher matcher = realPattern.matcher(Objects.requireNonNull(string)); - return CompletableFuture.completedFuture(new PatternReplaceableResult(string, matcher.find(), realPattern, matcher){ - @Override - public String replaceInfraction(){ - return matcher.replaceAll(match -> Character.toString(match.group().charAt(0))); - } + public CompletableFuture check(@NotNull final String string){ + return CompletableFuture.supplyAsync(() -> { + final Matcher matcher = realPattern.matcher(Objects.requireNonNull(string)); + return new PatternReplaceableResult(string, matcher.find(), realPattern, matcher){ + @Override + public String replaceInfraction() { + return matcher.replaceAll(match -> Character.toString(match.group().charAt(0))); + } + }; }); } @@ -67,7 +69,7 @@ public static FloodCheck.Builder builder(){ return new FloodCheck.Builder(); } - /**Floood Check Builder */ + /**Flood Check Builder */ public static class Builder implements AbstractBuilder { private Pattern pattern; diff --git a/src/main/java/me/dreamerzero/chatregulator/modules/checks/ICheck.java b/src/main/java/me/dreamerzero/chatregulator/modules/checks/ICheck.java index 481db2c3..8af51203 100644 --- a/src/main/java/me/dreamerzero/chatregulator/modules/checks/ICheck.java +++ b/src/main/java/me/dreamerzero/chatregulator/modules/checks/ICheck.java @@ -20,7 +20,7 @@ public interface ICheck { * @since 3.0.0 * @return a CompletableFuture with the result of the check */ - @NotNull CompletableFuture check(@NotNull final String string); + @NotNull CompletableFuture check(final @NotNull String string); /** * Get the {@link InfractionType} of this check diff --git a/src/main/java/me/dreamerzero/chatregulator/modules/checks/InfractionCheck.java b/src/main/java/me/dreamerzero/chatregulator/modules/checks/InfractionCheck.java index b81b3037..6b864d88 100644 --- a/src/main/java/me/dreamerzero/chatregulator/modules/checks/InfractionCheck.java +++ b/src/main/java/me/dreamerzero/chatregulator/modules/checks/InfractionCheck.java @@ -4,6 +4,7 @@ import java.util.Collection; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -47,31 +48,42 @@ private InfractionCheck(boolean blockable, Pattern... blockedWords){ * @see ICheck */ @Override - public CompletableFuture check(@NotNull final String string){ - final List patterns = new ArrayList<>(); - boolean detected = false; - for (final Pattern pattern : blockedWords) { - final Matcher match = pattern.matcher(string); - if(match.find()){ - detected = true; - if(blockable) { - return CompletableFuture.completedFuture(new PatternResult(match.group(), true, pattern, match)); + public CompletableFuture check(final @NotNull String string){ + return CompletableFuture.supplyAsync(() -> { + final List patterns = new ArrayList<>(); + boolean detected = false; + for (final Pattern pattern : blockedWords) { + final Matcher match = pattern.matcher(string); + if(match.find()){ + detected = true; + if (blockable) { + return new PatternResult(match.group(), blockable, pattern, match); + } + patterns.add(pattern); } - patterns.add(pattern); } - } - return CompletableFuture.completedFuture(detected - ? new ReplaceableResult(patterns.toString(), true){ - @Override - public String replaceInfraction(){ - String original = string; - for(Pattern pattern : patterns){ - original = pattern.matcher(original).replaceAll("***"); + return detected + ? new ReplaceableResult(patterns.toString(), true){ + @Override + public String replaceInfraction(){ + String original = string; + for (final Pattern pattern : patterns) { + original = pattern.matcher(original).replaceAll(InfractionCheck::generateReplacement); + } + return original; } - return original; } - } - : new Result(string, false)); + : new Result(string, false); + }); + } + + private static String generateReplacement(MatchResult result) { + final int size = result.group().length()/2; + final StringBuilder builder = new StringBuilder(size); + for (int i = 0; i < size; i++) { + builder.append('*'); + } + return builder.toString(); } @Override diff --git a/src/main/java/me/dreamerzero/chatregulator/modules/checks/SpamCheck.java b/src/main/java/me/dreamerzero/chatregulator/modules/checks/SpamCheck.java index 8a7cdfe5..671eadda 100644 --- a/src/main/java/me/dreamerzero/chatregulator/modules/checks/SpamCheck.java +++ b/src/main/java/me/dreamerzero/chatregulator/modules/checks/SpamCheck.java @@ -28,8 +28,9 @@ private SpamCheck(@NotNull InfractionPlayer infractionPlayer, @NotNull SourceTyp */ @Override public CompletableFuture check(final @NotNull String string){ - final boolean infricted = this.spamInfricted(Objects.requireNonNull(string)); - return CompletableFuture.completedFuture(new Result(string, infricted)); + return CompletableFuture.supplyAsync( + () -> new Result(string, this.spamInfricted(Objects.requireNonNull(string))) + ); } /** diff --git a/src/main/java/me/dreamerzero/chatregulator/modules/checks/SyntaxCheck.java b/src/main/java/me/dreamerzero/chatregulator/modules/checks/SyntaxCheck.java index 720b3939..426f030c 100644 --- a/src/main/java/me/dreamerzero/chatregulator/modules/checks/SyntaxCheck.java +++ b/src/main/java/me/dreamerzero/chatregulator/modules/checks/SyntaxCheck.java @@ -19,8 +19,10 @@ public final class SyntaxCheck implements ICheck{ */ @Override public CompletableFuture check(final @NotNull String string) { - final String command = CommandUtils.getFirstArgument(Objects.requireNonNull(string)); - return CompletableFuture.completedFuture(new Result(command, command.indexOf(':') != -1)); + return CompletableFuture.supplyAsync(() -> { + final String command = CommandUtils.getFirstArgument(Objects.requireNonNull(string)); + return new Result(command, command.indexOf(':') != -1); + }); } @Override diff --git a/src/main/java/me/dreamerzero/chatregulator/modules/checks/UnicodeCheck.java b/src/main/java/me/dreamerzero/chatregulator/modules/checks/UnicodeCheck.java index 26cde64c..07f54c0c 100644 --- a/src/main/java/me/dreamerzero/chatregulator/modules/checks/UnicodeCheck.java +++ b/src/main/java/me/dreamerzero/chatregulator/modules/checks/UnicodeCheck.java @@ -43,30 +43,32 @@ private UnicodeCheck(char[] chars, ControlType control, CharMode mode){ */ @Override public CompletableFuture check(final @NotNull String string) { - final char[] charArray = Objects.requireNonNull(string).toCharArray(); - final Set results = new HashSet<>(); - - for(final char character : charArray){ - if(charPredicate.test(character)){ - if(control == ControlType.BLOCK) { - return CompletableFuture.completedFuture(new Result(string, true)); + return CompletableFuture.supplyAsync(() -> { + final char[] charArray = Objects.requireNonNull(string).toCharArray(); + final Set results = new HashSet<>(charArray.length); + + for(final char character : charArray){ + if(charPredicate.test(character)){ + if(control == ControlType.BLOCK) { + return new Result(string, true); + } + results.add(character); } - results.add(character); } - } - return CompletableFuture.completedFuture(results.isEmpty() - ? new Result(string, false) - : new ReplaceableResult(results.toString(), true){ - @Override - public String replaceInfraction(){ - String replaced = string; - for(final char character : results){ - replaced = replaced.replace(character, ' '); + return results.isEmpty() + ? new Result(string, false) + : new ReplaceableResult(results.toString(), true){ + @Override + public String replaceInfraction(){ + String replaced = string; + for (final char character : results) { + replaced = replaced.replace(character, ' '); + } + return replaced; } - return replaced; - } - }); + }; + }); } public static final boolean defaultCharTest(char c) { diff --git a/src/main/java/me/dreamerzero/chatregulator/utils/CommandUtils.java b/src/main/java/me/dreamerzero/chatregulator/utils/CommandUtils.java index 6a53560d..b1e306a9 100644 --- a/src/main/java/me/dreamerzero/chatregulator/utils/CommandUtils.java +++ b/src/main/java/me/dreamerzero/chatregulator/utils/CommandUtils.java @@ -45,10 +45,13 @@ public static void executeCommand( final String command = cmd.replace("", infractor.username()).replace("", servername); plugin.getProxy().getCommandManager() .executeAsync(plugin.getProxy().getConsoleCommandSource(), command) - .thenAcceptAsync(status -> { - if(!status.booleanValue()){ + .handleAsync((status, ex) -> { + if (ex != null) { + plugin.getLogger().warn("Error executing command", ex); + } else if(!status.booleanValue()) { plugin.getLogger().warn("Error executing command {}", command); } + return null; }); }); } diff --git a/src/main/java/me/dreamerzero/chatregulator/utils/GeneralUtils.java b/src/main/java/me/dreamerzero/chatregulator/utils/GeneralUtils.java index e4492f38..c1e9dfc4 100644 --- a/src/main/java/me/dreamerzero/chatregulator/utils/GeneralUtils.java +++ b/src/main/java/me/dreamerzero/chatregulator/utils/GeneralUtils.java @@ -26,6 +26,7 @@ import me.dreamerzero.chatregulator.enums.InfractionType; import me.dreamerzero.chatregulator.events.ChatViolationEvent; import me.dreamerzero.chatregulator.events.CommandViolationEvent; +import me.dreamerzero.chatregulator.events.ViolationEvent; /** * General utils @@ -48,7 +49,7 @@ public static boolean allowedPlayer(@NotNull Player player, InfractionType type) * @param iplayer the infraction player * @return if the player has flagged for spam */ - public static boolean spamCheck(Result result, InfractionPlayer iplayer){ + public static boolean cooldownSpamCheck(Result result, InfractionPlayer iplayer){ final MainConfig.Spam config = Configuration.getConfig().getSpamConfig(); if(!result.isInfraction() || !config.getCooldownConfig().enabled()) { return false; @@ -66,6 +67,15 @@ public static boolean callViolationEvent(@NotNull EventBundle bundle, @NotNull C return plugin.getProxy().getEventManager().fire(bundle.source() == SourceType.COMMAND ? new CommandViolationEvent(bundle.player(), bundle.type(), bundle.result, bundle.string) : new ChatViolationEvent(bundle.player(), bundle.type(), bundle.result, bundle.string)) + .exceptionallyAsync(ex -> { + plugin.getLogger().error("An Error ocurred on Violation Event call", ex); + return new ViolationEvent(bundle.player(), bundle.type(), new Result(bundle.string, false)) { + @Override + public GenericResult getResult() { + return GenericResult.denied(); + } + }; + }) .thenApplyAsync(violationEvent -> { if(!violationEvent.getResult().isAllowed()) { if(bundle.source() == SourceType.COMMAND) @@ -99,7 +109,10 @@ private GeneralUtils(){} public static boolean unicode(InfractionPlayer player, AtomicReference string, EventWrapper event, ChatRegulator plugin) { return GeneralUtils.allowedPlayer(player.getPlayer(), InfractionType.UNICODE) - && UnicodeCheck.createCheck(string.get()).thenApply(result -> { + && UnicodeCheck.createCheck(string.get()).exceptionallyAsync(e -> { + plugin.getLogger().error("An Error ocurred on Unicode Check", e); + return new Result("", false); + }).thenApplyAsync(result -> { if(GeneralUtils.checkAndCall(new EventBundle(player, string.get(), InfractionType.UNICODE, result, event.source()), plugin)){ if(Configuration.getConfig().getUnicodeConfig().isBlockable()){ event.cancel(); @@ -117,7 +130,10 @@ public static boolean unicode(InfractionPlayer player, AtomicReference s public static boolean caps(InfractionPlayer player, AtomicReference string, EventWrapper event, ChatRegulator plugin) { return GeneralUtils.allowedPlayer(player.getPlayer(), InfractionType.CAPS) - && CapsCheck.createCheck(string.get()).thenApply(result -> { + && CapsCheck.createCheck(string.get()).exceptionallyAsync(e -> { + plugin.getLogger().error("An Error ocurred on Caps Check", e); + return new Result("", false); + }).thenApplyAsync(result -> { if(GeneralUtils.checkAndCall(new EventBundle(player, string.get(), InfractionType.CAPS, result, event.source()), plugin)){ if(Configuration.getConfig().getCapsConfig().isBlockable()){ event.cancel(); @@ -135,7 +151,10 @@ public static boolean caps(InfractionPlayer player, AtomicReference stri public static boolean flood(InfractionPlayer player, AtomicReference string, EventWrapper event, ChatRegulator plugin) { return GeneralUtils.allowedPlayer(player.getPlayer(), InfractionType.FLOOD) - && FloodCheck.createCheck(string.get()).thenApply(result -> { + && FloodCheck.createCheck(string.get()).exceptionallyAsync(e -> { + plugin.getLogger().error("An Error ocurred on Flood Check", e); + return new Result("", false); + }).thenApplyAsync(result -> { if(GeneralUtils.checkAndCall(new EventBundle(player, string.get(), InfractionType.FLOOD, result, event.source()), plugin)) { if(Configuration.getConfig().getFloodConfig().isBlockable()){ event.cancel(); @@ -153,7 +172,10 @@ public static boolean flood(InfractionPlayer player, AtomicReference str public static boolean regular(InfractionPlayer player, AtomicReference string, EventWrapper event, ChatRegulator plugin) { return GeneralUtils.allowedPlayer(player.getPlayer(), InfractionType.REGULAR) - && InfractionCheck.createCheck(string.get()).thenApply(result -> { + && InfractionCheck.createCheck(string.get()).exceptionallyAsync(e -> { + plugin.getLogger().error("An Error ocurred on Regular Infraction Check", e); + return new Result("", false); + }).thenApplyAsync(result -> { if(GeneralUtils.checkAndCall(new EventBundle(player, string.get(), InfractionType.REGULAR, result, event.source()), plugin)) { if(Configuration.getConfig().getInfractionsConfig().isBlockable()){ event.cancel(); @@ -171,8 +193,11 @@ public static boolean regular(InfractionPlayer player, AtomicReference s public static boolean spam(InfractionPlayer player, AtomicReference string, EventWrapper event, ChatRegulator plugin) { if(GeneralUtils.allowedPlayer(player.getPlayer(), InfractionType.SPAM)) { - Result result = SpamCheck.createCheck(player, string.get(), event.source()).join(); - if(GeneralUtils.spamCheck(result, player) + final Result result = SpamCheck.createCheck(player, string.get(), event.source()).exceptionallyAsync(e -> { + plugin.getLogger().error("An Error ocurred on Spam Check", e); + return new Result("", false); + }).join(); + if(GeneralUtils.cooldownSpamCheck(result, player) && GeneralUtils.callViolationEvent(new EventBundle(player, string.get(), InfractionType.SPAM, result, event.source()), plugin) ) { event.cancel(); diff --git a/src/test/java/me/dreamerzero/chatregulator/modules/checks/CapsTest.java b/src/test/java/me/dreamerzero/chatregulator/modules/checks/CapsTest.java index cfeab74b..1c785d32 100644 --- a/src/test/java/me/dreamerzero/chatregulator/modules/checks/CapsTest.java +++ b/src/test/java/me/dreamerzero/chatregulator/modules/checks/CapsTest.java @@ -50,12 +50,11 @@ void realTest(){ String message = "AAAAAAAAAA"; Player player = TestsUtils.createRandomNormalPlayer(); assertTrue(GeneralUtils.allowedPlayer(player, InfractionType.CAPS)); - CapsCheck.createCheck(message).thenAccept(result -> { - assertTrue(GeneralUtils.checkAndCall(new EventBundle(InfractionPlayer.get(player), message, InfractionType.CAPS, result, SourceType.CHAT), TestsUtils.createRegulator())); - assertTrue(result instanceof IReplaceable); - String messageReplaced = ((IReplaceable)result).replaceInfraction(); - assertEquals("aaaaaaaaaa", messageReplaced); - StatisticsUtils.resetStatistics(); - }).join(); + var result = CapsCheck.createCheck(message).join(); + assertTrue(GeneralUtils.checkAndCall(new EventBundle(InfractionPlayer.get(player), message, InfractionType.CAPS, result, SourceType.CHAT), TestsUtils.createRegulator())); + assertTrue(result instanceof IReplaceable); + String messageReplaced = ((IReplaceable)result).replaceInfraction(); + assertEquals("aaaaaaaaaa", messageReplaced); + StatisticsUtils.resetStatistics(); } } diff --git a/src/test/java/me/dreamerzero/chatregulator/modules/checks/FloodTest.java b/src/test/java/me/dreamerzero/chatregulator/modules/checks/FloodTest.java index 1fbc7f28..dd345b3e 100644 --- a/src/test/java/me/dreamerzero/chatregulator/modules/checks/FloodTest.java +++ b/src/test/java/me/dreamerzero/chatregulator/modules/checks/FloodTest.java @@ -15,13 +15,12 @@ void floodCheck(){ String original = "aa floOoOOOooOod aa"; String expected = "aa flod aa"; - FloodCheck.builder().limit(5).build().check(original).thenAccept(result->{ - assertTrue(result.isInfraction()); - assertTrue(result instanceof IReplaceable); - String replaced = ((IReplaceable)result).replaceInfraction(); + var result = FloodCheck.builder().limit(5).build().check(original).join(); + assertTrue(result.isInfraction()); + assertTrue(result instanceof IReplaceable); + String replaced = ((IReplaceable)result).replaceInfraction(); - assertEquals(replaced, expected); - }).join(); + assertEquals(replaced, expected); } @Test @@ -29,12 +28,11 @@ void floodCheck(){ void multiFlood(){ String original = "helloooooo everyoneeeeeee"; - FloodCheck.createCheck(original).thenAccept(result -> { - assertTrue(result.isInfraction()); - assertTrue(result instanceof IReplaceable); - String replaced = "hello everyone"; - String actual = ((IReplaceable)result).replaceInfraction(); - assertEquals(replaced, actual, actual); - }).join(); + var result = FloodCheck.createCheck(original).join(); + assertTrue(result.isInfraction()); + assertTrue(result instanceof IReplaceable); + String replaced = "hello everyone"; + String actual = ((IReplaceable)result).replaceInfraction(); + assertEquals(replaced, actual, actual); } } diff --git a/src/test/java/me/dreamerzero/chatregulator/modules/checks/InfractionTest.java b/src/test/java/me/dreamerzero/chatregulator/modules/checks/InfractionTest.java index af39f2a5..499079e0 100644 --- a/src/test/java/me/dreamerzero/chatregulator/modules/checks/InfractionTest.java +++ b/src/test/java/me/dreamerzero/chatregulator/modules/checks/InfractionTest.java @@ -38,20 +38,20 @@ void replaceMultiple(){ .blockedPatterns( Pattern.compile("sh[ilj1y]t", Pattern.CASE_INSENSITIVE), Pattern.compile("d[ilj1y]ck", Pattern.CASE_INSENSITIVE), + Pattern.compile("m[0o]th[e3]rf[uv]ck[e3]r", Pattern.CASE_INSENSITIVE), Pattern.compile("f[uv4]ck", Pattern.CASE_INSENSITIVE) ) .build(); - String original = "Hello D1cK sh1t f4ck!!!"; - String expected = "Hello *** *** ***!!!"; + String original = "Hello D1cK sh1t f4ck mOtherfVck3r!!!"; + String expected = "Hello ** ** ** ******!!!"; - iCheck.check(original).thenAccept(result -> { - assertTrue(result.isInfraction()); - assertTrue(result instanceof IReplaceable); + var check = iCheck.check(original).join(); + assertTrue(check.isInfraction()); + assertTrue(check instanceof IReplaceable); - String replaced = ((IReplaceable)result).replaceInfraction(); + String replaced = ((IReplaceable)check).replaceInfraction(); - assertEquals(expected, replaced); - }).join(); + assertEquals(expected, replaced); } } diff --git a/src/test/java/me/dreamerzero/chatregulator/modules/checks/UnicodeTest.java b/src/test/java/me/dreamerzero/chatregulator/modules/checks/UnicodeTest.java index 6c63077a..670fd6f3 100644 --- a/src/test/java/me/dreamerzero/chatregulator/modules/checks/UnicodeTest.java +++ b/src/test/java/me/dreamerzero/chatregulator/modules/checks/UnicodeTest.java @@ -58,13 +58,13 @@ void illegalTest(){ void custom(){ String illegal = "ñn't"; - assertTrue(UnicodeCheck.builder() + var result = UnicodeCheck.builder() .characters('ñ') .build() .check(illegal) - .thenApply(Result::isInfraction) - .join() - ); + .join(); + + assertTrue(result.isInfraction()); } @Test