feat: 添加管理员指令
This commit is contained in:
@@ -132,16 +132,16 @@ public abstract class BallAPI {
|
||||
try (Connection connection = getDatasource().getConnection()) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
statement.execute("CREATE TABLE IF NOT EXISTS `hamster_ball_player_info`(" +
|
||||
"`uuid` CHAR(36) PRIMARY KEY," +
|
||||
"`name` VARCHAR(16) NOT NULL," +
|
||||
"`game_server` VARCHAR(32) NOT NULL," +
|
||||
"`proxy_server` VARCHAR(32) NOT NULL," +
|
||||
"`online` BOOLEAN NOT NULL" +
|
||||
") CHARSET utf8mb4;");
|
||||
"`uuid` CHAR(36) PRIMARY KEY," +
|
||||
"`name` VARCHAR(16) NOT NULL," +
|
||||
"`game_server` VARCHAR(32) NOT NULL," +
|
||||
"`proxy_server` VARCHAR(32) NOT NULL," +
|
||||
"`online` BOOLEAN NOT NULL" +
|
||||
") CHARSET utf8mb4;");
|
||||
statement.execute("CREATE TABLE IF NOT EXISTS `hamster_ball_cached_message`(" +
|
||||
"`uuid` CHAR(36) NOT NULL," +
|
||||
"`message` TEXT NOT NULL" +
|
||||
") CHARSET utf8mb4;");
|
||||
"`uuid` CHAR(36) NOT NULL," +
|
||||
"`message` TEXT NOT NULL" +
|
||||
") CHARSET utf8mb4;");
|
||||
}
|
||||
if (getBallConfig().isGameServerUpdatePlayerInfo()) {
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
@@ -267,8 +267,8 @@ public abstract class BallAPI {
|
||||
/**
|
||||
* 强制玩家执行命令
|
||||
*
|
||||
* @param type 执行对象的服务端类型
|
||||
* @param uuid 执行对象的 UUID
|
||||
* @param type 执行对象的服务端类型,null代表所有类型
|
||||
* @param uuid 执行对象的 UUID,null代表所有玩家
|
||||
* @param command 命令内容
|
||||
*/
|
||||
public void dispatchPlayerCommand(@Nullable BallServerType type, @Nullable UUID uuid, @NotNull String command) {
|
||||
|
@@ -0,0 +1,21 @@
|
||||
package cn.hamster3.mc.plugin.ball.common.command;
|
||||
|
||||
import cn.hamster3.mc.plugin.ball.common.command.adapt.ParentCommand;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class BallCommand extends ParentCommand {
|
||||
public static final BallCommand INSTANCE = new BallCommand();
|
||||
|
||||
private BallCommand() {
|
||||
addChildCommand(PlayerInfoCommand.INSTANCE);
|
||||
addChildCommand(SudoPlayerCommand.INSTANCE);
|
||||
addChildCommand(SudoAllConsoleCommand.INSTANCE);
|
||||
addChildCommand(SudoConsoleCommand.INSTANCE);
|
||||
addChildCommand(SudoAllConsoleCommand.INSTANCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getName() {
|
||||
return "hamster-ball";
|
||||
}
|
||||
}
|
@@ -0,0 +1,77 @@
|
||||
package cn.hamster3.mc.plugin.ball.common.command;
|
||||
|
||||
import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
|
||||
import cn.hamster3.mc.plugin.ball.common.command.adapt.ChildCommand;
|
||||
import cn.hamster3.mc.plugin.ball.common.command.adapt.AdaptCommandSender;
|
||||
import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class PlayerInfoCommand extends ChildCommand {
|
||||
public static final PlayerInfoCommand INSTANCE = new PlayerInfoCommand();
|
||||
|
||||
private PlayerInfoCommand() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getName() {
|
||||
return "player-info";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getUsage() {
|
||||
return "player-info <玩家名|UUID>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getDescription() {
|
||||
return "查看玩家信息";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull AdaptCommandSender sender) {
|
||||
return sender.hasPermission("hamster.ball.admin");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
if (args.length < 1) {
|
||||
sender.sendMessage(BallCommand.INSTANCE.getUsage() + " " + getUsage());
|
||||
return true;
|
||||
}
|
||||
BallPlayerInfo info;
|
||||
try {
|
||||
UUID uuid = UUID.fromString(args[0]);
|
||||
info = BallAPI.getInstance().getPlayerInfo(uuid);
|
||||
} catch (Exception e) {
|
||||
info = BallAPI.getInstance().getPlayerInfo(args[0]);
|
||||
}
|
||||
if (info == null) {
|
||||
sender.sendMessage("§c未找到玩家 " + args[0] + " 的信息");
|
||||
return true;
|
||||
}
|
||||
sender.sendMessage("§a玩家名称: " + info.getName());
|
||||
sender.sendMessage("§a玩家UUID: " + info.getUuid());
|
||||
sender.sendMessage("§a玩家在线: " + info.isOnline());
|
||||
sender.sendMessage("§a接入点: " + info.getProxyServer());
|
||||
sender.sendMessage("§a所在子服: " + info.getGameServer());
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
if (args.length == 1) {
|
||||
return BallAPI.getInstance().getAllPlayerInfo().values().stream()
|
||||
.map(BallPlayerInfo::getName)
|
||||
.filter(o -> o.toLowerCase().startsWith(args[0].toLowerCase()))
|
||||
.limit(10)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
@@ -0,0 +1,58 @@
|
||||
package cn.hamster3.mc.plugin.ball.common.command;
|
||||
|
||||
import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
|
||||
import cn.hamster3.mc.plugin.ball.common.command.adapt.ChildCommand;
|
||||
import cn.hamster3.mc.plugin.ball.common.command.adapt.AdaptCommandSender;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class SudoAllConsoleCommand extends ChildCommand {
|
||||
public static final SudoAllConsoleCommand INSTANCE = new SudoAllConsoleCommand();
|
||||
|
||||
private SudoAllConsoleCommand() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getName() {
|
||||
return "sudo-all-console";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getUsage() {
|
||||
return "sudo-all-console <服务器ID> <命令内容>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getDescription() {
|
||||
return "强制所有控制台执行指令";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull AdaptCommandSender sender) {
|
||||
return sender.hasPermission("hamster.ball.admin");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
if (args.length < 1) {
|
||||
sender.sendMessage(BallCommand.INSTANCE.getUsage() + " " + getUsage());
|
||||
return true;
|
||||
}
|
||||
StringBuilder builder = new StringBuilder(args[0]);
|
||||
for (int i = 1; i < args.length; i++) {
|
||||
builder.append(" ").append(args[i]);
|
||||
}
|
||||
String command = builder.toString();
|
||||
BallAPI.getInstance().dispatchConsoleCommand(null, null, command);
|
||||
sender.sendMessage("§a已强制所有服务器控制台执行命令: §e/" + command);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
@@ -0,0 +1,58 @@
|
||||
package cn.hamster3.mc.plugin.ball.common.command;
|
||||
|
||||
import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
|
||||
import cn.hamster3.mc.plugin.ball.common.command.adapt.ChildCommand;
|
||||
import cn.hamster3.mc.plugin.ball.common.command.adapt.AdaptCommandSender;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class SudoAllPlayerCommand extends ChildCommand {
|
||||
public static final SudoAllPlayerCommand INSTANCE = new SudoAllPlayerCommand();
|
||||
|
||||
private SudoAllPlayerCommand() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getName() {
|
||||
return "sudo-all-player";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getUsage() {
|
||||
return "sudo-all-player <命令内容>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getDescription() {
|
||||
return "强制所有玩家执行指令";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull AdaptCommandSender sender) {
|
||||
return sender.hasPermission("hamster.ball.admin");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
if (args.length < 1) {
|
||||
sender.sendMessage(BallCommand.INSTANCE.getUsage() + " " + getUsage());
|
||||
return true;
|
||||
}
|
||||
StringBuilder builder = new StringBuilder(args[0]);
|
||||
for (int i = 1; i < args.length; i++) {
|
||||
builder.append(" ").append(args[i]);
|
||||
}
|
||||
String command = builder.toString();
|
||||
BallAPI.getInstance().dispatchPlayerCommand(null, null, command);
|
||||
sender.sendMessage("§a已强制所有玩家执行命令: §e/" + command);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
@@ -0,0 +1,72 @@
|
||||
package cn.hamster3.mc.plugin.ball.common.command;
|
||||
|
||||
import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
|
||||
import cn.hamster3.mc.plugin.ball.common.command.adapt.ChildCommand;
|
||||
import cn.hamster3.mc.plugin.ball.common.command.adapt.AdaptCommandSender;
|
||||
import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class SudoConsoleCommand extends ChildCommand {
|
||||
public static final SudoConsoleCommand INSTANCE = new SudoConsoleCommand();
|
||||
|
||||
private SudoConsoleCommand() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getName() {
|
||||
return "sudo-console";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getUsage() {
|
||||
return "sudo-console <服务器ID> <命令内容>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getDescription() {
|
||||
return "强制控制台执行指令";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull AdaptCommandSender sender) {
|
||||
return sender.hasPermission("hamster.ball.admin");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(BallCommand.INSTANCE.getUsage() + " " + getUsage());
|
||||
return true;
|
||||
}
|
||||
BallServerInfo info = BallAPI.getInstance().getServerInfo(args[0]);
|
||||
if (info == null) {
|
||||
sender.sendMessage("§c服务器 " + args[0] + " 不在线");
|
||||
return true;
|
||||
}
|
||||
StringBuilder builder = new StringBuilder(args[1]);
|
||||
for (int i = 2; i < args.length; i++) {
|
||||
builder.append(" ").append(args[i]);
|
||||
}
|
||||
String command = builder.toString();
|
||||
BallAPI.getInstance().dispatchConsoleCommand(null, info.getId(), command);
|
||||
sender.sendMessage("§a已强制服务器 " + info.getName() + " 控制台执行命令: §e/" + command);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
if (args.length == 1) {
|
||||
return BallAPI.getInstance().getAllServerInfo().values().stream()
|
||||
.map(BallServerInfo::getId)
|
||||
.filter(o -> o.toLowerCase().startsWith(args[0].toLowerCase()))
|
||||
.limit(10)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
@@ -0,0 +1,83 @@
|
||||
package cn.hamster3.mc.plugin.ball.common.command;
|
||||
|
||||
import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
|
||||
import cn.hamster3.mc.plugin.ball.common.command.adapt.ChildCommand;
|
||||
import cn.hamster3.mc.plugin.ball.common.command.adapt.AdaptCommandSender;
|
||||
import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class SudoPlayerCommand extends ChildCommand {
|
||||
public static final SudoPlayerCommand INSTANCE = new SudoPlayerCommand();
|
||||
|
||||
private SudoPlayerCommand() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getName() {
|
||||
return "sudo-player";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getUsage() {
|
||||
return "sudo-player <玩家名|UUID> <命令内容>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getDescription() {
|
||||
return "强制玩家执行指令";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull AdaptCommandSender sender) {
|
||||
return sender.hasPermission("hamster.ball.admin");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(BallCommand.INSTANCE.getUsage() + " " + getUsage());
|
||||
return true;
|
||||
}
|
||||
BallPlayerInfo info;
|
||||
try {
|
||||
UUID uuid = UUID.fromString(args[0]);
|
||||
info = BallAPI.getInstance().getPlayerInfo(uuid);
|
||||
} catch (Exception e) {
|
||||
info = BallAPI.getInstance().getPlayerInfo(args[0]);
|
||||
}
|
||||
if (info == null) {
|
||||
sender.sendMessage("§c未找到玩家 " + args[0]);
|
||||
return true;
|
||||
}
|
||||
if (!info.isOnline()) {
|
||||
sender.sendMessage("§c玩家 " + args[0] + " 不在线");
|
||||
return true;
|
||||
}
|
||||
StringBuilder builder = new StringBuilder(args[1]);
|
||||
for (int i = 2; i < args.length; i++) {
|
||||
builder.append(" ").append(args[i]);
|
||||
}
|
||||
String command = builder.toString();
|
||||
BallAPI.getInstance().dispatchPlayerCommand(null, info.getUuid(), command);
|
||||
sender.sendMessage("§a已强制玩家 " + info.getName() + " 执行命令: §e/" + command);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
if (args.length == 1) {
|
||||
return BallAPI.getInstance().getAllPlayerInfo().values().stream()
|
||||
.map(BallPlayerInfo::getName)
|
||||
.filter(o -> o.toLowerCase().startsWith(args[0].toLowerCase()))
|
||||
.limit(10)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
@@ -0,0 +1,14 @@
|
||||
package cn.hamster3.mc.plugin.ball.common.command.adapt;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public interface AdaptCommandSender {
|
||||
boolean hasPermission(@NotNull String permission);
|
||||
|
||||
void sendMessage(@NotNull Component message);
|
||||
|
||||
default void sendMessage(@NotNull String message) {
|
||||
sendMessage(Component.text(message));
|
||||
}
|
||||
}
|
@@ -0,0 +1,24 @@
|
||||
package cn.hamster3.mc.plugin.ball.common.command.adapt;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class ChildCommand {
|
||||
@NotNull
|
||||
public abstract String getName();
|
||||
|
||||
@NotNull
|
||||
public abstract String getUsage();
|
||||
|
||||
@NotNull
|
||||
public abstract String getDescription();
|
||||
|
||||
public abstract boolean hasPermission(@NotNull AdaptCommandSender sender);
|
||||
|
||||
public abstract boolean onCommand(@NotNull AdaptCommandSender sender, @NotNull String[] args);
|
||||
|
||||
@Nullable
|
||||
public abstract List<String> onTabComplete(@NotNull AdaptCommandSender sender, @NotNull String[] args);
|
||||
}
|
@@ -0,0 +1,151 @@
|
||||
package cn.hamster3.mc.plugin.ball.common.command.adapt;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public abstract class ParentCommand extends ChildCommand {
|
||||
@NotNull
|
||||
private final Map<String, ChildCommand> childCommands;
|
||||
|
||||
public ParentCommand() {
|
||||
childCommands = new LinkedHashMap<>();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public abstract String getName();
|
||||
|
||||
@Nullable
|
||||
public ParentCommand getParent() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Collection<ChildCommand> getChildCommands() {
|
||||
return childCommands.values();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getUsage() {
|
||||
ParentCommand parent = getParent();
|
||||
if (parent == null) {
|
||||
return "/" + getName();
|
||||
}
|
||||
return parent.getUsage() + " " + getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull AdaptCommandSender sender) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getDescription() {
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有子命令
|
||||
* <p>
|
||||
* 如果子命令也是 ParentCommand 类型,则继续递归获取该 ParentCommand 的子命令
|
||||
*
|
||||
* @return 所有子命令
|
||||
*/
|
||||
@NotNull
|
||||
public List<ChildCommand> getEndChildCommands() {
|
||||
ArrayList<ChildCommand> list = new ArrayList<>();
|
||||
for (ChildCommand command : getChildCommands()) {
|
||||
if (command instanceof ParentCommand) {
|
||||
list.addAll(((ParentCommand) command).getEndChildCommands());
|
||||
} else {
|
||||
list.add(command);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public void addChildCommand(@NotNull ChildCommand command) {
|
||||
childCommands.put(command.getName(), command);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Map<String, String> getCommandHelp(AdaptCommandSender sender) {
|
||||
Map<String, String> map = new LinkedHashMap<>();
|
||||
for (ChildCommand child : getChildCommands()) {
|
||||
if (!child.hasPermission(sender)) {
|
||||
continue;
|
||||
}
|
||||
if (child instanceof ParentCommand) {
|
||||
Map<String, String> childMap = ((ParentCommand) child).getCommandHelp(sender);
|
||||
map.putAll(childMap);
|
||||
continue;
|
||||
}
|
||||
map.put(getUsage() + " " + child.getUsage(), child.getDescription());
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
public void sendHelp(@NotNull AdaptCommandSender sender) {
|
||||
sender.sendMessage("§e==================== [ " + getName() + " 使用帮助] ====================");
|
||||
Map<String, String> map = getCommandHelp(sender);
|
||||
int maxLength = map.keySet().stream()
|
||||
.map(String::length)
|
||||
.max(Integer::compareTo)
|
||||
.orElse(-1);
|
||||
for (Map.Entry<String, String> entry : map.entrySet()) {
|
||||
sender.sendMessage(String.format("§a%-" + maxLength + "s - %s", entry.getKey(), entry.getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
if (!hasPermission(sender)) {
|
||||
sender.sendMessage(Component.translatable("commands.help.failed").color(NamedTextColor.RED));
|
||||
return true;
|
||||
}
|
||||
if (args.length == 0) {
|
||||
sendHelp(sender);
|
||||
return true;
|
||||
}
|
||||
for (ChildCommand childCommand : getChildCommands()) {
|
||||
if (!childCommand.getName().equalsIgnoreCase(args[0])) {
|
||||
continue;
|
||||
}
|
||||
if (!childCommand.hasPermission(sender)) {
|
||||
sender.sendMessage(Component.translatable("commands.help.failed").color(NamedTextColor.RED));
|
||||
return true;
|
||||
}
|
||||
return childCommand.onCommand(sender, Arrays.copyOfRange(args, 1, args.length));
|
||||
}
|
||||
sender.sendMessage(Component.translatable("commands.help.failed").color(NamedTextColor.RED));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(@NotNull AdaptCommandSender sender, @NotNull String[] args) {
|
||||
if (args.length == 0) {
|
||||
return getChildCommands().stream()
|
||||
.filter(o -> o.hasPermission(sender))
|
||||
.map(ChildCommand::getName)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
for (ChildCommand child : getChildCommands()) {
|
||||
if (args[0].equalsIgnoreCase(child.getName())) {
|
||||
return child.onTabComplete(sender, Arrays.copyOfRange(args, 1, args.length));
|
||||
}
|
||||
}
|
||||
args[0] = args[0].toLowerCase();
|
||||
return getChildCommands().stream()
|
||||
.filter(o -> o.hasPermission(sender))
|
||||
.map(ChildCommand::getName)
|
||||
.filter(o -> o.toLowerCase().startsWith(args[0].toLowerCase()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user