diff --git a/Essentials/src/com/earth2me/essentials/ISettings.java b/Essentials/src/com/earth2me/essentials/ISettings.java index 1ee1dff8f..7f944e529 100644 --- a/Essentials/src/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/com/earth2me/essentials/ISettings.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.function.Predicate; import java.util.regex.Pattern; @@ -332,4 +333,6 @@ public interface ISettings extends IConf { boolean isSafeUsermap(); boolean logCommandBlockCommands(); + + Set> getNickBlacklist(); } diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java index e28008731..2d611e5fa 100644 --- a/Essentials/src/com/earth2me/essentials/Settings.java +++ b/Essentials/src/com/earth2me/essentials/Settings.java @@ -35,6 +35,7 @@ import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.function.Predicate; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; @@ -555,6 +556,7 @@ public class Settings implements net.ess3.api.ISettings { isWaterSafe = _isWaterSafe(); isSafeUsermap = _isSafeUsermap(); logCommandBlockCommands = _logCommandBlockCommands(); + nickBlacklist = _getNickBlacklist(); } void _lateLoadItemSpawnBlacklist() { @@ -1588,4 +1590,25 @@ public class Settings implements net.ess3.api.ISettings { public boolean logCommandBlockCommands() { return logCommandBlockCommands; } + + private Set> nickBlacklist; + + private Set> _getNickBlacklist() { + Set> blacklist = new HashSet<>(); + + config.getStringList("nick-blacklist").forEach(entry -> { + try { + blacklist.add(Pattern.compile(entry).asPredicate()); + } catch (PatternSyntaxException e) { + logger.warning("Invalid nickname blacklist regex: " + entry); + } + }); + + return blacklist; + } + + @Override + public Set> getNickBlacklist() { + return nickBlacklist; + } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandnick.java b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java index 93e13002d..68d71e0cf 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandnick.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java @@ -83,10 +83,17 @@ public class Commandnick extends EssentialsLoopCommand { throw new Exception(tl("nickNamesAlpha")); } else if (user != null && (user.isAuthorized("essentials.nick.changecolors") && !user.isAuthorized("essentials.nick.changecolors.bypass")) && !FormatUtil.stripFormat(newNick).equals(user.getName())) { throw new Exception(tl("nickNamesOnlyColorChanges")); + } else if (user != null && !user.isAuthorized("essentials.nick.blacklist.bypass") && isNickBanned(newNick)) { + throw new Exception(tl("nickNameBlacklist", nick)); } return newNick; } + private boolean isNickBanned(String newNick) { + return ess.getSettings().getNickBlacklist().stream() + .anyMatch(entry -> entry.test(newNick)); + } + private int getNickLength(final String nick) { return ess.getSettings().ignoreColorsInMaxLength() ? ChatColor.stripColor(nick).length() : nick.length(); } diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml index f4fafccdc..b71392bf7 100644 --- a/Essentials/src/config.yml +++ b/Essentials/src/config.yml @@ -32,6 +32,12 @@ nickname-prefix: '~' # The maximum length allowed in nicknames. The nickname prefix is included in this. max-nick-length: 15 +# A list of phrases that cannot be used in nicknames. You can include regular expressions here. +# Users with essentials.nick.blacklist.bypass will be able to bypass this filter. +nick-blacklist: +#- Notch +#- '^Dinnerbone' + # When this option is enabled, nickname length checking will exclude color codes in player names. # ie: "&6Notch" has 7 characters (2 are part of a color code), a length of 5 is used when this option is set to true ignore-colors-in-max-nick-length: false diff --git a/Essentials/src/messages.properties b/Essentials/src/messages.properties index 84f3207f0..c25610306 100644 --- a/Essentials/src/messages.properties +++ b/Essentials/src/messages.properties @@ -323,6 +323,7 @@ negativeBalanceError=\u00a74User is not allowed to have a negative balance. nickChanged=\u00a76Nickname changed. nickDisplayName=\u00a74You have to enable change-displayname in Essentials config. nickInUse=\u00a74That name is already in use. +nickNameBlacklist=\u00a74That nickname is not allowed. nickNamesAlpha=\u00a74Nicknames must be alphanumeric. nickNamesOnlyColorChanges=\u00a74Nicknames can only have their colors changed. nickNoMore=\u00a76You no longer have a nickname.