diff --git a/src/main/java/com/volmit/iris/core/decrees/DecreeIris.java b/src/main/java/com/volmit/iris/core/decrees/DecreeIris.java index f7ec71182..da910648d 100644 --- a/src/main/java/com/volmit/iris/core/decrees/DecreeIris.java +++ b/src/main/java/com/volmit/iris/core/decrees/DecreeIris.java @@ -20,13 +20,16 @@ package com.volmit.iris.core.decrees; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.annotations.Decree; +import com.volmit.iris.util.decree.annotations.Param; @Decree(name = "irisd", aliases = {"ird"}, description = "Basic Command") public class DecreeIris implements DecreeExecutor { @Decree(description = "Ping self", aliases = "p") - public void ping() + public void ping( + @Param(name = "message",defaultValue = "Pong", aliases = {"msg", "m"}) + String message) { - sender().sendMessage("Pong!"); + sender().sendMessage(message + "!"); } } diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java b/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java index 4993e5ab1..75034f3ad 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java +++ b/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java @@ -20,10 +20,14 @@ package com.volmit.iris.util.decree; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.annotations.Param; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.exceptions.DecreeWhichException; +import lombok.Data; import java.lang.reflect.Parameter; import java.util.Arrays; +@Data public class DecreeParameter { private final Parameter parameter; private final Param param; @@ -53,16 +57,12 @@ public class DecreeParameter { } public boolean isRequired() { - return param.value().equals(Param.REQUIRED); + return param.required(); } public KList getNames() { KList d = new KList<>(); - if (Arrays.equals(param.aliases(), new String[]{Param.NO_ALIAS})){ - return d; - } - for(String i : param.aliases()) { if(i.isEmpty()) @@ -78,4 +78,8 @@ public class DecreeParameter { return d; } + + public Object getDefaultValue() throws DecreeParsingException, DecreeWhichException { + return param.defaultValue().isEmpty() ? null : getHandler().parse(param.defaultValue()); + } } diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java b/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java index 7cf9e79fd..341ef6009 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java +++ b/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java @@ -21,6 +21,7 @@ package com.volmit.iris.util.decree; import com.volmit.iris.Iris; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.virtual.VirtualDecreeCommand; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.J; import org.bukkit.command.Command; @@ -51,7 +52,12 @@ public interface DecreeSystem extends CommandExecutor, TabCompleter { @Override default boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - J.aBukkit(() -> call(new VolmitSender(sender), args)); + J.aBukkit(() -> { + if(!call(new VolmitSender(sender), args)) + { + sender.sendMessage(C.RED + "Unknown Iris Command"); + } + }); return true; } diff --git a/src/main/java/com/volmit/iris/util/decree/annotations/Param.java b/src/main/java/com/volmit/iris/util/decree/annotations/Param.java index 022934464..dab1c9c83 100644 --- a/src/main/java/com/volmit/iris/util/decree/annotations/Param.java +++ b/src/main/java/com/volmit/iris/util/decree/annotations/Param.java @@ -26,10 +26,6 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface Param { - String REQUIRED = "REQUIRED"; - - String NO_ALIAS = ""; - String DEFAULT_DESCRIPTION = "No Description Provided"; /** @@ -39,6 +35,8 @@ public @interface Param { */ String name(); + boolean required() default false; + /** * The description of this parameter, used in help-popups in game.
* The default value is {@link #DEFAULT_DESCRIPTION} @@ -48,15 +46,15 @@ public @interface Param { /** * The default value for this argument.
* The entered string is parsed to the value similarly to how commandline-text would be.
- * Default is {@link #REQUIRED}, which indicates the variable MUST be defined by the person running the command.
+ * Which indicates the variable MUST be defined by the person running the command.
* If you define this, the variable automatically becomes non-required, but can still be set. */ - String value() default REQUIRED; + String defaultValue() default ""; /** * The aliases of this parameter (instead of just the {@link #name() name} (if specified) or Method Name (name of method))
* Can be initialized as just a string (ex. "alias") or as an array (ex. {"alias1", "alias2"})
* If someone uses /plugin foo bar=baz and you specify alias="b" here, /plugin foo b=baz will do the exact same. */ - String[] aliases() default {NO_ALIAS}; + String[] aliases() default ""; } diff --git a/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java b/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java index 2640fa832..f3139a0a7 100644 --- a/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java +++ b/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java @@ -29,6 +29,7 @@ import com.volmit.iris.util.decree.annotations.Decree; import com.volmit.iris.util.decree.exceptions.DecreeParsingException; import com.volmit.iris.util.decree.exceptions.DecreeWhichException; import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.J; import lombok.Data; @@ -203,7 +204,7 @@ public class VirtualDecreeCommand { if(param == null) { Iris.debug("Can't find parameter key for " + key + "=" + value + " in " + getPath()); - // TODO: WARN UNKNOWN PARAMETER + sender.sendMessage(C.YELLOW + "Unknown Parameter: " + key); continue; } @@ -213,7 +214,7 @@ public class VirtualDecreeCommand { data.put(key, param.getHandler().parse(value)); } catch (DecreeParsingException e) { Iris.debug("Can't parse parameter value for " + key + "=" + value + " in " + getPath() + " using handler " + param.getHandler().getClass().getSimpleName()); - // TODO: WARN BAD PARAM + sender.sendMessage(C.RED + "Cannot convert \"" + value + "\" into a " + param.getType().getSimpleName()); return null; } catch (DecreeWhichException e) { KList validOptions = param.getHandler().getPossibilities(value); @@ -232,21 +233,21 @@ public class VirtualDecreeCommand { try { data.put(par.getName(), par.getHandler().parse(i)); } catch (DecreeParsingException e) { - Iris.debug("Can't parse parameter value for " + par.getNames() + "=" + i + " in " + getPath() + " using handler " + par.getHandler().getClass().getSimpleName()); - // TODO: WARN BAD PARAM + Iris.debug("Can't parse parameter value for " + par.getName() + "=" + i + " in " + getPath() + " using handler " + par.getHandler().getClass().getSimpleName()); + sender.sendMessage(C.RED + "Cannot convert \"" + i + "\" into a " + par.getType().getSimpleName()); return null; } catch (DecreeWhichException e) { - Iris.debug("Can't parse parameter value for " + par.getNames() + "=" + i + " in " + getPath() + " using handler " + par.getHandler().getClass().getSimpleName()); + Iris.debug("Can't parse parameter value for " + par.getName() + "=" + i + " in " + getPath() + " using handler " + par.getHandler().getClass().getSimpleName()); KList validOptions = par.getHandler().getPossibilities(i); - String update = null; - Iris.debug("Client chose " + update + " for " + par.getNames() + "=" + i + " (old) in " + getPath()); + String update = null; // TODO: PICK ONE + Iris.debug("Client chose " + update + " for " + par.getName() + "=" + i + " (old) in " + getPath()); in.set(ix--, update); } } - catch(ArrayIndexOutOfBoundsException e) + catch(IndexOutOfBoundsException e) { - // TODO: Ignoring parameter (not in method anywhere + sender.sendMessage(C.YELLOW + "Unknown Parameter: " + i + " (" + Form.getNumberSuffixThStRd(ix+1) + " argument)"); } } } @@ -276,20 +277,7 @@ public class VirtualDecreeCommand { if(args.isEmpty()) { - int m = getNodes().size(); - - if(getNodes().isNotEmpty()) - { - for(VirtualDecreeCommand i : getNodes()) - { - sender.sendMessage(i.getPath() + " - " + i.getDescription()); - } - } - - else - { - sender.sendMessage(C.RED + "There are no subcommands in this group! Contact support, this is a command design issue!"); - } + sender.sendDecreeHelp(this); return true; } @@ -320,11 +308,41 @@ public class VirtualDecreeCommand { { Object value = map.get(i.getName()); + try + { + if(value == null && !i.getParam().defaultValue().trim().isEmpty()) + { + value = i.getDefaultValue(); + } + } + catch (DecreeParsingException e) { + Iris.debug("Can't parse parameter value for " + i.getName() + "=" + i + " in " + getPath() + " using handler " + i.getHandler().getClass().getSimpleName()); + sender.sendMessage(C.RED + "Cannot convert \"" + i + "\" into a " + i.getType().getSimpleName()); + return false; + } catch (DecreeWhichException e) { + Iris.debug("Can't parse parameter value for " + i.getName() + "=" + i + " in " + getPath() + " using handler " + i.getHandler().getClass().getSimpleName()); + KList validOptions = i.getHandler().getPossibilities(i.getParam().defaultValue()); + String update = null; // TODO: PICK ONE + Iris.debug("Client chose " + update + " for " + i.getName() + "=" + i + " (old) in " + getPath()); + try + { + value = i.getDefaultValue(); + } + catch (DecreeParsingException x) { + x.printStackTrace(); + Iris.debug("Can't parse parameter value for " + i.getName() + "=" + i + " in " + getPath() + " using handler " + i.getHandler().getClass().getSimpleName()); + sender.sendMessage(C.RED + "Cannot convert \"" + i + "\" into a " + i.getType().getSimpleName()); + return false; + } catch (DecreeWhichException x) { + x.printStackTrace(); + } + } + if(value == null) { if(i.isRequired()) { - // TODO: REQUIRED... UNDEFINED + sender.sendMessage("Missing: " + i.getName() + " (" + i.getType().getSimpleName() + ") as the " + Form.getNumberSuffixThStRd(vm+1) + " argument."); return false; } } diff --git a/src/main/java/com/volmit/iris/util/format/Form.java b/src/main/java/com/volmit/iris/util/format/Form.java index fc043ced5..7f7c80022 100644 --- a/src/main/java/com/volmit/iris/util/format/Form.java +++ b/src/main/java/com/volmit/iris/util/format/Form.java @@ -18,6 +18,7 @@ package com.volmit.iris.util.format; +import com.google.common.base.Preconditions; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RollingSequence; @@ -38,6 +39,18 @@ public class Form { private static final BigInteger THOUSAND = BigInteger.valueOf(1000); private static final NavigableMap MAP; + public static String getNumberSuffixThStRd(int day) { + if (day >= 11 && day <= 13) { + return Form.f(day) + "th"; + } + return switch (day % 10) { + case 1 -> Form.f(day) + "st"; + case 2 -> Form.f(day) + "nd"; + case 3 -> Form.f(day) + "rd"; + default -> Form.f(day) + "th"; + }; + } + static { MAP = new TreeMap<>(); for (int i = 0; i < NAMES.length; i++) { diff --git a/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java b/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java index b158336ad..a10440da8 100644 --- a/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java +++ b/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java @@ -20,6 +20,7 @@ package com.volmit.iris.util.plugin; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.util.decree.virtual.VirtualDecreeCommand; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.math.M; @@ -333,4 +334,21 @@ public class VolmitSender implements CommandSender { public Spigot spigot() { return s.spigot(); } + + public void sendDecreeHelp(VirtualDecreeCommand v) { + int m = v.getNodes().size(); + + if(v.getNodes().isNotEmpty()) + { + for(VirtualDecreeCommand i : v.getNodes()) + { + sendMessage(i.getPath() + " - " + i.getDescription()); + } + } + + else + { + sendMessage(C.RED + "There are no subcommands in this group! Contact support, this is a command design issue!"); + } + } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 59767aa97..641130bc2 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -17,5 +17,7 @@ libraries: commands: iris: aliases: [ ir, irs ] + irisd: + aliases: [ ird, irsd ] api-version: ${apiversion} hotload-dependencies: false \ No newline at end of file