From 39f5a7fed65f7e69a32d08e0c7a33ae64affbb44 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 3 Sep 2024 22:10:05 +0200 Subject: [PATCH] Refactor economy commands for simplification Consolidate command creation logic into a reusable `create` method to reduce code duplication and improve maintainability. Simplify the registration process of give and take commands by leveraging the reusable method. --- .../economist/command/EconomyCommand.java | 107 +++++++++--------- 1 file changed, 54 insertions(+), 53 deletions(-) diff --git a/src/main/java/net/thenextlvl/economist/command/EconomyCommand.java b/src/main/java/net/thenextlvl/economist/command/EconomyCommand.java index 2e1d3e3..4e60c16 100644 --- a/src/main/java/net/thenextlvl/economist/command/EconomyCommand.java +++ b/src/main/java/net/thenextlvl/economist/command/EconomyCommand.java @@ -13,14 +13,17 @@ import lombok.RequiredArgsConstructor; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.thenextlvl.economist.EconomistPlugin; +import net.thenextlvl.economist.api.Account; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.entity.Player; import org.jetbrains.annotations.Nullable; +import java.math.BigDecimal; import java.util.Collection; import java.util.List; import java.util.Locale; +import java.util.function.BiFunction; @RequiredArgsConstructor @SuppressWarnings("UnstableApiUsage") @@ -28,95 +31,93 @@ public class EconomyCommand { private final EconomistPlugin plugin; public void register() { - var minimum = Commands.argument("amount", DoubleArgumentType.doubleArg(plugin.config().minimumPayment())); - var target = Commands.argument("player", CustomArgumentTypes.cachedOfflinePlayer()); - var targets = Commands.argument("players", ArgumentTypes.players()); var command = Commands.literal("economy") .requires(stack -> stack.getSender().hasPermission("economist.admin")) - .then(Commands.literal("give") - .then(target.then(minimum)) - .then(targets.then(minimum))) - .then(reset()) - .then(set()) - .then(Commands.literal("take") - .then(target.then(minimum)) - .then(targets.then(minimum))) - .build(); + .then(give()).then(reset()).then(set()).then(take()).build(); plugin.getLifecycleManager().registerEventHandler(LifecycleEvents.COMMANDS.newHandler(event -> event.registrar().register(command, "Manage the economy", List.of("eco")))); } + private ArgumentBuilder give() { + return create("give", "balance.deposited", "balance.deposited.world", Account::deposit, plugin.config().minimumPayment()); + } + + private ArgumentBuilder take() { + return create("take", "balance.withdrawn", "balance.withdrawn.world", Account::withdraw, plugin.config().minimumPayment()); + } + private ArgumentBuilder set() { - var amountArgument = Commands.argument("amount", DoubleArgumentType.doubleArg(0)); - var worldArgument = Commands.argument("world", ArgumentTypes.world()); - return Commands.literal("set") - .then(Commands.argument("player", CustomArgumentTypes.cachedOfflinePlayer()) - .then(amountArgument - .then(worldArgument - .executes(context -> { - var player = context.getArgument("player", OfflinePlayer.class); - var amount = context.getArgument("amount", Double.class); - var world = context.getArgument("world", World.class); - return set(context, List.of(player), amount, world); - })) - .executes(context -> { - var player = context.getArgument("player", OfflinePlayer.class); - var amount = context.getArgument("amount", Double.class); - return set(context, List.of(player), amount, null); - }))) - .then(Commands.argument("players", ArgumentTypes.players()) - .then(amountArgument - .then(worldArgument - .executes(context -> { - var players = context.getArgument("players", PlayerSelectorArgumentResolver.class); - var amount = context.getArgument("amount", Double.class); - var world = context.getArgument("world", World.class); - return set(context, List.copyOf(players.resolve(context.getSource())), amount, world); - })) - .executes(context -> { - var players = context.getArgument("players", PlayerSelectorArgumentResolver.class); - var amount = context.getArgument("amount", Double.class); - return set(context, List.copyOf(players.resolve(context.getSource())), amount, null); - }))); + return create("set", "balance.set", "balance.set.world", Account::setBalance, -Double.MAX_VALUE); } private ArgumentBuilder reset() { - var worldArgument = Commands.argument("world", ArgumentTypes.world()); return Commands.literal("reset") .then(Commands.argument("player", CustomArgumentTypes.cachedOfflinePlayer()) - .then(worldArgument.executes(context -> { + .then(Commands.argument("world", ArgumentTypes.world()).executes(context -> { var player = context.getArgument("player", OfflinePlayer.class); var world = context.getArgument("world", World.class); - return set(context, List.of(player), plugin.config().startBalance(), world); + return execute(context, "balance.reset.world", List.of(player), plugin.config().startBalance(), world, Account::setBalance); })).executes(context -> { var player = context.getArgument("player", OfflinePlayer.class); - return set(context, List.of(player), plugin.config().startBalance(), null); + return execute(context, "balance.reset", List.of(player), plugin.config().startBalance(), null, Account::setBalance); })) .then(Commands.argument("players", ArgumentTypes.players()) - .then(worldArgument.executes(context -> { + .then(Commands.argument("world", ArgumentTypes.world()).executes(context -> { var players = context.getArgument("players", PlayerSelectorArgumentResolver.class); var resolve = players.resolve(context.getSource()); var world = context.getArgument("world", World.class); - return set(context, resolve, plugin.config().startBalance(), world); + return execute(context, "balance.reset.world", resolve, plugin.config().startBalance(), world, Account::setBalance); })).executes(context -> { var players = context.getArgument("players", PlayerSelectorArgumentResolver.class); var resolve = players.resolve(context.getSource()); - return set(context, resolve, plugin.config().startBalance(), null); + return execute(context, "balance.reset", resolve, plugin.config().startBalance(), null, Account::setBalance); })); } - private int set(CommandContext context, Collection players, Number amount, @Nullable World world) { + private ArgumentBuilder create(String command, String successMessage, String successMessageWorld, + BiFunction function, Double minimum) { + return Commands.literal(command) + .then(Commands.argument("player", CustomArgumentTypes.cachedOfflinePlayer()) + .then(Commands.argument("amount", DoubleArgumentType.doubleArg(minimum)) + .then(Commands.argument("world", ArgumentTypes.world()).executes(context -> { + var player = context.getArgument("player", OfflinePlayer.class); + var amount = context.getArgument("amount", Double.class); + var world = context.getArgument("world", World.class); + return execute(context, successMessageWorld, List.of(player), amount, world, function); + })).executes(context -> { + var player = context.getArgument("player", OfflinePlayer.class); + var amount = context.getArgument("amount", Double.class); + return execute(context, successMessage, List.of(player), amount, null, function); + }))) + .then(Commands.argument("players", ArgumentTypes.players()) + .then(Commands.argument("amount", DoubleArgumentType.doubleArg(minimum)) + .then(Commands.argument("world", ArgumentTypes.world()).executes(context -> { + var players = context.getArgument("players", PlayerSelectorArgumentResolver.class); + var amount = context.getArgument("amount", Double.class); + var world = context.getArgument("world", World.class); + return execute(context, successMessageWorld, List.copyOf(players.resolve(context.getSource())), amount, world, function); + })).executes(context -> { + var players = context.getArgument("players", PlayerSelectorArgumentResolver.class); + var amount = context.getArgument("amount", Double.class); + return execute(context, successMessage, List.copyOf(players.resolve(context.getSource())), amount, null, function); + }))); + } + + private int execute(CommandContext context, String successMessage, + Collection players, Number amount, @Nullable World world, + BiFunction function) { var sender = context.getSource().getSender(); var locale = sender instanceof Player p ? p.locale() : Locale.US; if (!players.isEmpty()) players.forEach(player -> (world != null ? plugin.economyController().tryGetAccount(player, world) : plugin.economyController().tryGetAccount(player)) .thenAccept(optional -> optional.ifPresentOrElse(account -> { - var balance = account.setBalance(amount); - plugin.bundle().sendMessage(sender, world != null ? "balance.reset.world" : "balance.reset", + var balance = function.apply(account, amount); + plugin.bundle().sendMessage(sender, successMessage, Placeholder.parsed("world", world != null ? world.key().asString() : "null"), Placeholder.parsed("player", String.valueOf(player.getName())), Placeholder.parsed("balance", plugin.economyController().format(balance, locale)), + Placeholder.parsed("amount", plugin.economyController().format(amount, locale)), Placeholder.parsed("symbol", plugin.economyController().getCurrencySymbol())); }, () -> plugin.bundle().sendMessage(sender, world != null ? "account.not-found.world" : "account.not-found", Placeholder.parsed("player", String.valueOf(player.getName())),