From 1f87af08d0b2a694343e8fdc6e0aff2a25891449 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 06:20:47 +0000 Subject: [PATCH] Refactor commands to use a common BaseCommand Introduced an abstract `BaseCommand` class to centralize common command logic, such as permission checks, player-only checks, and error handling. Refactored `ServersCommand` and `SetBlockCommand` to extend the new `BaseCommand`. This simplifies the individual command classes and reduces code duplication. Removed the now-redundant command definitions from `plugin.yml`, as this information is now handled programmatically within each command's constructor. --- .../com/indra87g/commands/BaseCommand.java | 49 +++++++++++++++++++ .../com/indra87g/commands/ServersCommand.java | 15 ++---- .../indra87g/commands/SetBlockCommand.java | 22 ++++----- src/main/resources/plugin.yml | 9 ---- 4 files changed, 61 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/indra87g/commands/BaseCommand.java diff --git a/src/main/java/com/indra87g/commands/BaseCommand.java b/src/main/java/com/indra87g/commands/BaseCommand.java new file mode 100644 index 0000000..b2dfb3e --- /dev/null +++ b/src/main/java/com/indra87g/commands/BaseCommand.java @@ -0,0 +1,49 @@ +package com.indra87g.commands; + +import cn.nukkit.command.Command; +import cn.nukkit.command.CommandSender; +import cn.nukkit.Player; + +public abstract class BaseCommand extends Command { + + public BaseCommand(String name, String description, String usage, String permission) { + super(name); + this.setDescription(description); + this.setUsage(usage); + this.setPermission(permission); + } + + @Override + public boolean execute(CommandSender sender, String label, String[] args) { + if (!this.testPermission(sender)) { + sender.sendMessage("You do not have permission to use this command."); + return false; + } + + if (!(sender instanceof Player)) { + sender.sendMessage("This command can only be used by a player."); + return false; + } + + Player player = (Player) sender; + + if (!validateArgs(args, player)) { + // The validateArgs method is responsible for sending the usage message. + return false; + } + + try { + return handleCommand(player, args); + } catch (Exception e) { + sender.sendMessage("An unexpected error occurred while executing the command."); + e.printStackTrace(); + return false; + } + } + + protected boolean validateArgs(String[] args, Player player) { + return true; + } + + protected abstract boolean handleCommand(Player player, String[] args); +} diff --git a/src/main/java/com/indra87g/commands/ServersCommand.java b/src/main/java/com/indra87g/commands/ServersCommand.java index 417ac06..24939e2 100644 --- a/src/main/java/com/indra87g/commands/ServersCommand.java +++ b/src/main/java/com/indra87g/commands/ServersCommand.java @@ -1,8 +1,6 @@ package com.indra87g.commands; import cn.nukkit.Player; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; import cn.nukkit.event.EventHandler; import cn.nukkit.event.Listener; import cn.nukkit.event.player.PlayerFormRespondedEvent; @@ -17,25 +15,18 @@ import java.util.Map; import java.util.UUID; -public class ServersCommand extends Command implements Listener { +public class ServersCommand extends BaseCommand implements Listener { private final Main plugin; private final Map formIDs = new HashMap<>(); public ServersCommand(Main plugin) { - super("servers", "Display a list of servers to connect to.", "/servers"); + super("servers", "Display a list of servers to connect to.", "/servers", "waffle.servers"); this.plugin = plugin; } @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!(sender instanceof Player)) { - sender.sendMessage("This command can only be used by a player."); - return false; - } - - Player player = (Player) sender; - + public boolean handleCommand(Player player, String[] args) { List servers = plugin.getServers(); if (servers == null || servers.isEmpty()) { player.sendMessage("There are no servers available at the moment. Please try again later."); diff --git a/src/main/java/com/indra87g/commands/SetBlockCommand.java b/src/main/java/com/indra87g/commands/SetBlockCommand.java index 9aa4b21..ae4065a 100644 --- a/src/main/java/com/indra87g/commands/SetBlockCommand.java +++ b/src/main/java/com/indra87g/commands/SetBlockCommand.java @@ -2,31 +2,27 @@ import cn.nukkit.Player; import cn.nukkit.block.Block; -import cn.nukkit.command.Command; -import cn.nukkit.command.CommandSender; import cn.nukkit.level.Level; import cn.nukkit.math.Vector3; -public class SetBlockCommand extends Command { +public class SetBlockCommand extends BaseCommand { public SetBlockCommand() { - super("setblock", "Sets a block at a specific location", "/setblock "); + super("setblock", "Sets a block at a specific location", "/setblock ", "waffle.setblock"); } @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!(sender instanceof Player)) { - sender.sendMessage("This command can only be used by a player."); - return false; - } - - Player player = (Player) sender; - Level level = player.getLevel(); - + protected boolean validateArgs(String[] args, Player player) { if (args.length != 4) { player.sendMessage("§cUsage: " + this.getUsage()); return false; } + return true; + } + + @Override + public boolean handleCommand(Player player, String[] args) { + Level level = player.getLevel(); try { int x = Integer.parseInt(args[0]); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 5a604bf..5813dcf 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,15 +4,6 @@ version: 0.1.0 api: 1.0.0 author: indra87g description: Core plugin for the WaffleNK ecosystem. -commands: - setblock: - description: "Sets a block at a specific location" - usage: "/setblock " - permission: waffle.setblock - servers: - description: "Shows a list of servers" - usage: "/servers" - permission: waffle.servers permissions: waffle.setblock: description: "Allows the user to use the /setblock command"