From f94093239f019c5be4a4d5b692414fdd2a4aa8c5 Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Sat, 27 Apr 2019 16:46:13 +1000 Subject: [PATCH] Setup a registry converter --- .../worldedit/command/WorldEditCommands.java | 20 ++-- .../command/argument/NumberParser.java | 6 +- .../command/argument/RegistryConverter.java | 98 +++++++++++++++++++ .../command/argument/StringParser.java | 6 +- .../platform/PlatformCommandManager.java | 2 + 5 files changed, 120 insertions(+), 12 deletions(-) create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java index 7586b0109..0d19d1538 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java @@ -48,6 +48,7 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.TextStyle; +import java.time.zone.ZoneRulesException; import java.util.List; import java.util.Locale; @@ -68,7 +69,7 @@ public class WorldEditCommands { ) public void version(Actor actor) throws WorldEditException { actor.print("WorldEdit version " + WorldEdit.getVersion()); - actor.print("https://github.com/sk89q/worldedit/"); + actor.print("https://github.com/EngineHub/worldedit/"); PlatformManager pm = we.getPlatformManager(); @@ -141,13 +142,16 @@ public class WorldEditCommands { public void tz(Player player, LocalSession session, @Arg(desc = "The timezone to set") String timezone) throws WorldEditException { - ZoneId tz = ZoneId.of(timezone); - session.setTimezone(tz); - player.print("Timezone set for this session to: " + tz.getDisplayName( - TextStyle.FULL, Locale.ENGLISH - )); - player.print("The current time in that timezone is: " - + dateFormat.format(ZonedDateTime.now(tz))); + try { + ZoneId tz = ZoneId.of(timezone); + session.setTimezone(tz); + player.print("Timezone set for this session to: " + tz.getDisplayName( + TextStyle.FULL, Locale.ENGLISH + )); + player.print("The current time in that timezone is: " + dateFormat.format(ZonedDateTime.now(tz))); + } catch (ZoneRulesException e) { + player.printError("Invalid timezone"); + } } @Command( diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/NumberParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/NumberParser.java index 349089e50..dcb06b4f9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/NumberParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/NumberParser.java @@ -29,17 +29,19 @@ import com.sk89q.worldedit.util.command.composition.CommandExecutor; import java.util.Collections; import java.util.List; +import javax.annotation.Nullable; + public class NumberParser implements CommandExecutor { private final String name; private final String description; - private final String defaultSuggestion; + private final @Nullable String defaultSuggestion; public NumberParser(String name, String description) { this(name, description, null); } - public NumberParser(String name, String description, String defaultSuggestion) { + public NumberParser(String name, String description, @Nullable String defaultSuggestion) { this.name = name; this.description = description; this.defaultSuggestion = defaultSuggestion; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java new file mode 100644 index 000000000..5e9d2ed66 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/RegistryConverter.java @@ -0,0 +1,98 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.command.argument; + +import com.sk89q.worldedit.registry.Registry; +import com.sk89q.worldedit.util.formatting.text.Component; +import com.sk89q.worldedit.util.formatting.text.TextComponent; +import com.sk89q.worldedit.world.biome.BiomeType; +import com.sk89q.worldedit.world.block.BlockCategory; +import com.sk89q.worldedit.world.block.BlockType; +import com.sk89q.worldedit.world.entity.EntityType; +import com.sk89q.worldedit.world.fluid.FluidCategory; +import com.sk89q.worldedit.world.fluid.FluidType; +import com.sk89q.worldedit.world.gamemode.GameMode; +import com.sk89q.worldedit.world.item.ItemCategory; +import com.sk89q.worldedit.world.item.ItemType; +import com.sk89q.worldedit.world.weather.WeatherType; +import org.enginehub.piston.CommandManager; +import org.enginehub.piston.converter.ArgumentConverter; +import org.enginehub.piston.converter.ConversionResult; +import org.enginehub.piston.converter.FailedConversion; +import org.enginehub.piston.converter.SuccessfulConversion; +import org.enginehub.piston.inject.InjectedValueAccess; +import org.enginehub.piston.inject.Key; + +import java.util.List; +import java.util.stream.Collectors; + +public class RegistryConverter implements ArgumentConverter { + + public static void register(CommandManager commandManager) { + commandManager.registerConverter(Key.of(BlockType.class), + new RegistryConverter<>(BlockType.class, BlockType.REGISTRY)); + commandManager.registerConverter(Key.of(BlockCategory.class), + new RegistryConverter<>(BlockCategory.class, BlockCategory.REGISTRY)); + commandManager.registerConverter(Key.of(ItemType.class), + new RegistryConverter<>(ItemType.class, ItemType.REGISTRY)); + commandManager.registerConverter(Key.of(ItemCategory.class), + new RegistryConverter<>(ItemCategory.class, ItemCategory.REGISTRY)); + commandManager.registerConverter(Key.of(BiomeType.class), + new RegistryConverter<>(BiomeType.class, BiomeType.REGISTRY)); + commandManager.registerConverter(Key.of(EntityType.class), + new RegistryConverter<>(EntityType.class, EntityType.REGISTRY)); + commandManager.registerConverter(Key.of(FluidType.class), + new RegistryConverter<>(FluidType.class, FluidType.REGISTRY)); + commandManager.registerConverter(Key.of(FluidCategory.class), + new RegistryConverter<>(FluidCategory.class, FluidCategory.REGISTRY)); + commandManager.registerConverter(Key.of(GameMode.class), + new RegistryConverter<>(GameMode.class, GameMode.REGISTRY)); + commandManager.registerConverter(Key.of(WeatherType.class), + new RegistryConverter<>(WeatherType.class, WeatherType.REGISTRY)); + } + + private final Registry registry; + private final TextComponent choices; + + public RegistryConverter(Class clazz, Registry registry) { + this.registry = registry; + this.choices = TextComponent.of("any " + clazz.getSimpleName()); + } + + @Override + public Component describeAcceptableArguments() { + return this.choices; + } + + @Override + public ConversionResult convert(String argument, InjectedValueAccess injectedValueAccess) { + V result = registry.get(argument); + return result == null + ? FailedConversion.from(new IllegalArgumentException("Not a valid choice: " + argument)) + : SuccessfulConversion.fromSingle(result); + } + + @Override + public List getSuggestions(String input) { + return registry.keySet().stream() + .filter(string -> string.startsWith(input)) + .collect(Collectors.toList()); + } +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/StringParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/StringParser.java index 298f999e4..30c02381f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/StringParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/StringParser.java @@ -29,17 +29,19 @@ import com.sk89q.worldedit.util.command.composition.CommandExecutor; import java.util.Collections; import java.util.List; +import javax.annotation.Nullable; + public class StringParser implements CommandExecutor { private final String name; private final String description; - private final String defaultSuggestion; + private final @Nullable String defaultSuggestion; public StringParser(String name, String description) { this(name, description, null); } - public StringParser(String name, String description, String defaultSuggestion) { + public StringParser(String name, String description, @Nullable String defaultSuggestion) { this.name = name; this.description = description; this.defaultSuggestion = defaultSuggestion; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java index b8e5f2101..c8f363a11 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java @@ -75,6 +75,7 @@ import com.sk89q.worldedit.command.argument.EnumConverter; import com.sk89q.worldedit.command.argument.ExpandAmountConverter; import com.sk89q.worldedit.command.argument.FactoryConverter; import com.sk89q.worldedit.command.argument.RegionFactoryConverter; +import com.sk89q.worldedit.command.argument.RegistryConverter; import com.sk89q.worldedit.command.argument.VectorConverter; import com.sk89q.worldedit.command.argument.ZonedDateTimeConverter; import com.sk89q.worldedit.command.util.PermissionCondition; @@ -196,6 +197,7 @@ public final class PlatformCommandManager { } VectorConverter.register(commandManager); EnumConverter.register(commandManager); + RegistryConverter.register(commandManager); ExpandAmountConverter.register(commandManager); ZonedDateTimeConverter.register(commandManager); BooleanConverter.register(commandManager);