diff --git a/src/main/java/dev/j3fftw/worldeditslimefun/commands/WorldEditSlimefunCommands.java b/src/main/java/dev/j3fftw/worldeditslimefun/commands/WorldEditSlimefunCommands.java index e1c2483..9692f75 100644 --- a/src/main/java/dev/j3fftw/worldeditslimefun/commands/WorldEditSlimefunCommands.java +++ b/src/main/java/dev/j3fftw/worldeditslimefun/commands/WorldEditSlimefunCommands.java @@ -50,7 +50,7 @@ public static void init(WorldEditSlimefun plugin) { completions.registerStaticCompletion("slimefun_blocks", Utils.SLIMEFUN_BLOCKS); completions.registerAsyncCompletion("command_flags", context -> { List args = new ArrayList<>(Arrays.asList(context.getContextValueByName(String[].class, "commandFlags"))); - List availableFlags = new ArrayList<>(CommandFlags.FLAG_TYPES.keySet()); + List availableFlags = new ArrayList<>(CommandFlags.getFlagTypes().keySet()); availableFlags.removeAll(args); if (args.isEmpty()) { @@ -63,8 +63,8 @@ public static void init(WorldEditSlimefun plugin) { } String lastArg = args.get(args.size() - 1); - if (CommandFlags.FLAG_TYPES.containsKey(lastArg)) { - return CommandFlags.FLAG_TYPES.get(lastArg).getTabSuggestions(context); + if (CommandFlags.getFlagTypes().containsKey(lastArg)) { + return CommandFlags.getFlagTypes().get(lastArg).getTabSuggestions(context); } if (args.size() % 2 == 0) { @@ -140,7 +140,7 @@ public void paste(Player player, @Default("INVALID") String sfId, String[] comma }); for (CommandFlag flag : flags) { - flag.apply(flags, sfItem, block); + flag.apply(player, flags, sfItem, block); } }); long time = System.currentTimeMillis() - start; diff --git a/src/main/java/dev/j3fftw/worldeditslimefun/commands/flags/CommandFlag.java b/src/main/java/dev/j3fftw/worldeditslimefun/commands/flags/CommandFlag.java index 644200e..836a5df 100644 --- a/src/main/java/dev/j3fftw/worldeditslimefun/commands/flags/CommandFlag.java +++ b/src/main/java/dev/j3fftw/worldeditslimefun/commands/flags/CommandFlag.java @@ -3,6 +3,7 @@ import co.aikar.commands.BukkitCommandCompletionContext; import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem; import org.bukkit.block.Block; +import org.bukkit.entity.Player; import java.util.Collection; import java.util.List; @@ -19,7 +20,7 @@ public T getValue() { return value; } - public abstract void apply(List> flags, SlimefunItem sfItem, Block block); + public abstract void apply(Player player, List> flags, SlimefunItem sfItem, Block block); public abstract boolean canApply(SlimefunItem sfItem); public abstract Collection getTabSuggestions(BukkitCommandCompletionContext context); diff --git a/src/main/java/dev/j3fftw/worldeditslimefun/commands/flags/CommandFlags.java b/src/main/java/dev/j3fftw/worldeditslimefun/commands/flags/CommandFlags.java index e21e8a8..c324af7 100644 --- a/src/main/java/dev/j3fftw/worldeditslimefun/commands/flags/CommandFlags.java +++ b/src/main/java/dev/j3fftw/worldeditslimefun/commands/flags/CommandFlags.java @@ -14,25 +14,48 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; public class CommandFlags { - public static final Map> FLAG_TYPES = Map.of( + private static final Map> FLAG_TYPES = new HashMap<>(Map.of( "--energy", new EnergyFlag(), "--inputs", new InputsFlag(), "--refill_inputs_task", new RefillInputsFlag(), "--void_outputs_task", new VoidOutputsFlag(), "--task_timeout", new TimeoutFlag() - ); + )); + + /** + * Takes a type and value and converts it into a matching {@link CommandFlag} + * @param type The type of flag to get, formatted as "--type" + * @param value The value of the flag to get, format depends on the type provided + * @return the matching {@link CommandFlag} or null if one could not be found + */ + public static @Nullable CommandFlag getFlag(@Nonnull String type, @Nonnull String value) { + CommandFlag flag = FLAG_TYPES.get(type); + if (flag != null) { + return flag.ofValue(value); + } + return null; + } - public static List> getFlags(List args) { + /** + * Translates the provided args into {@link CommandFlag CommandFlags} + * @param args The args to convert, formatted as: {"--energy", "true", "--task_timeout", "10s"} + * @return The command flags from the given arguments, empty if arguments are invalid + */ + public static @Nonnull List> getFlags(@Nonnull List args) { List> flags = new ArrayList<>(); for (int i = 0; i < args.size(); i++) { String arg = args.get(i); @@ -46,17 +69,30 @@ public static List> getFlags(List args) { return flags; } - public static CommandFlag getFlag(String type, String value) { - CommandFlag flag = FLAG_TYPES.get(type); - if (flag != null) { - return flag.ofValue(value); + /** + * Attempts to register the flag type, fails if there is already a flag for the given flag type + * @param type A {@link String} flag type in the format of "--type" + * @param flag The {@link CommandFlag} for the given flag type + * @return If the flag type was successfully registered + */ + public static boolean addFlagType(@Nonnull String type, @Nonnull CommandFlag flag) { + if (FLAG_TYPES.containsKey(type)) { + return false; } - return null; + FLAG_TYPES.put(type, flag); + return true; + } + + /** + * @return An unmodifiable copy of {@link CommandFlags#FLAG_TYPES} + */ + public static @Nonnull Map> getFlagTypes() { + return Map.copyOf(FLAG_TYPES); } public static class EnergyFlag extends CommandFlag { @Override - public void apply(List> flags, SlimefunItem sfItem, Block block) { + public void apply(Player player, List> flags, SlimefunItem sfItem, Block block) { BlockStorage.addBlockInfo(block, "energy-charge", String.valueOf(Integer.MAX_VALUE), false); } @@ -79,7 +115,7 @@ public EnergyFlag ofValue(String value) { public static class InputsFlag extends CommandFlag> { @Override - public void apply(List> flags, SlimefunItem sfItem, Block block) { + public void apply(Player player, List> flags, SlimefunItem sfItem, Block block) { BlockMenu menu = BlockStorage.getInventory(block); int[] slots = menu.getPreset().getSlotsAccessedByItemTransport(ItemTransportFlow.INSERT); for (ItemStack input : this.value) { @@ -180,7 +216,7 @@ public static class RefillInputsFlag extends CommandFlag { private RefillInputsTask task; @Override - public void apply(List> flags, SlimefunItem sfItem, Block block) { + public void apply(Player player, List> flags, SlimefunItem sfItem, Block block) { if (task == null) { task = new RefillInputsTask(sfItem); @@ -217,7 +253,7 @@ public static class VoidOutputsFlag extends CommandFlag { private VoidOutputsTask task; @Override - public void apply(List> flags, SlimefunItem sfItem, Block block) { + public void apply(Player player, List> flags, SlimefunItem sfItem, Block block) { if (task == null) { task = new VoidOutputsTask(sfItem); @@ -250,7 +286,7 @@ public VoidOutputsFlag ofValue(String value) { public static class TimeoutFlag extends CommandFlag { @Override - public void apply(List> flags, SlimefunItem sfItem, Block block) { + public void apply(Player player, List> flags, SlimefunItem sfItem, Block block) { }