Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-11-16 21:10:30 +01:00
Expose CommandMeta in CommandManager and add a ref to the plugin instance (#544)
Dieser Commit ist enthalten in:
Ursprung
ac4b4a34ca
Commit
922c001b59
@ -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}.
|
||||||
*
|
*
|
||||||
|
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -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}.
|
||||||
*
|
*
|
||||||
|
@ -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) {
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren