diff --git a/pom.xml b/pom.xml index 2787afd..b535fc9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - adhdmc + simplexity SimpleNicks - 1.0.1 + 2.0.0 jar SimpleNicks @@ -39,6 +39,14 @@ false + + + + mojang + + + diff --git a/src/main/java/adhdmc/simplenicks/commands/CommandHandler.java b/src/main/java/adhdmc/simplenicks/commands/CommandHandler.java deleted file mode 100644 index dae9307..0000000 --- a/src/main/java/adhdmc/simplenicks/commands/CommandHandler.java +++ /dev/null @@ -1,86 +0,0 @@ -package adhdmc.simplenicks.commands; - -import adhdmc.simplenicks.SimpleNicks; -import adhdmc.simplenicks.config.LocaleHandler; -import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.command.*; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - - -public class CommandHandler implements CommandExecutor, TabCompleter { - - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { - MiniMessage miniMessage = SimpleNicks.getMiniMessage(); - - String[] parsedArgs = parseArgs(args); - - // Arguments Check - if (parsedArgs.length == 0) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getInvalidCommand())); // Invalid Arguments - return true; - } - // Execute Command - SubCommand subCommand = SimpleNicks.getSubCommands().getOrDefault(parsedArgs[0].toLowerCase(Locale.ENGLISH), null); - if (subCommand == null) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getInvalidCommand())); // Invalid SubCommand - return true; - } - subCommand.execute(sender, Arrays.copyOfRange(parsedArgs, 1, parsedArgs.length)); - return true; - } - - @Override - public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { - ArrayList tabComplete = new ArrayList<>(); - if (args.length == 1) { - for (SubCommand subCommand : SimpleNicks.getSubCommands().values()) { - if (sender.hasPermission(subCommand.getPermission()) && subCommand.getName().startsWith(args[0].toLowerCase(Locale.ENGLISH))) { - tabComplete.add(subCommand.getName()); - } - } - } - else { - SubCommand subCommand = SimpleNicks.getSubCommands().getOrDefault(args[0].toLowerCase(Locale.ENGLISH), null); - if (subCommand == null) { return tabComplete; } - if (sender.hasPermission(subCommand.getPermission())) { - return subCommand.getSubcommandArguments(sender, Arrays.copyOfRange(args, 1, args.length)); - } - } - return tabComplete; - } - - private String[] parseArgs(String[] args) { - String command = String.join(" ", args); - List arguments = new ArrayList<>(); - StringBuilder currentArgument = new StringBuilder(); - boolean inQuotes = false; - - for (int i = 0; i < command.length(); i++) { - char c = command.charAt(i); - - if (c == '\\' && i + 1 < command.length()) { - currentArgument.append(command.charAt(++i)); - } - else if (c == '\"') { - inQuotes = !inQuotes; - } - else if (Character.isWhitespace(c) && !inQuotes) { - if (currentArgument.length() > 0) { - arguments.add(currentArgument.toString()); - currentArgument.setLength(0); - } - } - else { - currentArgument.append(c); - } - } - - if (currentArgument.length() > 0) arguments.add(currentArgument.toString()); - - return arguments.toArray(new String[0]); - } -} - diff --git a/src/main/java/adhdmc/simplenicks/commands/SubCommand.java b/src/main/java/adhdmc/simplenicks/commands/SubCommand.java deleted file mode 100644 index 4b61621..0000000 --- a/src/main/java/adhdmc/simplenicks/commands/SubCommand.java +++ /dev/null @@ -1,46 +0,0 @@ -package adhdmc.simplenicks.commands; - -import adhdmc.simplenicks.util.SNPerm; -import org.bukkit.command.CommandSender; - -import java.util.List; - -public abstract class SubCommand { - - private final String name; - private final String description; - private final String syntax; - private final SNPerm permission; - - public SubCommand(String name, String description, String syntax, SNPerm permission) { - this.name = name; - this.description = description; - this.syntax = syntax; - this.permission = permission; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - public String getSyntax() { - return syntax; - } - - public SNPerm getSimpleNickPermission() { - return permission; - } - - public String getPermission() { - return permission.getPermission(); - } - - public abstract void execute(CommandSender sender, String[] args); - - public abstract List getSubcommandArguments(CommandSender sender, String[] args); - -} diff --git a/src/main/java/adhdmc/simplenicks/commands/subcommands/Delete.java b/src/main/java/adhdmc/simplenicks/commands/subcommands/Delete.java deleted file mode 100644 index 7506c86..0000000 --- a/src/main/java/adhdmc/simplenicks/commands/subcommands/Delete.java +++ /dev/null @@ -1,43 +0,0 @@ -package adhdmc.simplenicks.commands.subcommands; - -import adhdmc.simplenicks.SimpleNicks; -import adhdmc.simplenicks.commands.SubCommand; -import adhdmc.simplenicks.config.LocaleHandler; -import adhdmc.simplenicks.util.NickHandler; -import adhdmc.simplenicks.util.SNPerm; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Delete extends SubCommand { - MiniMessage miniMessage = SimpleNicks.getMiniMessage(); - public Delete() { - super("delete", "Deletes a given nickname.", "/nick delete ", SNPerm.NICK_DELETE); - } - - @Override - public void execute(CommandSender sender, String[] args) { - // Player Check - if (!(sender instanceof Player player)) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getConsoleCannotRun(), Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // Invalid Usage (Not a Player) - return; - } - String nickname = NickHandler.getInstance().getNickname(player); - if (!NickHandler.getInstance().deleteNickname(player, nickname)) { - player.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickDeleteFailure(), Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - return; - } - player.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickDeleteSuccess(), Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()), Placeholder.parsed("nickname", nickname))); - } - - @Override - public List getSubcommandArguments(CommandSender sender, String[] args) { - if (!(sender instanceof Player player)) return new ArrayList<>(); - if (args.length == 1) return NickHandler.getInstance().getSavedNicknames(player); - return new ArrayList<>(); - } -} diff --git a/src/main/java/adhdmc/simplenicks/commands/subcommands/Help.java b/src/main/java/adhdmc/simplenicks/commands/subcommands/Help.java deleted file mode 100644 index 6defd68..0000000 --- a/src/main/java/adhdmc/simplenicks/commands/subcommands/Help.java +++ /dev/null @@ -1,31 +0,0 @@ -package adhdmc.simplenicks.commands.subcommands; - -import adhdmc.simplenicks.SimpleNicks; -import adhdmc.simplenicks.commands.SubCommand; -import adhdmc.simplenicks.config.LocaleHandler; -import adhdmc.simplenicks.util.SNPerm; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import org.bukkit.command.CommandSender; - -import java.util.List; - -public class Help extends SubCommand { - MiniMessage miniMessage = SimpleNicks.getMiniMessage(); - public Help() { - super("help", "Help command for SimpleNicks", "/nick help", SNPerm.NICK_COMMAND); - } - - @Override - public void execute(CommandSender sender, String[] args) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getHelpBase(), Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getHelpSet())); - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getHelpReset())); - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getHelpMinimessage())); - } - - @Override - public List getSubcommandArguments(CommandSender sender, String[] args) { - return null; - } -} diff --git a/src/main/java/adhdmc/simplenicks/commands/subcommands/Reload.java b/src/main/java/adhdmc/simplenicks/commands/subcommands/Reload.java deleted file mode 100644 index 3149b61..0000000 --- a/src/main/java/adhdmc/simplenicks/commands/subcommands/Reload.java +++ /dev/null @@ -1,33 +0,0 @@ -package adhdmc.simplenicks.commands.subcommands; - -import adhdmc.simplenicks.SimpleNicks; -import adhdmc.simplenicks.commands.SubCommand; -import adhdmc.simplenicks.config.LocaleHandler; -import adhdmc.simplenicks.util.SNPerm; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import org.bukkit.command.CommandSender; - -import java.util.List; - -public class Reload extends SubCommand { - MiniMessage miniMessage = SimpleNicks.getMiniMessage(); - public Reload() { - super("reload", "Reloads SimpleNicks Config and Locale", "/nick reload", SNPerm.NICK_RELOAD); - } - - @Override - public void execute(CommandSender sender, String[] args) { - if (!sender.hasPermission(SNPerm.NICK_RELOAD.getPermission())){ - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNoPermission(), Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - return; - } - SimpleNicks.configReload(); - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getConfigReload(), Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - } - - @Override - public List getSubcommandArguments(CommandSender sender, String[] args) { - return null; - } -} diff --git a/src/main/java/adhdmc/simplenicks/commands/subcommands/Reset.java b/src/main/java/adhdmc/simplenicks/commands/subcommands/Reset.java deleted file mode 100644 index 030a1d1..0000000 --- a/src/main/java/adhdmc/simplenicks/commands/subcommands/Reset.java +++ /dev/null @@ -1,75 +0,0 @@ -package adhdmc.simplenicks.commands.subcommands; - -import adhdmc.simplenicks.SimpleNicks; -import adhdmc.simplenicks.commands.SubCommand; -import adhdmc.simplenicks.config.LocaleHandler; -import adhdmc.simplenicks.util.NickHandler; -import adhdmc.simplenicks.util.SNPerm; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -public class Reset extends SubCommand { - public Reset() { - super("reset", "Resets a nickname", "/nick reset", SNPerm.NICK_RESET); - } - - @Override - public void execute(CommandSender sender, String[] args) { - MiniMessage miniMessage = SimpleNicks.getMiniMessage(); - - // Player Check - if (!(sender instanceof Player)) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getConsoleCannotRun(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // Invalid Usage (Not a Player) - return; - } - // Arguments Check - if (args.length > 1) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getTooManyArguments(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // Too Many Arguments - return; - } - // Admin Check - if (args.length == 1 && !sender.hasPermission(SNPerm.NICK_RESET_OTHERS.getPermission())) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNoPermission(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // No Permission - return; - } - // Valid Player Check - Player player = (args.length == 0) ? (Player) sender : SimpleNicks.getInstance().getServer().getPlayer(args[0]); - if (player == null) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getInvalidPlayer(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // Invalid Player - return; - } - if (sender == player && !sender.hasPermission(SNPerm.NICK_RESET.getPermission())) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getTooManyArguments(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // No Permission - return; - } - // Set Nickname - // Saved to player - NickHandler.getInstance().resetNickname(player); - player.displayName(miniMessage.deserialize(player.getName())); - if (player != sender) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickResetOther(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()), - Placeholder.parsed("username", player.getName()))); - player.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickResetByOther(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()), - Placeholder.component("username", ((Player) sender).displayName()))); - } else { - player.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickResetSelf(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - } - } - - @Override - public List getSubcommandArguments(CommandSender sender, String[] args) { - return null; - } -} diff --git a/src/main/java/adhdmc/simplenicks/commands/subcommands/Save.java b/src/main/java/adhdmc/simplenicks/commands/subcommands/Save.java deleted file mode 100644 index cf2e1e0..0000000 --- a/src/main/java/adhdmc/simplenicks/commands/subcommands/Save.java +++ /dev/null @@ -1,46 +0,0 @@ -package adhdmc.simplenicks.commands.subcommands; - -import adhdmc.simplenicks.SimpleNicks; -import adhdmc.simplenicks.commands.SubCommand; -import adhdmc.simplenicks.config.Config; -import adhdmc.simplenicks.config.LocaleHandler; -import adhdmc.simplenicks.util.NickHandler; -import adhdmc.simplenicks.util.SNPerm; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class Save extends SubCommand { - MiniMessage miniMessage = SimpleNicks.getMiniMessage(); - public Save() { - super("save", "Saves the current or a provided nickname.", "/nick save [nickname]", SNPerm.NICK_SAVE); - } - - @Override - public void execute(CommandSender sender, String[] args) { - // Player Check - if (!(sender instanceof Player player)) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getConsoleCannotRun(), Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // Invalid Usage (Not a Player) - return; - } - if (NickHandler.getInstance().getSavedNicknames(player).size() >= Config.getInstance().getMaxSaves()) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickSaveFailureTooMany(), Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // Invalid Usage (Not a Player) - return; - } - String nickname = NickHandler.getInstance().getNickname(player); - if (!NickHandler.getInstance().saveNickname(player, nickname)) { - player.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickSaveFailure(), Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - return; - } - player.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickSaveSuccess(), Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()), Placeholder.parsed("nickname", nickname))); - } - - @Override - public List getSubcommandArguments(CommandSender sender, String[] args) { - return new ArrayList<>(); - } -} diff --git a/src/main/java/adhdmc/simplenicks/commands/subcommands/Set.java b/src/main/java/adhdmc/simplenicks/commands/subcommands/Set.java deleted file mode 100644 index 7839729..0000000 --- a/src/main/java/adhdmc/simplenicks/commands/subcommands/Set.java +++ /dev/null @@ -1,182 +0,0 @@ -package adhdmc.simplenicks.commands.subcommands; - -import adhdmc.simplenicks.SimpleNicks; -import adhdmc.simplenicks.commands.SubCommand; -import adhdmc.simplenicks.config.Config; -import adhdmc.simplenicks.config.LocaleHandler; -import adhdmc.simplenicks.util.NickHandler; -import adhdmc.simplenicks.util.SNPerm; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; - -public class Set extends SubCommand { - MiniMessage miniMessage = SimpleNicks.getMiniMessage(); - - - public Set() { - super("set", "sets a nickname", "/nick set", SNPerm.NICK_COMMAND); - } - - @Override - public void execute(CommandSender sender, String[] args) { - int length = Config.getInstance().getMaxLength(); - Pattern regex = Config.getInstance().getRegex(); - // Player Check - if (!(sender instanceof Player sendingPlayer)) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getConsoleCannotRun(), Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // Invalid Usage (Not a Player) - return; - } - // Arguments Check - if (args.length == 0) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNoArguments(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // Invalid Arguments - return; - } - if (args.length > 2) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getTooManyArguments(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // Too Many Arguments - return; - } - if (args.length == 2 && - !(sender.hasPermission(SNPerm.NICK_OTHERS_FULL.getPermission()) || - sender.hasPermission(SNPerm.NICK_OTHERS_BASIC.getPermission()) || - sender.hasPermission(SNPerm.NICK_OTHERS_RESTRICTIVE.getPermission()))) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNoPermission(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // No Permission - return; - } - if (!sender.hasPermission(SNPerm.NICK_COMMAND.getPermission())) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNoPermission(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // No Permission to set own - return; - } - // Nickname Validity Check - String nicknameStripped = miniMessage.stripTags(args[0]); - if (!regex.matcher(nicknameStripped).matches()) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getInvalidNickRegex(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()), - Placeholder.parsed("regex", regex.pattern()))); // Non-Alphanumeric Nickname - return; - } - if (nicknameStripped.length() > length) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getInvalidNickTooLong(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()), - Placeholder.parsed("value", String.valueOf(length)))); // Nickname Too Long - return; - } - // Valid Player Check - Player player = (args.length == 1) ? (Player) sender : SimpleNicks.getInstance().getServer().getPlayer(args[1]); - if (player == null) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getInvalidPlayer(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); // Invalid Player - return; - } - // Check against cached usernames - if (!player.hasPermission(SNPerm.NICK_USERNAME_BYPASS.getPermission()) && (SimpleNicks.getInstance().getServer().getOfflinePlayerIfCached(nicknameStripped) != null) && !(nicknameStripped.equals(player.getName()))){ - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getCantNickUsername(), - Placeholder.parsed("name", nicknameStripped), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - return; - } - // TODO: [Check Requirement] Is this required? Can it be reformatted? - Component nickname = null; - //The checks process to go through if someone is nicknaming another player - if (args.length == 2) { - if (sendingPlayer.hasPermission(SNPerm.NICK_OTHERS_FULL.getPermission())){ - //Full parse, no regards for the formatting permissions of either player - nickname = miniMessage.deserialize(args[0]); - } else if (sendingPlayer.hasPermission(SNPerm.NICK_OTHERS_BASIC.getPermission())) { - //Basic parse, parses based on the Admin's permissions - if (parseMessageContent(sendingPlayer, args[0]) == null) { - sendingPlayer.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getInvalidTags(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - return; - } - nickname = parseMessageContent(sendingPlayer, args[0]); - } else if (sendingPlayer.hasPermission(SNPerm.NICK_OTHERS_RESTRICTIVE.getPermission())) { - //Restrictive parse, parses based on the player's permissions - if (parseMessageContent(player, args[0]) == null) { - sendingPlayer.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getInvalidTags(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - return; - } - nickname = parseMessageContent(player, args[0]); - } - } else { - //Player nicknaming themselves, based on their own permissions - if (parseMessageContent(player, args[0]) == null){ - sendingPlayer.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getInvalidTags(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - return; - } else { - nickname = parseMessageContent(player, args[0]); - } - } - //idk it says this might be null, I hope it's not but just in case lol - if (nickname == null) { - sender.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickIsNull(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - return; - } - // TODO: End [Check Requirement] - // Set Nickname - NickHandler.getInstance().setNickname(player, args[0]); - //Send feedback if an admin is setting someone's name, both to the admin and player - if (sendingPlayer != player) { - sendingPlayer.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickChangeOther(), - Placeholder.parsed("username", player.getName()), - Placeholder.component("nickname", nickname), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - player.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickChangedByOther(), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()), - Placeholder.component("username", sendingPlayer.displayName()), - Placeholder.component("nickname", nickname))); - } else { - //If a player sets their own name - player.sendMessage(miniMessage.deserialize(LocaleHandler.getInstance().getNickChangedSelf(), - Placeholder.component("nickname", nickname), - Placeholder.parsed("prefix", LocaleHandler.getInstance().getPrefix()))); - } - } - - @Override - public List getSubcommandArguments(CommandSender sender, String[] args) { - if (!(sender instanceof Player player)) return new ArrayList<>(); - if (args.length == 2 && (sender.hasPermission(SNPerm.NICK_OTHERS_FULL.getPermission()) || - sender.hasPermission(SNPerm.NICK_OTHERS_BASIC.getPermission()) || - sender.hasPermission(SNPerm.NICK_OTHERS_RESTRICTIVE.getPermission()))) { - return null; - } - if (args.length == 1) return NickHandler.getInstance().getSavedNicknames(player); - return new ArrayList<>(); - } - //Stolen from https://github.com/YouHaveTrouble/JustChat/blob/master/src/main/java/me/youhavetrouble/justchat/JustChatListener.java#L78 - private Component parseMessageContent(Player player, String rawMessage) { - TagResolver.Builder tagResolver = TagResolver.builder(); - //This is stupid but yk whatever - int tempCheckSolution = 0; - for(SNPerm perm : SNPerm.values()) { - if (player.hasPermission(perm.getPermission()) && perm.getTagResolver() != null) { - tagResolver.resolver(perm.getTagResolver()); - tempCheckSolution = tempCheckSolution + 1; - } - } - MiniMessage nameParser = MiniMessage.builder().tags(tagResolver.build()).build(); - Component fullParsedName = miniMessage.deserialize(rawMessage); - Component permParsedName = nameParser.deserialize(rawMessage); - if (tempCheckSolution == 0) { - String strippedMsg = miniMessage.stripTags(rawMessage); - return miniMessage.deserialize(strippedMsg); - } - if (fullParsedName.equals(permParsedName)) return permParsedName; - return null; - } -} diff --git a/src/main/java/adhdmc/simplenicks/config/LocaleHandler.java b/src/main/java/adhdmc/simplenicks/config/LocaleHandler.java deleted file mode 100644 index 62bb8a7..0000000 --- a/src/main/java/adhdmc/simplenicks/config/LocaleHandler.java +++ /dev/null @@ -1,197 +0,0 @@ -package adhdmc.simplenicks.config; - -import adhdmc.simplenicks.SimpleNicks; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.io.IOException; -import java.util.logging.Logger; - -public class LocaleHandler { - private static LocaleHandler instance; - private final String fileName = "locale.yml"; - private final File localeFile = new File(SimpleNicks.getInstance().getDataFolder(), fileName); - private final FileConfiguration localeConfig = new YamlConfiguration(); - private final Logger logger = SimpleNicks.getInstance().getLogger(); - private String invalidCommand, noArguments, tooManyArguments, cantNickUsername, noPermission, consoleCannotRun, - invalidPlayer, invalidNickRegex, invalidNickTooLong, invalidTags, prefix, helpBase, helpSet, helpReset, - helpMinimessage, configReload, nickChangedSelf, nickChangeOther, nickChangedByOther, nickResetSelf, - nickResetOther, nickResetByOther, noRegex, nickIsNull, nickSaveSuccess, nickSaveFailure, nickSaveFailureTooMany, - nickDeleteSuccess, nickDeleteFailure; - - - - private LocaleHandler() { - if (!localeFile.exists()) { - SimpleNicks.getInstance().saveResource(fileName, false); - } - } - - public static LocaleHandler getInstance() { - if (instance == null) instance = new LocaleHandler(); - return instance; - } - - public FileConfiguration getLocaleConfig() { - return localeConfig; - } - - - - public void loadLocale() { - try { - localeConfig.load(localeFile); - } catch (IOException | InvalidConfigurationException e) { - logger.severe("Issue loading locale.yml"); - e.printStackTrace(); - } - invalidCommand = localeConfig.getString("invalid-command", "Invalid command."); - noArguments = localeConfig.getString("no-arguments", "No arguments provided."); - tooManyArguments = localeConfig.getString("too-many-arguments", "Too many arguments provided."); - cantNickUsername = localeConfig.getString("cant-nick-username", "You cannot name yourself , as that is the username of another player on this server. Pick another name"); - noPermission = localeConfig.getString("no-permission", "You do not have permission to run this command"); - consoleCannotRun = localeConfig.getString("console-cannot-run", "This command cannot be run on the Console."); - invalidPlayer = localeConfig.getString("invalid-player", "Invalid player specified"); - invalidNickRegex = localeConfig.getString("invalid-nick-regex", "Not a valid nickname, must follow regex: "); - invalidNickTooLong = localeConfig.getString("invalid-nick-too-long", "Nickname is too long, must be <= "); - invalidTags = localeConfig.getString("invalid-tags", "You have used a color or formatting tag you do not have permission to use. Please try again"); - prefix = localeConfig.getString("prefix", "SimpleNicks » "); - helpBase = localeConfig.getString("help-base", "--------"); - helpSet = localeConfig.getString("help-set","· Setting a nickname: \n /nick set "); - helpReset = localeConfig.getString("help-reset","· removing a nickname: \n /nick reset"); - helpMinimessage = localeConfig.getString("help-minimessage", "· Formatting: \n This plugin uses minimessage formatting. You can find a format viewer here"); - configReload = localeConfig.getString("config-reload", "SimpleNicks config and locale reloaded"); - nickChangedSelf = localeConfig.getString("nick-changed-self", "Changed your own nickname to !"); - nickChangeOther = localeConfig.getString("nick-change-other", "Changed 's nickname to "); - nickChangedByOther = localeConfig.getString("nick-changed-by-other", " changed your nickname to !"); - nickResetSelf = localeConfig.getString("nick-reset-self", "Reset your own nickname!"); - nickResetOther = localeConfig.getString("nick-reset-other", "Reset 's nickname."); - nickResetByOther = localeConfig.getString("nick-reset-by-other", "Your nickname was reset by "); - noRegex = localeConfig.getString("no-regex", "nickname-regex is null or malformed in file 'config.yml'. Please fix this"); - nickIsNull = localeConfig.getString("nick-is-null", "Something went wrong and the nickname is null, please check your formatting"); - nickSaveSuccess = localeConfig.getString("nick-save-success", "Success! The nickname has been saved for future use"); - nickSaveFailure = localeConfig.getString("nick-save-failure", "Failed to save current username."); - nickSaveFailureTooMany = localeConfig.getString("nick-save-failure-too-many", "You have too many saved usernames, please remove some with /nick delete "); - nickDeleteSuccess = localeConfig.getString("nick-delete-success", "The nickname has been successfully removed from your saved names"); - nickDeleteFailure = localeConfig.getString("nick-delete-failure", "Failed to delete given username."); - } - - public String getInvalidCommand() { - return invalidCommand; - } - - public String getNoArguments() { - return noArguments; - } - - public String getTooManyArguments() { - return tooManyArguments; - } - - public String getCantNickUsername() { - return cantNickUsername; - } - - public String getNoPermission() { - return noPermission; - } - - public String getConsoleCannotRun() { - return consoleCannotRun; - } - - public String getInvalidPlayer() { - return invalidPlayer; - } - - public String getInvalidNickRegex() { - return invalidNickRegex; - } - - public String getInvalidNickTooLong() { - return invalidNickTooLong; - } - - public String getInvalidTags() { - return invalidTags; - } - - public String getPrefix() { - return prefix; - } - - public String getHelpBase() { - return helpBase; - } - - public String getHelpSet() { - return helpSet; - } - - public String getHelpReset() { - return helpReset; - } - - public String getHelpMinimessage() { - return helpMinimessage; - } - - public String getConfigReload() { - return configReload; - } - - public String getNickChangedSelf() { - return nickChangedSelf; - } - - public String getNickChangeOther() { - return nickChangeOther; - } - - public String getNickChangedByOther() { - return nickChangedByOther; - } - - public String getNickResetSelf() { - return nickResetSelf; - } - - public String getNickResetOther() { - return nickResetOther; - } - - public String getNickResetByOther() { - return nickResetByOther; - } - - public String getNoRegex() { - return noRegex; - } - - public String getNickIsNull() { - return nickIsNull; - } - - public String getNickSaveSuccess() { - return nickSaveSuccess; - } - - public String getNickSaveFailure() { - return nickSaveFailure; - } - - public String getNickSaveFailureTooMany() { - return nickSaveFailureTooMany; - } - - public String getNickDeleteSuccess() { - return nickDeleteSuccess; - } - - public String getNickDeleteFailure() { - return nickDeleteFailure; - } -} - diff --git a/src/main/java/adhdmc/simplenicks/util/SNPerm.java b/src/main/java/adhdmc/simplenicks/util/SNPerm.java deleted file mode 100644 index 522b900..0000000 --- a/src/main/java/adhdmc/simplenicks/util/SNPerm.java +++ /dev/null @@ -1,50 +0,0 @@ -package adhdmc.simplenicks.util; - -import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; -import net.kyori.adventure.text.minimessage.tag.standard.StandardTags; - -public enum SNPerm { - //Nickname Perms - NICK_COLOR("simplenick.nick.color", StandardTags.color()), - NICK_GRADIENT("simplenick.nick.gradient", StandardTags.gradient()), - NICK_RAINBOW("simplenick.nick.rainbow", StandardTags.rainbow()), - NICK_FORMAT_RESET("simplenick.nick.format.reset", StandardTags.reset()), - NICK_UNDERLINE("simplenick.nick.format.underline", StandardTags.decorations(TextDecoration.UNDERLINED)), - NICK_ITALIC("simplenick.nick.format.italic", StandardTags.decorations(TextDecoration.ITALIC)), - NICK_STRIKETHROUGH("simplenick.nick.format.strikethrough", StandardTags.decorations(TextDecoration.STRIKETHROUGH)), - NICK_BOLD("simplenick.nick.format.bold", StandardTags.decorations(TextDecoration.BOLD)), - NICK_OBFUSCATED("simplenick.nick.format.obfuscated", StandardTags.decorations(TextDecoration.OBFUSCATED)), - //Command Perms - NICK_COMMAND("simplenick.nick.set", null), - NICK_OTHERS_RESTRICTIVE("simplenick.admin.restrictive", null), - NICK_OTHERS_BASIC("simplenick.admin.basic", null), - NICK_OTHERS_FULL("simplenick.admin.full", null), - NICK_RESET_OTHERS("simplenick.admin.reset", null), - NICK_RESET("simplenick.nick.reset", null), - NICK_SAVE("simplenick.save", null), - NICK_DELETE("simplenick.delete", null), - NICK_RELOAD("simplenick.reload", null), - NICK_USERNAME_BYPASS("simplenick.usernamebypass", null); - - private final String permission; - private final TagResolver resolver; - - SNPerm(String permission, TagResolver resolver) { - this.permission = permission; - this.resolver = resolver; - } - - SNPerm(String permission) { - this.permission = permission; - this.resolver = null; - } - - public String getPermission() { - return permission; - } - - public TagResolver getTagResolver() { - return resolver; - } -} diff --git a/src/main/java/adhdmc/simplenicks/SimpleNicks.java b/src/main/java/simplexity/simplenicks/SimpleNicks.java similarity index 55% rename from src/main/java/adhdmc/simplenicks/SimpleNicks.java rename to src/main/java/simplexity/simplenicks/SimpleNicks.java index a34250a..0522bb6 100644 --- a/src/main/java/adhdmc/simplenicks/SimpleNicks.java +++ b/src/main/java/simplexity/simplenicks/SimpleNicks.java @@ -1,16 +1,22 @@ -package adhdmc.simplenicks; +package simplexity.simplenicks; -import adhdmc.simplenicks.commands.CommandHandler; -import adhdmc.simplenicks.commands.SubCommand; -import adhdmc.simplenicks.commands.subcommands.*; -import adhdmc.simplenicks.config.Config; -import adhdmc.simplenicks.config.LocaleHandler; -import adhdmc.simplenicks.listener.LoginListener; -import adhdmc.simplenicks.util.NickHandler; -import adhdmc.simplenicks.util.SNExpansion; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; +import simplexity.simplenicks.commands.CommandHandler; +import simplexity.simplenicks.commands.Delete; +import simplexity.simplenicks.commands.Help; +import simplexity.simplenicks.commands.Reset; +import simplexity.simplenicks.commands.Save; +import simplexity.simplenicks.commands.Set; +import simplexity.simplenicks.commands.SNReload; +import simplexity.simplenicks.commands.SubCommand; +import simplexity.simplenicks.config.ConfigHandler; +import simplexity.simplenicks.config.LocaleHandler; +import simplexity.simplenicks.listener.LoginListener; +import simplexity.simplenicks.util.Constants; +import simplexity.simplenicks.util.NickHandler; +import simplexity.simplenicks.util.SNExpansion; import java.util.Collections; import java.util.HashMap; @@ -38,8 +44,9 @@ public void onEnable() { instance = this; registerSubCommands(); this.saveDefaultConfig(); - Config.getInstance().setConfigDefaults(); + ConfigHandler.getInstance().setConfigDefaults(); this.getCommand("nick").setExecutor(new CommandHandler()); + this.getCommand("snreload").setExecutor(new SNReload()); if (this.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { new SNExpansion().register(); } @@ -59,22 +66,21 @@ public static Map getSubCommands() { return Collections.unmodifiableMap(subCommands); } - public static Logger getSimpleNicksLogger(){ + public static Logger getSimpleNicksLogger() { return instance.getLogger(); } private void registerSubCommands() { - subCommands.put("reset", new Reset()); - subCommands.put("help", new Help()); - subCommands.put("set", new Set()); - subCommands.put("reload", new Reload()); - subCommands.put("save", new Save()); - subCommands.put("delete", new Delete()); + subCommands.put("reset", new Reset("reset", Constants.NICK_RESET, Constants.NICK_RESET_OTHERS, false)); + subCommands.put("help", new Help("help", Constants.NICK_COMMAND, Constants.NICK_OTHERS_COMMAND, true)); + subCommands.put("set", new Set("set", Constants.NICK_COMMAND, Constants.NICK_OTHERS_RESTRICTIVE, false)); + subCommands.put("save", new Save("save", Constants.NICK_SAVE, Constants.NICK_OTHERS_SAVE, false)); + subCommands.put("delete", new Delete("delete", Constants.NICK_DELETE, Constants.NICK_OTHERS_DELETE, false)); } public static void configReload() { LocaleHandler.getInstance().loadLocale(); - Config.getInstance().reloadConfig(); + ConfigHandler.getInstance().reloadConfig(); NickHandler.getInstance().loadSavingType(); } } diff --git a/src/main/java/simplexity/simplenicks/commands/CommandHandler.java b/src/main/java/simplexity/simplenicks/commands/CommandHandler.java new file mode 100644 index 0000000..7fa9e5c --- /dev/null +++ b/src/main/java/simplexity/simplenicks/commands/CommandHandler.java @@ -0,0 +1,137 @@ +package simplexity.simplenicks.commands; + +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import simplexity.simplenicks.SimpleNicks; +import simplexity.simplenicks.config.LocaleHandler; + +import java.util.ArrayList; +import java.util.List; + +public class CommandHandler implements TabExecutor { + private final MiniMessage miniMessage = SimpleNicks.getMiniMessage(); + private final ArrayList tabComplete = new ArrayList<>(); + + // /nick + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { + if (args.length < 1) { + sendMessage(sender, LocaleHandler.getInstance().getNotEnoughArgs()); + return false; + } + if (args.length >= 2) { + Player player = getPlayerFromArgs(args); + String subCommandString = args[0].toLowerCase(); + SubCommand subCommand = SimpleNicks.getSubCommands().get(subCommandString); + if (subCommand != null && sender.hasPermission(subCommand.adminPermission) && (player != null)) { + commandOnOther(sender, args, player); + return true; + } + } + commandOnSelf(sender, args); + return true; + + } + + private Player getPlayerFromArgs(String[] args) { + return SimpleNicks.getInstance().getServer().getPlayer(args[1]); + } + + private void commandOnOther(CommandSender sender, String[] args, Player player) { + String command = args[0].toLowerCase(); + SubCommand subCommand = SimpleNicks.getSubCommands().get(command); + if (subCommand == null) { + sendMessage(sender, LocaleHandler.getInstance().getInvalidCommand()); + return; + } + if (!sender.hasPermission(subCommand.adminPermission)) { + sendMessage(sender, LocaleHandler.getInstance().getNoPermission()); + return; + } + subCommand.executeOnOther(sender, player, args); + } + + private void commandOnSelf(CommandSender sender, String[] args) { + String command = args[0].toLowerCase(); + SubCommand subCommand = SimpleNicks.getSubCommands().get(command); + if (subCommand == null) { + sendMessage(sender, LocaleHandler.getInstance().getInvalidCommand()); + return; + } + if (!sender.hasPermission(subCommand.basicPermission)) { + sendMessage(sender, LocaleHandler.getInstance().getNoPermission()); + return; + } + Player player = null; + if (sender instanceof Player) { + player = (Player) sender; + } + if (player == null && !subCommand.canRunWithoutPlayer()) { + sendMessage(sender, LocaleHandler.getInstance().getMustBePlayer()); + return; + } + subCommand.executeOnSelf(sender, player, args); + } + + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { + tabComplete.clear(); + Player player = getPlayerForTabComplete(sender, args); + switch (args.length) { + case 0, 1 -> addSubCommandsToTabComplete(sender); + case 2 -> { + SubCommand subCommand = SimpleNicks.getSubCommands().get(args[0].toLowerCase()); + if (SimpleNicks.getSubCommands().containsKey(args[0].toLowerCase())) { + if (sender.hasPermission(subCommand.adminPermission) && (player != null)) { + return null; + } else { + return subCommand.tabComplete(sender, args, player); + } + } + } + case 3 -> { + SubCommand subCommand = SimpleNicks.getSubCommands().get(args[0].toLowerCase()); + if (subCommand == null) { + return null; + } + return subCommand.tabComplete(sender, args, player); + } + } + + return tabComplete; + } + + private Player getPlayerForTabComplete(CommandSender sender, String[] args) { + if (args.length < 2) { + return null; + } + Player player = getPlayerFromArgs(args); + if (player != null) { + return player; + } + if (sender instanceof Player playerSender) { + return playerSender; + } + return null; + } + + private void addSubCommandsToTabComplete(CommandSender sender) { + for (String key : SimpleNicks.getSubCommands().keySet()) { + SubCommand subCommand = SimpleNicks.getSubCommands().get(key); + if (sender.hasPermission(subCommand.basicPermission) || sender.hasPermission(subCommand.adminPermission)) { + tabComplete.add(key); + } + } + } + + private void sendMessage(CommandSender sender, String message) { + sender.sendMessage(miniMessage.deserialize(message, Placeholder.parsed("prefix", LocaleHandler.getInstance().getPluginPrefix()))); + } +} diff --git a/src/main/java/simplexity/simplenicks/commands/Delete.java b/src/main/java/simplexity/simplenicks/commands/Delete.java new file mode 100644 index 0000000..6e69be3 --- /dev/null +++ b/src/main/java/simplexity/simplenicks/commands/Delete.java @@ -0,0 +1,59 @@ +package simplexity.simplenicks.commands; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.permissions.Permission; +import simplexity.simplenicks.config.LocaleHandler; +import simplexity.simplenicks.util.NickHandler; + +import java.util.ArrayList; +import java.util.List; + +public class Delete extends SubCommand{ + public Delete(String commandName, Permission basicPermission, Permission adminPermission, boolean consoleRunNoPlayer) { + super(commandName, basicPermission, adminPermission, consoleRunNoPlayer); + } + + @Override + public void executeOnOther(CommandSender sender, Player player, String[] args) { + if (!isValidArgsLength(sender, player, args, 3)) { + return; + } + String nickname = args[2]; + if (removeSavedNick(sender, player, nickname)) { + sender.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getDeleteNick(), nickname)); + } + + } + + @Override + public void executeOnSelf(CommandSender sender, Player player, String[] args) { + if (!isValidArgsLength(sender, player, args, 2)) { + return; + } + String nickname = args[1]; + if (removeSavedNick(sender, player, nickname)) { + sender.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getDeleteNick(), nickname)); + } + } + + private boolean removeSavedNick(CommandSender sender, Player player, String nickname) { + List savedNicks = NickHandler.getInstance().getSavedNicknames(player); + if (!savedNicks.contains(nickname)) { + sender.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getNameNonexistent(), nickname)); + return false; + } + NickHandler.getInstance().deleteNickname(player, nickname); + NickHandler.getInstance().refreshNickname(player); + return true; + } + + @Override + public ArrayList tabComplete(CommandSender sender, String[] args, Player player) { + if (player == null) { + return null; + } + List savedNickNames = NickHandler.getInstance().getSavedNicknames(player); + return (ArrayList) savedNickNames; + } +} diff --git a/src/main/java/simplexity/simplenicks/commands/Help.java b/src/main/java/simplexity/simplenicks/commands/Help.java new file mode 100644 index 0000000..1bc4fd6 --- /dev/null +++ b/src/main/java/simplexity/simplenicks/commands/Help.java @@ -0,0 +1,31 @@ +package simplexity.simplenicks.commands; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.permissions.Permission; +import simplexity.simplenicks.config.LocaleHandler; + +import java.util.ArrayList; + +public class Help extends SubCommand { + + public Help(String commandName, Permission basicPermission, Permission adminPermission, boolean consoleRunNoPlayer) { + super(commandName, basicPermission, adminPermission, consoleRunNoPlayer); + } + + @Override + public void executeOnOther(CommandSender sender, Player player, String[] args) { + sender.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getShownHelp(), player.getName())); + player.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getHelpMessage(), "")); + } + + @Override + public void executeOnSelf(CommandSender sender, Player player, String[] args) { + sender.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getHelpMessage(), "")); + } + + @Override + public ArrayList tabComplete(CommandSender sender, String[] args, Player player) { + return null; + } +} diff --git a/src/main/java/simplexity/simplenicks/commands/Reset.java b/src/main/java/simplexity/simplenicks/commands/Reset.java new file mode 100644 index 0000000..8015aac --- /dev/null +++ b/src/main/java/simplexity/simplenicks/commands/Reset.java @@ -0,0 +1,41 @@ +package simplexity.simplenicks.commands; + +import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.permissions.Permission; +import simplexity.simplenicks.config.LocaleHandler; +import simplexity.simplenicks.util.NickHandler; + +import java.util.ArrayList; + +public class Reset extends SubCommand { + + public Reset(String commandName, Permission basicPermission, Permission adminPermission, boolean consoleRunNoPlayer) { + super(commandName, basicPermission, adminPermission, consoleRunNoPlayer); + } + + @Override + public void executeOnOther(CommandSender sender, Player player, String[] args) { + resetName(player); + sender.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getResetOther(), player.getName())); + player.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getResetByOther(), player.getName())); + } + + @Override + public void executeOnSelf(CommandSender sender, Player player, String[] args) { + resetName(player); + player.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getResetSelf(), player.getName())); + } + + public void resetName(Player player) { + String username = player.getName(); + player.displayName(Component.text(username)); + NickHandler.getInstance().resetNickname(player); + } + + @Override + public ArrayList tabComplete(CommandSender sender, String[] args, Player player) { + return null; + } +} diff --git a/src/main/java/simplexity/simplenicks/commands/SNReload.java b/src/main/java/simplexity/simplenicks/commands/SNReload.java new file mode 100644 index 0000000..859ab6d --- /dev/null +++ b/src/main/java/simplexity/simplenicks/commands/SNReload.java @@ -0,0 +1,21 @@ +package simplexity.simplenicks.commands; + +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import simplexity.simplenicks.SimpleNicks; +import simplexity.simplenicks.config.ConfigHandler; +import simplexity.simplenicks.config.LocaleHandler; + +public class SNReload implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { + ConfigHandler.getInstance().reloadConfig(); + LocaleHandler.getInstance().loadLocale(); + sender.sendMessage(SimpleNicks.getMiniMessage().deserialize(LocaleHandler.getInstance().getConfigReloaded(), + Placeholder.parsed("prefix", LocaleHandler.getInstance().getPluginPrefix()))); + return false; + } +} diff --git a/src/main/java/simplexity/simplenicks/commands/Save.java b/src/main/java/simplexity/simplenicks/commands/Save.java new file mode 100644 index 0000000..08b3f7a --- /dev/null +++ b/src/main/java/simplexity/simplenicks/commands/Save.java @@ -0,0 +1,54 @@ +package simplexity.simplenicks.commands; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.permissions.Permission; +import simplexity.simplenicks.config.ConfigHandler; +import simplexity.simplenicks.config.LocaleHandler; +import simplexity.simplenicks.util.NickHandler; + +import java.util.ArrayList; +import java.util.List; + +public class Save extends SubCommand{ + public Save(String commandName, Permission basicPermission, Permission adminPermission, boolean consoleRunNoPlayer) { + super(commandName, basicPermission, adminPermission, consoleRunNoPlayer); + } + + @Override + public void executeOnOther(CommandSender sender, Player player, String[] args) { + if (savePlayerNick(player)) { + sender.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getSaveNick(), miniMessage.serialize(player.displayName()))); + player.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getSaveNick(), miniMessage.serialize(player.displayName()))); + } else { + sender.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getSaveFailure(), String.valueOf(ConfigHandler.getInstance().getMaxSaves()))); + } + } + + @Override + public void executeOnSelf(CommandSender sender, Player player, String[] args) { + if (savePlayerNick(player)) { + player.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getSaveNick(), miniMessage.serialize(player.displayName()))); + } else { + player.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getSaveFailure(), String.valueOf(ConfigHandler.getInstance().getMaxSaves()))); + } + } + + public boolean savePlayerNick(Player player) { + String nameToSave = miniMessage.serialize(player.displayName()); + List nameList = NickHandler.getInstance().getSavedNicknames(player); + if (nameList.contains(nameToSave)) { + return false; + } + if (nameList.size() >= ConfigHandler.getInstance().getMaxSaves()) { + return false; + } + NickHandler.getInstance().saveNickname(player, nameToSave); + return true; + } + + @Override + public ArrayList tabComplete(CommandSender sender, String[] args, Player player) { + return null; + } +} diff --git a/src/main/java/simplexity/simplenicks/commands/Set.java b/src/main/java/simplexity/simplenicks/commands/Set.java new file mode 100644 index 0000000..4602ae5 --- /dev/null +++ b/src/main/java/simplexity/simplenicks/commands/Set.java @@ -0,0 +1,144 @@ +package simplexity.simplenicks.commands; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.permissions.Permission; +import simplexity.simplenicks.SimpleNicks; +import simplexity.simplenicks.config.ConfigHandler; +import simplexity.simplenicks.config.LocaleHandler; +import simplexity.simplenicks.util.Constants; +import simplexity.simplenicks.util.NickHandler; +import simplexity.simplenicks.util.TagPermission; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +public class Set extends SubCommand { + MiniMessage serializer = MiniMessage.builder().tags(TagResolver.empty()).build(); + + public Set(String commandName, Permission basicPermission, Permission adminPermission, boolean consoleRunNoPlayer) { + super(commandName, basicPermission, adminPermission, consoleRunNoPlayer); + } + + @Override + public void executeOnOther(CommandSender sender, Player player, String[] args) { + if (!isValidArgsLength(sender, player, args, 3)) { + return; + } + String nickname = args[2]; + Component nickComponent = Component.empty(); + if (sender.hasPermission(Constants.NICK_OTHERS_FULL)) { + nickComponent = miniMessage.deserialize(nickname); + } else if (sender.hasPermission(Constants.NICK_OTHERS_BASIC)) { + nickComponent = getNickComponent(sender, nickname); + } else if (sender.hasPermission(Constants.NICK_OTHERS_RESTRICTIVE)) { + nickComponent = getNickComponent(player, nickname); + } + if (!passesChecks(sender, nickname, player)) { + return; + } + if (setPlayerNick(player, nickComponent)) { + sender.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getChangedOther(), nickname)); + player.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getChangedByOther(), nickname)); + } else { + sender.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getInvalidTags(), nickname)); + } + } + + @Override + public void executeOnSelf(CommandSender sender, Player player, String[] args) { + if (!isValidArgsLength(sender, player, args, 2)) return; + String nickname = args[1]; + if (!passesChecks(sender, nickname, player)) { + return; + } + Component nickComponent = getNickComponent(sender, nickname); + if (setPlayerNick(player, nickComponent)) { + player.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getChangedSelf(), nickname)); + } else { + player.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getInvalidTags(), nickname)); + } + } + + private boolean setPlayerNick(Player player, Component nickComponent) { + if (nickComponent == null) { + return false; + } + String nickToSave = miniMessage.serialize(nickComponent); + NickHandler.getInstance().setNickname(player, nickToSave); + return true; + } + + + + + @Override + public ArrayList tabComplete(CommandSender sender, String[] args, Player player) { + if (player == null) { + return null; + } + List savedNickNames = NickHandler.getInstance().getSavedNicknames(player); + return (ArrayList) savedNickNames; + } + + private Component getNickComponent(CommandSender user, String nick) { + int permissionCount = 0; + String strippedMessage = miniMessage.stripTags(nick); + TagResolver.Builder resolverBuilder = TagResolver.builder(); + Component finalNick = null; + for (TagPermission tagPermission : TagPermission.values()) { + if (!user.hasPermission(tagPermission.getPermission())) { + continue; + } + permissionCount++; + resolverBuilder.resolver(tagPermission.getTagResolver()); + finalNick = serializer.deserialize(nick, tagPermission.getTagResolver()); + } + if (permissionCount == 0) { + return Component.text(strippedMessage); + } + String plainNick = PlainTextComponentSerializer.plainText().serialize(finalNick); + if (!plainNick.equals(strippedMessage)) { + return null; + } + return finalNick; + } + + private boolean passesChecks(CommandSender sender, String nickname, Player player) { + String strippedMessage = miniMessage.stripTags(nickname); + Pattern regexPattern = ConfigHandler.getInstance().getRegex(); + if (strippedMessage.length() > ConfigHandler.getInstance().getMaxLength() && !sender.hasPermission(Constants.NICK_LENGTH_BYPASS)) { + sender.sendMessage(parsedMessage(sender, null, LocaleHandler.getInstance().getInvalidNickLength(), "")); + return false; + } + if (!regexPattern.matcher(strippedMessage).matches() && !sender.hasPermission(Constants.NICK_REGEX_BYPASS)) { + sender.sendMessage(parsedMessage(sender, null, LocaleHandler.getInstance().getInvalidNick(), ConfigHandler.getInstance().getRegexString())); + return false; + } + OfflinePlayer playerToCheck = SimpleNicks.getInstance().getServer().getOfflinePlayer(strippedMessage); + if (!playerToCheck.hasPlayedBefore()) { + return true; + } + if (playerToCheck.getPlayer() == player) { + return true; + + } + if (!sender.hasPermission(Constants.NICK_USERNAME_BYPASS)) { + long lastSeen = playerToCheck.getLastSeen(); + long now = System.currentTimeMillis(); + long diff = now - lastSeen; + if (diff < ConfigHandler.getInstance().getUsernameProtectionTime()) { + sender.sendMessage(parsedMessage(sender, null, LocaleHandler.getInstance().getOtherPlayersUsername(), nickname)); + return false; + } + } + return true; + } + +} diff --git a/src/main/java/simplexity/simplenicks/commands/SubCommand.java b/src/main/java/simplexity/simplenicks/commands/SubCommand.java new file mode 100644 index 0000000..9b6db61 --- /dev/null +++ b/src/main/java/simplexity/simplenicks/commands/SubCommand.java @@ -0,0 +1,77 @@ +package simplexity.simplenicks.commands; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.permissions.Permission; +import simplexity.simplenicks.SimpleNicks; +import simplexity.simplenicks.config.LocaleHandler; + +import java.util.ArrayList; + +public abstract class SubCommand { + public final String commandName; + public final Permission basicPermission; + public final Permission adminPermission; + public final boolean canRunWithoutPlayer; + public final MiniMessage miniMessage = SimpleNicks.getMiniMessage(); + + public SubCommand(String commandName, Permission basicPermission, Permission adminPermission, boolean consoleRunNoPlayer) { + this.commandName = commandName; + this.basicPermission = basicPermission; + this.adminPermission = adminPermission; + this.canRunWithoutPlayer = consoleRunNoPlayer; + } + + public abstract void executeOnOther(CommandSender sender, Player player, String[] args); + + public abstract void executeOnSelf(CommandSender sender, Player player, String[] args); + + public abstract ArrayList tabComplete(CommandSender sender, String[] args, Player player); + + public String getCommandName() { + return commandName; + } + + public Permission getBasicPermission() { + return basicPermission; + } + + public Permission getAdminPermission() { + return adminPermission; + } + + public boolean canRunWithoutPlayer() { + return canRunWithoutPlayer; + } + + public Component parsedMessage(CommandSender sender, Player player, String message, String value) { + Component senderName; + Component playerName; + if (sender == null) { + senderName = Component.empty(); + } else { + senderName = sender.name(); + } + if (player == null) { + playerName = Component.empty(); + } else { + playerName = player.name(); + } + return miniMessage.deserialize(message, + Placeholder.parsed("prefix", LocaleHandler.getInstance().getPluginPrefix()), + Placeholder.component("initiator", senderName), + Placeholder.component("target", playerName), + Placeholder.parsed("value", value)); + } + + public boolean isValidArgsLength(CommandSender sender, Player player, String[] args, int minArgsLength) { + if (args.length < minArgsLength) { + sender.sendMessage(parsedMessage(sender, player, LocaleHandler.getInstance().getNotEnoughArgs(), "")); + return false; + } + return true; + } +} diff --git a/src/main/java/adhdmc/simplenicks/config/Config.java b/src/main/java/simplexity/simplenicks/config/ConfigHandler.java similarity index 53% rename from src/main/java/adhdmc/simplenicks/config/Config.java rename to src/main/java/simplexity/simplenicks/config/ConfigHandler.java index 2b6e510..bcd53f9 100644 --- a/src/main/java/adhdmc/simplenicks/config/Config.java +++ b/src/main/java/simplexity/simplenicks/config/ConfigHandler.java @@ -1,26 +1,35 @@ -package adhdmc.simplenicks.config; +package simplexity.simplenicks.config; -import adhdmc.simplenicks.SimpleNicks; import org.bukkit.configuration.file.FileConfiguration; +import simplexity.simplenicks.SimpleNicks; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -public class Config { +public class ConfigHandler { - public enum SAVING_TYPE { PDC, FILE } - private static Config instance; + public String getRegexString() { + return regexString; + } + + public enum SAVING_TYPE {PDC, FILE} + + private static ConfigHandler instance; private Pattern regex = Pattern.compile("[A-Za-z0-9_]+"); private SAVING_TYPE savingType = SAVING_TYPE.FILE; private int maxLength = 25; private int maxSaves = 5; + private boolean tablistNick = false; + private String regexString = "[A-Za-z0-9_]+"; + private long usernameProtectionTime = 0; - private Config() {} + private ConfigHandler() { + } - public static Config getInstance() { + public static ConfigHandler getInstance() { if (instance != null) return instance; - instance = new Config(); + instance = new ConfigHandler(); return instance; } @@ -30,12 +39,12 @@ public void reloadConfig() { // Check the validity of the regex. try { String regexSetting = SimpleNicks.getInstance().getConfig().getString("nickname-regex"); + regexString = regexSetting; assert regexSetting != null; assert !regexSetting.isBlank(); regex = Pattern.compile(regexSetting); - } - catch (AssertionError | PatternSyntaxException e) { - SimpleNicks.getSimpleNicksLogger().severe(LocaleHandler.getInstance().getNoRegex()); + } catch (AssertionError | PatternSyntaxException e) { + SimpleNicks.getSimpleNicksLogger().severe(LocaleHandler.getInstance().getInvalidConfigRegex()); } // Check validity of saving-type. try { @@ -47,18 +56,41 @@ public void reloadConfig() { } maxLength = SimpleNicks.getInstance().getConfig().getInt("max-nickname-length"); maxSaves = SimpleNicks.getInstance().getConfig().getInt("max-saves"); + tablistNick = SimpleNicks.getInstance().getConfig().getBoolean("tablist-nick"); + usernameProtectionTime = SimpleNicks.getInstance().getConfig().getLong("username-protection") * 86400000; } public void setConfigDefaults() { FileConfiguration config = SimpleNicks.getInstance().getConfig(); - config.addDefault("saving-type","file"); + config.addDefault("saving-type", "file"); config.addDefault("max-nickname-length", 25); config.addDefault("max-saves", 5); - config.addDefault("nickname-regex","[A-Za-z0-9_]+"); + config.addDefault("nickname-regex", "[A-Za-z0-9_]+"); + config.addDefault("tablist-nick", false); + config.addDefault("username-protection", 30); + } + + public Pattern getRegex() { + return regex; + } + + public SAVING_TYPE getSavingType() { + return savingType; + } + + public int getMaxLength() { + return maxLength; + } + + public int getMaxSaves() { + return maxSaves; + } + + public boolean shouldNickTablist() { + return tablistNick; } - public Pattern getRegex() { return regex; } - public SAVING_TYPE getSavingType() { return savingType; } - public int getMaxLength() { return maxLength; } - public int getMaxSaves() { return maxSaves; } + public long getUsernameProtectionTime() { + return usernameProtectionTime; + } } diff --git a/src/main/java/simplexity/simplenicks/config/LocaleHandler.java b/src/main/java/simplexity/simplenicks/config/LocaleHandler.java new file mode 100644 index 0000000..1ff7d86 --- /dev/null +++ b/src/main/java/simplexity/simplenicks/config/LocaleHandler.java @@ -0,0 +1,204 @@ +package simplexity.simplenicks.config; + +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import simplexity.simplenicks.SimpleNicks; + +import java.io.File; +import java.io.IOException; +import java.util.logging.Logger; + +public class LocaleHandler { + private static LocaleHandler instance; + private final String fileName = "locale.yml"; + private final File localeFile = new File(SimpleNicks.getInstance().getDataFolder(), fileName); + private final FileConfiguration localeConfig = new YamlConfiguration(); + private final Logger logger = SimpleNicks.getInstance().getLogger(); + //Plugin + private String pluginPrefix, helpMessage, configReloaded, shownHelp; + //Errors + private String invalidCommand, invalidPlayer, invalidNick, invalidNickLength, invalidTags, invalidConfigRegex, + tooManyArgs, notEnoughArgs, nickIsNull, deleteFailure, nameNonexistent, saveFailure, tooManyToSave, otherPlayersUsername, + noPermission, mustBePlayer; + //Nick + private String changedSelf, changedOther, changedByOther, resetSelf, resetOther, resetByOther, saveNick, deleteNick; + + + private LocaleHandler() { + if (!localeFile.exists()) { + SimpleNicks.getInstance().saveResource(fileName, false); + } + } + + public static LocaleHandler getInstance() { + if (instance == null) instance = new LocaleHandler(); + return instance; + } + + public FileConfiguration getLocaleConfig() { + return localeConfig; + } + + + public void loadLocale() { + try { + localeConfig.load(localeFile); + } catch (IOException | InvalidConfigurationException e) { + logger.severe("Issue loading locale.yml"); + e.printStackTrace(); + } + pluginPrefix = localeConfig.getString("plugin.prefix", "SimpleNicks » "); + helpMessage = localeConfig.getString("plugin.help-message", + """ + ======================== + · Setting a nickname:\s + /nick set + · removing a nickname:\s + /nick reset" + · Formatting:\s + This plugin uses minimessage formatting. You can find a format viewer here" + \ + """); + shownHelp = localeConfig.getString("plugin.shown-help", " has been shown the help screen"); + configReloaded = localeConfig.getString("plugin.config-reloaded", "SimpleNicks config and locale reloaded"); + invalidCommand = localeConfig.getString("error.invalid.command", "Invalid command."); + invalidPlayer = localeConfig.getString("error.invalid.player", "Invalid player specified"); + invalidNick = localeConfig.getString("error.invalid.nick", "Not a valid nickname, must follow regex: "); + invalidNickLength = localeConfig.getString("error.invalid.nick-length", "Nickname is too long, must be <= "); + invalidTags = localeConfig.getString("error.invalid.tags", "You have used a color or formatting tag you do not have permission to use. Please try again"); + invalidConfigRegex = localeConfig.getString("error.invalid.config-regex", "nickname-regex is null or malformed in file 'config.yml'. Please fix this"); + notEnoughArgs = localeConfig.getString("error.arguments.not-enough", "No arguments provided."); + tooManyArgs = localeConfig.getString("error.arguments.too-many", "Too many arguments provided."); + nickIsNull = localeConfig.getString("error.nickname.is-null", "Something went wrong and the nickname is null, please check your formatting"); + deleteFailure = localeConfig.getString("error.nickname.delete-failure", "Failed to delete given username."); + saveFailure = localeConfig.getString("error.nickname.save-failure", "Failed to save current username."); + tooManyToSave = localeConfig.getString("error.nickname.too-many-to-save", "You have too many saved usernames, please remove some with /nick delete "); + otherPlayersUsername = localeConfig.getString("error.nickname.other-players-username", "You cannot name yourself , as that is the username of another player on this server. Pick another name"); + nameNonexistent = localeConfig.getString("error.nickname.name-nonexistent", "Cannot delete this name because it does not exist"); + noPermission = localeConfig.getString("error.no-permission", "You do not have permission to run this command"); + mustBePlayer = localeConfig.getString("error.must-be-player", "This command cannot be run on the Console. You must be a player to run this command"); + changedSelf = localeConfig.getString("nick.changed.self", "Changed your nickname to !"); + changedOther = localeConfig.getString("nick.changed.other", "Changed 's nickname to "); + changedByOther = localeConfig.getString("nick.changed.by-other", " changed your nickname to !"); + resetSelf = localeConfig.getString("nick.reset.self", "Reset your nickname!"); + resetOther = localeConfig.getString("nick.reset.other", "Reset 's nickname."); + resetByOther = localeConfig.getString("nick.reset.reset-by-other", "Your nickname was reset by "); + saveNick = localeConfig.getString("nick.save", "Success! The nickname has been saved for future use"); + deleteNick = localeConfig.getString("nick.delete", "The nickname has been successfully removed from your saved names"); + } + + + public String getPluginPrefix() { + return pluginPrefix; + } + + public String getHelpMessage() { + return helpMessage; + } + + public String getConfigReloaded() { + return configReloaded; + } + + public String getInvalidCommand() { + return invalidCommand; + } + + public String getInvalidPlayer() { + return invalidPlayer; + } + + public String getInvalidNick() { + return invalidNick; + } + + public String getInvalidNickLength() { + return invalidNickLength; + } + + public String getInvalidTags() { + return invalidTags; + } + + public String getInvalidConfigRegex() { + return invalidConfigRegex; + } + + public String getTooManyArgs() { + return tooManyArgs; + } + + public String getNotEnoughArgs() { + return notEnoughArgs; + } + + public String getNickIsNull() { + return nickIsNull; + } + + public String getDeleteFailure() { + return deleteFailure; + } + + public String getSaveFailure() { + return saveFailure; + } + + public String getTooManyToSave() { + return tooManyToSave; + } + + public String getOtherPlayersUsername() { + return otherPlayersUsername; + } + + public String getNoPermission() { + return noPermission; + } + + public String getMustBePlayer() { + return mustBePlayer; + } + + public String getChangedSelf() { + return changedSelf; + } + + public String getChangedOther() { + return changedOther; + } + + public String getChangedByOther() { + return changedByOther; + } + + public String getResetSelf() { + return resetSelf; + } + + public String getResetOther() { + return resetOther; + } + + public String getResetByOther() { + return resetByOther; + } + + public String getSaveNick() { + return saveNick; + } + + public String getDeleteNick() { + return deleteNick; + } + + public String getNameNonexistent() { + return nameNonexistent; + } + + public String getShownHelp() { + return shownHelp; + } +} + diff --git a/src/main/java/adhdmc/simplenicks/listener/LoginListener.java b/src/main/java/simplexity/simplenicks/listener/LoginListener.java similarity index 82% rename from src/main/java/adhdmc/simplenicks/listener/LoginListener.java rename to src/main/java/simplexity/simplenicks/listener/LoginListener.java index cbba75b..b43f4f3 100644 --- a/src/main/java/adhdmc/simplenicks/listener/LoginListener.java +++ b/src/main/java/simplexity/simplenicks/listener/LoginListener.java @@ -1,10 +1,10 @@ -package adhdmc.simplenicks.listener; +package simplexity.simplenicks.listener; -import adhdmc.simplenicks.util.NickHandler; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; +import simplexity.simplenicks.util.NickHandler; public class LoginListener implements Listener { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) diff --git a/src/main/java/simplexity/simplenicks/util/Constants.java b/src/main/java/simplexity/simplenicks/util/Constants.java new file mode 100644 index 0000000..1e1bab6 --- /dev/null +++ b/src/main/java/simplexity/simplenicks/util/Constants.java @@ -0,0 +1,20 @@ +package simplexity.simplenicks.util; + +import org.bukkit.permissions.Permission; + +public class Constants { + public static Permission NICK_OTHERS_COMMAND = new Permission("simplenick.admin"); + public static Permission NICK_OTHERS_RESTRICTIVE = new Permission("simplenick.admin.restrictive"); + public static Permission NICK_OTHERS_BASIC = new Permission("simplenick.admin.basic"); + public static Permission NICK_OTHERS_FULL = new Permission("simplenick.admin.full"); + public static Permission NICK_RESET_OTHERS = new Permission("simplenick.admin.reset"); + public static Permission NICK_OTHERS_SAVE = new Permission("simplenick.admin.save"); + public static Permission NICK_OTHERS_DELETE = new Permission("simplenick.admin.delete"); + public static Permission NICK_COMMAND = new Permission("simplenick.nick"); + public static Permission NICK_RESET = new Permission("simplenick.nick.reset"); + public static Permission NICK_SAVE = new Permission("simplenick.nick.save"); + public static Permission NICK_DELETE = new Permission("simplenick.nick.delete"); + public static Permission NICK_USERNAME_BYPASS = new Permission("simplenick.bypass.username"); + public static Permission NICK_LENGTH_BYPASS = new Permission("simplenick.bypass.length"); + public static Permission NICK_REGEX_BYPASS = new Permission("simplenick.bypass.regex"); +} diff --git a/src/main/java/adhdmc/simplenicks/util/NickHandler.java b/src/main/java/simplexity/simplenicks/util/NickHandler.java similarity index 53% rename from src/main/java/adhdmc/simplenicks/util/NickHandler.java rename to src/main/java/simplexity/simplenicks/util/NickHandler.java index 372c54c..f7adb0a 100644 --- a/src/main/java/adhdmc/simplenicks/util/NickHandler.java +++ b/src/main/java/simplexity/simplenicks/util/NickHandler.java @@ -1,12 +1,13 @@ -package adhdmc.simplenicks.util; +package simplexity.simplenicks.util; -import adhdmc.simplenicks.config.Config; -import adhdmc.simplenicks.util.saving.AbstractSaving; -import adhdmc.simplenicks.util.saving.PlayerPDC; -import adhdmc.simplenicks.util.saving.YMLFile; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import simplexity.simplenicks.SimpleNicks; +import simplexity.simplenicks.config.ConfigHandler; +import simplexity.simplenicks.util.saving.AbstractSaving; +import simplexity.simplenicks.util.saving.PlayerPDC; +import simplexity.simplenicks.util.saving.YMLFile; import java.util.List; @@ -15,8 +16,10 @@ public class NickHandler { private static NickHandler instance; private AbstractSaving saveHandler; + private final MiniMessage miniMessage = SimpleNicks.getMiniMessage(); - private NickHandler() {} + private NickHandler() { + } public static NickHandler getInstance() { if (instance != null) return instance; @@ -25,7 +28,10 @@ public static NickHandler getInstance() { return instance; } - public String getNickname(OfflinePlayer p) { return saveHandler.getNickname(p); } + public String getNickname(OfflinePlayer p) { + return saveHandler.getNickname(p); + } + public boolean setNickname(OfflinePlayer p, String nickname) { if (!saveHandler.setNickname(p, nickname)) return false; refreshNickname(p); @@ -42,20 +48,35 @@ public boolean refreshNickname(OfflinePlayer p) { Player player = p.getPlayer(); if (player == null) return false; String nicknameRaw = getNickname(p); - if (nicknameRaw == null || nicknameRaw.isBlank()) player.displayName(null); - else player.displayName(MiniMessage.miniMessage().deserialize(nicknameRaw)); + if (nicknameRaw == null || nicknameRaw.isBlank()) { + player.displayName(null); + } else { + player.displayName(miniMessage.deserialize(nicknameRaw)); + if (ConfigHandler.getInstance().shouldNickTablist()) { + player.playerListName(miniMessage.deserialize(nicknameRaw)); + } + } + return true; } public void loadSavingType() { - switch (Config.getInstance().getSavingType()) { + switch (ConfigHandler.getInstance().getSavingType()) { case PDC -> saveHandler = new PlayerPDC(); case FILE -> saveHandler = new YMLFile(); } saveHandler.init(); } - public boolean saveNickname(OfflinePlayer p, String nickname) { return saveHandler.saveNickname(p, nickname); } - public boolean deleteNickname(OfflinePlayer p, String nickname) { return saveHandler.deleteNickname(p, nickname); } - public List getSavedNicknames(OfflinePlayer p) { return saveHandler.getSavedNicknames(p); } + public boolean saveNickname(OfflinePlayer p, String nickname) { + return saveHandler.saveNickname(p, nickname); + } + + public boolean deleteNickname(OfflinePlayer p, String nickname) { + return saveHandler.deleteNickname(p, nickname); + } + + public List getSavedNicknames(OfflinePlayer p) { + return saveHandler.getSavedNicknames(p); + } } diff --git a/src/main/java/adhdmc/simplenicks/util/SNExpansion.java b/src/main/java/simplexity/simplenicks/util/SNExpansion.java similarity index 91% rename from src/main/java/adhdmc/simplenicks/util/SNExpansion.java rename to src/main/java/simplexity/simplenicks/util/SNExpansion.java index 6a8c34c..5c61cc7 100644 --- a/src/main/java/adhdmc/simplenicks/util/SNExpansion.java +++ b/src/main/java/simplexity/simplenicks/util/SNExpansion.java @@ -1,9 +1,9 @@ -package adhdmc.simplenicks.util; +package simplexity.simplenicks.util; -import adhdmc.simplenicks.SimpleNicks; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import org.bukkit.OfflinePlayer; import org.jetbrains.annotations.NotNull; +import simplexity.simplenicks.SimpleNicks; public class SNExpansion extends PlaceholderExpansion { @Override diff --git a/src/main/java/simplexity/simplenicks/util/TagPermission.java b/src/main/java/simplexity/simplenicks/util/TagPermission.java new file mode 100644 index 0000000..d00e567 --- /dev/null +++ b/src/main/java/simplexity/simplenicks/util/TagPermission.java @@ -0,0 +1,38 @@ +package simplexity.simplenicks.util; + +import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.text.minimessage.tag.standard.StandardTags; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; + +public enum TagPermission { + //Nickname Perms + HEX_COLOR("simplenick.nick.color", StandardTags.color()), + GRADIENT("simplenick.nick.gradient", StandardTags.gradient()), + RAINBOW("simplenick.nick.rainbow", StandardTags.rainbow()), + RESET("simplenick.nick.format.reset", StandardTags.reset()), + UNDERLINE("simplenick.nick.format.underline", StandardTags.decorations(TextDecoration.UNDERLINED)), + ITALIC("simplenick.nick.format.italic", StandardTags.decorations(TextDecoration.ITALIC)), + STRIKETHROUGH("simplenick.nick.format.strikethrough", StandardTags.decorations(TextDecoration.STRIKETHROUGH)), + BOLD("simplenick.nick.format.bold", StandardTags.decorations(TextDecoration.BOLD)), + OBFUSCATED("simplenick.nick.format.obfuscated", StandardTags.decorations(TextDecoration.OBFUSCATED)); + + + private final String permission; + private final TagResolver resolver; + + TagPermission(String permission, TagResolver resolver) { + this.permission = permission; + this.resolver = resolver; + } + + public String getPermission() { + return permission; + } + + public TagResolver getTagResolver() { + return resolver; + } +} diff --git a/src/main/java/adhdmc/simplenicks/util/saving/AbstractSaving.java b/src/main/java/simplexity/simplenicks/util/saving/AbstractSaving.java similarity index 91% rename from src/main/java/adhdmc/simplenicks/util/saving/AbstractSaving.java rename to src/main/java/simplexity/simplenicks/util/saving/AbstractSaving.java index 04516cb..7b04009 100644 --- a/src/main/java/adhdmc/simplenicks/util/saving/AbstractSaving.java +++ b/src/main/java/simplexity/simplenicks/util/saving/AbstractSaving.java @@ -1,4 +1,4 @@ -package adhdmc.simplenicks.util.saving; +package simplexity.simplenicks.util.saving; import org.bukkit.OfflinePlayer; @@ -7,10 +7,16 @@ public abstract class AbstractSaving { public abstract void init(); + public abstract String getNickname(OfflinePlayer p); + public abstract boolean setNickname(OfflinePlayer p, String nickname); + public abstract boolean saveNickname(OfflinePlayer p, String nickname); + public abstract boolean deleteNickname(OfflinePlayer p, String nickname); + public abstract boolean resetNickname(OfflinePlayer p); + public abstract List getSavedNicknames(OfflinePlayer p); } diff --git a/src/main/java/adhdmc/simplenicks/util/saving/PlayerPDC.java b/src/main/java/simplexity/simplenicks/util/saving/PlayerPDC.java similarity index 93% rename from src/main/java/adhdmc/simplenicks/util/saving/PlayerPDC.java rename to src/main/java/simplexity/simplenicks/util/saving/PlayerPDC.java index ef43ae0..c0257ca 100644 --- a/src/main/java/adhdmc/simplenicks/util/saving/PlayerPDC.java +++ b/src/main/java/simplexity/simplenicks/util/saving/PlayerPDC.java @@ -1,11 +1,11 @@ -package adhdmc.simplenicks.util.saving; +package simplexity.simplenicks.util.saving; -import adhdmc.simplenicks.SimpleNicks; import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; +import simplexity.simplenicks.SimpleNicks; import java.util.ArrayList; import java.util.List; @@ -14,7 +14,8 @@ public class PlayerPDC extends AbstractSaving { public static final NamespacedKey nickNameSave = new NamespacedKey(SimpleNicks.getInstance(), "nickname"); @Override - public void init() { } + public void init() { + } @Override public String getNickname(OfflinePlayer p) { diff --git a/src/main/java/adhdmc/simplenicks/util/saving/YMLFile.java b/src/main/java/simplexity/simplenicks/util/saving/YMLFile.java similarity index 81% rename from src/main/java/adhdmc/simplenicks/util/saving/YMLFile.java rename to src/main/java/simplexity/simplenicks/util/saving/YMLFile.java index c70d024..7ca4b4d 100644 --- a/src/main/java/adhdmc/simplenicks/util/saving/YMLFile.java +++ b/src/main/java/simplexity/simplenicks/util/saving/YMLFile.java @@ -1,11 +1,11 @@ -package adhdmc.simplenicks.util.saving; +package simplexity.simplenicks.util.saving; -import adhdmc.simplenicks.SimpleNicks; import org.bukkit.OfflinePlayer; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import simplexity.simplenicks.SimpleNicks; import java.io.File; import java.io.IOException; @@ -20,11 +20,17 @@ public class YMLFile extends AbstractSaving { public void init() { if (!dataFile.exists()) { dataFile.getParentFile().mkdirs(); - try { nicknameData.save(dataFile); } - catch (IOException e) { e.printStackTrace(); } + try { + nicknameData.save(dataFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + nicknameData.load(dataFile); + } catch (IOException | InvalidConfigurationException e) { + e.printStackTrace(); } - try { nicknameData.load(dataFile); } - catch (IOException | InvalidConfigurationException e) { e.printStackTrace(); } } @Override @@ -58,8 +64,11 @@ public boolean saveNickname(OfflinePlayer p, String nickname) { @Override public boolean deleteNickname(OfflinePlayer p, String nickname) { List nicknames = getSavedNicknames(p); + ConfigurationSection section = nicknameData.getConfigurationSection(p.getUniqueId().toString()); + if (section == null) return false; if (!nicknames.contains(nickname)) return false; nicknames.remove(nickname); + section.set("saved", nicknames); saveData(); return true; } @@ -81,8 +90,9 @@ public List getSavedNicknames(OfflinePlayer p) { } private boolean saveData() { - try { nicknameData.save(dataFile); } - catch (IOException e) { + try { + nicknameData.save(dataFile); + } catch (IOException e) { e.printStackTrace(); return false; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 5b694c2..2ed7c73 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -13,4 +13,13 @@ max-nickname-length: 30 nickname-regex: "[A-Za-z0-9_]+" # How many nicknames can be saved? -max-saves: 5 \ No newline at end of file +max-saves: 5 + +# Should names be changed in tablist? +# (Keep this false if you use any other tablist plugin, there are placeholder API placeholders to use on those) +tablist-nick: false + +# How long should people be offline before their username is available to use as a nickname? +# In days, -1 to disable username protection altogether + +username-protection: 30 \ No newline at end of file diff --git a/src/main/resources/locale.yml b/src/main/resources/locale.yml index 914bd14..98a8983 100644 --- a/src/main/resources/locale.yml +++ b/src/main/resources/locale.yml @@ -1,29 +1,44 @@ -invalid-command: "Invalid command." -no-arguments: "No arguments provided." -too-many-arguments: "Too many arguments provided." -cant-nick-username: "You cannot name yourself , as that is the username of another player on this server. Pick another name" -no-permission: "You do not have permission to run this command" -console-cannot-run: "This command cannot be run on the Console." -invalid-player: "Invalid player specified" -invalid-nick-regex: "Not a valid nickname, must follow regex: " -invalid-nick-too-long: "Nickname is too long, must be <= " -invalid-tags: "You have used a color or formatting tag you do not have permission to use. Please try again" -prefix: "SimpleNicks » " -help-base: "--------" -help-set: "· Setting a nickname: \n /nick set " -help-reset: "· removing a nickname: \n /nick reset" -help-minimessage: "· Formatting: \n This plugin uses minimessage formatting. You can find a format viewer here" -config-reload: "SimpleNicks config and locale reloaded" -nick-changed-self: "Changed your own nickname to !" -nick-change-other: "Changed 's nickname to " -nick-changed-by-other: " changed your nickname to !" -nick-reset-self: "Reset your own nickname!" -nick-reset-other: "Reset 's nickname." -nick-reset-by-other: "Your nickname was reset by " -no-regex: "nickname-regex is null or malformed in file 'config.yml'. Please fix this" -nick-is-null: "Something went wrong and the nickname is null, please check your formatting" -nick-save-success: "Success! The nickname has been saved for future use" -nick-save-failure: "Failed to save current username." -nick-save-failure-too-many: "You have too many saved usernames, please remove some with /nick delete " -nick-delete-success: "The nickname has been successfully removed from your saved names" -nick-delete-failure: "Failed to delete given username." \ No newline at end of file +plugin: + prefix: "SimpleNicks » " + help-message: > + ======================== + · Setting a nickname: + /nick set + · removing a nickname: + /nick reset" + · Formatting: + This plugin uses minimessage formatting. You can find a format viewer here" + shown-help: " has been shown the help screen" + config-reloaded: "SimpleNicks config and locale reloaded" + +error: + invalid: + command: "Invalid command." + player: "Invalid player specified" + nick: "Not a valid nickname, must follow regex: " + nick-length: "Nickname is too long, must be <= " + tags: "You have used a color or formatting tag you do not have permission to use. Please try again" + config-regex: "nickname-regex is null or malformed in file 'config.yml'. Please fix this" + arguments: + not-enough: "No arguments provided." + too-many: "Too many arguments provided." + nickname: + is-null: "Something went wrong and the nickname is null, please check your formatting" + delete-failure: "Failed to delete given username." + name-nonexistent: "Cannot delete this name because it does not exist" + save-failure: "Failed to save current username." + too-many-to-save: "You have too many saved usernames, please remove some with /nick delete " + other-players-username: "You cannot name yourself , as that is the username of another player on this server. Pick another name" + no-permission: "You do not have permission to run this command" + must-be-player: "This command cannot be run on the Console. You must be a player to run this command" +nick: + changed: + self: "Changed your nickname to !" + other: "Changed 's nickname to " + by-other: " changed your nickname to !" + reset: + self: "Reset your nickname!" + other: "Reset 's nickname." + by-other: "Your nickname was reset by " + save: "Success! The nickname has been saved for future use" + delete: "The nickname has been successfully removed from your saved names" \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 964b3d0..3012b30 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,8 +1,9 @@ name: SimpleNicks version: '${project.version}' -main: adhdmc.simplenicks.SimpleNicks +main: simplexity.simplenicks.SimpleNicks authors: ['Rhythmic', 'Peashooter101'] api-version: 1.19 +description: "A simple plugin to allow players to set and reset nicknames." softdepend: - PlaceholderAPI commands: @@ -11,6 +12,11 @@ commands: aliases: [simplenicks, simplenick, snick] usage: "Usage: /nick [save|delete|set|reset|help|reload] [player]" permission: simplenick.nick.set + snreload: + description: "Reloads the config and locale of SimpleNicks." + aliases: [simplenicksreload, simplenickreload, snreload] + usage: "Usage: /snreload" + permission: simplenick.reload permissions: simplenick.admin: description: allows user to set and reset other players' nicknames @@ -18,57 +24,100 @@ permissions: simplenick.admin.reset: default: op description: Allows the user to clear another player's nickname + children: + simplenick.admin: true simplenick.admin.restrictive: default: op description: Allows the user to set another player's nickname, but uses the formatting permissions of the other player + children: + simplenick.admin: true simplenick.admin.basic: default: op description: Allows the user to set another player's nickname, using the formatting permissions assigned to the player with the 'admin.basic' permission + children: + simplenick.admin: true simplenick.admin.full: default: false description: Allows the user to set another player's nickname, does not check the formatting permissions delegated to either player + children: + simplenick.admin: true simplenick.reload: description: allows a user to reload the locale and config of this plugin default: op - simplenick.usernamebypass: + simplenick.bypass.username: description: allows user to nickname themselves another person's username default: false - simplenick.save: + simplenick.bypass.length: + description: allows user to nickname themselves a username longer than the configured max characters + default: false + simplenick.bypass.regex: + description: allows user to nickname themselves a username that does not match the configured regex + default: false + simplenick.nick: + description: base of all formatting permissions + default: op + simplenick.nick.save: description: save your current nickname for future use, only works on 'FILE' save type default: op - simplenick.delete: + children: + simplenick.nick: true + simplenick.nick.delete: description: delete one of your previously saved nicknames default: op - simplenick.nick: - description: base of all formatting permissions - default: op + children: + simplenick.nick: true simplenick.nick.set: description: allows usage of the /nick command default: op + children: + simplenick.nick: true simplenick.nick.reset: description: allows a user to reset their own nickname default: op + children: + simplenick.nick: true simplenick.nick.color: description: allows color codes to be used in a nickname default: op + children: + simplenick.nick: true simplenick.nick.gradient: description: allows gradients to be used in a nickname default: op + children: + simplenick.nick: true simplenick.nick.rainbow: description: allows the rainbow tag to be used in a nickname default: op + children: + simplenick.nick: true simplenick.nick.format.reset: description: allows the reset formatting tag to be used in a nickname default: op + children: + simplenick.nick: true + simplenick.nick.format: true simplenick.nick.format.italic: description: allows the italic formatting tag to be used in a nickname default: op + children: + simplenick.nick: true + simplenick.nick.format: true simplenick.nick.format.strikethrough: description: allows the strikethrough formatting tag to be used in a nickname default: op + children: + simplenick.nick: true + simplenick.nick.format: true simplenick.nick.format.bold: description: allows the bold format tag to be used in a nickname default: op + children: + simplenick.nick: true + simplenick.nick.format: true simplenick.nick.format.obfuscated: description: allows the obfuscated format tag to be used in a nickname - default: op \ No newline at end of file + default: op + children: + simplenick.nick: true + simplenick.nick.format: true \ No newline at end of file