Added new Brigadier commands related APIs for bungee/paper/cli + a few javadoc
This commit is contained in:
48
pandalib-bungee-commands/pom.xml
Normal file
48
pandalib-bungee-commands/pom.xml
Normal file
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>pandalib-parent</artifactId>
|
||||
<groupId>fr.pandacube.lib</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>pandalib-bungee-commands</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>bungeecord-repo</id>
|
||||
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>fr.pandacube.lib</groupId>
|
||||
<artifactId>pandalib-util</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>fr.pandacube.lib</groupId>
|
||||
<artifactId>pandalib-chat</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>fr.pandacube.lib</groupId>
|
||||
<artifactId>pandalib-commands</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-api</artifactId>
|
||||
<version>${bungeecord.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
@@ -0,0 +1,128 @@
|
||||
package fr.pandacube.lib.bungee.commands;
|
||||
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import com.mojang.brigadier.context.ParsedCommandNode;
|
||||
import com.mojang.brigadier.context.StringRange;
|
||||
import com.mojang.brigadier.suggestion.Suggestion;
|
||||
import com.mojang.brigadier.suggestion.SuggestionProvider;
|
||||
import com.mojang.brigadier.suggestion.Suggestions;
|
||||
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
|
||||
import com.mojang.brigadier.tree.LiteralCommandNode;
|
||||
import fr.pandacube.lib.commands.BrigadierCommand;
|
||||
import fr.pandacube.lib.commands.SuggestionsSupplier;
|
||||
import fr.pandacube.lib.reflect.Reflect;
|
||||
import fr.pandacube.lib.util.Log;
|
||||
import net.md_5.bungee.api.CommandSender;
|
||||
import net.md_5.bungee.api.ProxyServer;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
import net.md_5.bungee.api.plugin.Command;
|
||||
import net.md_5.bungee.api.plugin.TabExecutor;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public abstract class BungeeBrigadierCommand extends BrigadierCommand<CommandSender> {
|
||||
|
||||
protected BungeeBrigadierDispatcher dispatcher;
|
||||
|
||||
public BungeeBrigadierCommand(BungeeBrigadierDispatcher d) {
|
||||
if (d == null) {
|
||||
throw new IllegalStateException("BungeeBrigadierDispatcher not provided.");
|
||||
}
|
||||
dispatcher = d;
|
||||
|
||||
LiteralCommandNode<CommandSender> commandNode;
|
||||
String[] aliases;
|
||||
|
||||
try {
|
||||
commandNode = buildCommand().build();
|
||||
postBuildCommand(commandNode);
|
||||
aliases = getAliases();
|
||||
} catch (Exception e) {
|
||||
Log.severe("Exception encountered when building Brigadier command " + getClass().getName(), e);
|
||||
return;
|
||||
}
|
||||
if (aliases == null)
|
||||
aliases = new String[0];
|
||||
|
||||
dispatcher.register(commandNode);
|
||||
|
||||
// still have to be registered for console
|
||||
ProxyServer.getInstance().getPluginManager().registerCommand(dispatcher.plugin, new CommandRelay(commandNode.getLiteral()));
|
||||
|
||||
for (String alias : aliases) {
|
||||
dispatcher.register(literal(alias)
|
||||
.requires(commandNode.getRequirement())
|
||||
.executes(commandNode.getCommand())
|
||||
.redirect(commandNode)
|
||||
.build()
|
||||
);
|
||||
|
||||
ProxyServer.getInstance().getPluginManager().registerCommand(dispatcher.plugin, new CommandRelay(alias));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class CommandRelay extends Command implements TabExecutor {
|
||||
private final String alias;
|
||||
public CommandRelay(String alias) {
|
||||
super(alias);
|
||||
this.alias = alias;
|
||||
}
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
dispatcher.execute(sender, alias + (args.length == 0 ? "" : (" " + String.join(" ", args))));
|
||||
}
|
||||
@Override
|
||||
public Iterable<String> onTabComplete(CommandSender sender, String[] args) {
|
||||
|
||||
String cursor = "/" + alias + " " + String.join(" ", args);
|
||||
|
||||
StringRange supportedRange = StringRange.between(cursor.lastIndexOf(' ') + 1, cursor.length());
|
||||
|
||||
Suggestions suggestions = dispatcher.getSuggestions(sender, cursor.substring(1));
|
||||
if (!suggestions.getRange().equals(supportedRange))
|
||||
return Collections.emptyList();
|
||||
|
||||
return suggestions.getList()
|
||||
.stream()
|
||||
.filter(s -> s.getRange().equals(supportedRange))
|
||||
.map(Suggestion::getText)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public boolean isConsole(CommandSender sender) {
|
||||
return ProxyServer.getInstance().getConsole().equals(sender);
|
||||
}
|
||||
public boolean isPlayer(CommandSender sender) {
|
||||
return sender instanceof ProxiedPlayer;
|
||||
}
|
||||
public Predicate<CommandSender> hasPermission(String permission) {
|
||||
return sender -> sender.hasPermission(permission);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
protected SuggestionProvider<CommandSender> wrapSuggestions(SuggestionsSupplier<CommandSender> suggestions) {
|
||||
return wrapSuggestions(suggestions, Function.identity());
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -0,0 +1,72 @@
|
||||
package fr.pandacube.lib.bungee.commands;
|
||||
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
import com.mojang.brigadier.ParseResults;
|
||||
import com.mojang.brigadier.context.CommandContextBuilder;
|
||||
import com.mojang.brigadier.context.StringRange;
|
||||
import com.mojang.brigadier.context.SuggestionContext;
|
||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||
import com.mojang.brigadier.suggestion.Suggestion;
|
||||
import com.mojang.brigadier.suggestion.Suggestions;
|
||||
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
|
||||
import com.mojang.brigadier.tree.CommandNode;
|
||||
import com.mojang.brigadier.tree.LiteralCommandNode;
|
||||
import fr.pandacube.lib.chat.Chat;
|
||||
import fr.pandacube.lib.commands.BrigadierCommand;
|
||||
import fr.pandacube.lib.commands.BrigadierDispatcher;
|
||||
import fr.pandacube.lib.commands.BrigadierSuggestionsUtil;
|
||||
import fr.pandacube.lib.util.Log;
|
||||
import net.kyori.adventure.text.ComponentLike;
|
||||
import net.md_5.bungee.api.CommandSender;
|
||||
import net.md_5.bungee.api.ProxyServer;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
import net.md_5.bungee.api.event.ChatEvent;
|
||||
import net.md_5.bungee.api.plugin.Listener;
|
||||
import net.md_5.bungee.api.plugin.Plugin;
|
||||
import net.md_5.bungee.event.EventHandler;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class BungeeBrigadierDispatcher extends BrigadierDispatcher<CommandSender> implements Listener {
|
||||
|
||||
|
||||
|
||||
|
||||
/* package */ final Plugin plugin;
|
||||
|
||||
public BungeeBrigadierDispatcher(Plugin pl) {
|
||||
plugin = pl;
|
||||
ProxyServer.getInstance().getPluginManager().registerListener(plugin, this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void onChat(ChatEvent event) {
|
||||
if (!event.getMessage().startsWith("/"))
|
||||
return;
|
||||
|
||||
String commandLine = event.getMessage().substring(1);
|
||||
|
||||
String commandName = commandLine.split(" ", -1)[0];
|
||||
|
||||
if (getDispatcher().getRoot().getChild(commandName) == null)
|
||||
return;
|
||||
|
||||
event.setCancelled(true);
|
||||
|
||||
ProxyServer.getInstance().getScheduler().runAsync(plugin, () -> execute((ProxiedPlayer) event.getSender(), commandLine));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void sendSenderMessage(CommandSender sender, ComponentLike message) {
|
||||
sender.sendMessage(Chat.toBungee(message.asComponent()));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user