Build AsminVoicechat / prepare-release (push) Successful in 14s
Build AsminVoicechat / build-and-test (17) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (18) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (19) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (20) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (21) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (22) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (23) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (24) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (25) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (26) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (27-ea) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (16) (push) Canceled after 38s
187 lines
8.0 KiB
Java
187 lines
8.0 KiB
Java
/*
|
|
* Decompiled with CFR 0.152.
|
|
*
|
|
* Could not load the following classes:
|
|
* com.mojang.brigadier.CommandDispatcher
|
|
* com.mojang.brigadier.builder.LiteralArgumentBuilder
|
|
* com.mojang.brigadier.suggestion.SuggestionProvider
|
|
* com.mojang.brigadier.tree.CommandNode
|
|
* com.mojang.brigadier.tree.LiteralCommandNode
|
|
* com.mojang.brigadier.tree.RootCommandNode
|
|
* org.bukkit.Bukkit
|
|
* org.bukkit.command.Command
|
|
* org.bukkit.entity.Player
|
|
* org.bukkit.event.EventHandler
|
|
* org.bukkit.event.Listener
|
|
* org.bukkit.event.player.PlayerCommandSendEvent
|
|
* org.bukkit.event.server.ServerLoadEvent
|
|
* org.bukkit.plugin.Plugin
|
|
*/
|
|
package de.maxhenkel.voicechat.commodore;
|
|
|
|
import com.mojang.brigadier.CommandDispatcher;
|
|
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
|
import com.mojang.brigadier.suggestion.SuggestionProvider;
|
|
import com.mojang.brigadier.tree.CommandNode;
|
|
import com.mojang.brigadier.tree.LiteralCommandNode;
|
|
import com.mojang.brigadier.tree.RootCommandNode;
|
|
import de.maxhenkel.voicechat.commodore.AbstractCommodore;
|
|
import de.maxhenkel.voicechat.commodore.Commodore;
|
|
import de.maxhenkel.voicechat.commodore.ReflectionUtil;
|
|
import java.lang.reflect.Constructor;
|
|
import java.lang.reflect.Field;
|
|
import java.lang.reflect.Method;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.Collection;
|
|
import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.Objects;
|
|
import java.util.Set;
|
|
import java.util.function.Predicate;
|
|
import java.util.stream.Collectors;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.command.Command;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.event.EventHandler;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.event.player.PlayerCommandSendEvent;
|
|
import org.bukkit.event.server.ServerLoadEvent;
|
|
import org.bukkit.plugin.Plugin;
|
|
|
|
final class ReflectionCommodore
|
|
extends AbstractCommodore
|
|
implements Commodore {
|
|
private static final Field CONSOLE_FIELD;
|
|
private static final Method GET_COMMAND_DISPATCHER_METHOD;
|
|
private static final Method GET_BRIGADIER_DISPATCHER_METHOD;
|
|
private static final Constructor<?> COMMAND_WRAPPER_CONSTRUCTOR;
|
|
private final Plugin plugin;
|
|
private final List<LiteralCommandNode<?>> registeredNodes = new ArrayList();
|
|
|
|
ReflectionCommodore(Plugin plugin) {
|
|
this.plugin = plugin;
|
|
this.plugin.getServer().getPluginManager().registerEvents((Listener)new ServerReloadListener(this), this.plugin);
|
|
}
|
|
|
|
private CommandDispatcher<?> getDispatcher() {
|
|
try {
|
|
Object mcServerObject = CONSOLE_FIELD.get(Bukkit.getServer());
|
|
Object commandDispatcherObject = GET_COMMAND_DISPATCHER_METHOD.invoke(mcServerObject, new Object[0]);
|
|
return (CommandDispatcher)GET_BRIGADIER_DISPATCHER_METHOD.invoke(commandDispatcherObject, new Object[0]);
|
|
}
|
|
catch (ReflectiveOperationException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void register(LiteralCommandNode<?> node) {
|
|
Objects.requireNonNull(node, "node");
|
|
CommandDispatcher<?> dispatcher = this.getDispatcher();
|
|
RootCommandNode root = dispatcher.getRoot();
|
|
ReflectionCommodore.removeChild(root, node.getName());
|
|
root.addChild(node);
|
|
this.registeredNodes.add(node);
|
|
}
|
|
|
|
@Override
|
|
public void register(Command command, LiteralCommandNode<?> node, Predicate<? super Player> permissionTest) {
|
|
Objects.requireNonNull(command, "command");
|
|
Objects.requireNonNull(node, "node");
|
|
Objects.requireNonNull(permissionTest, "permissionTest");
|
|
try {
|
|
SuggestionProvider wrapper = (SuggestionProvider)COMMAND_WRAPPER_CONSTRUCTOR.newInstance(this.plugin.getServer(), command);
|
|
ReflectionCommodore.setRequiredHackyFieldsRecursively(node, wrapper);
|
|
}
|
|
catch (Throwable e) {
|
|
e.printStackTrace();
|
|
}
|
|
Collection<String> aliases = ReflectionCommodore.getAliases(command);
|
|
if (!aliases.contains(node.getLiteral())) {
|
|
node = ReflectionCommodore.renameLiteralNode(node, command.getName());
|
|
}
|
|
for (String alias : aliases) {
|
|
if (node.getLiteral().equals(alias)) {
|
|
this.register(node);
|
|
continue;
|
|
}
|
|
this.register(((LiteralArgumentBuilder)LiteralArgumentBuilder.literal((String)alias).redirect(node)).build());
|
|
}
|
|
this.plugin.getServer().getPluginManager().registerEvents((Listener)new CommandDataSendListener(command, permissionTest), this.plugin);
|
|
}
|
|
|
|
static void ensureSetup() {
|
|
}
|
|
|
|
static {
|
|
try {
|
|
Class<?> commandDispatcher;
|
|
Class<?> minecraftServer;
|
|
if (ReflectionUtil.minecraftVersion() >= 19) {
|
|
throw new UnsupportedOperationException("ReflectionCommodore is not supported on MC 1.19 or above. Switch to Paper :)");
|
|
}
|
|
if (ReflectionUtil.minecraftVersion() > 16) {
|
|
minecraftServer = ReflectionUtil.mcClass("server.MinecraftServer");
|
|
commandDispatcher = ReflectionUtil.mcClass("commands.CommandDispatcher");
|
|
} else {
|
|
minecraftServer = ReflectionUtil.nmsClass("MinecraftServer");
|
|
commandDispatcher = ReflectionUtil.nmsClass("CommandDispatcher");
|
|
}
|
|
Class<?> craftServer = ReflectionUtil.obcClass("CraftServer");
|
|
CONSOLE_FIELD = craftServer.getDeclaredField("console");
|
|
CONSOLE_FIELD.setAccessible(true);
|
|
GET_COMMAND_DISPATCHER_METHOD = Arrays.stream(minecraftServer.getDeclaredMethods()).filter(method -> method.getParameterCount() == 0).filter(method -> commandDispatcher.isAssignableFrom(method.getReturnType())).findFirst().orElseThrow(NoSuchMethodException::new);
|
|
GET_COMMAND_DISPATCHER_METHOD.setAccessible(true);
|
|
GET_BRIGADIER_DISPATCHER_METHOD = Arrays.stream(commandDispatcher.getDeclaredMethods()).filter(method -> method.getParameterCount() == 0).filter(method -> CommandDispatcher.class.isAssignableFrom(method.getReturnType())).findFirst().orElseThrow(NoSuchMethodException::new);
|
|
GET_BRIGADIER_DISPATCHER_METHOD.setAccessible(true);
|
|
Class<?> commandWrapperClass = ReflectionUtil.obcClass("command.BukkitCommandWrapper");
|
|
COMMAND_WRAPPER_CONSTRUCTOR = commandWrapperClass.getConstructor(craftServer, Command.class);
|
|
}
|
|
catch (ReflectiveOperationException e) {
|
|
throw new ExceptionInInitializerError(e);
|
|
}
|
|
}
|
|
|
|
private static final class ServerReloadListener
|
|
implements Listener {
|
|
private final ReflectionCommodore commodore;
|
|
|
|
private ServerReloadListener(ReflectionCommodore commodore) {
|
|
this.commodore = commodore;
|
|
}
|
|
|
|
@EventHandler
|
|
public void onLoad(ServerLoadEvent e) {
|
|
CommandDispatcher dispatcher = this.commodore.getDispatcher();
|
|
RootCommandNode root = dispatcher.getRoot();
|
|
for (LiteralCommandNode node : this.commodore.registeredNodes) {
|
|
AbstractCommodore.removeChild(root, node.getName());
|
|
root.addChild((CommandNode)node);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static final class CommandDataSendListener
|
|
implements Listener {
|
|
private final Set<String> aliases;
|
|
private final Set<String> minecraftPrefixedAliases;
|
|
private final Predicate<? super Player> permissionTest;
|
|
|
|
CommandDataSendListener(Command pluginCommand, Predicate<? super Player> permissionTest) {
|
|
this.aliases = new HashSet<String>(AbstractCommodore.getAliases(pluginCommand));
|
|
this.minecraftPrefixedAliases = this.aliases.stream().map(alias -> "minecraft:" + alias).collect(Collectors.toSet());
|
|
this.permissionTest = permissionTest;
|
|
}
|
|
|
|
@EventHandler
|
|
public void onCommandSend(PlayerCommandSendEvent e) {
|
|
e.getCommands().removeAll(this.minecraftPrefixedAliases);
|
|
if (!this.permissionTest.test((Player)e.getPlayer())) {
|
|
e.getCommands().removeAll(this.aliases);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|