diff --git a/SpigotCore_14/src/de/steamwar/inventory/SWItem_14.java b/SpigotCore_14/src/de/steamwar/inventory/SWItem_14.java
index adf1b9c..623dd20 100644
--- a/SpigotCore_14/src/de/steamwar/inventory/SWItem_14.java
+++ b/SpigotCore_14/src/de/steamwar/inventory/SWItem_14.java
@@ -19,6 +19,7 @@
package de.steamwar.inventory;
+import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;
@@ -269,7 +270,7 @@ class SWItem_14 {
ItemStack head = new ItemStack(Material.PLAYER_HEAD, 1);
SkullMeta headmeta = (SkullMeta) head.getItemMeta();
assert headmeta != null;
- headmeta.setOwner(player);
+ headmeta.setOwningPlayer(Bukkit.getOfflinePlayer(player));
headmeta.setDisplayName(player);
head.setItemMeta(headmeta);
return head;
diff --git a/SpigotCore_15/src/de/steamwar/authlib/AuthlibInjector_15.java b/SpigotCore_15/src/de/steamwar/authlib/AuthlibInjector_15.java
new file mode 100644
index 0000000..9864a31
--- /dev/null
+++ b/SpigotCore_15/src/de/steamwar/authlib/AuthlibInjector_15.java
@@ -0,0 +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.authlib;
+
+import net.minecraft.server.v1_15_R1.MinecraftServer;
+
+public class AuthlibInjector_15 {
+
+ static Class getMinecraftClass() {
+ return MinecraftServer.class;
+ }
+
+ static Object getMinecraftServerInstance() {
+ return MinecraftServer.getServer();
+ }
+}
diff --git a/SpigotCore_Main/src/de/steamwar/authlib/AuthlibInjector.java b/SpigotCore_Main/src/de/steamwar/authlib/AuthlibInjector.java
new file mode 100644
index 0000000..f12bd3d
--- /dev/null
+++ b/SpigotCore_Main/src/de/steamwar/authlib/AuthlibInjector.java
@@ -0,0 +1,47 @@
+/*
+ * 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.authlib;
+
+import com.mojang.authlib.yggdrasil.YggdrasilGameProfileRepository;
+import de.steamwar.core.Core;
+import de.steamwar.core.VersionedCallable;
+
+import java.lang.reflect.Field;
+
+public class AuthlibInjector {
+
+ public static void inject() {
+ if (Core.getVersion() != 15) {
+ return;
+ }
+
+ try {
+ Class> minecraftServerClass = VersionedCallable.call(new VersionedCallable<>(() -> AuthlibInjector_15.getMinecraftClass(), 15));
+ Field repo = minecraftServerClass.getDeclaredField("gameProfileRepository");
+ repo.setAccessible(true);
+ Object instance = VersionedCallable.call(new VersionedCallable<>(() -> AuthlibInjector_15.getMinecraftServerInstance(), 15));
+ repo.set(instance, new SteamwarGameProfileRepository((YggdrasilGameProfileRepository) repo.get(instance)));
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/SpigotCore_Main/src/de/steamwar/authlib/SteamwarGameProfileRepository.java b/SpigotCore_Main/src/de/steamwar/authlib/SteamwarGameProfileRepository.java
new file mode 100644
index 0000000..3a4ebae
--- /dev/null
+++ b/SpigotCore_Main/src/de/steamwar/authlib/SteamwarGameProfileRepository.java
@@ -0,0 +1,60 @@
+/*
+ * 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.authlib;
+
+import com.mojang.authlib.Agent;
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.GameProfileRepository;
+import com.mojang.authlib.ProfileLookupCallback;
+import com.mojang.authlib.yggdrasil.YggdrasilGameProfileRepository;
+import de.steamwar.sql.SteamwarUser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SteamwarGameProfileRepository implements GameProfileRepository {
+
+ private final YggdrasilGameProfileRepository fallback;
+
+ public SteamwarGameProfileRepository(YggdrasilGameProfileRepository repository) {
+ fallback = repository;
+ }
+
+ @Override
+ public void findProfilesByNames(String[] strings, Agent agent, ProfileLookupCallback profileLookupCallback) {
+ if(agent == Agent.SCROLLS) {
+ fallback.findProfilesByNames(strings, agent, profileLookupCallback);
+ } else {
+ List unknownNames = new ArrayList<>();
+ for (String name:strings) {
+ SteamwarUser user = SteamwarUser.get(name);
+ if(user == null) {
+ unknownNames.add(name);
+ continue;
+ }
+
+ profileLookupCallback.onProfileLookupSucceeded(new GameProfile(user.getUUID(), user.getUserName()));
+ }
+ if(!unknownNames.isEmpty()) {
+ fallback.findProfilesByNames(unknownNames.toArray(new String[0]), agent, profileLookupCallback);
+ }
+ }
+ }
+}
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);
- }
}
diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java
index 72cda65..ab72fc5 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,58 +47,36 @@ 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;
- }
- }
- for (SubCommand subCommand : commandHelpSet) {
- 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;
}
@Override
public List tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException {
- List strings = new ArrayList<>();
- for (SubCommand subCommand : commandSet) {
- List tabCompletes = subCommand.tabComplete(sender, args);
- 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;
+ 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.toLowerCase().startsWith(string))
+ .collect(Collectors.toList());
}
};
+ 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);
- } 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");
}
@@ -108,14 +87,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()));
+ commandHelpList.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;
- }
+ if (anno.help()) return;
for (int i = 1; i < parameters.length; i++) {
Parameter parameter = parameters[i];
Class> clazz = parameter.getType();
@@ -126,37 +103,31 @@ 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;
}
}
- 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;
} 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);
}
});
- 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) {
- return;
- }
+ T[] anno = SWCommandUtils.getAnnotation(method, annotation);
+ if (anno == null || anno.length == 0) return;
Parameter[] parameters = method.getParameters();
if (!parameterTester.test(parameters.length)) {
@@ -171,39 +142,43 @@ 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);
+ 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);
}
});
}
- protected void unregister() {
+ 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);
}
- protected void register() {
+ public void register() {
SWCommandUtils.commandMap.register("steamwar", this.command);
}
@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 da927ad..e6e0ee4 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 {
@@ -61,6 +58,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 -> {
@@ -100,41 +98,35 @@ public class SWCommandUtils {
}
}
- static Object[] generateArgumentArray(TypeMapper>[] parameters, String[] args, Class> varArgType, String[] subCommand) throws CommandParseException {
+ static Object[] generateArgumentArray(CommandSender commandSender, TypeMapper>[] parameters, String[] args, Class> varArgType, String[] subCommand) throws CommandParseException {
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++;
}
- 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(Arrays.copyOf(args, index), args[index]);
+ 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[arguments.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();
+ Array.set(varArgument, i, value);
index++;
- if (arguments[i + 1] == 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(Arrays.copyOf(args, index), args[index]);
- if (value == null) {
- throw new CommandParseException();
- }
- Array.set(varArgument, i, value);
- index++;
- }
}
}
return arguments;
@@ -145,8 +137,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) {
@@ -156,7 +147,7 @@ public class SWCommandUtils {
public static TypeMapper createMapper(Function mapper, BiFunction> tabCompleter) {
return new TypeMapper() {
@Override
- public T map(String[] previous, String s) {
+ public T map(CommandSender commandSender, String[] previousArguments, String s) {
return mapper.apply(s);
}
@@ -178,18 +169,13 @@ 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) {
+ static T[] getAnnotation(Method method, Class annotation) {
if (method.getAnnotations().length != 1) return null;
- return method.getAnnotation(annotation);
+ return method.getDeclaredAnnotationsByType(annotation);
}
}
diff --git a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java
index 343cbd0..15dad9a 100644
--- a/SpigotCore_Main/src/de/steamwar/command/SubCommand.java
+++ b/SpigotCore_Main/src/de/steamwar/command/SubCommand.java
@@ -26,6 +26,9 @@ import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.*;
import java.util.function.Function;
+import java.util.function.Predicate;
+
+import static de.steamwar.command.SWCommandUtils.*;
class SubCommand {
@@ -33,18 +36,16 @@ class SubCommand {
private Method method;
String[] subCommand;
TypeMapper>[] arguments;
+ private Predicate commandSenderPredicate;
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) {
+ SubCommand(SWCommand swCommand, Method method, String[] subCommand, Map> localTypeMapper) {
this.swCommand = swCommand;
this.method = method;
Parameter[] parameters = method.getParameters();
+ commandSenderPredicate = sender -> parameters[0].getType().isAssignableFrom(sender.getClass());
commandSenderFunction = sender -> parameters[0].getType().cast(sender);
this.subCommand = subCommand;
@@ -58,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;
}
@@ -72,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);
}
}
@@ -88,7 +87,10 @@ class SubCommand {
return false;
}
try {
- Object[] objects = SWCommandUtils.generateArgumentArray(arguments, args, varArgType, subCommand);
+ if (!commandSenderPredicate.test(commandSender)) {
+ return false;
+ }
+ Object[] objects = SWCommandUtils.generateArgumentArray(commandSender, arguments, args, varArgType, subCommand);
objects[0] = commandSenderFunction.apply(commandSender);
method.setAccessible(true);
method.invoke(swCommand, objects);
@@ -114,9 +116,11 @@ 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(Arrays.copyOf(args, index), s) == null) {
+ if (argument.map(commandSender, Arrays.copyOf(args, index), s) == null) {
return null;
}
} catch (Exception e) {
@@ -127,9 +131,11 @@ 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(Arrays.copyOf(args, index), s) == null) {
+ if (arguments[arguments.length - 1].map(commandSender, Arrays.copyOf(args, index), s) == null) {
return null;
}
} catch (Exception e) {
diff --git a/SpigotCore_Main/src/de/steamwar/command/TypeMapper.java b/SpigotCore_Main/src/de/steamwar/command/TypeMapper.java
index 27b04f7..c0c160c 100644
--- a/SpigotCore_Main/src/de/steamwar/command/TypeMapper.java
+++ b/SpigotCore_Main/src/de/steamwar/command/TypeMapper.java
@@ -24,7 +24,15 @@ import org.bukkit.command.CommandSender;
import java.util.List;
public interface TypeMapper {
- T map(String[] previousArguments, String s);
+ default T map(CommandSender commandSender, String[] previousArguments, String s) {
+ return map(previousArguments, s);
+ }
+
+ // For backwards compatibility, can be removed later on
+ @Deprecated(since = "Use the other map Function without calling super!")
+ default T map(String[] previousArguments, String s) {
+ throw new SecurityException();
+ }
List tabCompletes(CommandSender commandSender, String[] previousArguments, String s);
}
diff --git a/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore_Main/src/de/steamwar/core/Core.java
index d9c59df..62f8849 100644
--- a/SpigotCore_Main/src/de/steamwar/core/Core.java
+++ b/SpigotCore_Main/src/de/steamwar/core/Core.java
@@ -19,6 +19,7 @@
package de.steamwar.core;
+import de.steamwar.authlib.AuthlibInjector;
import de.steamwar.comms.BungeeReceiver;
import de.steamwar.core.events.ChattingEvent;
import de.steamwar.core.events.ChunkListener;
@@ -64,6 +65,7 @@ public class Core extends JavaPlugin{
ErrorLogger.init();
getServer().getMessenger().registerIncomingPluginChannel(this, "sw:bridge", new BungeeReceiver());
getServer().getMessenger().registerOutgoingPluginChannel(this, "sw:bridge");
+ AuthlibInjector.inject();
}
@Override
diff --git a/SpigotCore_Main/src/de/steamwar/sql/Team.java b/SpigotCore_Main/src/de/steamwar/sql/Team.java
index 7504476..7841b23 100644
--- a/SpigotCore_Main/src/de/steamwar/sql/Team.java
+++ b/SpigotCore_Main/src/de/steamwar/sql/Team.java
@@ -28,21 +28,19 @@ public class Team {
private final int teamId;
private final String teamKuerzel;
private final String teamName;
- private final int teamLeader;
private final String teamColor;
- private static final Team pub = new Team(0, "PUB", "Öffentlich", 0, "8");
+ private static final Team pub = new Team(0, "PUB", "Öffentlich", "8");
- private Team(int teamId, String teamKuerzel, String teamName, int teamLeader, String teamColor){
+ private Team(int teamId, String teamKuerzel, String teamName, String teamColor){
this.teamId = teamId;
this.teamKuerzel = teamKuerzel;
this.teamName = teamName;
- this.teamLeader = teamLeader;
this.teamColor = teamColor;
}
private Team(ResultSet rs) throws SQLException {
- this(rs.getInt("TeamID"), rs.getString("TeamKuerzel"), rs.getString("TeamName"), rs.getInt("TeamLeader"), rs.getString("TeamColor"));
+ this(rs.getInt("TeamID"), rs.getString("TeamKuerzel"), rs.getString("TeamName"), rs.getString("TeamColor"));
}
public static Team get(int id){
@@ -70,10 +68,6 @@ public class Team {
return teamName;
}
- public int getTeamLeader() {
- return teamLeader;
- }
-
public String getTeamColor() {
return teamColor;
}
diff --git a/SpigotCore_Main/src/de/steamwar/sql/UserConfig.java b/SpigotCore_Main/src/de/steamwar/sql/UserConfig.java
new file mode 100644
index 0000000..b7a87c3
--- /dev/null
+++ b/SpigotCore_Main/src/de/steamwar/sql/UserConfig.java
@@ -0,0 +1,68 @@
+/*
+ * 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.sql;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.UUID;
+
+public class UserConfig {
+
+ private UserConfig() {
+
+ }
+
+ public static String getConfig(UUID player, String config) {
+ return getConfig(SteamwarUser.get(player).getId(), config);
+ }
+
+ public static String getConfig(int player, String config) {
+ ResultSet configResult = SQL.select("SELECT * FROM UserConfig WHERE User = ? AND Config = ?", player, config);
+ try {
+ if (!configResult.next()) {
+ return null;
+ }
+ return configResult.getString("Value");
+ } catch (SQLException e) {
+ throw new SecurityException(e.getMessage(), e);
+ }
+ }
+
+ public static void updatePlayerConfig(UUID uuid, String config, String value) {
+ updatePlayerConfig(SteamwarUser.get(uuid).getId(), config, value);
+ }
+
+ public static void updatePlayerConfig(int id, String config, String value) {
+ if (value == null) {
+ removePlayerConfig(id, config);
+ return;
+ }
+ SQL.update("INSERT INTO UserConfig (User, Config, Value) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE Value = VALUES(Value)", id, config, value);
+ }
+
+ public static void removePlayerConfig(UUID uuid, String config) {
+ removePlayerConfig(SteamwarUser.get(uuid).getId(), config);
+ }
+
+ public static void removePlayerConfig(int id, String config) {
+ SQL.update("DELETE FROM UserConfig WHERE User = ? AND Config = ?", id, config);
+ }
+
+}