From 8d94980313cadfead8e2e1ed5b0486d347a9a1c5 Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Wed, 27 Nov 2024 16:34:35 +0800 Subject: [PATCH] Abstract out issuer awareness logic to a builder --- .../IssuerAwarenessContextBuilder.java | 108 ++++++++++++++++++ .../core/commandtools/MVCommandContexts.java | 55 ++------- 2 files changed, 120 insertions(+), 43 deletions(-) create mode 100644 src/main/java/org/mvplugins/multiverse/core/commandtools/IssuerAwarenessContextBuilder.java diff --git a/src/main/java/org/mvplugins/multiverse/core/commandtools/IssuerAwarenessContextBuilder.java b/src/main/java/org/mvplugins/multiverse/core/commandtools/IssuerAwarenessContextBuilder.java new file mode 100644 index 000000000..ac9b6e380 --- /dev/null +++ b/src/main/java/org/mvplugins/multiverse/core/commandtools/IssuerAwarenessContextBuilder.java @@ -0,0 +1,108 @@ +package org.mvplugins.multiverse.core.commandtools; + +import co.aikar.commands.BukkitCommandExecutionContext; +import co.aikar.commands.BukkitCommandIssuer; +import co.aikar.commands.InvalidCommandArgument; +import co.aikar.commands.contexts.IssuerAwareContextResolver; +import com.google.common.base.Function; +import com.google.common.base.Predicate; + +import java.util.Objects; +import java.util.function.Supplier; + +public class IssuerAwarenessContextBuilder { + + public static IssuerAwarenessContextBuilder create() { + return new IssuerAwarenessContextBuilder<>(); + } + + private Predicate canGetFromIssuer; + private Function getFromIssuer; + private Function getFromContext; + private Supplier issuerOnlyError; + private Function issuerAwareError; + private Function inputOnlyError; + + private IssuerAwarenessContextBuilder() { + // Dont expose constructor + } + + public IssuerAwarenessContextBuilder canGetFromIssuer(Predicate canGetFromIssuer) { + this.canGetFromIssuer = canGetFromIssuer; + return this; + } + + public IssuerAwarenessContextBuilder getFromIssuer(Function getFromIssuer) { + this.getFromIssuer = getFromIssuer; + return this; + } + + public IssuerAwarenessContextBuilder getFromContext(Function getFromContext) { + this.getFromContext = getFromContext; + return this; + } + + public IssuerAwarenessContextBuilder issuerOnlyError(Supplier issuerOnlyError) { + this.issuerOnlyError = issuerOnlyError; + return this; + } + + public IssuerAwarenessContextBuilder issuerAwareError(Function issuerAwareError) { + this.issuerAwareError = issuerAwareError; + return this; + } + + public IssuerAwarenessContextBuilder inputOnlyError(Function inputOnlyError) { + this.inputOnlyError = inputOnlyError; + return this; + } + + public IssuerAwareContextResolver build() { + Objects.requireNonNull(canGetFromIssuer); + Objects.requireNonNull(getFromIssuer); + Objects.requireNonNull(getFromContext); + Objects.requireNonNull(issuerOnlyError); + Objects.requireNonNull(issuerAwareError); + Objects.requireNonNull(inputOnlyError); + + return context -> { + String resolve = context.getFlagValue("resolve", ""); + + if (resolve.equals("issuerOnly")) { + if (canGetFromIssuer.test(context.getIssuer())) { + return getFromIssuer.apply(context.getIssuer()); + } + if (context.isOptional()) { + return null; + } + throw issuerOnlyError.get(); + } + + String input = context.getFirstArg(); + T result = getFromContext.apply(input); + + if (resolve.equals("issuerAware")) { + if (result != null) { + context.popFirstArg(); + return result; + } + if (canGetFromIssuer.test(context.getIssuer())) { + return getFromIssuer.apply(context.getIssuer()); + } + if (context.isOptional()) { + return null; + } + throw issuerAwareError.apply(input); + } + + if (result != null) { + context.popFirstArg(); + return result; + } + if (context.isOptional()) { + return null; + } + throw inputOnlyError.apply(input); + }; + } +} diff --git a/src/main/java/org/mvplugins/multiverse/core/commandtools/MVCommandContexts.java b/src/main/java/org/mvplugins/multiverse/core/commandtools/MVCommandContexts.java index 3c1691e47..d71cc1b48 100644 --- a/src/main/java/org/mvplugins/multiverse/core/commandtools/MVCommandContexts.java +++ b/src/main/java/org/mvplugins/multiverse/core/commandtools/MVCommandContexts.java @@ -8,6 +8,7 @@ import co.aikar.commands.InvalidCommandArgument; import co.aikar.commands.PaperCommandContexts; import co.aikar.commands.contexts.ContextResolver; +import co.aikar.commands.contexts.IssuerAwareContextResolver; import com.google.common.base.Strings; import jakarta.inject.Inject; import org.bukkit.GameRule; @@ -54,7 +55,7 @@ public class MVCommandContexts extends PaperCommandContexts { registerContext(GameRuleValue.class, this::parseGameRuleValue); registerIssuerAwareContext(LoadedMultiverseWorld.class, this::parseLoadedMultiverseWorld); registerIssuerAwareContext(LoadedMultiverseWorld[].class, this::parseLoadedMultiverseWorldArray); - registerIssuerAwareContext(MultiverseWorld.class, this::parseMultiverseWorld); + registerIssuerAwareContext(MultiverseWorld.class, this.parseMultiverseWorld()); registerIssuerAwareContext(Player.class, this::parsePlayer); registerIssuerAwareContext(Player[].class, this::parsePlayerArray); } @@ -224,48 +225,16 @@ private LoadedMultiverseWorld[] parseLoadedMultiverseWorldArray(BukkitCommandExe throw new InvalidCommandArgument("World " + worldStrings + " is not a loaded multiverse world."); } - private MultiverseWorld parseMultiverseWorld(BukkitCommandExecutionContext context) { - String resolve = context.getFlagValue("resolve", ""); - - // Get world based on sender only - if (resolve.equals("issuerOnly")) { - if (context.getIssuer().isPlayer()) { - return worldManager.getWorld(context.getIssuer().getPlayer().getWorld()).getOrNull(); - } - if (context.isOptional()) { - return null; - } - throw new InvalidCommandArgument("This command can only be used by a player in a Multiverse World."); - } - - String worldName = context.getFirstArg(); - MultiverseWorld world = worldManager.getWorld(worldName).getOrNull(); - - // Get world based on input, fallback to sender if input is not a world - if (resolve.equals("issuerAware")) { - if (world != null) { - context.popFirstArg(); - return world; - } - if (context.getIssuer().isPlayer()) { - return worldManager.getWorld(context.getPlayer().getWorld()) - .getOrElseThrow(() -> new InvalidCommandArgument("You are not in a multiverse world. Either specify a multiverse world name or use this command in a multiverse world.")); - } - if (context.isOptional()) { - return null; - } - throw new InvalidCommandArgument("World '" + worldName + "' is not a loaded multiverse world. Remember to specify the world name when using this command in console."); - } - - // Get world based on input only - if (world != null) { - context.popFirstArg(); - return world; - } - if (context.isOptional()) { - return null; - } - throw new InvalidCommandArgument("World " + worldName + " is not a loaded multiverse world."); + private IssuerAwareContextResolver parseMultiverseWorld() { + return IssuerAwarenessContextBuilder.create() + .canGetFromIssuer(BukkitCommandIssuer::isPlayer) + .getFromIssuer(issuer -> worldManager.getWorld(issuer.getPlayer().getWorld()) + .getOrElseThrow(() -> new InvalidCommandArgument("You must be in a multiverse world to use this command."))) + .getFromContext(input -> worldManager.getWorld(input).getOrNull()) + .issuerOnlyError(() -> new InvalidCommandArgument("This command can only be used by a player in a Multiverse World.")) + .issuerAwareError(input -> new InvalidCommandArgument("World '" + input + "' is not a multiverse world. Remember to specify the world name when using this command in console.")) + .inputOnlyError(input -> new InvalidCommandArgument("World '" + input + "' is not a multiverse world.")) + .build(); } private Player parsePlayer(BukkitCommandExecutionContext context) {