From c7119dc115b28211cb4c5d271320be20b147fb8a Mon Sep 17 00:00:00 2001 From: broccolai Date: Sat, 19 Sep 2020 06:09:19 +0000 Subject: [PATCH] Add player arguments --- .../arguments/standard/UUIDArgument.java | 5 - .../bukkit/parsers/OfflinePlayerArgument.java | 187 ++++++++++++++++++ .../bukkit/parsers/PlayerArgument.java | 182 +++++++++++++++++ 3 files changed, 369 insertions(+), 5 deletions(-) create mode 100644 cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/OfflinePlayerArgument.java create mode 100644 cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/PlayerArgument.java diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/UUIDArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/UUIDArgument.java index 393bac7b..18c09573 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/UUIDArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/UUIDArgument.java @@ -27,13 +27,8 @@ import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.parser.ArgumentParseResult; import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.context.CommandContext; -import com.intellectualsites.commands.arguments.CommandArgument; -import com.intellectualsites.commands.arguments.parser.ArgumentParseResult; -import com.intellectualsites.commands.arguments.parser.ArgumentParser; -import com.intellectualsites.commands.context.CommandContext; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.util.List; import java.util.Queue; import java.util.UUID; diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/OfflinePlayerArgument.java b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/OfflinePlayerArgument.java new file mode 100644 index 00000000..e7b3b1d8 --- /dev/null +++ b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/OfflinePlayerArgument.java @@ -0,0 +1,187 @@ +// +// MIT License +// +// Copyright (c) 2020 Alexander Söderberg +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.bukkit.parsers; + +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.context.CommandContext; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +@SuppressWarnings("unused") +public final class OfflinePlayerArgument extends CommandArgument { + private OfflinePlayerArgument(final boolean required, + @Nonnull final String name, + @Nonnull final String defaultValue, + @Nonnull final BiFunction, String, List> suggestionsProvider) { + super(required, name, new OfflinePlayerParser<>(), defaultValue, OfflinePlayer.class, suggestionsProvider); + } + + /** + * Create a new builder + * + * @param name Name of the component + * @param Command sender type + * @return Created builder + */ + @Nonnull + public static Builder newBuilder(@Nonnull final String name) { + return new Builder<>(name); + } + + /** + * Create a new required command component + * + * @param name Component name + * @param Command sender type + * @return Created component + */ + @Nonnull + public static CommandArgument required(@Nonnull final String name) { + return OfflinePlayerArgument.newBuilder(name).asRequired().build(); + } + + /** + * Create a new optional command component + * + * @param name Component name + * @param Command sender type + * @return Created component + */ + @Nonnull + public static CommandArgument optional(@Nonnull final String name) { + return OfflinePlayerArgument.newBuilder(name).asOptional().build(); + } + + /** + * Create a new required command component with a default value + * + * @param name Component name + * @param defaultNum Default num + * @param Command sender type + * @return Created component + */ + @Nonnull + public static CommandArgument optional(@Nonnull final String name, + final String defaultNum) { + return OfflinePlayerArgument.newBuilder(name).asOptionalWithDefault(defaultNum).build(); + } + + + public static final class Builder extends CommandArgument.Builder { + + protected Builder(@Nonnull final String name) { + super(OfflinePlayer.class, name); + } + + /** + * Builder a new boolean component + * + * @return Constructed component + */ + @Nonnull + @Override + public OfflinePlayerArgument build() { + return new OfflinePlayerArgument<>(this.isRequired(), this.getName(), this.getDefaultValue(), + this.getSuggestionsProvider()); + } + + } + + + private static final class OfflinePlayerParser implements ArgumentParser { + + private OfflinePlayerParser() { + } + + @Nonnull + @Override + public ArgumentParseResult parse(@Nonnull final CommandContext commandContext, + @Nonnull final Queue inputQueue) { + final String input = inputQueue.peek(); + if (input == null) { + return ArgumentParseResult.failure(new NullPointerException("No input was provided")); + } + inputQueue.remove(); + + //noinspection deprecation + OfflinePlayer player = Bukkit.getOfflinePlayer(input); + + if (player == null || (!player.hasPlayedBefore() && !player.isOnline())) { + return ArgumentParseResult.failure(new OfflinePlayerParseException(input)); + } + + return ArgumentParseResult.success(player); + } + + @Nonnull + @Override + public List suggestions(@Nonnull final CommandContext commandContext, + @Nonnull final String input) { + List output = new ArrayList<>(); + + for (Player player : Bukkit.getOnlinePlayers()) { + output.add(player.getName()); + } + + return output; + } + } + + + /** + * Player parse exception + */ + public static final class OfflinePlayerParseException extends IllegalArgumentException { + + private final String input; + + /** + * Construct a new boolean parse exception + * + * @param input String input + */ + public OfflinePlayerParseException(@Nonnull final String input) { + this.input = input; + } + + /** + * Get the supplied input + * + * @return String value + */ + public String getInput() { + return input; + } + + } +} diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/PlayerArgument.java b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/PlayerArgument.java new file mode 100644 index 00000000..8eb854ab --- /dev/null +++ b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/PlayerArgument.java @@ -0,0 +1,182 @@ +// +// MIT License +// +// Copyright (c) 2020 Alexander Söderberg +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +package cloud.commandframework.bukkit.parsers; + +import cloud.commandframework.arguments.CommandArgument; +import cloud.commandframework.arguments.parser.ArgumentParseResult; +import cloud.commandframework.arguments.parser.ArgumentParser; +import cloud.commandframework.context.CommandContext; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.function.BiFunction; + +@SuppressWarnings("unused") +public final class PlayerArgument extends CommandArgument { + private PlayerArgument(final boolean required, + @Nonnull final String name, + @Nonnull final String defaultValue, + @Nonnull final BiFunction, String, List> suggestionsProvider) { + super(required, name, new PlayerParser<>(), defaultValue, Player.class, suggestionsProvider); + } + + /** + * Create a new builder + * + * @param name Name of the component + * @param Command sender type + * @return Created builder + */ + @Nonnull + public static Builder newBuilder(@Nonnull final String name) { + return new Builder<>(name); + } + + /** + * Create a new required command component + * + * @param name Component name + * @param Command sender type + * @return Created component + */ + @Nonnull + public static CommandArgument required(@Nonnull final String name) { + return PlayerArgument.newBuilder(name).asRequired().build(); + } + + /** + * Create a new optional command component + * + * @param name Component name + * @param Command sender type + * @return Created component + */ + @Nonnull + public static CommandArgument optional(@Nonnull final String name) { + return PlayerArgument.newBuilder(name).asOptional().build(); + } + + /** + * Create a new required command component with a default value + * + * @param name Component name + * @param defaultNum Default num + * @param Command sender type + * @return Created component + */ + @Nonnull + public static CommandArgument optional(@Nonnull final String name, + final String defaultNum) { + return PlayerArgument.newBuilder(name).asOptionalWithDefault(defaultNum).build(); + } + + + public static final class Builder extends CommandArgument.Builder { + + protected Builder(@Nonnull final String name) { + super(Player.class, name); + } + + /** + * Builder a new boolean component + * + * @return Constructed component + */ + @Nonnull + @Override + public PlayerArgument build() { + return new PlayerArgument<>(this.isRequired(), this.getName(), this.getDefaultValue(), this.getSuggestionsProvider()); + } + + } + + + private static final class PlayerParser implements ArgumentParser { + + @Nonnull + @Override + public ArgumentParseResult parse(@Nonnull final CommandContext commandContext, + @Nonnull final Queue inputQueue) { + final String input = inputQueue.peek(); + if (input == null) { + return ArgumentParseResult.failure(new NullPointerException("No input was provided")); + } + inputQueue.remove(); + + //noinspection deprecation + Player player = Bukkit.getPlayer(input); + + if (player == null) { + return ArgumentParseResult.failure(new PlayerParseException(input)); + } + + return ArgumentParseResult.success(player); + } + + @Nonnull + @Override + public List suggestions(@Nonnull final CommandContext commandContext, + @Nonnull final String input) { + List output = new ArrayList<>(); + + for (Player player : Bukkit.getOnlinePlayers()) { + output.add(player.getName()); + } + + return output; + } + } + + + /** + * Player parse exception + */ + public static final class PlayerParseException extends IllegalArgumentException { + + private final String input; + + /** + * Construct a new boolean parse exception + * + * @param input String input + */ + public PlayerParseException(@Nonnull final String input) { + this.input = input; + } + + /** + * Get the supplied input + * + * @return String value + */ + public String getInput() { + return input; + } + + } +}