Fix SWCommand Mapper stuff
Add copyright to SubCommand
Dieser Commit ist enthalten in:
Ursprung
9773b9d7ea
Commit
97a8862b62
@ -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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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<Material> materialTypeMapper() {
|
||||
List<String> 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<String> tabCompletes(String s) {
|
||||
return tabCompletes;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -74,24 +74,26 @@ public abstract class SWCommand {
|
||||
});
|
||||
|
||||
for (Method method : getClass().getDeclaredMethods()) {
|
||||
Register register = method.getDeclaredAnnotation(Register.class);
|
||||
if (register == null) {
|
||||
continue;
|
||||
addMapper(method);
|
||||
}
|
||||
if (!validMethod(method)) {
|
||||
continue;
|
||||
}
|
||||
commandSet.add(new SubCommand(this, 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<CommandSender> 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();
|
||||
}
|
||||
|
@ -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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.command;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren