diff --git a/src/fr/neatmonster/nocheatplus/checks/CheckType.java b/src/fr/neatmonster/nocheatplus/checks/CheckType.java index b62ad598..c7e91d42 100644 --- a/src/fr/neatmonster/nocheatplus/checks/CheckType.java +++ b/src/fr/neatmonster/nocheatplus/checks/CheckType.java @@ -62,9 +62,15 @@ public enum CheckType { BLOCKPLACE_SPEED(BLOCKPLACE, Permissions.BLOCKPLACE_SPEED), CHAT(ChatConfig.factory, ChatData.factory), + CHAT_CAPTCHA(CHAT, Permissions.CHAT_CAPTCHA), CHAT_COLOR(CHAT, Permissions.CHAT_COLOR), - CHAT_NOPWNAGE(CHAT, Permissions.CHAT_NOPWNAGE), + CHAT_COMMANDS(CHAT, Permissions.CHAT_COMMANDS), CHAT_GLOBALCHAT(CHAT, Permissions.CHAT_GLOBALCHAT), + CHAT_LOGINS(CHAT, Permissions.CHAT_LOGINS), + CHAT_RELOG(CHAT, Permissions.CHAT_RELOG), + // TOOD: remove nopwnage + CHAT_NOPWNAGE(CHAT, Permissions.CHAT_NOPWNAGE), + COMBINED(CombinedConfig.factory, CombinedData.factory), COMBINED_IMPROBABLE(COMBINED, Permissions.COMBINED_IMPROBABLE), diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/Captcha.java b/src/fr/neatmonster/nocheatplus/checks/chat/Captcha.java new file mode 100644 index 00000000..da29e796 --- /dev/null +++ b/src/fr/neatmonster/nocheatplus/checks/chat/Captcha.java @@ -0,0 +1,101 @@ +package fr.neatmonster.nocheatplus.checks.chat; + +import java.util.Random; + +import org.bukkit.entity.Player; + +import fr.neatmonster.nocheatplus.checks.AsyncCheck; +import fr.neatmonster.nocheatplus.checks.CheckType; +import fr.neatmonster.nocheatplus.players.Permissions; +import fr.neatmonster.nocheatplus.utilities.CheckUtils; + +/** + * NOTE: EARLY REFACTORING STATE, MOST METHODS NEED SYNC OVER DATA ! + * @author mc_dev + * + */ +public class Captcha extends AsyncCheck implements ICaptcha{ + + public Captcha() { + super(CheckType.CHAT_CAPTCHA); + } + + /** The random number generator. */ + private final Random random = new Random(); + + + @Override + public void checkCaptcha(Player player, String message, ChatConfig cc, ChatData data, boolean isMainThread) { + // Correct answer to the captcha? + if (message.equals(data.captchaGenerated)) { + // Yes, clear his data and do not worry anymore about him. + data.clearNoPwnageData(); + data.captchaStarted = false; + player.sendMessage(CheckUtils.replaceColors(cc.captchaSuccess)); + } else { + // Increment his tries number counter. + data.captchTries++; + data.captchaVL ++; + // Does he failed too much 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); + // (Resetting captcha tries is done on quit/kick). + } + + // Display the question again (if not kicked). + if (player.isOnline()) + sendCaptcha(player, cc, data); + } + } + + @Override + public void sendNewCaptcha(Player player, ChatConfig cc, ChatData data) { + // Display a captcha to the player. + generateCaptcha(cc, data, true); + sendCaptcha(player, cc, data); + data.captchaStarted = true; + } + + @Override + public void generateCaptcha(ChatConfig cc, ChatData data, boolean reset) { + if (reset) data.captchTries = 0; + data.captchaGenerated = ""; + for (int i = 0; i < cc.captchaLength; i++) + data.captchaGenerated += cc.captchaCharacters.charAt(random + .nextInt(cc.captchaCharacters.length())); + } + + @Override + public void resetCaptcha(Player player){ + ChatData data = ChatData.getData(player); + synchronized (data) { + resetCaptcha(ChatConfig.getConfig(player), data); + } + } + + @Override + public void resetCaptcha(ChatConfig cc, ChatData data){ + data.captchTries = 0; + if (shouldCheckCaptcha(cc, data) || shouldStartCaptcha(cc, data)){ + generateCaptcha(cc, data, true); + } + } + + @Override + public void sendCaptcha(Player player, ChatConfig cc, ChatData data) { + player.sendMessage(CheckUtils.replaceColors(cc.captchaQuestion.replace("[captcha]", + data.captchaGenerated))); + } + + @Override + public boolean shouldStartCaptcha(ChatConfig cc, ChatData data) { + return cc.captchaCheck && !data.captchaStarted && !data.hasCachedPermission(Permissions.CHAT_CAPTCHA); + } + + @Override + public boolean shouldCheckCaptcha(ChatConfig cc, ChatData data) { + return cc.captchaCheck && data.captchaStarted && !data.hasCachedPermission(Permissions.CHAT_CAPTCHA); + } +} diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/ChatConfig.java b/src/fr/neatmonster/nocheatplus/checks/chat/ChatConfig.java index 7d5698d2..e038026c 100644 --- a/src/fr/neatmonster/nocheatplus/checks/chat/ChatConfig.java +++ b/src/fr/neatmonster/nocheatplus/checks/chat/ChatConfig.java @@ -67,6 +67,14 @@ public class ChatConfig extends AsyncCheckConfig { return worldsMap.get(player.getWorld().getName()); } } + + public final boolean captchaCheck; + public final String captchaCharacters; + public final int captchaLength; + public final String captchaQuestion; + public final String captchaSuccess; + public final int captchaTries; + public final ActionList captchaActions; public final boolean colorCheck; public final ActionList colorActions; @@ -93,14 +101,6 @@ public class ChatConfig extends AsyncCheckConfig { public final long noPwnageBannedTimeout; public final int noPwnageBannedWeight; - public final boolean noPwnageCaptchaCheck; - public final String noPwnageCaptchaCharacters; - public final int noPwnageCaptchaLength; - public final String noPwnageCaptchaQuestion; - public final String noPwnageCaptchaSuccess; - public final int noPwnageCaptchaTries; - public final ActionList noPwnageCaptchaActions; - public final boolean noPwnageFirstCheck; public final long noPwnageFirstTimeout; public final int noPwnageFirstWeight; @@ -152,8 +152,17 @@ public class ChatConfig extends AsyncCheckConfig { Permissions.CHAT_COLOR, Permissions.CHAT_GLOBALCHAT, Permissions.CHAT_NOPWNAGE, - Permissions.CHAT_NOPWNAGE_CAPTCHA, + Permissions.CHAT_CAPTCHA, }); + + captchaCheck = config.getBoolean(ConfPaths.CHAT_CAPTCHA_CHECK); + captchaCharacters = config.getString(ConfPaths.CHAT_CAPTCHA_CHARACTERS); + captchaLength = config.getInt(ConfPaths.CHAT_CAPTCHA_LENGTH); + captchaQuestion = config.getString(ConfPaths.CHAT_CAPTCHA_QUESTION); + captchaSuccess = config.getString(ConfPaths.CHAT_CAPTCHA_SUCCESS); + captchaTries = config.getInt(ConfPaths.CHAT_CAPTCHA_TRIES); + captchaActions = config.getActionList(ConfPaths.CHAT_CAPTCHA_ACTIONS, Permissions.CHAT_CAPTCHA); + colorCheck = config.getBoolean(ConfPaths.CHAT_COLOR_CHECK); colorActions = config.getActionList(ConfPaths.CHAT_COLOR_ACTIONS, Permissions.CHAT_COLOR); @@ -180,14 +189,6 @@ public class ChatConfig extends AsyncCheckConfig { noPwnageBannedTimeout = config.getLong(ConfPaths.CHAT_NOPWNAGE_BANNED_TIMEOUT); noPwnageBannedWeight = config.getInt(ConfPaths.CHAT_NOPWNAGE_BANNED_WEIGHT); - noPwnageCaptchaCheck = config.getBoolean(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_CHECK); - noPwnageCaptchaCharacters = config.getString(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_CHARACTERS); - noPwnageCaptchaLength = config.getInt(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_LENGTH); - noPwnageCaptchaQuestion = config.getString(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_QUESTION); - noPwnageCaptchaSuccess = config.getString(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_SUCCESS); - noPwnageCaptchaTries = config.getInt(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_TRIES); - noPwnageCaptchaActions = config.getActionList(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_ACTIONS, Permissions.CHAT_NOPWNAGE_CAPTCHA); - noPwnageFirstCheck = config.getBoolean(ConfPaths.CHAT_NOPWNAGE_FIRST_CHECK); noPwnageFirstTimeout = config.getLong(ConfPaths.CHAT_NOPWNAGE_FIRST_TIMEOUT); noPwnageFirstWeight = config.getInt(ConfPaths.CHAT_NOPWNAGE_FIRST_WEIGHT); diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/ChatData.java b/src/fr/neatmonster/nocheatplus/checks/chat/ChatData.java index 2c05fd5a..b657e7a9 100644 --- a/src/fr/neatmonster/nocheatplus/checks/chat/ChatData.java +++ b/src/fr/neatmonster/nocheatplus/checks/chat/ChatData.java @@ -70,35 +70,41 @@ public class ChatData extends AsyncCheckData { public double captchaVL; public double colorVL; public double globalChatVL; - public double noPwnageVL; + public double noPwnageVL; + + // Captcha data. + public int captchTries; + public String captchaGenerated; + public boolean captchaStarted; // Data of the globalchat check. public final ActionFrequency globalChatFrequency = new ActionFrequency(10, 3000); - // Data of the no pwnage check. - public int noPwnageCaptchTries; - public String noPwnageGeneratedCaptcha; - public boolean noPwnageHasStartedCaptcha; + // Data of the no pwnage check. public long noPwnageJoinTime; + public String noPwnageLastMessage; public long noPwnageLastMessageTime; public long noPwnageLastWarningTime; public long noPwnageLeaveTime; + + public int noPwnageReloginWarnings; public long noPwnageReloginWarningTime; + public final ActionFrequency noPwnageSpeed = new ActionFrequency(5, 1000); /** * Clear the data of the no pwnage check. */ public synchronized void clearNoPwnageData() { - noPwnageCaptchTries = noPwnageReloginWarnings = 0; + captchTries = noPwnageReloginWarnings = 0; captchaVL = 0D; // colorVL <- is spared to avoid problems with spam + captcha success. noPwnageVL = 0; noPwnageSpeed.clear(System.currentTimeMillis()); noPwnageJoinTime = noPwnageLastMessageTime = noPwnageLastWarningTime = noPwnageLeaveTime = noPwnageReloginWarningTime = 0L; - noPwnageGeneratedCaptcha = noPwnageLastMessage = ""; + captchaGenerated = noPwnageLastMessage = ""; } } diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java b/src/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java index d0be3cfd..237d6dff 100644 --- a/src/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java +++ b/src/fr/neatmonster/nocheatplus/checks/chat/ChatListener.java @@ -42,6 +42,9 @@ public class ChatListener implements Listener, INotifyReload { /** The no pwnage check. */ private final NoPwnage noPwnage = new NoPwnage(); + /** Captcha handler. */ + private final Captcha captcha = new Captcha(); + /** Global chat check (experiment: alternative / supplement). */ private final GlobalChat globalChat = new GlobalChat(); @@ -94,9 +97,9 @@ public class ChatListener implements Listener, INotifyReload { if (color.isEnabled(player)) event.setMessage(color.check(player, event.getMessage(), false)); // Then the no pwnage check. - if (noPwnage.isEnabled(player) && noPwnage.check(player, event.getMessage(), false, false)) + if (noPwnage.isEnabled(player) && noPwnage.check(player, event.getMessage(), captcha, false, false)) event.setCancelled(true); - else if (globalChat.isEnabled(player) && globalChat.check(player, event.getMessage(), (ICaptcha) noPwnage, false)) + else if (globalChat.isEnabled(player) && globalChat.check(player, event.getMessage(), captcha, false)) // Only check those that got through. // (ICaptcha to start captcha if desired.) event.setCancelled(true); @@ -163,9 +166,9 @@ public class ChatListener implements Listener, INotifyReload { final boolean handleAsChat = chatCommands.hasPrefixWords(lcMessage); // Then the no pwnage check. - if (!commandExclusions.hasPrefixWords(lcMessage) && noPwnage.isEnabled(player) && noPwnage.check(player, event.getMessage(), !handleAsChat, true)) + if (!commandExclusions.hasPrefixWords(lcMessage) && noPwnage.isEnabled(player) && noPwnage.check(player, event.getMessage(), captcha, !handleAsChat, true)) event.setCancelled(true); - else if (handleAsChat && globalChat.isEnabled(player) && globalChat.check(player, event.getMessage(), noPwnage, true)) + else if (handleAsChat && globalChat.isEnabled(player) && globalChat.check(player, event.getMessage(), captcha, true)) event.setCancelled(true); } @@ -195,7 +198,7 @@ public class ChatListener implements Listener, INotifyReload { TickTask.updatePermissions(); // Reset captcha of player if needed. - noPwnage.resetCaptcha(player); + captcha.resetCaptcha(player); // Execute the no pwnage check. if (noPwnage.isEnabled(player) && noPwnage.checkLogin(player)) diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/Commands.java b/src/fr/neatmonster/nocheatplus/checks/chat/Commands.java new file mode 100644 index 00000000..103d8f52 --- /dev/null +++ b/src/fr/neatmonster/nocheatplus/checks/chat/Commands.java @@ -0,0 +1,11 @@ +package fr.neatmonster.nocheatplus.checks.chat; + +import fr.neatmonster.nocheatplus.checks.Check; +import fr.neatmonster.nocheatplus.checks.CheckType; + +public class Commands extends Check { + public Commands() { + super(CheckType.CHAT_COMMANDS); + } + +} diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/ICaptcha.java b/src/fr/neatmonster/nocheatplus/checks/chat/ICaptcha.java index 252a3cf0..3c2662c9 100644 --- a/src/fr/neatmonster/nocheatplus/checks/chat/ICaptcha.java +++ b/src/fr/neatmonster/nocheatplus/checks/chat/ICaptcha.java @@ -4,7 +4,7 @@ import org.bukkit.entity.Player; /** * Captcha related operations.
- * Auxiliary interface to avoid creating a new check type. + * Auxiliary interface, most methods should need sync over data, unless stated otherwise. * @author mc_dev * */ @@ -59,4 +59,18 @@ public interface ICaptcha { * @param data */ public void resetCaptcha(ChatConfig cc, ChatData data); + + /** + * Convenience method. Should synchronize over data of player (!). + * @param player + */ + public void resetCaptcha(Player player); + + /** + * Generate a captcha. + * @param cc + * @param data + * @param reset If to reset tries. + */ + public void generateCaptcha(ChatConfig cc, ChatData data, boolean reset); } diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/Logins.java b/src/fr/neatmonster/nocheatplus/checks/chat/Logins.java new file mode 100644 index 00000000..7ab164b2 --- /dev/null +++ b/src/fr/neatmonster/nocheatplus/checks/chat/Logins.java @@ -0,0 +1,12 @@ +package fr.neatmonster.nocheatplus.checks.chat; + +import fr.neatmonster.nocheatplus.checks.Check; +import fr.neatmonster.nocheatplus.checks.CheckType; + +public class Logins extends Check { + + public Logins() { + super(CheckType.CHAT_LOGINS); + } + +} diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/NoPwnage.java b/src/fr/neatmonster/nocheatplus/checks/chat/NoPwnage.java index d572e2aa..efe4d767 100644 --- a/src/fr/neatmonster/nocheatplus/checks/chat/NoPwnage.java +++ b/src/fr/neatmonster/nocheatplus/checks/chat/NoPwnage.java @@ -1,7 +1,6 @@ package fr.neatmonster.nocheatplus.checks.chat; import java.util.Map; -import java.util.Random; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -11,7 +10,6 @@ import fr.neatmonster.nocheatplus.checks.AsyncCheck; import fr.neatmonster.nocheatplus.checks.CheckType; import fr.neatmonster.nocheatplus.checks.ViolationData; import fr.neatmonster.nocheatplus.checks.combined.CombinedData; -import fr.neatmonster.nocheatplus.players.Permissions; import fr.neatmonster.nocheatplus.utilities.CheckUtils; /* @@ -27,7 +25,7 @@ import fr.neatmonster.nocheatplus.utilities.CheckUtils; /** * The NoPwnage check will try to detect "spambots" (like the ones created by the PWN4G3 software). */ -public class NoPwnage extends AsyncCheck implements ICaptcha{ +public class NoPwnage extends AsyncCheck{ /** The last message which caused ban said. */ private String lastBanCausingMessage; @@ -40,10 +38,7 @@ public class NoPwnage extends AsyncCheck implements ICaptcha{ /** The time it was when the last message was said. */ private long lastGlobalMessageTime; - - /** The random number generator. */ - private final Random random = new Random(); - + /** * Instantiates a new no pwnage check. */ @@ -56,13 +51,14 @@ public class NoPwnage extends AsyncCheck implements ICaptcha{ * * @param player * the player + * @param captcha * @param event * the event * @param isMainThread * is the thread the main thread * @return If to cancel the event. */ - public boolean check(final Player player, final String message, final boolean isCommand, + public boolean check(final Player player, final String message, final Captcha captcha, final boolean isCommand, final boolean isMainThread) { final ChatConfig cc = ChatConfig.getConfig(player); @@ -70,7 +66,7 @@ public class NoPwnage extends AsyncCheck implements ICaptcha{ // Keep related to ChatData/NoPwnage/Color used lock. synchronized (data) { - return unsafeCheck(player, message, isCommand, isMainThread, cc, data); + return unsafeCheck(player, message, captcha, isCommand, isMainThread, cc, data); } } @@ -103,6 +99,7 @@ public class NoPwnage extends AsyncCheck implements ICaptcha{ * the player * @param message * the message + * @param captcha * @param isMainThread * the is main thread * @param cc @@ -111,14 +108,14 @@ public class NoPwnage extends AsyncCheck implements ICaptcha{ * the data * @return If to cancel the event. */ - private boolean unsafeCheck(final Player player, final String message, final boolean isCommand, + private boolean unsafeCheck(final Player player, final String message, final Captcha captcha, final boolean isCommand, final boolean isMainThread, final ChatConfig cc, final ChatData data) { boolean cancel = false; final long now = System.currentTimeMillis(); - if (shouldCheckCaptcha(cc, data)) { - checkCaptcha(player, message, cc, data, isMainThread); + if (captcha.shouldCheckCaptcha(cc, data)) { + captcha.checkCaptcha(player, message, cc, data, isMainThread); // Cancel the event. return true; } @@ -177,8 +174,8 @@ public class NoPwnage extends AsyncCheck implements ICaptcha{ player.sendMessage(CheckUtils.replaceColors(cc.noPwnageWarnPlayerMessage)); data.noPwnageLastWarningTime = now; } else if (suspicion > cc.noPwnageLevel) - if (shouldStartCaptcha(cc, data)) { - sendNewCaptcha(player, cc, data); + if (captcha.shouldStartCaptcha(cc, data)) { + captcha.sendNewCaptcha(player, cc, data); cancel = true; } else { lastBanCausingMessage = message; @@ -212,88 +209,7 @@ public class NoPwnage extends AsyncCheck implements ICaptcha{ return cancel; } - @Override - public void checkCaptcha(Player player, String message, ChatConfig cc, ChatData data, boolean isMainThread) { - // Correct answer to the captcha? - if (message.equals(data.noPwnageGeneratedCaptcha)) { - // Yes, clear his data and do not worry anymore about him. - data.clearNoPwnageData(); - data.noPwnageHasStartedCaptcha = false; - player.sendMessage(CheckUtils.replaceColors(cc.noPwnageCaptchaSuccess)); - } else { - // Increment his tries number counter. - data.noPwnageCaptchTries++; - data.captchaVL ++; - // Does he failed too much times? - if (data.noPwnageCaptchTries > cc.noPwnageCaptchaTries) { - // Find out if we need to kick the player or not. - executeActions(player, data.captchaVL, 1, cc.noPwnageCaptchaActions, - isMainThread); - // (Resetting captcha tries is done on quit/kick). - } - // Display the question again (if not kicked). - if (player.isOnline()) - sendCaptcha(player, cc, data); - } - } - - @Override - public void sendNewCaptcha(Player player, ChatConfig cc, ChatData data) { - // Display a captcha to the player. - generateCaptcha(cc, data, true); - sendCaptcha(player, cc, data); - data.noPwnageHasStartedCaptcha = true; - } - - /** - * Just generate captcha, reset tries if set so. - * @param cc - * @param data - * @param reset - */ - public void generateCaptcha(ChatConfig cc, ChatData data, boolean reset) { - if (reset) data.noPwnageCaptchTries = 0; - data.noPwnageGeneratedCaptcha = ""; - for (int i = 0; i < cc.noPwnageCaptchaLength; i++) - data.noPwnageGeneratedCaptcha += cc.noPwnageCaptchaCharacters.charAt(random - .nextInt(cc.noPwnageCaptchaCharacters.length())); - } - - /** - * Reset captcha, synchronizes over ChatData instance for the player.. - * @param player - */ - public void resetCaptcha(Player player){ - ChatData data = ChatData.getData(player); - synchronized (data) { - resetCaptcha(ChatConfig.getConfig(player), data); - } - } - - @Override - public void resetCaptcha(ChatConfig cc, ChatData data){ - data.noPwnageCaptchTries = 0; - if (shouldCheckCaptcha(cc, data) || shouldStartCaptcha(cc, data)){ - generateCaptcha(cc, data, true); - } - } - - @Override - public void sendCaptcha(Player player, ChatConfig cc, ChatData data) { - player.sendMessage(CheckUtils.replaceColors(cc.noPwnageCaptchaQuestion.replace("[captcha]", - data.noPwnageGeneratedCaptcha))); - } - - @Override - public boolean shouldStartCaptcha(ChatConfig cc, ChatData data) { - return cc.noPwnageCaptchaCheck && !data.noPwnageHasStartedCaptcha && !data.hasCachedPermission(Permissions.CHAT_NOPWNAGE_CAPTCHA); - } - - @Override - public boolean shouldCheckCaptcha(ChatConfig cc, ChatData data) { - return cc.noPwnageCaptchaCheck && data.noPwnageHasStartedCaptcha && !data.hasCachedPermission(Permissions.CHAT_NOPWNAGE_CAPTCHA); - } /** * Check (Join), only call from synchronized code. diff --git a/src/fr/neatmonster/nocheatplus/checks/chat/Relog.java b/src/fr/neatmonster/nocheatplus/checks/chat/Relog.java new file mode 100644 index 00000000..90bdefba --- /dev/null +++ b/src/fr/neatmonster/nocheatplus/checks/chat/Relog.java @@ -0,0 +1,12 @@ +package fr.neatmonster.nocheatplus.checks.chat; + +import fr.neatmonster.nocheatplus.checks.Check; +import fr.neatmonster.nocheatplus.checks.CheckType; + +public class Relog extends Check { + + public Relog() { + super(CheckType.CHAT_RELOG); + } + +} diff --git a/src/fr/neatmonster/nocheatplus/config/ConfPaths.java b/src/fr/neatmonster/nocheatplus/config/ConfPaths.java index 5784d0f7..8362ed99 100644 --- a/src/fr/neatmonster/nocheatplus/config/ConfPaths.java +++ b/src/fr/neatmonster/nocheatplus/config/ConfPaths.java @@ -180,6 +180,15 @@ public abstract class ConfPaths { @GlobalConfig public static final String CHAT_HANDLEASCHAT = CHAT + "handleaschat"; + private static final String CHAT_CAPTCHA = CHAT + "captcha."; + public static final String CHAT_CAPTCHA_CHECK = CHAT_CAPTCHA + "active"; + public static final String CHAT_CAPTCHA_CHARACTERS = CHAT_CAPTCHA + "characters"; + public static final String CHAT_CAPTCHA_LENGTH = CHAT_CAPTCHA + "length"; + public static final String CHAT_CAPTCHA_QUESTION = CHAT_CAPTCHA + "question"; + public static final String CHAT_CAPTCHA_SUCCESS = CHAT_CAPTCHA + "success"; + public static final String CHAT_CAPTCHA_TRIES = CHAT_CAPTCHA + "tries"; + public static final String CHAT_CAPTCHA_ACTIONS = CHAT_CAPTCHA + "actions"; + private static final String CHAT_COLOR = CHAT + "color."; public static final String CHAT_COLOR_CHECK = CHAT_COLOR + "active"; public static final String CHAT_COLOR_ACTIONS = CHAT_COLOR + "actions"; @@ -236,15 +245,6 @@ public abstract class ConfPaths { public static final String CHAT_NOPWNAGE_BANNED_TIMEOUT = CHAT_NOPWNAGE_BANNED + "timeout"; public static final String CHAT_NOPWNAGE_BANNED_WEIGHT = CHAT_NOPWNAGE_BANNED + "weight"; - private static final String CHAT_NOPWNAGE_CAPTCHA = CHAT_NOPWNAGE + "captcha."; - public static final String CHAT_NOPWNAGE_CAPTCHA_CHECK = CHAT_NOPWNAGE_CAPTCHA + "active"; - public static final String CHAT_NOPWNAGE_CAPTCHA_CHARACTERS = CHAT_NOPWNAGE_CAPTCHA + "characters"; - public static final String CHAT_NOPWNAGE_CAPTCHA_LENGTH = CHAT_NOPWNAGE_CAPTCHA + "length"; - public static final String CHAT_NOPWNAGE_CAPTCHA_QUESTION = CHAT_NOPWNAGE_CAPTCHA + "question"; - public static final String CHAT_NOPWNAGE_CAPTCHA_SUCCESS = CHAT_NOPWNAGE_CAPTCHA + "success"; - public static final String CHAT_NOPWNAGE_CAPTCHA_TRIES = CHAT_NOPWNAGE_CAPTCHA + "tries"; - public static final String CHAT_NOPWNAGE_CAPTCHA_ACTIONS = CHAT_NOPWNAGE_CAPTCHA + "actions"; - private static final String CHAT_NOPWNAGE_FIRST = CHAT_NOPWNAGE + "first."; public static final String CHAT_NOPWNAGE_FIRST_CHECK = CHAT_NOPWNAGE_FIRST + "active"; public static final String CHAT_NOPWNAGE_FIRST_TIMEOUT = CHAT_NOPWNAGE_FIRST + "timeout"; diff --git a/src/fr/neatmonster/nocheatplus/config/DefaultConfig.java b/src/fr/neatmonster/nocheatplus/config/DefaultConfig.java index 2445dcc0..97ec8aca 100644 --- a/src/fr/neatmonster/nocheatplus/config/DefaultConfig.java +++ b/src/fr/neatmonster/nocheatplus/config/DefaultConfig.java @@ -144,16 +144,28 @@ public class DefaultConfig extends ConfigFile { * Y888 ,d 888 888 ,ee 888 888 * "88,d88 888 888 "88 888 888 */ + set(ConfPaths.CHAT_COLOR_CHECK, true); set(ConfPaths.CHAT_COLOR_ACTIONS, "log:color:0:1:if cancel"); + // Multi purpose. + set(ConfPaths.CHAT_HANDLEASCHAT, + new LinkedList(Arrays.asList(new String[]{"/me"}))); + + // Captcha. + set(ConfPaths.CHAT_CAPTCHA_CHECK, false); + set(ConfPaths.CHAT_CAPTCHA_CHARACTERS, "abcdefghjkmnpqrtuvwxyzABCDEFGHJKMNPQRTUVWXYZ2346789"); + set(ConfPaths.CHAT_CAPTCHA_LENGTH, 6); + set(ConfPaths.CHAT_CAPTCHA_QUESTION, "&cPlease type '&6[captcha]&c' to continue sending messages/commands."); + set(ConfPaths.CHAT_CAPTCHA_SUCCESS, "&aOK, it sounds like you're not a spambot."); + set(ConfPaths.CHAT_CAPTCHA_TRIES, 3); + set(ConfPaths.CHAT_CAPTCHA_ACTIONS, "cancel cmd:kickcaptcha vl>4 log:captcha:2:5:cf cancel cmd:kickcaptcha"); + // globalchat (ordering on purpose). set(ConfPaths.CHAT_GLOBALCHAT_CHECK, true); set(ConfPaths.CHAT_GLOBALCHAT_LEVEL, 80); set(ConfPaths.CHAT_GLOBALCHAT_FREQUENCY_FACTOR, 0.9D); set(ConfPaths.CHAT_GLOBALCHAT_FREQUENCY_WEIGHT, 6); - set(ConfPaths.CHAT_HANDLEASCHAT, - new LinkedList(Arrays.asList(new String[]{"/me"}))); set(ConfPaths.CHAT_GLOBALCHAT_GL_CHECK, true); set(ConfPaths.CHAT_GLOBALCHAT_GL_WEIGHT, 0.5); set(ConfPaths.CHAT_GLOBALCHAT_GL_WORDS_CHECK, false); @@ -176,16 +188,6 @@ public class DefaultConfig extends ConfigFile { set(ConfPaths.CHAT_NOPWNAGE_BANNED_TIMEOUT, 5000L); set(ConfPaths.CHAT_NOPWNAGE_BANNED_WEIGHT, 100); - set(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_CHECK, false); - set(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_CHARACTERS, - "abcdefghjkmnpqrtuvwxyzABCDEFGHJKMNPQRTUVWXYZ2346789"); - set(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_LENGTH, 6); - set(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_QUESTION, - "&cPlease type '&6[captcha]&c' to continue sending messages/commands."); - set(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_SUCCESS, "&aOK, it sounds like you're not a spambot."); - set(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_TRIES, 3); - set(ConfPaths.CHAT_NOPWNAGE_CAPTCHA_ACTIONS, "cancel cmd:kickcaptcha vl>4 log:captcha:2:5:cf cancel cmd:kickcaptcha"); - set(ConfPaths.CHAT_NOPWNAGE_FIRST_CHECK, true); set(ConfPaths.CHAT_NOPWNAGE_FIRST_TIMEOUT, 3000L); set(ConfPaths.CHAT_NOPWNAGE_FIRST_WEIGHT, 200); diff --git a/src/fr/neatmonster/nocheatplus/players/Permissions.java b/src/fr/neatmonster/nocheatplus/players/Permissions.java index dae8e546..fa1c7711 100644 --- a/src/fr/neatmonster/nocheatplus/players/Permissions.java +++ b/src/fr/neatmonster/nocheatplus/players/Permissions.java @@ -102,10 +102,14 @@ public class Permissions { * "88,d88 888 888 "88 888 888 */ private static final String CHAT = CHECKS + ".chat"; + public static final String CHAT_CAPTCHA = CHAT + ".captcha"; public static final String CHAT_COLOR = CHAT + ".color"; + public static final String CHAT_COMMANDS = CHAT + ".commands"; public static final String CHAT_GLOBALCHAT = CHAT + ".globalchat"; + public static final String CHAT_LOGINS = CHAT + ".logins"; + public static final String CHAT_RELOG = CHAT + ".relog"; + public static final String CHAT_NOPWNAGE = CHAT + ".nopwnage"; - public static final String CHAT_NOPWNAGE_CAPTCHA = CHAT_NOPWNAGE + ".captcha"; /* * Combined !