diff --git a/eco-api/src/main/java/com/willfp/eco/core/Eco.java b/eco-api/src/main/java/com/willfp/eco/core/Eco.java index 096e5024..51451534 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/Eco.java +++ b/eco-api/src/main/java/com/willfp/eco/core/Eco.java @@ -160,18 +160,18 @@ public interface Eco { EcoPlugin getEcoPlugin(); @NotNull - PluginCommandBase createPluginCommand(@NotNull EcoPlugin plugin, + PluginCommandBase createPluginCommand(@NotNull CommandBase parentDelegate, + @NotNull EcoPlugin plugin, @NotNull String name, @NotNull String permission, - boolean playersOnly - ); + boolean playersOnly); @NotNull - CommandBase createSubCommand(@NotNull EcoPlugin plugin, + CommandBase createSubCommand(@NotNull CommandBase parentDelegate, + @NotNull EcoPlugin plugin, @NotNull String name, @NotNull String permission, - boolean playersOnly - ); + boolean playersOnly); /** * Updatable config. diff --git a/eco-api/src/main/java/com/willfp/eco/core/command/CommandBase.java b/eco-api/src/main/java/com/willfp/eco/core/command/CommandBase.java index f47a4e55..84146cb7 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/command/CommandBase.java +++ b/eco-api/src/main/java/com/willfp/eco/core/command/CommandBase.java @@ -50,6 +50,8 @@ public interface CommandBase { @NotNull List getSubcommands(); + @NotNull CommandBase getWrapped(); + /** * Handle command execution. * @@ -59,6 +61,7 @@ public interface CommandBase { default void onExecute(@NotNull CommandSender sender, @NotNull List args) throws NotificationException { // Do nothing. + Bukkit.getLogger().info("Did this happen?"); } /** diff --git a/eco-api/src/main/java/com/willfp/eco/core/command/impl/PluginCommand.java b/eco-api/src/main/java/com/willfp/eco/core/command/impl/PluginCommand.java index bd228344..6d244a18 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/command/impl/PluginCommand.java +++ b/eco-api/src/main/java/com/willfp/eco/core/command/impl/PluginCommand.java @@ -37,7 +37,7 @@ public abstract class PluginCommand implements PluginCommandBase { @NotNull final String name, @NotNull final String permission, final boolean playersOnly) { - this.delegate = Eco.get().createPluginCommand(plugin, name, permission, playersOnly); + this.delegate = Eco.get().createPluginCommand(this, plugin, name, permission, playersOnly); } @Override @@ -65,6 +65,11 @@ public abstract class PluginCommand implements PluginCommandBase { return delegate.getSubcommands(); } + @Override + public @NotNull CommandBase getWrapped() { + return this; + } + @Override public void register() { delegate.register(); diff --git a/eco-api/src/main/java/com/willfp/eco/core/command/impl/Subcommand.java b/eco-api/src/main/java/com/willfp/eco/core/command/impl/Subcommand.java index a2640f8c..57712dc3 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/command/impl/Subcommand.java +++ b/eco-api/src/main/java/com/willfp/eco/core/command/impl/Subcommand.java @@ -26,7 +26,7 @@ public abstract class Subcommand implements CommandBase { @NotNull final String name, @NotNull final String permission, final boolean playersOnly) { - this.delegate = Eco.get().createSubCommand(plugin, name, permission, playersOnly); + this.delegate = Eco.get().createSubCommand(this, plugin, name, permission, playersOnly); } /** @@ -67,6 +67,11 @@ public abstract class Subcommand implements CommandBase { return delegate.getSubcommands(); } + @Override + public @NotNull CommandBase getWrapped() { + return this; + } + @Override public EcoPlugin getPlugin() { return delegate.getPlugin(); diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoHandledCommand.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoHandledCommand.kt index 560c1b24..4af3ad0a 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoHandledCommand.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoHandledCommand.kt @@ -19,6 +19,7 @@ import org.bukkit.util.StringUtil * in order to execute the command-specific code. */ abstract class EcoHandledCommand( + private val parentDelegate: CommandBase, private val plugin: EcoPlugin, private val name: String, private val permission: String, @@ -66,8 +67,27 @@ abstract class EcoHandledCommand( override fun getSubcommands() = this.subCommands + override fun getWrapped() = this.parentDelegate + override fun addSubcommand(command: CommandBase): CommandBase { - TODO("Not yet implemented") + subCommands.add(command) + return this + } + + override fun onExecute(sender: CommandSender, args: MutableList) { + parentDelegate.onExecute(sender, args) + } + + override fun onExecute(sender: Player, args: MutableList) { + parentDelegate.onExecute(sender, args) + } + + override fun tabComplete(sender: CommandSender, args: MutableList): MutableList { + return parentDelegate.tabComplete(sender, args) + } + + override fun tabComplete(sender: Player, args: MutableList): MutableList { + return parentDelegate.tabComplete(sender, args) } /** @@ -76,31 +96,28 @@ abstract class EcoHandledCommand( * @param sender The sender. * @param args The arguments. */ - private fun handleExecution(sender: CommandSender, args: List) { + private fun CommandBase.handleExecution(sender: CommandSender, args: List) { if (!canExecute(sender, this, plugin)) { return } - - val subHandledCommands = subCommands.filterIsInstance() - + if (args.isNotEmpty()) { - for (subCommand in subHandledCommands) { - if (subCommand.name.equals(args[0], true) && !canExecute( - sender, - subCommand, - plugin - ) - ) { + for (subCommand in subcommands) { + if (subCommand.name.equals(args[0], true)) { + if (!canExecute(sender, subCommand, plugin)) { + return + } + + subCommand.handleExecution(sender, args.subList(1, args.size)) return } - - subCommand.handleExecution(sender, args.subList(1, args.size)) - return } } try { - notifyFalse(isPlayersOnly && sender !is Player, "not-player") + notifyFalse(!isPlayersOnly || sender is Player, "not-player") + + Bukkit.getLogger().info(name) onExecute(sender, args) @@ -120,10 +137,10 @@ abstract class EcoHandledCommand( * @param args The arguments. * @return The tab completion results. */ - private fun handleTabComplete(sender: CommandSender, args: List): List { + private fun CommandBase.handleTabComplete(sender: CommandSender, args: List): List { if (!sender.hasPermission(permission) || args.isEmpty()) return emptyList() - val completions = subCommands.filter { sender.hasPermission(it.permission) }.map { it.name }.sorted() + val completions = subcommands.filter { sender.hasPermission(it.permission) }.map { it.name }.sorted() return when (args.size) { 1 -> { @@ -133,10 +150,10 @@ abstract class EcoHandledCommand( } else -> { - val subHandledCommands = subCommands.filterIsInstance() - val matchingCommand = subHandledCommands.firstOrNull { - sender.hasPermission(it.permission) && it.name.equals(args[0], true) - } + val matchingCommand = + subcommands.firstOrNull { + sender.hasPermission(it.permission) && it.name.equals(args[0], true) + } matchingCommand?.handleTabComplete(sender, args.subList(1, args.size)) ?: listOf() } diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoPluginCommand.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoPluginCommand.kt index 22e80701..d4bae6af 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoPluginCommand.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoPluginCommand.kt @@ -2,6 +2,7 @@ package com.willfp.eco.internal.command import com.willfp.eco.core.Eco import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.command.CommandBase import com.willfp.eco.core.command.PluginCommandBase import org.bukkit.Bukkit @@ -9,10 +10,12 @@ import org.bukkit.Bukkit * EcoPluginCommand contains the internal logic of PluginCommand. */ class EcoPluginCommand( - plugin: EcoPlugin, name: String, + parentDelegate: CommandBase, + plugin: EcoPlugin, + name: String, permission: String, playersOnly: Boolean -) : EcoHandledCommand(plugin, name, permission, playersOnly), +) : EcoHandledCommand(parentDelegate, plugin, name, permission, playersOnly), PluginCommandBase { override fun register() { val command = Bukkit.getPluginCommand(name) diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoSubCommand.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoSubCommand.kt index fa5253e3..bf8a2022 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoSubCommand.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/command/EcoSubCommand.kt @@ -1,6 +1,7 @@ package com.willfp.eco.internal.command import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.command.CommandBase /** * EcoSubCommand is just an instantiated handled command.
@@ -8,9 +9,11 @@ import com.willfp.eco.core.EcoPlugin * of subcommands because they are called and added from their parent. */ class EcoSubCommand( - plugin: EcoPlugin, name: String, + parentDelegate: CommandBase, + plugin: EcoPlugin, + name: String, permission: String, playersOnly: Boolean -) : EcoHandledCommand(plugin, name, permission, playersOnly) { +) : EcoHandledCommand(parentDelegate, plugin, name, permission, playersOnly) { } \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoImpl.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoImpl.kt index 99921b25..2e72bbc0 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoImpl.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoImpl.kt @@ -4,6 +4,7 @@ import com.willfp.eco.core.Eco import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.PluginLike import com.willfp.eco.core.PluginProps +import com.willfp.eco.core.command.CommandBase import com.willfp.eco.core.command.impl.PluginCommand import com.willfp.eco.core.config.ConfigType import com.willfp.eco.core.config.interfaces.Config @@ -167,11 +168,13 @@ class EcoImpl : EcoSpigotPlugin(), Eco { } override fun createPluginCommand( + parentDelegate: CommandBase, plugin: EcoPlugin, name: String, permission: String, playersOnly: Boolean ) = EcoPluginCommand( + parentDelegate, plugin, name, permission, @@ -179,11 +182,13 @@ class EcoImpl : EcoSpigotPlugin(), Eco { ) override fun createSubCommand( + parentDelegate: CommandBase, plugin: EcoPlugin, name: String, permission: String, playersOnly: Boolean ) = EcoSubCommand( + parentDelegate, plugin, name, permission,