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;