mirror of
https://e.coding.net/circlecloud/YumCore.git
synced 2024-11-22 01:48:50 +00:00
feat: 添加新的命令发送者检测
Signed-off-by: 502647092 <admin@yumc.pw>
This commit is contained in:
parent
27a81f7e84
commit
a72f617b3e
@ -13,6 +13,7 @@ import pw.yumc.YumCore.bukkit.Log;
|
|||||||
import pw.yumc.YumCore.bukkit.P;
|
import pw.yumc.YumCore.bukkit.P;
|
||||||
import pw.yumc.YumCore.commands.annotation.Async;
|
import pw.yumc.YumCore.commands.annotation.Async;
|
||||||
import pw.yumc.YumCore.commands.annotation.Cmd;
|
import pw.yumc.YumCore.commands.annotation.Cmd;
|
||||||
|
import pw.yumc.YumCore.commands.annotation.Cmd.Executor;
|
||||||
import pw.yumc.YumCore.commands.annotation.Help;
|
import pw.yumc.YumCore.commands.annotation.Help;
|
||||||
import pw.yumc.YumCore.commands.annotation.Sort;
|
import pw.yumc.YumCore.commands.annotation.Sort;
|
||||||
import pw.yumc.YumCore.commands.exception.CommandException;
|
import pw.yumc.YumCore.commands.exception.CommandException;
|
||||||
@ -27,6 +28,7 @@ public class CommandInfo {
|
|||||||
public static final CommandInfo Unknow = new CommandInfo();
|
public static final CommandInfo Unknow = new CommandInfo();
|
||||||
private static final String onlyPlayer = "§c控制台无法使用此命令(§4请在游戏内执行§c)!";
|
private static final String onlyPlayer = "§c控制台无法使用此命令(§4请在游戏内执行§c)!";
|
||||||
private static final String onlyConsole = "§c玩家无法使用此命令(§4请使用控制台执行§c)!";
|
private static final String onlyConsole = "§c玩家无法使用此命令(§4请使用控制台执行§c)!";
|
||||||
|
private static final String onlyExecutor = "§c当前命令仅允许 §b%s §c执行!";
|
||||||
private static final String losePerm = "§c你需要有 %s 的权限才能执行此命令!";
|
private static final String losePerm = "§c你需要有 %s 的权限才能执行此命令!";
|
||||||
private static final String cmdErr = "§6错误原因: §4命令参数不正确!";
|
private static final String cmdErr = "§6错误原因: §4命令参数不正确!";
|
||||||
private static final String cmdUse = "§6使用方法: §e/%s %s %s";
|
private static final String cmdUse = "§6使用方法: §e/%s %s %s";
|
||||||
@ -35,6 +37,8 @@ public class CommandInfo {
|
|||||||
private final Method method;
|
private final Method method;
|
||||||
private final String name;
|
private final String name;
|
||||||
private final List<String> aliases;
|
private final List<String> aliases;
|
||||||
|
private final List<Executor> executors;
|
||||||
|
private final String executorStr;
|
||||||
private final boolean async;
|
private final boolean async;
|
||||||
private final Cmd command;
|
private final Cmd command;
|
||||||
private final Help help;
|
private final Help help;
|
||||||
@ -45,6 +49,8 @@ public class CommandInfo {
|
|||||||
this.origin = origin;
|
this.origin = origin;
|
||||||
this.name = "".equals(command.value()) ? method.getName().toLowerCase() : command.value();
|
this.name = "".equals(command.value()) ? method.getName().toLowerCase() : command.value();
|
||||||
this.aliases = Arrays.asList(command.aliases());
|
this.aliases = Arrays.asList(command.aliases());
|
||||||
|
this.executors = Arrays.asList(command.executor());
|
||||||
|
this.executorStr = eS(executors);
|
||||||
this.command = command;
|
this.command = command;
|
||||||
this.help = help;
|
this.help = help;
|
||||||
this.async = async;
|
this.async = async;
|
||||||
@ -56,6 +62,8 @@ public class CommandInfo {
|
|||||||
this.origin = null;
|
this.origin = null;
|
||||||
this.name = "unknow";
|
this.name = "unknow";
|
||||||
this.aliases = null;
|
this.aliases = null;
|
||||||
|
this.executors = null;
|
||||||
|
this.executorStr = null;
|
||||||
this.command = null;
|
this.command = null;
|
||||||
this.help = null;
|
this.help = null;
|
||||||
this.async = false;
|
this.async = false;
|
||||||
@ -93,15 +101,9 @@ public class CommandInfo {
|
|||||||
/**
|
/**
|
||||||
* 执行命令
|
* 执行命令
|
||||||
*
|
*
|
||||||
* @param sender
|
* @param cmdArgs
|
||||||
* 命令发送者
|
* 命令参数
|
||||||
* @param command
|
* @return 是否执行成功
|
||||||
* 主命令
|
|
||||||
* @param label
|
|
||||||
* 主命令别名
|
|
||||||
* @param args
|
|
||||||
* 子命令参数
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
public boolean execute(final CommandArgument cmdArgs) {
|
public boolean execute(final CommandArgument cmdArgs) {
|
||||||
if (method == null) {
|
if (method == null) {
|
||||||
@ -183,12 +185,33 @@ public class CommandInfo {
|
|||||||
*/
|
*/
|
||||||
private boolean check(final CommandArgument cmdArgs) {
|
private boolean check(final CommandArgument cmdArgs) {
|
||||||
final CommandSender sender = cmdArgs.getSender();
|
final CommandSender sender = cmdArgs.getSender();
|
||||||
|
return checkArgs(sender, cmdArgs) && checkSender(sender) && checkPerm(sender);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkArgs(final CommandSender sender, final CommandArgument cmdArgs) {
|
||||||
if (cmdArgs.getArgs().length < command.minimumArguments()) {
|
if (cmdArgs.getArgs().length < command.minimumArguments()) {
|
||||||
Log.toSender(sender, cmdErr);
|
Log.toSender(sender, cmdErr);
|
||||||
Log.toSender(sender, String.format(cmdUse, cmdArgs.getAlias(), getName(), help.possibleArguments()));
|
Log.toSender(sender, String.format(cmdUse, cmdArgs.getAlias(), getName(), help.possibleArguments()));
|
||||||
Log.toSender(sender, String.format(cmdDes, help.value()));
|
Log.toSender(sender, String.format(cmdDes, help.value()));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkPerm(final CommandSender sender) {
|
||||||
|
final String perm = command.permission();
|
||||||
|
if (perm != null && !"".equals(perm) && !sender.hasPermission(perm)) {
|
||||||
|
Log.toSender(sender, String.format(losePerm, perm));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkSender(final CommandSender sender) {
|
||||||
|
if (!executors.contains(Executor.ALL) && !executors.contains(Executor.valueOf(sender))) {
|
||||||
|
Log.toSender(sender, String.format(onlyExecutor, executorStr));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (sender instanceof Player) {
|
if (sender instanceof Player) {
|
||||||
if (command.onlyConsole()) {
|
if (command.onlyConsole()) {
|
||||||
Log.toSender(sender, onlyConsole);
|
Log.toSender(sender, onlyConsole);
|
||||||
@ -200,11 +223,15 @@ public class CommandInfo {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final String perm = command.permission();
|
|
||||||
if (perm != null && !"".equals(perm) && !sender.hasPermission(perm)) {
|
|
||||||
Log.toSender(sender, String.format(losePerm, perm));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String eS(final List<Executor> executors) {
|
||||||
|
final StringBuffer str = new StringBuffer();
|
||||||
|
for (final Executor executor : executors) {
|
||||||
|
str.append(executor.getName());
|
||||||
|
str.append(", ");
|
||||||
|
}
|
||||||
|
return str.toString().substring(0, str.length() - 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,13 @@ import java.lang.annotation.Retention;
|
|||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
import org.bukkit.command.BlockCommandSender;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.ConsoleCommandSender;
|
||||||
|
import org.bukkit.command.RemoteConsoleCommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.minecart.CommandMinecart;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 命令注解
|
* 命令注解
|
||||||
*
|
*
|
||||||
@ -29,28 +36,136 @@ public @interface Cmd {
|
|||||||
*/
|
*/
|
||||||
String[] aliases() default "";
|
String[] aliases() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return 命令执行者
|
||||||
|
*/
|
||||||
|
Executor[] executor() default Executor.ALL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return 命令最小参数
|
* @return 命令最小参数
|
||||||
*/
|
*/
|
||||||
int minimumArguments() default 0;
|
int minimumArguments() default 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated 详见 {@link Executor}
|
||||||
|
* @return 只允许控制台执行
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
boolean onlyConsole() default false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated 详见 {@link Executor}
|
||||||
|
* @return 只允许玩家执行
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
boolean onlyPlayer() default false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return 当前命令权限
|
||||||
|
*/
|
||||||
|
String permission() default "";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return 命令名称
|
* @return 命令名称
|
||||||
*/
|
*/
|
||||||
String value() default "";
|
String value() default "";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return 只允许控制台执行
|
* 命令执行者
|
||||||
|
*
|
||||||
|
* @author 喵♂呜
|
||||||
|
* @since 2016年8月26日 下午8:55:15
|
||||||
*/
|
*/
|
||||||
boolean onlyConsole() default false;
|
public enum Executor {
|
||||||
|
/**
|
||||||
|
* 玩家
|
||||||
|
*/
|
||||||
|
PLAYER {
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "玩家";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 控制台
|
||||||
|
*/
|
||||||
|
CONSOLE {
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "控制台";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 命令方块
|
||||||
|
*/
|
||||||
|
BLOCK {
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "命令方块";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 命令矿车
|
||||||
|
*/
|
||||||
|
COMMANDMINECART {
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "命令矿车";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 远程控制台
|
||||||
|
*/
|
||||||
|
REMOTECONSOLE {
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "远程控制台";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 所有
|
||||||
|
*/
|
||||||
|
ALL {
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "所有执行者";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 未知
|
||||||
|
*/
|
||||||
|
UNKNOW {
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "未知";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* 解析Executor
|
||||||
|
*
|
||||||
|
* @param sender
|
||||||
|
* 命令执行者
|
||||||
|
* @return {@link Executor}
|
||||||
|
*/
|
||||||
|
public static Executor valueOf(final CommandSender sender) {
|
||||||
|
if (sender instanceof Player) {
|
||||||
|
return Executor.PLAYER;
|
||||||
|
} else if (sender instanceof ConsoleCommandSender) {
|
||||||
|
return Executor.CONSOLE;
|
||||||
|
} else if (sender instanceof BlockCommandSender) {
|
||||||
|
return Executor.BLOCK;
|
||||||
|
} else if (sender instanceof CommandMinecart) {
|
||||||
|
return Executor.COMMANDMINECART;
|
||||||
|
} else if (sender instanceof RemoteConsoleCommandSender) {
|
||||||
|
return Executor.REMOTECONSOLE;
|
||||||
|
} else {
|
||||||
|
return Executor.UNKNOW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return 只允许玩家执行
|
* @return 执行者名称
|
||||||
*/
|
*/
|
||||||
boolean onlyPlayer() default false;
|
public abstract String getName();
|
||||||
|
}
|
||||||
/**
|
|
||||||
* @return 当前命令权限
|
|
||||||
*/
|
|
||||||
String permission() default "";
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user