diff --git a/SpigotCore_Main/src/de/steamwar/acommand/TestCommand.java b/SpigotCore_Main/src/de/steamwar/acommand/TestCommand.java index a09a896..aa8ca89 100644 --- a/SpigotCore_Main/src/de/steamwar/acommand/TestCommand.java +++ b/SpigotCore_Main/src/de/steamwar/acommand/TestCommand.java @@ -1,9 +1,33 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package de.steamwar.acommand; import de.steamwar.command.SWCommand; +import de.steamwar.command.TypeMapper; import org.bukkit.Material; import org.bukkit.entity.Player; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + public class TestCommand extends SWCommand { public TestCommand() { @@ -18,10 +42,33 @@ public class TestCommand extends SWCommand { } // Another Command, subCommands can be implemented with the Register Annotation, - // you can Implement custom Mappers Annotation by @Mapper on a Parameter + // you can use custom Mappers by putting a Mapper Annotation on a Parameter @Register({"two"}) public void testTwo(Player player, int i, @Mapper("Hello World") Material material) { } + // Add Custom Mapper when this command is registered, all Mapper of you class will be + // created first and than the Commands. Do not use this mapper outside your class, as + // it can only create failures. Use on your own risk. Definition order should be considered. + @Mapper("Hello World") + public TypeMapper materialTypeMapper() { + List tabCompletes = Arrays.stream(Material.values()) + .filter(Material::isSolid) + .map(Material::name) + .map(String::toLowerCase) + .collect(Collectors.toList()); + return new TypeMapper<>() { + @Override + public Material map(String s) { + return Material.valueOf(s.toUpperCase()); + } + + @Override + public List tabCompletes(String s) { + return tabCompletes; + } + }; + } + } diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index 4919a41..de49a86 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -74,24 +74,26 @@ public abstract class SWCommand { }); for (Method method : getClass().getDeclaredMethods()) { - Register register = method.getDeclaredAnnotation(Register.class); - if (register == null) { - continue; - } - if (!validMethod(method)) { - continue; - } - commandSet.add(new SubCommand(this, method)); + addMapper(method); + } + for (Method method : getClass().getDeclaredMethods()) { + addCommand(method); } } - private boolean validMethod(Method method) { + private void addCommand(Method method) { + Register register = method.getDeclaredAnnotation(Register.class); + Mapper methodMapper = method.getDeclaredAnnotation(Mapper.class); + if (register == null || methodMapper != null) { + return; + } + Parameter[] parameters = method.getParameters(); if (parameters.length == 0) { - return false; + return; } if (!CommandSender.class.isAssignableFrom(parameters[0].getType())) { - return false; + return; } for (int i = 1; i < parameters.length; i++) { Parameter parameter = parameters[i]; @@ -107,9 +109,32 @@ public abstract class SWCommand { if (mapper != null) { name = mapper.value(); } - if (!SWCommandUtils.MAPPER_FUNCTIONS.containsKey(name)) return false; + if (!SWCommandUtils.MAPPER_FUNCTIONS.containsKey(name)) return; + } + commandSet.add(new SubCommand(this, method)); + } + + private void addMapper(Method method) { + Register register = method.getDeclaredAnnotation(Register.class); + Mapper methodMapper = method.getDeclaredAnnotation(Mapper.class); + if (register != null || methodMapper == null) { + return; + } + + Parameter[] parameters = method.getParameters(); + if (parameters.length != 0) { + return; + } + if (method.getReturnType() != TypeMapper.class) { + return; + } + try { + method.setAccessible(true); + Object object = method.invoke(this); + SWCommandUtils.addMapper(methodMapper.value(), (TypeMapper) object); + } catch (Exception e) { + throw new SecurityException(e.getMessage(), e); } - return true; } protected final void setHelpMessage(Consumer helpMessage) { @@ -128,7 +153,7 @@ public abstract class SWCommand { } @Retention(RetentionPolicy.RUNTIME) - @Target({ElementType.PARAMETER}) + @Target({ElementType.PARAMETER, ElementType.METHOD}) protected @interface Mapper { String value(); } diff --git a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java index ab0c8ca..b04abf5 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java @@ -1,3 +1,22 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package de.steamwar.command; import org.bukkit.command.CommandSender;