diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7172c8e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,37 @@ +name: CI + +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up JDK 8 + uses: actions/setup-java@v4 + with: + java-version: '8' + distribution: 'temurin' + + - name: Cache Maven packages + uses: actions/cache@v4 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + + - name: Compile + run: mvn compile --batch-mode + + - name: Run tests + run: mvn test --batch-mode diff --git a/pom.xml b/pom.xml index cae8a28..50b8ec6 100644 --- a/pom.xml +++ b/pom.xml @@ -62,10 +62,6 @@ sonatype https://oss.sonatype.org/content/groups/public/ - - jitpack.io - https://jitpack.io - @@ -75,12 +71,6 @@ 1.17.1-R0.1-SNAPSHOT provided - - com.github.Preponderous-Software - ponder - 1.0 - compile - junit junit diff --git a/src/main/java/dansplugins/wildpets/WildPets.java b/src/main/java/dansplugins/wildpets/WildPets.java index e44fc08..6b37d13 100644 --- a/src/main/java/dansplugins/wildpets/WildPets.java +++ b/src/main/java/dansplugins/wildpets/WildPets.java @@ -11,14 +11,11 @@ import dansplugins.wildpets.storage.StorageService; import dansplugins.wildpets.scheduler.Scheduler; import org.bukkit.ChatColor; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; -import preponderous.ponder.minecraft.bukkit.abs.PonderBukkitPlugin; -import preponderous.ponder.minecraft.bukkit.services.CommandService; -import preponderous.ponder.minecraft.bukkit.tools.EventHandlerRegistry; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.event.Listener; +import org.bukkit.plugin.java.JavaPlugin; import java.io.File; import java.util.ArrayList; @@ -27,10 +24,10 @@ /** * @author Daniel McCoy Stephenson */ -public final class WildPets extends PonderBukkitPlugin { +public final class WildPets extends JavaPlugin { private final String pluginVersion = "v" + getDescription().getVersion(); - private final CommandService commandService = new CommandService(getPonder()); + private final CommandService commandService = new CommandService(this); private final EphemeralData ephemeralData = new EphemeralData(); private final EntityConfigService entityConfigService = new EntityConfigService(this); private final ConfigService configService = new ConfigService(this, entityConfigService); @@ -140,7 +137,7 @@ private void handlebStatsIntegration() { } /** - * Registers the event handlers of the plugin using Ponder. + * Registers the event handlers of the plugin. */ private void registerEventHandlers() { ArrayList listeners = new ArrayList<>(); @@ -154,7 +151,7 @@ private void registerEventHandlers() { } /** - * Initializes Ponder's command service with the plugin's commands. + * Initializes the command service with the plugin's commands. */ private void initializeCommandService() { ArrayList commands = new ArrayList<>(Arrays.asList( @@ -168,4 +165,4 @@ private void initializeCommandService() { )); commandService.initialize(commands, "That command wasn't found."); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/AbstractPluginCommand.java b/src/main/java/dansplugins/wildpets/commands/AbstractPluginCommand.java new file mode 100644 index 0000000..70cf93a --- /dev/null +++ b/src/main/java/dansplugins/wildpets/commands/AbstractPluginCommand.java @@ -0,0 +1,99 @@ +package dansplugins.wildpets.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Abstract base class for plugin commands. + */ +public abstract class AbstractPluginCommand { + private final ArrayList names; + private final ArrayList permissions; + + public AbstractPluginCommand(ArrayList names, ArrayList permissions) { + this.names = names; + this.permissions = permissions; + } + + /** + * Method to execute the command with no arguments. + * @param sender The sender of the command. + * @return Whether the execution of the command was successful. + */ + public abstract boolean execute(CommandSender sender); + + /** + * @param sender The sender of the command. + * @param args The arguments of the command. + * @return Whether the execution of the command was successful. + */ + public abstract boolean execute(CommandSender sender, String[] args); + + /** + * @param message to send. + * @param args to check. + * @param sender to send message to. + * @param color of the message. + * @return Boolean signifying whether there were no arguments. + */ + public boolean sendMessageIfNoArguments(String message, String[] args, CommandSender sender, ChatColor color) { + if (args.length == 0) { + sender.sendMessage(color + message); + return true; + } + return false; + } + + /** + * @param line to convert into an Integer. + * @param orElse if the conversion fails. + * @return {@link Integer} numeric. + */ + public int getIntSafe(String line, int orElse) { + try { + return Integer.parseInt(line); + } catch (Exception e) { + return orElse; + } + } + + /** + * Method to test if something matches any goal string. + * + * @param matchCase for the comparison (or not) + * @param what to test + * @param goals to compare with + * @return {@code true} if something in goals matches what. + */ + public boolean safeEquals(boolean matchCase, String what, String... goals) { + return Arrays.stream(goals).anyMatch(goal -> + matchCase && goal.equals(what) || !matchCase && goal.equalsIgnoreCase(what) + ); + } + + /** + * @return A list of names of the command. + */ + public ArrayList getNames() { + return names; + } + + /** + * @return A list of permissions of the command. + */ + public ArrayList getPermissions() { + return permissions; + } + + public ArrayList extractArgumentsInsideDoubleQuotes(String[] args) throws Exception { + ArgumentParser argumentParser = new ArgumentParser(); + ArrayList doubleQuoteArgs = argumentParser.getArgumentsInsideDoubleQuotes(args); + if (doubleQuoteArgs.size() < 2) { + throw new Exception(); + } + return doubleQuoteArgs; + } +} diff --git a/src/main/java/dansplugins/wildpets/commands/ArgumentParser.java b/src/main/java/dansplugins/wildpets/commands/ArgumentParser.java new file mode 100644 index 0000000..a305ade --- /dev/null +++ b/src/main/java/dansplugins/wildpets/commands/ArgumentParser.java @@ -0,0 +1,49 @@ +package dansplugins.wildpets.commands; + +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Utility class for parsing command arguments. + */ +public class ArgumentParser { + + /** + * @param args to modify. + * @return Modified Array of Strings with the first argument dropped. + * @throws IllegalArgumentException if the arguments given are invalid. + */ + public String[] dropFirstArgument(String[] args) { + ensureArgumentsExist(args); + String[] toReturn = new String[args.length - 1]; + System.arraycopy(args, 1, toReturn, 0, args.length - 1); + return toReturn; + } + + /** + * @param args to compile and scan. + * @return {@link ArrayList} of {@link String} which were surrounded by double quotes. + * @throws IllegalArgumentException if the arguments given are invalid. + */ + public ArrayList getArgumentsInsideDoubleQuotes(String[] args) { + ensureArgumentsExist(args); + return parseForArguments(args); + } + + private ArrayList parseForArguments(String[] args) { + ArrayList toReturn = new ArrayList<>(); + final String argumentString = String.join(" ", args); + final Matcher matcher = Pattern.compile("\"[^\"]*\"").matcher(argumentString); + while (matcher.find()) { + toReturn.add(matcher.group().replace("\"", "")); + } + return toReturn; + } + + private void ensureArgumentsExist(String[] args) { + if (args == null || args.length == 0) { + throw new IllegalArgumentException("Arguments not valid."); + } + } +} diff --git a/src/main/java/dansplugins/wildpets/commands/CallCommand.java b/src/main/java/dansplugins/wildpets/commands/CallCommand.java index ad89be7..e4b38f4 100644 --- a/src/main/java/dansplugins/wildpets/commands/CallCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/CallCommand.java @@ -2,7 +2,6 @@ import dansplugins.wildpets.data.EphemeralData; import dansplugins.wildpets.pet.Pet; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -55,4 +54,4 @@ public boolean execute(CommandSender sender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/CheckAccessCommand.java b/src/main/java/dansplugins/wildpets/commands/CheckAccessCommand.java index a050b0e..dc75e58 100644 --- a/src/main/java/dansplugins/wildpets/commands/CheckAccessCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/CheckAccessCommand.java @@ -1,7 +1,6 @@ package dansplugins.wildpets.commands; import dansplugins.wildpets.data.EphemeralData; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -37,4 +36,4 @@ public boolean execute(CommandSender sender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/CommandService.java b/src/main/java/dansplugins/wildpets/commands/CommandService.java new file mode 100644 index 0000000..b286a6a --- /dev/null +++ b/src/main/java/dansplugins/wildpets/commands/CommandService.java @@ -0,0 +1,60 @@ +package dansplugins.wildpets.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.ArrayList; +import java.util.Set; + +/** + * Service for managing and executing plugin commands. + */ +public class CommandService { + private ArrayList commands = new ArrayList<>(); + private final Set coreCommands; + private String notFoundMessage; + private final ArgumentParser parser = new ArgumentParser(); + private final PermissionChecker permissionChecker = new PermissionChecker(); + + public CommandService(JavaPlugin plugin) { + coreCommands = plugin.getDescription().getCommands().keySet(); + } + + public void initialize(ArrayList commands, String notFoundMessage) { + this.commands = commands; + this.notFoundMessage = notFoundMessage; + } + + public boolean interpretAndExecuteCommand(CommandSender sender, String label, String[] args) { + if (!coreCommands.contains(label)) { + return false; + } + + if (args.length == 0) { + return false; + } + + String subCommand = args[0]; + + String[] arguments = parser.dropFirstArgument(args); + + for (AbstractPluginCommand command : commands) { + for (String name : command.getNames()) { + if (name.equalsIgnoreCase(subCommand)) { + if (!permissionChecker.checkPermission(sender, command.getPermissions())) { + return false; + } + if (arguments.length == 0) { + return command.execute(sender); + } + else { + return command.execute(sender, arguments); + } + } + } + } + sender.sendMessage(ChatColor.RED + notFoundMessage); + return false; + } +} diff --git a/src/main/java/dansplugins/wildpets/commands/ConfigCommand.java b/src/main/java/dansplugins/wildpets/commands/ConfigCommand.java index ccaa54c..9ef7d30 100644 --- a/src/main/java/dansplugins/wildpets/commands/ConfigCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/ConfigCommand.java @@ -1,6 +1,5 @@ package dansplugins.wildpets.commands; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -51,4 +50,4 @@ else if (args[0].equalsIgnoreCase("set")) { return false; } } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/DefaultCommand.java b/src/main/java/dansplugins/wildpets/commands/DefaultCommand.java index e1c7761..cb032a0 100644 --- a/src/main/java/dansplugins/wildpets/commands/DefaultCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/DefaultCommand.java @@ -1,7 +1,6 @@ package dansplugins.wildpets.commands; import dansplugins.wildpets.WildPets; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -32,4 +31,4 @@ public boolean execute(CommandSender commandSender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/FollowCommand.java b/src/main/java/dansplugins/wildpets/commands/FollowCommand.java index dffa0ab..f8ebe00 100644 --- a/src/main/java/dansplugins/wildpets/commands/FollowCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/FollowCommand.java @@ -2,7 +2,6 @@ import dansplugins.wildpets.data.EphemeralData; import dansplugins.wildpets.pet.Pet; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -45,4 +44,4 @@ public boolean execute(CommandSender sender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/GatherCommand.java b/src/main/java/dansplugins/wildpets/commands/GatherCommand.java index 3d0aa57..2122ed2 100644 --- a/src/main/java/dansplugins/wildpets/commands/GatherCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/GatherCommand.java @@ -3,7 +3,6 @@ import dansplugins.wildpets.pet.list.PetListRepository; import dansplugins.wildpets.pet.Pet; import dansplugins.wildpets.pet.list.PetList; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -54,4 +53,4 @@ public boolean execute(CommandSender commandSender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/HelpCommand.java b/src/main/java/dansplugins/wildpets/commands/HelpCommand.java index 14cd041..d61b636 100644 --- a/src/main/java/dansplugins/wildpets/commands/HelpCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/HelpCommand.java @@ -1,6 +1,5 @@ package dansplugins.wildpets.commands; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -56,4 +55,4 @@ public boolean execute(CommandSender sender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/InfoCommand.java b/src/main/java/dansplugins/wildpets/commands/InfoCommand.java index b0dcc50..c7566bf 100644 --- a/src/main/java/dansplugins/wildpets/commands/InfoCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/InfoCommand.java @@ -5,7 +5,6 @@ import dansplugins.wildpets.info.InfoSender; import dansplugins.wildpets.pet.Pet; import dansplugins.wildpets.pet.record.PetRecordRepository; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -51,4 +50,4 @@ public boolean execute(CommandSender sender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/ListCommand.java b/src/main/java/dansplugins/wildpets/commands/ListCommand.java index 8ae9622..489b36c 100644 --- a/src/main/java/dansplugins/wildpets/commands/ListCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/ListCommand.java @@ -2,7 +2,6 @@ import dansplugins.wildpets.pet.list.PetListRepository; import dansplugins.wildpets.pet.list.PetList; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -54,4 +53,4 @@ public boolean execute(CommandSender sender, String[] args) { petList.sendListOfPetsToPlayer(player); return true; } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/LocateCommand.java b/src/main/java/dansplugins/wildpets/commands/LocateCommand.java index b999b47..b287fd9 100644 --- a/src/main/java/dansplugins/wildpets/commands/LocateCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/LocateCommand.java @@ -6,7 +6,6 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Entity; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -57,4 +56,4 @@ public boolean execute(CommandSender sender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/LockCommand.java b/src/main/java/dansplugins/wildpets/commands/LockCommand.java index dc87113..f4812c3 100644 --- a/src/main/java/dansplugins/wildpets/commands/LockCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/LockCommand.java @@ -1,7 +1,6 @@ package dansplugins.wildpets.commands; import dansplugins.wildpets.data.EphemeralData; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -37,4 +36,4 @@ public boolean execute(CommandSender sender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/PermissionChecker.java b/src/main/java/dansplugins/wildpets/commands/PermissionChecker.java new file mode 100644 index 0000000..2e9cb60 --- /dev/null +++ b/src/main/java/dansplugins/wildpets/commands/PermissionChecker.java @@ -0,0 +1,41 @@ +package dansplugins.wildpets.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; + +/** + * Utility class for checking command permissions. + */ +public class PermissionChecker { + + /** + * @param sender The sender of the command. + * @param permissions The permissions to check. + * @return Whether the sender has one of the specified permissions. + */ + public boolean checkPermission(CommandSender sender, ArrayList permissions) { + for (String permission : permissions) { + if (checkPermission(sender, permission)) { + return true; + } + } + informSenderTheyDoNotHaveOneOfTheRequiredPermissions(sender, permissions); + return false; + } + + /** + * @param sender The sender of the command. + * @param permission The permission to check. + * @return Whether the sender has the specified permission. + */ + public boolean checkPermission(CommandSender sender, String permission) { + return sender.hasPermission(permission); + } + + private void informSenderTheyDoNotHaveOneOfTheRequiredPermissions(CommandSender sender, ArrayList permissions) { + String joinedPermissions = String.join(", ", permissions); + sender.sendMessage(ChatColor.RED + "In order to use this command, you need one of the following permissions: " + joinedPermissions); + } +} diff --git a/src/main/java/dansplugins/wildpets/commands/RenameCommand.java b/src/main/java/dansplugins/wildpets/commands/RenameCommand.java index 9001e77..a5e4db7 100644 --- a/src/main/java/dansplugins/wildpets/commands/RenameCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/RenameCommand.java @@ -9,7 +9,6 @@ import dansplugins.wildpets.pet.record.PetRecordRepository; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -99,4 +98,4 @@ public boolean execute(CommandSender sender, String[] args) { player.sendMessage(ChatColor.GREEN + "Renamed."); return true; } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/SelectCommand.java b/src/main/java/dansplugins/wildpets/commands/SelectCommand.java index 878cb52..5886295 100644 --- a/src/main/java/dansplugins/wildpets/commands/SelectCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/SelectCommand.java @@ -4,7 +4,6 @@ import dansplugins.wildpets.pet.list.PetListRepository; import dansplugins.wildpets.pet.Pet; import dansplugins.wildpets.config.ConfigService; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -77,4 +76,4 @@ public boolean execute(CommandSender sender, String[] args) { player.sendMessage(ChatColor.GREEN + pet.getName() + " selected."); return true; } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/SetFreeCommand.java b/src/main/java/dansplugins/wildpets/commands/SetFreeCommand.java index 8785623..13d86f7 100644 --- a/src/main/java/dansplugins/wildpets/commands/SetFreeCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/SetFreeCommand.java @@ -3,7 +3,6 @@ import dansplugins.wildpets.data.EphemeralData; import dansplugins.wildpets.pet.list.PetListRepository; import dansplugins.wildpets.pet.Pet; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -50,4 +49,4 @@ public boolean execute(CommandSender sender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/StatsCommand.java b/src/main/java/dansplugins/wildpets/commands/StatsCommand.java index 94089a2..78c5c23 100644 --- a/src/main/java/dansplugins/wildpets/commands/StatsCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/StatsCommand.java @@ -1,7 +1,6 @@ package dansplugins.wildpets.commands; import dansplugins.wildpets.pet.list.PetListRepository; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -31,4 +30,4 @@ public boolean execute(CommandSender sender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/StayCommand.java b/src/main/java/dansplugins/wildpets/commands/StayCommand.java index d22ac1e..4e2aa04 100644 --- a/src/main/java/dansplugins/wildpets/commands/StayCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/StayCommand.java @@ -2,7 +2,6 @@ import dansplugins.wildpets.data.EphemeralData; import dansplugins.wildpets.pet.Pet; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/dansplugins/wildpets/commands/TameCommand.java b/src/main/java/dansplugins/wildpets/commands/TameCommand.java index c62058e..31769d1 100644 --- a/src/main/java/dansplugins/wildpets/commands/TameCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/TameCommand.java @@ -1,7 +1,6 @@ package dansplugins.wildpets.commands; import dansplugins.wildpets.data.EphemeralData; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -48,4 +47,4 @@ public boolean execute(CommandSender sender, String[] args) { return execute(sender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/UnlockCommand.java b/src/main/java/dansplugins/wildpets/commands/UnlockCommand.java index 38393e2..33a2dd3 100644 --- a/src/main/java/dansplugins/wildpets/commands/UnlockCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/UnlockCommand.java @@ -1,7 +1,6 @@ package dansplugins.wildpets.commands; import dansplugins.wildpets.data.EphemeralData; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -37,4 +36,4 @@ public boolean execute(CommandSender sender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/commands/WanderCommand.java b/src/main/java/dansplugins/wildpets/commands/WanderCommand.java index 3ad4e50..cafebfd 100644 --- a/src/main/java/dansplugins/wildpets/commands/WanderCommand.java +++ b/src/main/java/dansplugins/wildpets/commands/WanderCommand.java @@ -2,7 +2,6 @@ import dansplugins.wildpets.data.EphemeralData; import dansplugins.wildpets.pet.Pet; -import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -45,4 +44,4 @@ public boolean execute(CommandSender sender) { public boolean execute(CommandSender commandSender, String[] strings) { return execute(commandSender); } -} \ No newline at end of file +} diff --git a/src/main/java/dansplugins/wildpets/data/Lockable.java b/src/main/java/dansplugins/wildpets/data/Lockable.java new file mode 100644 index 0000000..b36c923 --- /dev/null +++ b/src/main/java/dansplugins/wildpets/data/Lockable.java @@ -0,0 +1,15 @@ +package dansplugins.wildpets.data; + +import java.util.List; + +/** + * Interface for objects with owner and access control. + */ +public interface Lockable { + void setOwner(T toSet); + T getOwner(); + void addToAccessList(T toAdd); + void removeFromAccessList(T toRemove); + boolean hasAccess(T toCheck); + List getAccessList(); +} diff --git a/src/main/java/dansplugins/wildpets/data/Savable.java b/src/main/java/dansplugins/wildpets/data/Savable.java new file mode 100644 index 0000000..1b9e1fb --- /dev/null +++ b/src/main/java/dansplugins/wildpets/data/Savable.java @@ -0,0 +1,21 @@ +package dansplugins.wildpets.data; + +import java.util.Map; + +/** + * Interface for objects that can be serialized/deserialized to/from a map of strings. + */ +public interface Savable { + + /** + * Saves the object in the form of a map of strings to strings. + * @return The saved data. + */ + Map save(); + + /** + * Takes a map of strings to strings and loads values in from it. + * @param data The data to load. + */ + void load(Map data); +} diff --git a/src/main/java/dansplugins/wildpets/helpers/UUIDChecker.java b/src/main/java/dansplugins/wildpets/helpers/UUIDChecker.java new file mode 100644 index 0000000..d65004f --- /dev/null +++ b/src/main/java/dansplugins/wildpets/helpers/UUIDChecker.java @@ -0,0 +1,54 @@ +package dansplugins.wildpets.helpers; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +import java.util.UUID; + +/** + * Utility class for looking up player names and UUIDs. + */ +public class UUIDChecker { + + /** + * Method to obtain the name of a player based on their UUID. + * + * @param playerUUID used to find the name. + * @return Name of the player as a {@link String}, or {@code null} if the name cannot be resolved. + * @throws IllegalArgumentException if the UUID provided is null. + */ + public String findPlayerNameBasedOnUUID(UUID playerUUID) { + if (playerUUID == null) { + throw new IllegalArgumentException("Player UUID cannot be null!"); + } + final Player player = Bukkit.getPlayer(playerUUID); + if (player != null) { + return player.getName(); + } + final OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerUUID); + final String name = offlinePlayer.getName(); + return name == null || !offlinePlayer.hasPlayedBefore() ? null : name; + } + + /** + * Method to obtain the UUID of a player based on their known name. + * + * @param playerName used to find the UUID. + * @return {@link UUID} (Unique ID) of the Player. + * @throws IllegalArgumentException if the name is null. + */ + @SuppressWarnings("deprecation") + public UUID findUUIDBasedOnPlayerName(String playerName) { + if (playerName == null) { + throw new IllegalArgumentException("Player Name cannot be null!"); + } + final Player player = Bukkit.getPlayer(playerName); + if (player != null) { + return player.getUniqueId(); + } + final OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerName); + final String name = offlinePlayer.getName(); + return name == null || !offlinePlayer.hasPlayedBefore() ? null : offlinePlayer.getUniqueId(); + } +} diff --git a/src/main/java/dansplugins/wildpets/info/InfoSender.java b/src/main/java/dansplugins/wildpets/info/InfoSender.java index f845f0d..00c779f 100644 --- a/src/main/java/dansplugins/wildpets/info/InfoSender.java +++ b/src/main/java/dansplugins/wildpets/info/InfoSender.java @@ -7,7 +7,7 @@ import dansplugins.wildpets.pet.record.PetRecordRepository; import org.bukkit.ChatColor; import org.bukkit.entity.Player; -import preponderous.ponder.minecraft.bukkit.tools.UUIDChecker; +import dansplugins.wildpets.helpers.UUIDChecker; import java.util.UUID; diff --git a/src/main/java/dansplugins/wildpets/listeners/EventHandlerRegistry.java b/src/main/java/dansplugins/wildpets/listeners/EventHandlerRegistry.java new file mode 100644 index 0000000..e051042 --- /dev/null +++ b/src/main/java/dansplugins/wildpets/listeners/EventHandlerRegistry.java @@ -0,0 +1,36 @@ +package dansplugins.wildpets.listeners; + +import org.bukkit.Bukkit; +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginManager; + +import java.util.List; + +/** + * Utility class for registering event handlers. + */ +public class EventHandlerRegistry { + private final PluginManager manager; + + public EventHandlerRegistry() { + this.manager = Bukkit.getPluginManager(); + } + + /** + * Method to register multiple listeners for a given plugin. + * + * @param listeners to register. + * @param plugin to register it for. + * @throws IllegalArgumentException if the arguments are invalid. + */ + public void registerEventHandlers(List listeners, Plugin plugin) { + if (listeners == null || listeners.isEmpty()) { + throw new IllegalArgumentException("Listeners cannot be null or empty!"); + } + if (plugin == null) { + throw new IllegalArgumentException("Plugin cannot be null!"); + } + listeners.forEach(listener -> manager.registerEvents(listener, plugin)); + } +} diff --git a/src/main/java/dansplugins/wildpets/listeners/InteractionHandler.java b/src/main/java/dansplugins/wildpets/listeners/InteractionHandler.java index 779efb2..d77bf54 100644 --- a/src/main/java/dansplugins/wildpets/listeners/InteractionHandler.java +++ b/src/main/java/dansplugins/wildpets/listeners/InteractionHandler.java @@ -9,7 +9,7 @@ import dansplugins.wildpets.config.EntityConfigService; import dansplugins.wildpets.pet.record.PetRecordRepository; import dansplugins.wildpets.scheduler.Scheduler; -import preponderous.ponder.minecraft.bukkit.tools.UUIDChecker; +import dansplugins.wildpets.helpers.UUIDChecker; import org.bukkit.ChatColor; import org.bukkit.Material; diff --git a/src/main/java/dansplugins/wildpets/pet/Pet.java b/src/main/java/dansplugins/wildpets/pet/Pet.java index 41f12e2..51e395f 100644 --- a/src/main/java/dansplugins/wildpets/pet/Pet.java +++ b/src/main/java/dansplugins/wildpets/pet/Pet.java @@ -9,8 +9,8 @@ import org.bukkit.Server; import org.bukkit.entity.Entity; import org.bukkit.entity.Mob; -import preponderous.ponder.misc.abs.Lockable; -import preponderous.ponder.misc.abs.Savable; +import dansplugins.wildpets.data.Lockable; +import dansplugins.wildpets.data.Savable; import java.lang.reflect.Type; import java.util.*; @@ -161,7 +161,7 @@ public boolean hasAccess(UUID uuid) { } @Override - public ArrayList getAccessList() { + public List getAccessList() { return new ArrayList<>(accessList); } diff --git a/src/main/java/dansplugins/wildpets/pet/record/PetRecord.java b/src/main/java/dansplugins/wildpets/pet/record/PetRecord.java index a1b6759..4a2a185 100644 --- a/src/main/java/dansplugins/wildpets/pet/record/PetRecord.java +++ b/src/main/java/dansplugins/wildpets/pet/record/PetRecord.java @@ -4,7 +4,7 @@ import com.google.gson.GsonBuilder; import dansplugins.wildpets.pet.Pet; -import preponderous.ponder.misc.abs.Savable; +import dansplugins.wildpets.data.Savable; import java.util.HashMap; import java.util.Map;