From 8142224f6757bbe9aae927df9a32562e473c1ca3 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Mon, 3 May 2021 18:01:00 +0200 Subject: [PATCH 01/19] Add SWCommand.Register.Registeres --- .../src/de/steamwar/command/SWCommand.java | 15 ++++++++++++--- .../src/de/steamwar/command/SWCommandUtils.java | 4 ++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index ae31780..60bda46 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -153,8 +153,8 @@ public abstract class SWCommand { } private void add(Class annotation, Method method, IntPredicate parameterTester, boolean firstParameter, Class returnType, BiConsumer consumer) { - T anno = SWCommandUtils.getAnnotation(method, annotation); - if (anno == null) { + T[] anno = SWCommandUtils.getAnnotation(method, annotation); + if (anno == null || anno.length == 0) { return; } @@ -171,7 +171,9 @@ public abstract class SWCommand { Bukkit.getLogger().log(Level.WARNING, "The method '" + method.toString() + "' is lacking the desired return type '" + returnType.getTypeName() + "'"); return; } - consumer.accept(anno, parameters); + for (T a : anno) { + consumer.accept(a, parameters); + } } private void addMapper(Class annotation, Method method, IntPredicate parameterTester, boolean firstParameter, Class returnType, BiConsumer> consumer) { @@ -200,10 +202,17 @@ public abstract class SWCommand { @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) + @Repeatable(Register.Registeres.class) protected @interface Register { String[] value() default {}; boolean help() default false; + + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.METHOD}) + @interface Registeres { + Register[] value(); + } } @Retention(RetentionPolicy.RUNTIME) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java index 0d09c7f..e6e281c 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java @@ -188,8 +188,8 @@ public class SWCommandUtils { }; } - static T getAnnotation(Method method, Class annotation) { + static T[] getAnnotation(Method method, Class annotation) { if (method.getAnnotations().length != 1) return null; - return method.getAnnotation(annotation); + return method.getDeclaredAnnotationsByType(annotation); } } -- 2.39.2 From 9dad22742e26c4be501fe07cf8a11838d8a7e2bf Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 07:58:23 +0200 Subject: [PATCH 02/19] Fix SWCommand registering on new instance Add SWCommandUtils long mapper --- SpigotCore_Main/src/de/steamwar/command/SWCommand.java | 1 + SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java | 1 + 2 files changed, 2 insertions(+) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index 60bda46..44865c9 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -77,6 +77,7 @@ public abstract class SWCommand { return strings; } }; + unregister(); register(); for (Method method : getClass().getDeclaredMethods()) { diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java index e6e281c..ed36ad8 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java @@ -61,6 +61,7 @@ public class SWCommandUtils { addMapper(float.class, Float.class, createMapper(numberMapper(Float::parseFloat), numberCompleter(Float::parseFloat))); addMapper(double.class, Double.class, createMapper(numberMapper(Double::parseDouble), numberCompleter(Double::parseDouble))); addMapper(int.class, Integer.class, createMapper(numberMapper(Integer::parseInt), numberCompleter(Integer::parseInt))); + addMapper(long.class, Long.class, createMapper(numberMapper(Long::parseLong), numberCompleter(Long::parseLong))); MAPPER_FUNCTIONS.put(String.class.getTypeName(), createMapper(s -> s, Collections::singletonList)); MAPPER_FUNCTIONS.put(Player.class.getTypeName(), createMapper(Bukkit::getPlayer, s -> Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()))); MAPPER_FUNCTIONS.put(GameMode.class.getTypeName(), createMapper(s -> { -- 2.39.2 From 84ce642bc66c886f71066d957c820695dd8dba13 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 08:25:00 +0200 Subject: [PATCH 03/19] Simplify CommandParseException as it is a code-flow Exception --- .../steamwar/command/CommandParseException.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/CommandParseException.java b/SpigotCore_Main/src/de/steamwar/command/CommandParseException.java index b47cace..21e68bb 100644 --- a/SpigotCore_Main/src/de/steamwar/command/CommandParseException.java +++ b/SpigotCore_Main/src/de/steamwar/command/CommandParseException.java @@ -23,20 +23,4 @@ public class CommandParseException extends Exception { public CommandParseException() { } - - public CommandParseException(String message) { - super(message); - } - - public CommandParseException(String message, Throwable cause) { - super(message, cause); - } - - public CommandParseException(Throwable cause) { - super(cause); - } - - public CommandParseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } } -- 2.39.2 From d48175234ad70e76b9c78ca130a5193f75af73de Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 08:45:15 +0200 Subject: [PATCH 04/19] Simplify SubCommand and SWCommand --- .../src/de/steamwar/command/SWCommand.java | 2 +- .../src/de/steamwar/command/SubCommand.java | 24 +++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index 44865c9..d20237b 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -109,7 +109,7 @@ public abstract class SWCommand { Bukkit.getLogger().log(Level.WARNING, "The method '" + method.toString() + "' is lacking the varArgs parameters of type '" + String.class.getTypeName() + "' as last Argument"); return; } - commandHelpSet.add(new SubCommand(this, method, anno.value())); + commandHelpSet.add(new SubCommand(this, method, anno.value(), new HashMap<>())); }); } for (Method method : getClass().getDeclaredMethods()) { diff --git a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java index 86cfdc7..ef75877 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java @@ -28,6 +28,8 @@ import java.util.*; import java.util.function.Function; import java.util.function.Predicate; +import static de.steamwar.command.SWCommandUtils.*; + class SubCommand { private SWCommand swCommand; @@ -38,10 +40,6 @@ class SubCommand { private Function commandSenderFunction; Class varArgType = null; - public SubCommand(SWCommand swCommand, Method method, String[] subCommand) { - this(swCommand, method, subCommand, new HashMap<>()); - } - public SubCommand(SWCommand swCommand, Method method, String[] subCommand, Map> localTypeMapper) { this.swCommand = swCommand; this.method = method; @@ -61,13 +59,13 @@ class SubCommand { } SWCommand.Mapper mapper = parameter.getAnnotation(SWCommand.Mapper.class); - if (clazz.isEnum() && mapper == null && !SWCommandUtils.MAPPER_FUNCTIONS.containsKey(clazz.getTypeName()) && !localTypeMapper.containsKey(clazz.getTypeName())) { + if (clazz.isEnum() && mapper == null && !MAPPER_FUNCTIONS.containsKey(clazz.getTypeName()) && !localTypeMapper.containsKey(clazz.getTypeName())) { Class> enumClass = (Class>) clazz; List tabCompletes = new ArrayList<>(); for (Enum enumConstant : enumClass.getEnumConstants()) { tabCompletes.add(enumConstant.name().toLowerCase()); } - arguments[i - 1] = SWCommandUtils.createMapper(s -> SWCommandUtils.ENUM_MAPPER.apply(enumClass, s), s -> tabCompletes); + arguments[i - 1] = SWCommandUtils.createMapper(s -> ENUM_MAPPER.apply(enumClass, s), s -> tabCompletes); continue; } @@ -75,11 +73,9 @@ class SubCommand { if (mapper != null) { name = mapper.value(); } - if (localTypeMapper.containsKey(name)) { - arguments[i - 1] = localTypeMapper.getOrDefault(name, SWCommandUtils.ERROR_FUNCTION); - } else { - arguments[i - 1] = SWCommandUtils.MAPPER_FUNCTIONS.getOrDefault(name, SWCommandUtils.ERROR_FUNCTION); - } + arguments[i - 1] = localTypeMapper.containsKey(name) + ? localTypeMapper.get(name) + : MAPPER_FUNCTIONS.getOrDefault(name, ERROR_FUNCTION); } } @@ -120,7 +116,8 @@ class SubCommand { } for (TypeMapper argument : arguments) { String s = argsList.remove(0); - if (argsList.isEmpty()) return argument.tabCompletes(commandSender, Arrays.copyOf(args, args.length - 1), s); + if (argsList.isEmpty()) + return argument.tabCompletes(commandSender, Arrays.copyOf(args, args.length - 1), s); try { if (argument.map(commandSender, Arrays.copyOf(args, index), s) == null) { return null; @@ -133,7 +130,8 @@ class SubCommand { if (varArgType != null && !argsList.isEmpty()) { while (!argsList.isEmpty()) { String s = argsList.remove(0); - if (argsList.isEmpty()) return arguments[arguments.length - 1].tabCompletes(commandSender, Arrays.copyOf(args, args.length - 1), s); + if (argsList.isEmpty()) + return arguments[arguments.length - 1].tabCompletes(commandSender, Arrays.copyOf(args, args.length - 1), s); try { if (arguments[arguments.length - 1].map(commandSender, Arrays.copyOf(args, index), s) == null) { return null; -- 2.39.2 From 95fb899d1408459d7b8ae8b8e5fba84d1d0cf665 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 08:47:01 +0200 Subject: [PATCH 05/19] Simplify SubCommand --- SpigotCore_Main/src/de/steamwar/command/SubCommand.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java index ef75877..d53b4a6 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java @@ -116,8 +116,9 @@ class SubCommand { } for (TypeMapper argument : arguments) { String s = argsList.remove(0); - if (argsList.isEmpty()) + if (argsList.isEmpty()) { return argument.tabCompletes(commandSender, Arrays.copyOf(args, args.length - 1), s); + } try { if (argument.map(commandSender, Arrays.copyOf(args, index), s) == null) { return null; @@ -130,8 +131,9 @@ class SubCommand { if (varArgType != null && !argsList.isEmpty()) { while (!argsList.isEmpty()) { String s = argsList.remove(0); - if (argsList.isEmpty()) + if (argsList.isEmpty()) { return arguments[arguments.length - 1].tabCompletes(commandSender, Arrays.copyOf(args, args.length - 1), s); + } try { if (arguments[arguments.length - 1].map(commandSender, Arrays.copyOf(args, index), s) == null) { return null; -- 2.39.2 From 2adab560c24b1f28e53b50db44a2769cf0b706bd Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 08:54:24 +0200 Subject: [PATCH 06/19] Simplify SWCommandUtils --- .../de/steamwar/command/SWCommandUtils.java | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java index ed36ad8..04b90fa 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java @@ -111,31 +111,34 @@ public class SWCommandUtils { index++; } - if (varArgType != null && index > args.length - 1) { - Object varArgument = Array.newInstance(varArgType, 0); - arguments[arguments.length - 1] = varArgument; - } else { - for (int i = 0; i < parameters.length - (varArgType != null ? 1 : 0); i++) { - arguments[i + 1] = parameters[i].map(commandSender, Arrays.copyOf(args, index), args[index]); - index++; - if (arguments[i + 1] == null) { + int length = 0; + if (varArgType != null) { + length = args.length - parameters.length - subCommand.length + 1; + arguments[arguments.length - 1] = Array.newInstance(varArgType, length); + + if (index > args.length - 1) { + return arguments; + } + } + + for (int i = 0; i < parameters.length - (varArgType != null ? 1 : 0); i++) { + arguments[i + 1] = parameters[i].map(commandSender, Arrays.copyOf(args, index), args[index]); + index++; + if (arguments[i + 1] == null) { + throw new CommandParseException(); + } + } + + if (varArgType != null) { + Object varArgument = arguments[args.length - 1]; + + for (int i = 0; i < length; i++) { + Object value = parameters[parameters.length - 1].map(commandSender, Arrays.copyOf(args, index), args[index]); + if (value == null) { throw new CommandParseException(); } - } - - if (varArgType != null) { - int length = args.length - parameters.length - subCommand.length + 1; - Object varArgument = Array.newInstance(varArgType, length); - arguments[arguments.length - 1] = varArgument; - - for (int i = 0; i < length; i++) { - Object value = parameters[parameters.length - 1].map(commandSender, Arrays.copyOf(args, index), args[index]); - if (value == null) { - throw new CommandParseException(); - } - Array.set(varArgument, i, value); - index++; - } + Array.set(varArgument, i, value); + index++; } } return arguments; -- 2.39.2 From 96b7652324f229a0f64bcfdb2f082b631e2c97a8 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 08:58:03 +0200 Subject: [PATCH 07/19] Speed up SWCommand registration --- SpigotCore_Main/src/de/steamwar/command/SWCommand.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index d20237b..e29b8e4 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -80,7 +80,8 @@ public abstract class SWCommand { unregister(); register(); - for (Method method : getClass().getDeclaredMethods()) { + Method[] methods = getClass().getDeclaredMethods(); + for (Method method : methods) { addMapper(Mapper.class, method, i -> i == 0, false, TypeMapper.class, (anno, typeMapper) -> { if (anno.local()) { localTypeMapper.put(anno.value(), typeMapper); @@ -112,7 +113,7 @@ public abstract class SWCommand { commandHelpSet.add(new SubCommand(this, method, anno.value(), new HashMap<>())); }); } - for (Method method : getClass().getDeclaredMethods()) { + for (Method method : methods) { add(Register.class, method, i -> i > 0, true, null, (anno, parameters) -> { if (anno.help()) { return; -- 2.39.2 From a42188f7a03dc423892eae78b8c85df1cb773c77 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 09:21:05 +0200 Subject: [PATCH 08/19] Streamify SWCommand --- .../src/de/steamwar/command/SWCommand.java | 80 +++++++------------ 1 file changed, 28 insertions(+), 52 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index e29b8e4..9c66a2c 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -30,12 +30,13 @@ import java.util.*; import java.util.function.BiConsumer; import java.util.function.IntPredicate; import java.util.logging.Level; +import java.util.stream.Collectors; public abstract class SWCommand { private final Command command; - private final List commandSet = new ArrayList<>(); - private final List commandHelpSet = new ArrayList<>(); + private final List commandList = new ArrayList<>(); + private final List commandHelpList = new ArrayList<>(); private final Map> localTypeMapper = new HashMap<>(); protected SWCommand(String command) { @@ -46,15 +47,13 @@ public abstract class SWCommand { this.command = new Command(command, "", "/" + command, Arrays.asList(aliases)) { @Override public boolean execute(CommandSender sender, String alias, String[] args) { - for (SubCommand subCommand : commandSet) { - if (subCommand.invoke(sender, args)) { - return false; - } + // if (commandList.stream().filter(s -> s.invoke(sender, args)).findFirst().isEmpty()) return false; + // if (commandHelpList.stream().filter(s -> s.invoke(sender, args)).findFirst().isEmpty()) return false; + for (SubCommand subCommand : commandList) { + if (subCommand.invoke(sender, args)) return false; } - for (SubCommand subCommand : commandHelpSet) { - if (subCommand.invoke(sender, args)) { - return false; - } + for (SubCommand subCommand : commandHelpList) { + if (subCommand.invoke(sender, args)) return false; } return false; } @@ -62,19 +61,15 @@ public abstract class SWCommand { @Override public List tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException { List strings = new ArrayList<>(); - for (SubCommand subCommand : commandSet) { + for (SubCommand subCommand : commandList) { List tabCompletes = subCommand.tabComplete(sender, args); - if (tabCompletes != null) { - strings.addAll(tabCompletes); - } + if (tabCompletes != null) strings.addAll(tabCompletes); } - strings = new ArrayList<>(strings); - for (int i = strings.size() - 1; i >= 0; i--) { - if (!strings.get(i).toLowerCase().startsWith(args[args.length - 1].toLowerCase())) { - strings.remove(i); - } - } - return strings; + return strings.stream() + .filter(s -> !s.isEmpty()) + .filter(s -> !s.isBlank()) + .filter(s -> s.toLowerCase().startsWith(args[args.length - 1].toLowerCase())) + .collect(Collectors.toList()); } }; unregister(); @@ -83,23 +78,13 @@ public abstract class SWCommand { Method[] methods = getClass().getDeclaredMethods(); for (Method method : methods) { addMapper(Mapper.class, method, i -> i == 0, false, TypeMapper.class, (anno, typeMapper) -> { - if (anno.local()) { - localTypeMapper.put(anno.value(), typeMapper); - } else { - SWCommandUtils.addMapper(anno.value(), typeMapper); - } + (anno.local() ? localTypeMapper : SWCommandUtils.MAPPER_FUNCTIONS).putIfAbsent(anno.value(), typeMapper); }); addMapper(ClassMapper.class, method, i -> i == 0, false, TypeMapper.class, (anno, typeMapper) -> { - if (anno.local()) { - localTypeMapper.put(anno.value().getTypeName(), typeMapper); - } else { - SWCommandUtils.addMapper(anno.value().getTypeName(), typeMapper); - } + (anno.local() ? localTypeMapper : SWCommandUtils.MAPPER_FUNCTIONS).putIfAbsent(anno.value().getTypeName(), typeMapper); }); add(Register.class, method, i -> i > 0, true, null, (anno, parameters) -> { - if (!anno.help()) { - return; - } + if (!anno.help()) return; if (parameters.length != 2) { Bukkit.getLogger().log(Level.WARNING, "The method '" + method.toString() + "' is lacking parameters or has too many"); } @@ -110,14 +95,12 @@ public abstract class SWCommand { Bukkit.getLogger().log(Level.WARNING, "The method '" + method.toString() + "' is lacking the varArgs parameters of type '" + String.class.getTypeName() + "' as last Argument"); return; } - commandHelpSet.add(new SubCommand(this, method, anno.value(), new HashMap<>())); + commandHelpList.add(new SubCommand(this, method, anno.value(), new HashMap<>())); }); } for (Method method : methods) { add(Register.class, method, i -> i > 0, true, null, (anno, parameters) -> { - if (anno.help()) { - return; - } + if (anno.help()) return; for (int i = 1; i < parameters.length; i++) { Parameter parameter = parameters[i]; Class clazz = parameter.getType(); @@ -137,10 +120,10 @@ public abstract class SWCommand { return; } } - commandSet.add(new SubCommand(this, method, anno.value(), localTypeMapper)); + commandList.add(new SubCommand(this, method, anno.value(), localTypeMapper)); }); - this.commandSet.sort((o1, o2) -> { + this.commandList.sort((o1, o2) -> { int compare = Integer.compare(-o1.subCommand.length, -o2.subCommand.length); if (compare != 0) { return compare; @@ -150,15 +133,13 @@ public abstract class SWCommand { return Integer.compare(i1, i2); } }); - commandHelpSet.sort(Comparator.comparingInt(o -> -o.subCommand.length)); + commandHelpList.sort(Comparator.comparingInt(o -> -o.subCommand.length)); } } private void add(Class annotation, Method method, IntPredicate parameterTester, boolean firstParameter, Class returnType, BiConsumer consumer) { T[] anno = SWCommandUtils.getAnnotation(method, annotation); - if (anno == null || anno.length == 0) { - return; - } + if (anno == null || anno.length == 0) return; Parameter[] parameters = method.getParameters(); if (!parameterTester.test(parameters.length)) { @@ -173,17 +154,14 @@ public abstract class SWCommand { Bukkit.getLogger().log(Level.WARNING, "The method '" + method.toString() + "' is lacking the desired return type '" + returnType.getTypeName() + "'"); return; } - for (T a : anno) { - consumer.accept(a, parameters); - } + Arrays.stream(anno).forEach(t -> consumer.accept(t, parameters)); } private void addMapper(Class annotation, Method method, IntPredicate parameterTester, boolean firstParameter, Class returnType, BiConsumer> consumer) { add(annotation, method, parameterTester, firstParameter, returnType, (anno, parameters) -> { try { method.setAccessible(true); - Object object = method.invoke(this); - consumer.accept(anno, (TypeMapper) object); + consumer.accept(anno, (TypeMapper) method.invoke(this)); } catch (Exception e) { throw new SecurityException(e.getMessage(), e); } @@ -192,9 +170,7 @@ public abstract class SWCommand { public void unregister() { SWCommandUtils.knownCommandMap.remove(command.getName()); - for (String alias : command.getAliases()) { - SWCommandUtils.knownCommandMap.remove(alias); - } + command.getAliases().forEach(SWCommandUtils.knownCommandMap::remove); command.unregister(SWCommandUtils.commandMap); } -- 2.39.2 From 06fb4bbc1ae81f07c6f6456b687c3a87f0ae1448 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 09:35:51 +0200 Subject: [PATCH 09/19] Streamify SWCommand --- SpigotCore_Main/src/de/steamwar/command/SWCommand.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index 9c66a2c..6ec6fb1 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -60,12 +60,10 @@ public abstract class SWCommand { @Override public List tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException { - List strings = new ArrayList<>(); - for (SubCommand subCommand : commandList) { - List tabCompletes = subCommand.tabComplete(sender, args); - if (tabCompletes != null) strings.addAll(tabCompletes); - } - return strings.stream() + return commandList.stream() + .map(s -> s.tabComplete(sender, args)) + .filter(Objects::nonNull) + .flatMap(Collection::stream) .filter(s -> !s.isEmpty()) .filter(s -> !s.isBlank()) .filter(s -> s.toLowerCase().startsWith(args[args.length - 1].toLowerCase())) -- 2.39.2 From 259d6fef99b4e6c063aaada7ddd157d7969a9bf5 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 09:56:30 +0200 Subject: [PATCH 10/19] Streamify SWCommand --- .../src/de/steamwar/command/SWCommand.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index 6ec6fb1..5e73a02 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -47,8 +47,8 @@ public abstract class SWCommand { this.command = new Command(command, "", "/" + command, Arrays.asList(aliases)) { @Override public boolean execute(CommandSender sender, String alias, String[] args) { - // if (commandList.stream().filter(s -> s.invoke(sender, args)).findFirst().isEmpty()) return false; - // if (commandHelpList.stream().filter(s -> s.invoke(sender, args)).findFirst().isEmpty()) return false; + // if (commandList.stream().filter(s -> s.invoke(sender, args)).findFirst().isPresent()) return false; + // if (commandHelpList.stream().filter(s -> s.invoke(sender, args)).findFirst().isPresent()) return false; for (SubCommand subCommand : commandList) { if (subCommand.invoke(sender, args)) return false; } @@ -109,10 +109,7 @@ public abstract class SWCommand { if (clazz.isEnum() && mapper == null && !SWCommandUtils.MAPPER_FUNCTIONS.containsKey(clazz.getTypeName())) { continue; } - String name = clazz.getTypeName(); - if (mapper != null) { - name = mapper.value(); - } + String name = mapper != null ? mapper.value() : clazz.getTypeName(); if (!SWCommandUtils.MAPPER_FUNCTIONS.containsKey(name) && !localTypeMapper.containsKey(name)) { Bukkit.getLogger().log(Level.WARNING, "The parameter '" + parameter.toString() + "' is using an unsupported Mapper of type '" + name + "'"); return; @@ -126,9 +123,8 @@ public abstract class SWCommand { if (compare != 0) { return compare; } else { - int i1 = o1.varArgType != null ? Integer.MAX_VALUE : o1.arguments.length; - int i2 = o2.varArgType != null ? Integer.MAX_VALUE : o2.arguments.length; - return Integer.compare(i1, i2); + return Integer.compare(o1.varArgType != null ? Integer.MAX_VALUE : o1.arguments.length, + o2.varArgType != null ? Integer.MAX_VALUE : o2.arguments.length); } }); commandHelpList.sort(Comparator.comparingInt(o -> -o.subCommand.length)); -- 2.39.2 From ee9f9d40ceaebaeec9c97f310955d2ede28761fa Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 09:58:08 +0200 Subject: [PATCH 11/19] Optimize SWCommand --- SpigotCore_Main/src/de/steamwar/command/SWCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index 5e73a02..20f1d5c 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -60,13 +60,14 @@ public abstract class SWCommand { @Override public List tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException { + String string = args[args.length - 1].toLowerCase(); return commandList.stream() .map(s -> s.tabComplete(sender, args)) .filter(Objects::nonNull) .flatMap(Collection::stream) .filter(s -> !s.isEmpty()) .filter(s -> !s.isBlank()) - .filter(s -> s.toLowerCase().startsWith(args[args.length - 1].toLowerCase())) + .filter(s -> s.toLowerCase().startsWith(string)) .collect(Collectors.toList()); } }; -- 2.39.2 From 37d308346ef917c0e495a84a326d5a3d4b644ed7 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 10:02:07 +0200 Subject: [PATCH 12/19] Optimize SWCommand --- SpigotCore_Main/src/de/steamwar/command/SWCommand.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index 20f1d5c..3b6245d 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -47,14 +47,8 @@ public abstract class SWCommand { this.command = new Command(command, "", "/" + command, Arrays.asList(aliases)) { @Override public boolean execute(CommandSender sender, String alias, String[] args) { - // if (commandList.stream().filter(s -> s.invoke(sender, args)).findFirst().isPresent()) return false; - // if (commandHelpList.stream().filter(s -> s.invoke(sender, args)).findFirst().isPresent()) return false; - for (SubCommand subCommand : commandList) { - if (subCommand.invoke(sender, args)) return false; - } - for (SubCommand subCommand : commandHelpList) { - if (subCommand.invoke(sender, args)) return false; - } + if (commandList.stream().anyMatch(s -> s.invoke(sender, args))) return false; + commandHelpList.stream().anyMatch(s -> s.invoke(sender, args)); return false; } -- 2.39.2 From 218641b21dea2e30dbb5b7298be6f9a74ba16405 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 10:11:02 +0200 Subject: [PATCH 13/19] Optimize SWCommandUtils.numberCompleter --- .../src/de/steamwar/command/SWCommandUtils.java | 11 +++-------- .../src/de/steamwar/command/SubCommand.java | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java index 04b90fa..e4e6c29 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java @@ -182,14 +182,9 @@ public class SWCommandUtils { } private static Function> numberCompleter(Function mapper) { - return s -> { - try { - mapper.apply(s); - return Collections.singletonList(s); - } catch (Exception e) { - return Collections.emptyList(); - } - }; + return s -> numberMapper(mapper).apply(s) != null + ? Collections.singletonList(s) + : Collections.emptyList(); } static T[] getAnnotation(Method method, Class annotation) { diff --git a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java index d53b4a6..15dad9a 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java @@ -40,7 +40,7 @@ class SubCommand { private Function commandSenderFunction; Class varArgType = null; - public SubCommand(SWCommand swCommand, Method method, String[] subCommand, Map> localTypeMapper) { + SubCommand(SWCommand swCommand, Method method, String[] subCommand, Map> localTypeMapper) { this.swCommand = swCommand; this.method = method; -- 2.39.2 From a1125ae48f0dbc652b0baab8ee047c4d1675b5fc Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 10:25:44 +0200 Subject: [PATCH 14/19] Optimize SWCommandUtils.numberCompleter --- .../de/steamwar/command/SWCommandUtils.java | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java index e4e6c29..d4c0cc3 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java @@ -50,10 +50,7 @@ public class SWCommandUtils { static final BiFunction>, String, Enum> ENUM_MAPPER = (enumClass, s) -> { Enum[] enums = enumClass.getEnumConstants(); - for (Enum e : enums) { - if (e.name().equalsIgnoreCase(s)) return e; - } - return null; + return Arrays.stream(enums).filter(e -> e.name().equalsIgnoreCase(s)).findFirst().orElse(null); }; static { @@ -105,9 +102,7 @@ public class SWCommandUtils { Object[] arguments = new Object[parameters.length + 1]; int index = 0; while (index < subCommand.length) { - if (!args[index].equalsIgnoreCase(subCommand[index])) { - throw new CommandParseException(); - } + if (!args[index].equalsIgnoreCase(subCommand[index])) throw new CommandParseException(); index++; } @@ -116,17 +111,13 @@ public class SWCommandUtils { length = args.length - parameters.length - subCommand.length + 1; arguments[arguments.length - 1] = Array.newInstance(varArgType, length); - if (index > args.length - 1) { - return arguments; - } + if (index > args.length - 1) return arguments; } for (int i = 0; i < parameters.length - (varArgType != null ? 1 : 0); i++) { arguments[i + 1] = parameters[i].map(commandSender, Arrays.copyOf(args, index), args[index]); index++; - if (arguments[i + 1] == null) { - throw new CommandParseException(); - } + if (arguments[i + 1] == null) throw new CommandParseException(); } if (varArgType != null) { @@ -134,9 +125,7 @@ public class SWCommandUtils { for (int i = 0; i < length; i++) { Object value = parameters[parameters.length - 1].map(commandSender, Arrays.copyOf(args, index), args[index]); - if (value == null) { - throw new CommandParseException(); - } + if (value == null) throw new CommandParseException(); Array.set(varArgument, i, value); index++; } @@ -149,8 +138,7 @@ public class SWCommandUtils { } public static void addMapper(String name, TypeMapper mapper) { - if (MAPPER_FUNCTIONS.containsKey(name)) return; - MAPPER_FUNCTIONS.put(name, mapper); + MAPPER_FUNCTIONS.putIfAbsent(name, mapper); } public static TypeMapper createMapper(Function mapper, Function> tabCompleter) { -- 2.39.2 From 2fb3f9a01b5d7683ff1ecd758ded43a9d4e483f1 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 10:28:57 +0200 Subject: [PATCH 15/19] Optimize SWCommandUtils.numberCompleter --- SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java index d4c0cc3..05f0e94 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java @@ -110,7 +110,6 @@ public class SWCommandUtils { if (varArgType != null) { length = args.length - parameters.length - subCommand.length + 1; arguments[arguments.length - 1] = Array.newInstance(varArgType, length); - if (index > args.length - 1) return arguments; } -- 2.39.2 From c07d4fbe5585fb43f9dc1563a253ce3a0380e50c Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 19:03:21 +0200 Subject: [PATCH 16/19] Add SWCommand.inject --- .../src/de/steamwar/command/SWCommand.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index 3b6245d..6c94f7a 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -22,6 +22,8 @@ package de.steamwar.command; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; +import org.bukkit.scheduler.BukkitRunnable; import java.lang.annotation.*; import java.lang.reflect.Method; @@ -60,7 +62,6 @@ public abstract class SWCommand { .filter(Objects::nonNull) .flatMap(Collection::stream) .filter(s -> !s.isEmpty()) - .filter(s -> !s.isBlank()) .filter(s -> s.toLowerCase().startsWith(string)) .collect(Collectors.toList()); } @@ -167,6 +168,16 @@ public abstract class SWCommand { SWCommandUtils.commandMap.register("steamwar", this.command); } + public void inject(Plugin plugin) { + new BukkitRunnable() { + @Override + public void run() { + SWCommand.this.unregister(); + SWCommand.this.register(); + } + }.runTask(plugin); + } + @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) @Repeatable(Register.Registeres.class) -- 2.39.2 From 0158f24e3e2422405620351e3090da0fd80d6afc Mon Sep 17 00:00:00 2001 From: yoyosource Date: Wed, 5 May 2021 19:17:39 +0200 Subject: [PATCH 17/19] Fix SWCommandUtils --- SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java index 05f0e94..e6e0ee4 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommandUtils.java @@ -120,7 +120,7 @@ public class SWCommandUtils { } if (varArgType != null) { - Object varArgument = arguments[args.length - 1]; + Object varArgument = arguments[arguments.length - 1]; for (int i = 0; i < length; i++) { Object value = parameters[parameters.length - 1].map(commandSender, Arrays.copyOf(args, index), args[index]); -- 2.39.2 From 5d9b874d4e56f2845fdf928641a0b2bc760f12a5 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 7 May 2021 09:23:37 +0200 Subject: [PATCH 18/19] Remove SWCommand.inject --- SpigotCore_Main/src/de/steamwar/command/SWCommand.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index 6c94f7a..7167bc7 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -168,16 +168,6 @@ public abstract class SWCommand { SWCommandUtils.commandMap.register("steamwar", this.command); } - public void inject(Plugin plugin) { - new BukkitRunnable() { - @Override - public void run() { - SWCommand.this.unregister(); - SWCommand.this.register(); - } - }.runTask(plugin); - } - @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) @Repeatable(Register.Registeres.class) -- 2.39.2 From 732ac93b3f84ae12568a107dbd826c0343ab475b Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 7 May 2021 09:43:22 +0200 Subject: [PATCH 19/19] Optimize imports in SWCommand --- SpigotCore_Main/src/de/steamwar/command/SWCommand.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index 7167bc7..ab72fc5 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -22,8 +22,6 @@ package de.steamwar.command; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; -import org.bukkit.scheduler.BukkitRunnable; import java.lang.annotation.*; import java.lang.reflect.Method; -- 2.39.2