3
0
Mirror von https://github.com/PaperMC/Velocity.git synchronisiert 2024-11-17 05:20:14 +01:00

Expose CommandMeta in CommandManager and add a ref to the plugin instance (#544)

Dieser Commit ist enthalten in:
Frank van der Heijden 2021-10-31 21:23:35 +01:00 committet von GitHub
Ursprung ac4b4a34ca
Commit 922c001b59
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 4AEE18F83AFDEB23
4 geänderte Dateien mit 69 neuen und 2 gelöschten Zeilen

Datei anzeigen

@ -10,6 +10,7 @@ package com.velocitypowered.api.command;
import com.velocitypowered.api.event.command.CommandExecuteEvent; import com.velocitypowered.api.event.command.CommandExecuteEvent;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import org.checkerframework.checker.nullness.qual.Nullable;
/** /**
* Handles the registration and execution of commands. * Handles the registration and execution of commands.
@ -74,6 +75,13 @@ public interface CommandManager {
*/ */
void unregister(String alias); void unregister(String alias);
/**
* Retrieves the {@link CommandMeta} from the specified command alias, if registered.
* @param alias the command alias to lookup
* @return an {@link CommandMeta} of the alias
*/
@Nullable CommandMeta getCommandMeta(String alias);
/** /**
* Attempts to asynchronously execute a command from the given {@code cmdLine}. * Attempts to asynchronously execute a command from the given {@code cmdLine}.
* *

Datei anzeigen

@ -9,6 +9,7 @@ package com.velocitypowered.api.command;
import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.CommandNode;
import java.util.Collection; import java.util.Collection;
import org.checkerframework.checker.nullness.qual.Nullable;
/** /**
* Contains metadata for a {@link Command}. * Contains metadata for a {@link Command}.
@ -32,6 +33,14 @@ public interface CommandMeta {
*/ */
Collection<CommandNode<CommandSource>> getHints(); Collection<CommandNode<CommandSource>> getHints();
/**
* Returns the plugin who registered the command.
* Note some {@link Command} registrations may not provide this information.
*
* @return the registering plugin
*/
@Nullable Object getPlugin();
/** /**
* Provides a fluent interface to create {@link CommandMeta}s. * Provides a fluent interface to create {@link CommandMeta}s.
*/ */
@ -56,6 +65,14 @@ public interface CommandMeta {
*/ */
Builder hint(CommandNode<CommandSource> node); Builder hint(CommandNode<CommandSource> node);
/**
* Specifies the plugin who registers the {@link Command}.
*
* @param plugin the registering plugin
* @return this builder, for chaining
*/
Builder plugin(Object plugin);
/** /**
* Returns a newly-created {@link CommandMeta} based on the specified parameters. * Returns a newly-created {@link CommandMeta} based on the specified parameters.
* *

Datei anzeigen

@ -42,7 +42,9 @@ import com.velocitypowered.proxy.event.VelocityEventManager;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -50,6 +52,7 @@ import net.kyori.adventure.identity.Identity;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.checkerframework.checker.lock.qual.GuardedBy; import org.checkerframework.checker.lock.qual.GuardedBy;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.jetbrains.annotations.VisibleForTesting; import org.jetbrains.annotations.VisibleForTesting;
public class VelocityCommandManager implements CommandManager { public class VelocityCommandManager implements CommandManager {
@ -61,6 +64,7 @@ public class VelocityCommandManager implements CommandManager {
private final List<CommandRegistrar<?>> registrars; private final List<CommandRegistrar<?>> registrars;
private final SuggestionsProvider<CommandSource> suggestionsProvider; private final SuggestionsProvider<CommandSource> suggestionsProvider;
private final CommandGraphInjector<CommandSource> injector; private final CommandGraphInjector<CommandSource> injector;
private final Map<String, CommandMeta> commandMetas;
/** /**
* Constructs a command manager. * Constructs a command manager.
@ -78,6 +82,7 @@ public class VelocityCommandManager implements CommandManager {
new RawCommandRegistrar(root, this.lock.writeLock())); new RawCommandRegistrar(root, this.lock.writeLock()));
this.suggestionsProvider = new SuggestionsProvider<>(this.dispatcher, this.lock.readLock()); this.suggestionsProvider = new SuggestionsProvider<>(this.dispatcher, this.lock.readLock());
this.injector = new CommandGraphInjector<>(this.dispatcher, this.lock.readLock()); this.injector = new CommandGraphInjector<>(this.dispatcher, this.lock.readLock());
this.commandMetas = new ConcurrentHashMap<>();
} }
public void setAnnounceProxyCommands(boolean announceProxyCommands) { public void setAnnounceProxyCommands(boolean announceProxyCommands) {
@ -137,6 +142,9 @@ public class VelocityCommandManager implements CommandManager {
return false; return false;
} }
registrar.register(meta, superInterface.cast(command)); registrar.register(meta, superInterface.cast(command));
for (String alias : meta.getAliases()) {
commandMetas.put(alias, meta);
}
return true; return true;
} }
@ -148,11 +156,24 @@ public class VelocityCommandManager implements CommandManager {
// The literals of secondary aliases will preserve the children of // The literals of secondary aliases will preserve the children of
// the removed literal in the graph. // the removed literal in the graph.
dispatcher.getRoot().removeChildByName(alias.toLowerCase(Locale.ENGLISH)); dispatcher.getRoot().removeChildByName(alias.toLowerCase(Locale.ENGLISH));
CommandMeta meta = commandMetas.get(alias);
if (meta != null) {
for (String metaAlias : meta.getAliases()) {
commandMetas.remove(metaAlias, meta);
}
}
} finally { } finally {
lock.writeLock().unlock(); lock.writeLock().unlock();
} }
} }
@Override
public @Nullable CommandMeta getCommandMeta(String alias) {
Preconditions.checkNotNull(alias, "alias");
return commandMetas.get(alias);
}
/** /**
* Fires a {@link CommandExecuteEvent}. * Fires a {@link CommandExecuteEvent}.
* *

Datei anzeigen

@ -30,6 +30,8 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class VelocityCommandMeta implements CommandMeta { public final class VelocityCommandMeta implements CommandMeta {
@ -37,12 +39,14 @@ public final class VelocityCommandMeta implements CommandMeta {
private final ImmutableSet.Builder<String> aliases; private final ImmutableSet.Builder<String> aliases;
private final ImmutableList.Builder<CommandNode<CommandSource>> hints; private final ImmutableList.Builder<CommandNode<CommandSource>> hints;
private @MonotonicNonNull Object plugin;
public Builder(final String alias) { public Builder(final String alias) {
Preconditions.checkNotNull(alias, "alias"); Preconditions.checkNotNull(alias, "alias");
this.aliases = ImmutableSet.<String>builder() this.aliases = ImmutableSet.<String>builder()
.add(alias.toLowerCase(Locale.ENGLISH)); .add(alias.toLowerCase(Locale.ENGLISH));
this.hints = ImmutableList.builder(); this.hints = ImmutableList.builder();
this.plugin = null;
} }
@Override @Override
@ -69,9 +73,16 @@ public final class VelocityCommandMeta implements CommandMeta {
return this; return this;
} }
@Override
public CommandMeta.Builder plugin(Object plugin) {
Preconditions.checkNotNull(plugin, "plugin");
this.plugin = plugin;
return this;
}
@Override @Override
public CommandMeta build() { public CommandMeta build() {
return new VelocityCommandMeta(this.aliases.build(), this.hints.build()); return new VelocityCommandMeta(this.aliases.build(), this.hints.build(), this.plugin);
} }
} }
@ -111,11 +122,16 @@ public final class VelocityCommandMeta implements CommandMeta {
private final Set<String> aliases; private final Set<String> aliases;
private final List<CommandNode<CommandSource>> hints; private final List<CommandNode<CommandSource>> hints;
private final Object plugin;
private VelocityCommandMeta( private VelocityCommandMeta(
final Set<String> aliases, final List<CommandNode<CommandSource>> hints) { final Set<String> aliases,
final List<CommandNode<CommandSource>> hints,
final @Nullable Object plugin
) {
this.aliases = aliases; this.aliases = aliases;
this.hints = hints; this.hints = hints;
this.plugin = plugin;
} }
@Override @Override
@ -128,6 +144,11 @@ public final class VelocityCommandMeta implements CommandMeta {
return this.hints; return this.hints;
} }
@Override
public @Nullable Object getPlugin() {
return plugin;
}
@Override @Override
public boolean equals(final Object o) { public boolean equals(final Object o) {
if (this == o) { if (this == o) {