diff --git a/bukkit/site/lab0x13/scrow/commands/bukkit/suggestionprovider/PlayerSuggestionProvider.java b/bukkit/site/lab0x13/scrow/commands/bukkit/suggestionprovider/PlayerSuggestionProvider.java new file mode 100644 index 0000000..f8f22af --- /dev/null +++ b/bukkit/site/lab0x13/scrow/commands/bukkit/suggestionprovider/PlayerSuggestionProvider.java @@ -0,0 +1,17 @@ +package site.lab0x13.scrow.commands.bukkit.suggestionprovider; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import site.lab0x13.scrow.commands.model.CommandContext; +import site.lab0x13.scrow.commands.model.SuggestionProvider; + +import java.util.List; + +public final class PlayerSuggestionProvider> implements SuggestionProvider { + @Override + public List suggest(C __, String ___) { + return Bukkit.getOnlinePlayers().stream() + .map(Player::getName) + .toList(); + } +} diff --git a/bukkit/site/lab0x13/scrow/commands/bukkit/type/OfflinePlayerArgumentType.java b/bukkit/site/lab0x13/scrow/commands/bukkit/type/OfflinePlayerArgumentType.java new file mode 100644 index 0000000..736e943 --- /dev/null +++ b/bukkit/site/lab0x13/scrow/commands/bukkit/type/OfflinePlayerArgumentType.java @@ -0,0 +1,33 @@ +package site.lab0x13.scrow.commands.bukkit.type; + +import com.leakyabstractions.result.api.Result; +import com.leakyabstractions.result.core.Results; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import site.lab0x13.scrow.commands.bukkit.suggestionprovider.PlayerSuggestionProvider; +import site.lab0x13.scrow.commands.model.CommandContext; +import site.lab0x13.scrow.commands.model.SuggestionProvider; +import site.lab0x13.scrow.commands.model.argument.ArgumentType; + +import java.util.UUID; + +public class OfflinePlayerArgumentType> implements ArgumentType { + + @Override + public Result parseInput(String string) { + // UUIDs are always 36 chars + if (string.length() == 36) + return Results.ofCallable(() -> Bukkit.getOfflinePlayer(UUID.fromString(string))) + .mapFailure(_ -> "Invalid UUID."); + + var player = Bukkit.getPlayerExact(string); + if (player == null || (!player.hasPlayedBefore() && !player.isOnline())) + return Results.failure("Player not found."); + return Results.success(player); + } + + @Override + public SuggestionProvider defaultSuggestionProvider() { + return new PlayerSuggestionProvider<>(); + } +} diff --git a/bukkit/site/lab0x13/scrow/commands/bukkit/type/PlayerArgumentType.java b/bukkit/site/lab0x13/scrow/commands/bukkit/type/PlayerArgumentType.java new file mode 100644 index 0000000..a4ee350 --- /dev/null +++ b/bukkit/site/lab0x13/scrow/commands/bukkit/type/PlayerArgumentType.java @@ -0,0 +1,37 @@ +package site.lab0x13.scrow.commands.bukkit.type; + +import com.leakyabstractions.result.api.Result; +import com.leakyabstractions.result.core.Results; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import site.lab0x13.scrow.commands.bukkit.suggestionprovider.PlayerSuggestionProvider; +import site.lab0x13.scrow.commands.model.CommandContext; +import site.lab0x13.scrow.commands.model.SuggestionProvider; +import site.lab0x13.scrow.commands.model.argument.ArgumentType; + +import java.util.UUID; + +public class PlayerArgumentType> implements ArgumentType { + + @Override + public Result parseInput(String input) { + // UUIDs are always 36 chars + Player player; + if (input.length() == 36) { + try { + player = Bukkit.getPlayer(UUID.fromString(input)); + } catch (IllegalArgumentException _) { + return Results.failure("Invalid UUID."); + } + } else { + player = Bukkit.getPlayer(input); + } + + return Results.ofNullable(player, "Player not online."); + } + + @Override + public SuggestionProvider defaultSuggestionProvider() { + return new PlayerSuggestionProvider<>(); + } +} diff --git a/bukkit/site/lab0x13/scrow/commands/bukkit/type/WorldArgumentType.java b/bukkit/site/lab0x13/scrow/commands/bukkit/type/WorldArgumentType.java new file mode 100644 index 0000000..632c2cb --- /dev/null +++ b/bukkit/site/lab0x13/scrow/commands/bukkit/type/WorldArgumentType.java @@ -0,0 +1,38 @@ +package site.lab0x13.scrow.commands.bukkit.type; + +import com.leakyabstractions.result.api.Result; +import com.leakyabstractions.result.core.Results; +import org.bukkit.Bukkit; +import org.bukkit.World; +import site.lab0x13.scrow.commands.model.CommandContext; +import site.lab0x13.scrow.commands.model.SuggestionProvider; +import site.lab0x13.scrow.commands.model.argument.ArgumentType; + +import java.util.UUID; +import java.util.stream.Stream; + +public class WorldArgumentType> implements ArgumentType { + @Override + public Result parseInput(String input) { + World world; + if (input.length() == 36) { + try { + world = Bukkit.getWorld(UUID.fromString(input)); + } catch (IllegalArgumentException _) { + return Results.failure("Invalid UUID."); + } + } else { + world = Bukkit.getWorld(input); + } + + return Results.ofNullable(world, "World not found"); + } + + @Override + public SuggestionProvider defaultSuggestionProvider() { + return (_, _) -> Stream.concat( + Bukkit.getWorlds().stream().map(World::getName), + Bukkit.getWorlds().stream().map(w -> w.getUID().toString()) + ).toList(); + } +} diff --git a/defs.bzl b/defs.bzl index 804a5d5..e29bd24 100644 --- a/defs.bzl +++ b/defs.bzl @@ -1,2 +1,2 @@ GROUP = "site.lab0x13.scrow" -VERSION = "0.5" \ No newline at end of file +VERSION = "0.6" \ No newline at end of file diff --git a/velocity/site/lab0x13/scrow/commands/velocity/suggestionprovider/PlayerSuggestionProvider.java b/velocity/site/lab0x13/scrow/commands/velocity/suggestionprovider/PlayerSuggestionProvider.java new file mode 100644 index 0000000..3e90e07 --- /dev/null +++ b/velocity/site/lab0x13/scrow/commands/velocity/suggestionprovider/PlayerSuggestionProvider.java @@ -0,0 +1,24 @@ +package suggestionprovider; + +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import site.lab0x13.scrow.commands.model.CommandContext; +import site.lab0x13.scrow.commands.model.SuggestionProvider; + +import java.util.List; + +public final class PlayerSuggestionProvider> implements SuggestionProvider { + + private final ProxyServer proxyServer; + + public PlayerSuggestionProvider(ProxyServer proxyServer) { + this.proxyServer = proxyServer; + } + + @Override + public List suggest(C __, String ___) { + return proxyServer.getAllPlayers().stream() + .map(Player::getUsername) + .toList(); + } +} diff --git a/velocity/site/lab0x13/scrow/commands/velocity/type/PlayerArgumentType.java b/velocity/site/lab0x13/scrow/commands/velocity/type/PlayerArgumentType.java new file mode 100644 index 0000000..3ff4f0e --- /dev/null +++ b/velocity/site/lab0x13/scrow/commands/velocity/type/PlayerArgumentType.java @@ -0,0 +1,43 @@ +package type; + +import com.leakyabstractions.result.api.Result; +import com.leakyabstractions.result.core.Results; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import site.lab0x13.scrow.commands.model.CommandContext; +import site.lab0x13.scrow.commands.model.SuggestionProvider; +import site.lab0x13.scrow.commands.model.argument.ArgumentType; +import suggestionprovider.PlayerSuggestionProvider; + +import java.util.UUID; + +public class PlayerArgumentType> implements ArgumentType { + + private final ProxyServer server; + + public PlayerArgumentType(ProxyServer server) { + this.server = server; + } + + @Override + public Result parseInput(String input) { + Player player; + if (input.length() == 36) { + try { + player = server.getPlayer(UUID.fromString(input)).orElse(null); + } catch (IllegalArgumentException _) { + return Results.failure("Invalid UUID."); + } + } else { + player = server.getPlayer(input).orElse(null); + } + + return Results.ofNullable(player, "Player not online."); + } + + @Override + public SuggestionProvider defaultSuggestionProvider() { + return new PlayerSuggestionProvider<>(server); + } +}