diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/Captcha.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/Captcha.java index 05c618c2..5a0fe9d1 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/Captcha.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/Captcha.java @@ -39,14 +39,14 @@ public class Captcha extends AsyncCheck implements ICaptcha{ // Have they failed too man times? if (data.captchTries > cc.captchaTries) { // Find out if we need to kick the player or not. - executeActions(player, data.captchaVL, 1, cc.captchaActions, - isMainThread); + executeActions(player, data.captchaVL, 1, cc.captchaActions, isMainThread); // (Resetting captcha tries is done on quit/kick). } // Display the question again (if not kicked). - if (player.isOnline()) + if (player.isOnline()) { sendCaptcha(player, cc, data); + } } } diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java index 23935c07..085d1d4d 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java @@ -121,28 +121,27 @@ public class ChatListener extends CheckListener implements INotifyReload, JoinLe * @param event * the event */ - @EventHandler( - ignoreCancelled = true, priority = EventPriority.LOWEST) + @EventHandler(ignoreCancelled = false, priority = EventPriority.LOWEST) public void onPlayerChat(final AsyncPlayerChatEvent event) { - /* - * ____ _ ____ _ _ - * | _ \| | __ _ _ _ ___ _ __ / ___| |__ __ _| |_ - * | |_) | |/ _` | | | |/ _ \ '__| | | | '_ \ / _` | __| - * | __/| | (_| | |_| | __/ | | |___| | | | (_| | |_ - * |_| |_|\__,_|\__, |\___|_| \____|_| |_|\__,_|\__| - * |___/ - */ + final Player player = event.getPlayer(); + final boolean alreadyCancelled = event.isCancelled(); // Tell TickTask to update cached permissions. + // (Might omit this if already cancelled.) TickTask.requestPermissionUpdate(player.getName(), CheckType.CHAT); // First the color check. - if (color.isEnabled(player)) event.setMessage(color.check(player, event.getMessage(), false)); + if (!alreadyCancelled && color.isEnabled(player)) { + event.setMessage(color.check(player, event.getMessage(), false)); + } // Then the no chat check. - if (text.isEnabled(player) && text.check(player, event.getMessage(), captcha, false)) + // TODO: isMainThread: Could consider event.isAsync ? + if (textChecks(player, event.getMessage(), false, alreadyCancelled)) { event.setCancelled(true); + } + } /** @@ -151,23 +150,8 @@ public class ChatListener extends CheckListener implements INotifyReload, JoinLe * @param event * the event */ - @EventHandler( - priority = EventPriority.LOWEST) + @EventHandler(priority = EventPriority.LOWEST) public void onPlayerCommandPreprocess(final PlayerCommandPreprocessEvent event) { - /* - * ____ _ ____ _ - * | _ \| | __ _ _ _ ___ _ __ / ___|___ _ __ ___ _ __ ___ __ _ _ __ __| | - * | |_) | |/ _` | | | |/ _ \ '__| | | / _ \| '_ ` _ \| '_ ` _ \ / _` | '_ \ / _` | - * | __/| | (_| | |_| | __/ | | |__| (_) | | | | | | | | | | | (_| | | | | (_| | - * |_| |_|\__,_|\__, |\___|_| \____\___/|_| |_| |_|_| |_| |_|\__,_|_| |_|\__,_| - * |___/ - * ____ - * | _ \ _ __ ___ _ __ _ __ ___ ___ ___ ___ ___ - * | |_) | '__/ _ \ '_ \| '__/ _ \ / __/ _ \/ __/ __| - * | __/| | | __/ |_) | | | (_) | (_| __/\__ \__ \ - * |_| |_| \___| .__/|_| \___/ \___\___||___/___/ - * |_| - */ final Player player = event.getPlayer(); // Tell TickTask to update cached permissions. @@ -207,16 +191,23 @@ public class ChatListener extends CheckListener implements INotifyReload, JoinLe final boolean handleAsChat = chatCommands.hasAnyPrefixWords(lcMessage, lcAltMessage); if (handleAsChat){ // Treat as chat. - // TODO: At least cut off the command (!). - if (text.isEnabled(player) && text.check(player, message, captcha, true)) - event.setCancelled(true); + // TODO: Consider requesting permission updates on these, for consistency. + // TODO: Cut off the command (?). + if (textChecks(player, message, true, false)) { + event.setCancelled(true); + } } else if (!commandExclusions.hasAnyPrefixWords(lcMessage, lcAltMessage)){ // Treat as command. - if (commands.isEnabled(player) && commands.check(player, message, captcha)) - event.setCancelled(true); + if (commands.isEnabled(player) && commands.check(player, message, captcha)) { + event.setCancelled(true); + } } + } + + private boolean textChecks(final Player player, final String message, final boolean isMainThread, final boolean alreadyCancelled) { + return text.isEnabled(player) && text.check(player, message, captcha, isMainThread, alreadyCancelled); } /** diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/Text.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/Text.java index b4747c54..37ffd1e5 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/Text.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/chat/Text.java @@ -53,15 +53,16 @@ public class Text extends AsyncCheck implements INotifyReload{ * The message to check. * @param captcha * Used for starting captcha on failure, if configured so. + * @param alreadyCancelled * @return */ - public boolean check(final Player player, final String message, final ICaptcha captcha, boolean isMainThread) { + public boolean check(final Player player, final String message, final ICaptcha captcha, boolean isMainThread, final boolean alreadyCancelled) { final ChatConfig cc = ChatConfig.getConfig(player); final ChatData data = ChatData.getData(player); synchronized (data) { - return unsafeCheck(player, message, captcha, cc, data, isMainThread); + return unsafeCheck(player, message, captcha, cc, data, isMainThread, alreadyCancelled); } } @@ -93,15 +94,20 @@ public class Text extends AsyncCheck implements INotifyReload{ * @param cc * @param data * @param isMainThread + * @param alreadyCancelled * @return */ private boolean unsafeCheck(final Player player, final String message, final ICaptcha captcha, - final ChatConfig cc, final ChatData data, boolean isMainThread) { + final ChatConfig cc, final ChatData data, boolean isMainThread, final boolean alreadyCancelled) { // Test captcha. - if (captcha.shouldCheckCaptcha(cc, data)){ + // TODO: Skip captcha for "handleaschat" commands? [controversial potential] + if (captcha.shouldCheckCaptcha(cc, data)) { captcha.checkCaptcha(player, message, cc, data, isMainThread); return true; + } else if (alreadyCancelled) { + // Skip checking. + return true; } // Take time once: