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;
|
package de.steamwar.acommand;
|
||||||
|
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.command.SWCommand;
|
||||||
|
import de.steamwar.command.TypeMapper;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class TestCommand extends SWCommand {
|
public class TestCommand extends SWCommand {
|
||||||
|
|
||||||
public TestCommand() {
|
public TestCommand() {
|
||||||
@ -18,10 +42,33 @@ public class TestCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Another Command, subCommands can be implemented with the Register Annotation,
|
// 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"})
|
@Register({"two"})
|
||||||
public void testTwo(Player player, int i, @Mapper("Hello World") Material material) {
|
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()) {
|
for (Method method : getClass().getDeclaredMethods()) {
|
||||||
Register register = method.getDeclaredAnnotation(Register.class);
|
addMapper(method);
|
||||||
if (register == null) {
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
if (!validMethod(method)) {
|
for (Method method : getClass().getDeclaredMethods()) {
|
||||||
continue;
|
addCommand(method);
|
||||||
}
|
|
||||||
commandSet.add(new SubCommand(this, 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();
|
Parameter[] parameters = method.getParameters();
|
||||||
if (parameters.length == 0) {
|
if (parameters.length == 0) {
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
if (!CommandSender.class.isAssignableFrom(parameters[0].getType())) {
|
if (!CommandSender.class.isAssignableFrom(parameters[0].getType())) {
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
for (int i = 1; i < parameters.length; i++) {
|
for (int i = 1; i < parameters.length; i++) {
|
||||||
Parameter parameter = parameters[i];
|
Parameter parameter = parameters[i];
|
||||||
@ -107,9 +109,32 @@ public abstract class SWCommand {
|
|||||||
if (mapper != null) {
|
if (mapper != null) {
|
||||||
name = mapper.value();
|
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) {
|
protected final void setHelpMessage(Consumer<CommandSender> helpMessage) {
|
||||||
@ -128,7 +153,7 @@ public abstract class SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Target({ElementType.PARAMETER})
|
@Target({ElementType.PARAMETER, ElementType.METHOD})
|
||||||
protected @interface Mapper {
|
protected @interface Mapper {
|
||||||
String value();
|
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;
|
package de.steamwar.command;
|
||||||
|
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren