From d78d64329bc2286d1487cb9d2de9e6f46bf9e0cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Tue, 15 Sep 2020 14:07:00 +0200 Subject: [PATCH] Don't require BukkitCommandManager to use BukkitCommandSender --- .../commands/BukkitTest.java | 4 +- .../commands/BukkitCommand.java | 9 ++-- .../commands/BukkitCommandManager.java | 17 ++++++- .../commands/parsers/WorldComponent.java | 18 +++---- .../commands/PaperBrigadierListener.java | 47 ++++++++++++------- .../commands/PaperCommandManager.java | 26 +++++++--- 6 files changed, 84 insertions(+), 37 deletions(-) diff --git a/cloud-minecraft/cloud-bukkit-test/src/main/java/com/intellectualsites/commands/BukkitTest.java b/cloud-minecraft/cloud-bukkit-test/src/main/java/com/intellectualsites/commands/BukkitTest.java index bc3aa877..c53c9658 100644 --- a/cloud-minecraft/cloud-bukkit-test/src/main/java/com/intellectualsites/commands/BukkitTest.java +++ b/cloud-minecraft/cloud-bukkit-test/src/main/java/com/intellectualsites/commands/BukkitTest.java @@ -53,7 +53,9 @@ public final class BukkitTest extends JavaPlugin { public void onEnable() { try { final PaperCommandManager mgr = new PaperCommandManager<>(this, - CommandExecutionCoordinator.simpleCoordinator()); + CommandExecutionCoordinator + .simpleCoordinator(), + BukkitCommandSender::of); mgr.registerBrigadier(); mgr.command(mgr.commandBuilder("gamemode", Collections.singleton("gajmöde"), diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/BukkitCommand.java b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/BukkitCommand.java index 80305d99..e260cb74 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/BukkitCommand.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/BukkitCommand.java @@ -32,7 +32,8 @@ import org.bukkit.plugin.Plugin; import javax.annotation.Nonnull; import java.util.List; -final class BukkitCommand extends org.bukkit.command.Command implements PluginIdentifiableCommand { +final class BukkitCommand + extends org.bukkit.command.Command implements PluginIdentifiableCommand { private final CommandComponent command; private final BukkitCommandManager bukkitCommandManager; @@ -54,7 +55,8 @@ final class BukkitCommand extends org.bukkit.comm for (final String string : strings) { builder.append(" ").append(string); } - this.bukkitCommandManager.executeCommand((C) BukkitCommandSender.of(commandSender), builder.toString()) + this.bukkitCommandManager.executeCommand(this.bukkitCommandManager.getCommandSenderMapper().apply(commandSender), + builder.toString()) .whenComplete(((commandResult, throwable) -> { if (throwable != null) { commandSender.sendMessage(ChatColor.RED + throwable.getCause().getMessage()); @@ -79,7 +81,8 @@ final class BukkitCommand extends org.bukkit.comm for (final String string : args) { builder.append(" ").append(string); } - return this.bukkitCommandManager.suggest((C) BukkitCommandSender.of(sender), builder.toString()); + return this.bukkitCommandManager.suggest(this.bukkitCommandManager.getCommandSenderMapper().apply(sender), + builder.toString()); } @Override diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/BukkitCommandManager.java b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/BukkitCommandManager.java index 612a048e..ce90f1ab 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/BukkitCommandManager.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/BukkitCommandManager.java @@ -27,6 +27,7 @@ import com.google.common.reflect.TypeToken; import com.intellectualsites.commands.execution.CommandExecutionCoordinator; import com.intellectualsites.commands.parsers.WorldComponent; import org.bukkit.World; +import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; import javax.annotation.Nonnull; @@ -35,25 +36,32 @@ import java.util.function.Function; /** * Command manager for the Bukkit platform, using {@link BukkitCommandSender} as the * command sender type + * + * @param Command sender type */ -public class BukkitCommandManager extends CommandManager { +public class BukkitCommandManager + extends CommandManager { private final Plugin owningPlugin; + private final Function commandSenderMapper; /** * Construct a new Bukkit command manager * * @param owningPlugin Plugin that is constructing the manager * @param commandExecutionCoordinator Coordinator provider + * @param commandSenderMapper Function that maps {@link CommandSender} to the command sender type * @throws Exception If the construction of the manager fails */ public BukkitCommandManager(@Nonnull final Plugin owningPlugin, @Nonnull final Function, - CommandExecutionCoordinator> commandExecutionCoordinator) + CommandExecutionCoordinator> commandExecutionCoordinator, + @Nonnull final Function commandSenderMapper) throws Exception { super(commandExecutionCoordinator, new BukkitPluginRegistrationHandler()); ((BukkitPluginRegistrationHandler) this.getCommandRegistrationHandler()).initialize(this); this.owningPlugin = owningPlugin; + this.commandSenderMapper = commandSenderMapper; /* Register Bukkit parsers */ this.getParserRegistry().registerParserSupplier(TypeToken.of(World.class), params -> new WorldComponent.WorldParser<>()); @@ -80,4 +88,9 @@ public class BukkitCommandManager extends Command return BukkitCommandMetaBuilder.builder().withDescription("").build(); } + @Nonnull + final Function getCommandSenderMapper() { + return this.commandSenderMapper; + } + } diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/parsers/WorldComponent.java b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/parsers/WorldComponent.java index ca03b190..05b9fb42 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/parsers/WorldComponent.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/parsers/WorldComponent.java @@ -23,11 +23,11 @@ // package com.intellectualsites.commands.parsers; -import com.intellectualsites.commands.BukkitCommandSender; import com.intellectualsites.commands.components.CommandComponent; import com.intellectualsites.commands.components.parser.ComponentParseResult; import com.intellectualsites.commands.components.parser.ComponentParser; import com.intellectualsites.commands.context.CommandContext; +import com.intellectualsites.commands.sender.CommandSender; import org.bukkit.Bukkit; import org.bukkit.World; @@ -41,7 +41,7 @@ import java.util.stream.Collectors; * * @param Command sender type */ -public class WorldComponent extends CommandComponent { +public class WorldComponent extends CommandComponent { protected WorldComponent(final boolean required, @Nonnull final String name, @@ -57,7 +57,7 @@ public class WorldComponent extends CommandCompon * @return Created builder */ @Nonnull - public static CommandComponent.Builder newBuilder(@Nonnull final String name) { + public static CommandComponent.Builder newBuilder(@Nonnull final String name) { return new WorldComponent.Builder<>(name); } @@ -69,7 +69,7 @@ public class WorldComponent extends CommandCompon * @return Created component */ @Nonnull - public static CommandComponent required(@Nonnull final String name) { + public static CommandComponent required(@Nonnull final String name) { return WorldComponent.newBuilder(name).asRequired().build(); } @@ -81,7 +81,7 @@ public class WorldComponent extends CommandCompon * @return Created component */ @Nonnull - public static CommandComponent optional(@Nonnull final String name) { + public static CommandComponent optional(@Nonnull final String name) { return WorldComponent.newBuilder(name).asOptional().build(); } @@ -94,13 +94,13 @@ public class WorldComponent extends CommandCompon * @return Created component */ @Nonnull - public static CommandComponent optional(@Nonnull final String name, - @Nonnull final String defaultValue) { + public static CommandComponent optional(@Nonnull final String name, + @Nonnull final String defaultValue) { return WorldComponent.newBuilder(name).asOptionalWithDefault(defaultValue).build(); } - public static final class Builder extends CommandComponent.Builder { + public static final class Builder extends CommandComponent.Builder { protected Builder(@Nonnull final String name) { super(World.class, name); @@ -114,7 +114,7 @@ public class WorldComponent extends CommandCompon } - public static final class WorldParser implements ComponentParser { + public static final class WorldParser implements ComponentParser { @Nonnull @Override diff --git a/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/PaperBrigadierListener.java b/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/PaperBrigadierListener.java index 734ae367..1e94660d 100644 --- a/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/PaperBrigadierListener.java +++ b/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/PaperBrigadierListener.java @@ -27,6 +27,7 @@ import com.destroystokyo.paper.brigadier.BukkitBrigadierCommandSource; import com.destroystokyo.paper.event.brigadier.CommandRegisteredEvent; import com.intellectualsites.commands.brigadier.CloudBrigadierManager; import com.intellectualsites.commands.components.CommandComponent; +import com.intellectualsites.commands.sender.CommandSender; import com.mojang.brigadier.arguments.ArgumentType; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -41,28 +42,29 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.UUID; -class PaperBrigadierListener implements Listener { +class PaperBrigadierListener implements Listener { - private final CloudBrigadierManager brigadierManager; - private final PaperCommandManager paperCommandManager; + private final CloudBrigadierManager brigadierManager; + private final PaperCommandManager paperCommandManager; + private final String nmsVersion; - PaperBrigadierListener(@Nonnull final PaperCommandManager paperCommandManager) throws Exception { + PaperBrigadierListener(@Nonnull final PaperCommandManager paperCommandManager) throws Exception { this.paperCommandManager = paperCommandManager; this.brigadierManager = new CloudBrigadierManager<>(); /* Register default mappings */ final String version = Bukkit.getServer().getClass().getPackage().getName(); - final String nms = version.substring(version.lastIndexOf(".") + 1); + this.nmsVersion = version.substring(version.lastIndexOf(".") + 1); try { /* Map UUID */ - this.mapSimpleNMS(UUID.class, this.getNMSArgument("UUID", nms).getConstructor()); + this.mapSimpleNMS(UUID.class, this.getNMSArgument("UUID").getConstructor()); /* Map World */ - this.mapSimpleNMS(World.class, this.getNMSArgument("Dimension", nms).getConstructor()); + this.mapSimpleNMS(World.class, this.getNMSArgument("Dimension").getConstructor()); /* Map Enchantment */ - this.mapSimpleNMS(Enchantment.class, this.getNMSArgument("Enchantment", nms).getConstructor()); + this.mapSimpleNMS(Enchantment.class, this.getNMSArgument("Enchantment").getConstructor()); /* Map EntityType */ - this.mapSimpleNMS(EntityType.class, this.getNMSArgument("EntitySummon", nms).getConstructor()); + this.mapSimpleNMS(EntityType.class, this.getNMSArgument("EntitySummon").getConstructor()); /* Map Material */ - this.mapSimpleNMS(Material.class, this.getNMSArgument("ItemStack", nms).getConstructor()); + this.mapSimpleNMS(Material.class, this.getNMSArgument("ItemStack").getConstructor()); } catch (final Exception e) { this.paperCommandManager.getOwningPlugin() .getLogger() @@ -70,13 +72,26 @@ class PaperBrigadierListener implements Listener { } } + /** + * Attempt to retrieve an NMS argument type + * + * @param argument Argument type name + * @return Argument class + * @throws Exception If the type cannot be retrieved + */ @Nonnull - private Class getNMSArgument(@Nonnull final String argument, @Nonnull final String nms) throws Exception { - return Class.forName(String.format("net.minecraft.server.%s.Argument%s", nms, argument)); + private Class getNMSArgument(@Nonnull final String argument) throws Exception { + return Class.forName(String.format("net.minecraft.server.%s.Argument%s", this.nmsVersion, argument)); } - private void mapSimpleNMS(@Nonnull final Class type, - @Nonnull final Constructor constructor) { + /** + * Attempt to register a mapping between a type and a NMS argument type + * + * @param type Type to map + * @param constructor Constructor that construct the NMS argument type + */ + public void mapSimpleNMS(@Nonnull final Class type, + @Nonnull final Constructor constructor) { try { this.brigadierManager.registerDefaultArgumentTypeSupplier(type, () -> { try { @@ -96,8 +111,8 @@ class PaperBrigadierListener implements Listener { @EventHandler public void onCommandRegister(@Nonnull final CommandRegisteredEvent event) { - final CommandTree commandTree = this.paperCommandManager.getCommandTree(); - final CommandTree.Node> node = commandTree.getNamedNode(event.getCommandLabel()); + final CommandTree commandTree = this.paperCommandManager.getCommandTree(); + final CommandTree.Node> node = commandTree.getNamedNode(event.getCommandLabel()); if (node == null) { return; } diff --git a/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/PaperCommandManager.java b/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/PaperCommandManager.java index b2a0e01a..95931fe4 100644 --- a/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/PaperCommandManager.java +++ b/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/PaperCommandManager.java @@ -25,41 +25,55 @@ package com.intellectualsites.commands; import com.intellectualsites.commands.execution.CommandExecutionCoordinator; import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.function.Function; /** * Paper command manager that extends {@link BukkitCommandManager} + * + * @param Command sender type */ -public class PaperCommandManager extends BukkitCommandManager { +public class PaperCommandManager + extends BukkitCommandManager { /** * Construct a new Paper command manager * * @param owningPlugin Plugin that is constructing the manager * @param commandExecutionCoordinator Coordinator provider + * @param commandSenderMapper Function that maps {@link CommandSender} to the command sender type * @throws Exception If the construction of the manager fails */ public PaperCommandManager(@Nonnull final Plugin owningPlugin, @Nonnull final Function, - CommandExecutionCoordinator> commandExecutionCoordinator) throws + CommandExecutionCoordinator> commandExecutionCoordinator, + @Nonnull final Function commandSenderMapper) throws Exception { - super(owningPlugin, commandExecutionCoordinator); + super(owningPlugin, commandExecutionCoordinator, commandSenderMapper); } /** - * Register the brigadier listener + * Attempt to register the Brigadier mapper, and return it. + * + * @return {@link PaperBrigadierListener} instance, if it could be created. If it cannot + * be created {@code null} is returned */ - public void registerBrigadier() { + @Nullable + public PaperBrigadierListener registerBrigadier() { try { - Bukkit.getPluginManager().registerEvents(new PaperBrigadierListener(this), + final PaperBrigadierListener brigadierListener = new PaperBrigadierListener<>(this); + Bukkit.getPluginManager().registerEvents(brigadierListener, this.getOwningPlugin()); + return brigadierListener; } catch (final Exception e) { this.getOwningPlugin().getLogger().severe("Failed to register Brigadier listener"); e.printStackTrace(); } + return null; } }