add CommandManager
This commit is contained in:
8
src/main/java/ghast/command/CommandExecuter.java
Normal file
8
src/main/java/ghast/command/CommandExecuter.java
Normal file
@@ -0,0 +1,8 @@
|
||||
package ghast.command;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public interface CommandExecuter {
|
||||
|
||||
void execute(CommandSender sender, String[] args);
|
||||
}
|
||||
67
src/main/java/ghast/command/CommandManager.java
Normal file
67
src/main/java/ghast/command/CommandManager.java
Normal file
@@ -0,0 +1,67 @@
|
||||
package ghast.command;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import ru.dmitriymx.reflection.ReflectionObject;
|
||||
|
||||
@UtilityClass
|
||||
@SuppressWarnings("unused")
|
||||
public class CommandManager {
|
||||
|
||||
public Builder create(String name) {
|
||||
return new Builder(name);
|
||||
}
|
||||
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public static class Builder {
|
||||
|
||||
private final String name;
|
||||
private CommandExecuter executer;
|
||||
private ErrorConsumer errorConsumer;
|
||||
private Boolean onlyPlayer;
|
||||
private String deniedMessage;
|
||||
|
||||
public Builder executer(CommandExecuter executer) {
|
||||
this.executer = executer;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder onError(ErrorConsumer errorConsumer) {
|
||||
this.errorConsumer = errorConsumer;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder useOnlyPlayer(String deniedMessage) {
|
||||
this.onlyPlayer = true;
|
||||
this.deniedMessage = deniedMessage;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder useOnlyPlayer() {
|
||||
return useOnlyPlayer(null);
|
||||
}
|
||||
|
||||
public Builder useOnlyConsole(String deniedMessage) {
|
||||
this.onlyPlayer = false;
|
||||
this.deniedMessage = deniedMessage;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder useOnlyConsole() {
|
||||
return useOnlyConsole(null);
|
||||
}
|
||||
|
||||
public void register() {
|
||||
//TODO для Paper такие "извращения" не требуются. Нужно продумать.
|
||||
new ReflectionObject(Bukkit.getServer())
|
||||
.method("getCommandMap").invoke()
|
||||
.method("register", String.class, Command.class).invoke(
|
||||
name, new CommandWrapper(name, this.onlyPlayer, this.deniedMessage,
|
||||
this.executer, this.errorConsumer)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
71
src/main/java/ghast/command/CommandWrapper.java
Normal file
71
src/main/java/ghast/command/CommandWrapper.java
Normal file
@@ -0,0 +1,71 @@
|
||||
package ghast.command;
|
||||
|
||||
import ghast.XLog;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.defaults.BukkitCommand;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
class CommandWrapper extends BukkitCommand {
|
||||
|
||||
private static final String DEFAULT_DENIED_MESSAGE_PLAYERS = ChatColor.RED + "This command use only players";
|
||||
private static final String DEFAULT_DENIED_MESSAGE_CONSOLE = ChatColor.RED + "This command use only in console";
|
||||
|
||||
private static final ErrorConsumer DEFAULT_ERROR_CONSUMER =
|
||||
(sender, commandName, args, exception) -> {
|
||||
sender.sendMessage(String.format("%sError execute command '%s'!", ChatColor.RED, commandName));
|
||||
XLog.error("Error execute command ''{0}'' with args ''{1}''",
|
||||
commandName, String.join(" ", args), exception);
|
||||
};
|
||||
|
||||
private final CommandExecuter executer;
|
||||
private final ErrorConsumer errorConsumer;
|
||||
private final Boolean onlyPlayer;
|
||||
private String deniedMessage;
|
||||
|
||||
protected CommandWrapper(String name, Boolean onlyPlayer, String deniedMessage,
|
||||
CommandExecuter executer, ErrorConsumer errorConsumer) {
|
||||
super(name);
|
||||
this.onlyPlayer = onlyPlayer;
|
||||
this.executer = executer;
|
||||
|
||||
if (onlyPlayer != null) {
|
||||
if (deniedMessage == null) {
|
||||
this.deniedMessage = Boolean.TRUE.equals(onlyPlayer) ? DEFAULT_DENIED_MESSAGE_PLAYERS
|
||||
: DEFAULT_DENIED_MESSAGE_CONSOLE;
|
||||
} else {
|
||||
this.deniedMessage = deniedMessage;
|
||||
}
|
||||
}
|
||||
|
||||
if(errorConsumer == null) {
|
||||
this.errorConsumer = DEFAULT_ERROR_CONSUMER;
|
||||
} else {
|
||||
this.errorConsumer = errorConsumer;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("java:S1066")
|
||||
public boolean execute(CommandSender commandSender, String commandName, String[] args) {
|
||||
if (Boolean.TRUE.equals(onlyPlayer)) {
|
||||
if (!(commandSender instanceof Player)) {
|
||||
commandSender.sendMessage(deniedMessage);
|
||||
return true;
|
||||
}
|
||||
} else if (Boolean.FALSE.equals(onlyPlayer)) { // use console only
|
||||
if (commandSender instanceof Player) {
|
||||
commandSender.sendMessage(deniedMessage);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
executer.execute(commandSender, args);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
errorConsumer.accept(commandSender, commandName, args, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
8
src/main/java/ghast/command/ErrorConsumer.java
Normal file
8
src/main/java/ghast/command/ErrorConsumer.java
Normal file
@@ -0,0 +1,8 @@
|
||||
package ghast.command;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public interface ErrorConsumer {
|
||||
|
||||
void accept(CommandSender sender, String commandName, String[] args, Exception exception);
|
||||
}
|
||||
Reference in New Issue
Block a user