1
mirror of https://github.com/CarmJos/MoeTeleport.git synced 2024-09-19 21:35:56 +00:00

feat(command): 为各个指令的功能添加单独权限,修复接受指令错误的问题

This commit is contained in:
Carm Jos 2023-03-17 22:36:14 +08:00
parent 8c1a4530c0
commit 4393cc9ce2
11 changed files with 76 additions and 160 deletions

View File

@ -9,10 +9,10 @@ README LANGUAGES [ [中文](README.md) | [**English**](README-EN.md) ]
# MoeTeleport # MoeTeleport
[![CodeFactor](https://www.codefactor.io/repository/github/carm-outsource/MoeTeleport/badge?s=b76fec1f64726b5f19989aace6adb5f85fdab840)](https://www.codefactor.io/repository/github/carm-outsource/MoeTeleport) [![CodeFactor](https://www.codefactor.io/repository/github/CarmJos/MoeTeleport/badge?s=b76fec1f64726b5f19989aace6adb5f85fdab840)](https://www.codefactor.io/repository/github/CarmJos/MoeTeleport)
![CodeSize](https://img.shields.io/github/languages/code-size/carm-outsource/MoeTeleport) ![CodeSize](https://img.shields.io/github/languages/code-size/CarmJos/MoeTeleport)
[![Download](https://img.shields.io/github/downloads/carm-outsource/MoeTeleport/total)](https://github.com/carm-outsource/MoeTeleport/releases) [![Download](https://img.shields.io/github/downloads/CarmJos/MoeTeleport/total)](https://github.com/CarmJos/MoeTeleport/releases)
[![Java CI with Maven](https://github.com/carm-outsource/MoeTeleport/actions/workflows/maven.yml/badge.svg?branch=master)](https://github.com/carm-outsource/MoeTeleport/actions/workflows/maven.yml) [![Java CI with Maven](https://github.com/CarmJos/MoeTeleport/actions/workflows/maven.yml/badge.svg?branch=master)](https://github.com/CarmJos/MoeTeleport/actions/workflows/maven.yml)
![Support](https://img.shields.io/badge/Minecraft-Java%201.13--Latest-blue) ![Support](https://img.shields.io/badge/Minecraft-Java%201.13--Latest-blue)
![](https://visitor-badge.glitch.me/badge?page_id=moeteleport.readme) ![](https://visitor-badge.glitch.me/badge?page_id=moeteleport.readme)

View File

@ -9,10 +9,10 @@ README LANGUAGES [ [**中文**](README.md) | [English](README-EN.md) ]
# MoeTeleport 喵喵传送 # MoeTeleport 喵喵传送
[![CodeFactor](https://www.codefactor.io/repository/github/carm-outsource/MoeTeleport/badge?s=b76fec1f64726b5f19989aace6adb5f85fdab840)](https://www.codefactor.io/repository/github/carm-outsource/MoeTeleport) [![CodeFactor](https://www.codefactor.io/repository/github/CarmJos/MoeTeleport/badge?s=b76fec1f64726b5f19989aace6adb5f85fdab840)](https://www.codefactor.io/repository/github/CarmJos/MoeTeleport)
![CodeSize](https://img.shields.io/github/languages/code-size/carm-outsource/MoeTeleport) ![CodeSize](https://img.shields.io/github/languages/code-size/CarmJos/MoeTeleport)
[![Download](https://img.shields.io/github/downloads/carm-outsource/MoeTeleport/total)](https://github.com/carm-outsource/MoeTeleport/releases) [![Download](https://img.shields.io/github/downloads/CarmJos/MoeTeleport/total)](https://github.com/CarmJos/MoeTeleport/releases)
[![Java CI with Maven](https://github.com/carm-outsource/MoeTeleport/actions/workflows/maven.yml/badge.svg?branch=master)](https://github.com/carm-outsource/MoeTeleport/actions/workflows/maven.yml) [![Java CI with Maven](https://github.com/CarmJos/MoeTeleport/actions/workflows/maven.yml/badge.svg?branch=master)](https://github.com/CarmJos/MoeTeleport/actions/workflows/maven.yml)
![Support](https://img.shields.io/badge/Minecraft-Java%201.13--Latest-blue) ![Support](https://img.shields.io/badge/Minecraft-Java%201.13--Latest-blue)
![](https://visitor-badge.glitch.me/badge?page_id=moeteleport.readme) ![](https://visitor-badge.glitch.me/badge?page_id=moeteleport.readme)

30
pom.xml
View File

@ -11,14 +11,14 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<deps.easyplugin.version>1.5.4</deps.easyplugin.version> <deps.easyplugin.version>1.5.5</deps.easyplugin.version>
<deps.easysql.version>0.4.6</deps.easysql.version> <deps.easysql.version>0.4.6</deps.easysql.version>
<deps.mineconfig.version>2.5.0</deps.mineconfig.version> <deps.mineconfig.version>2.5.0</deps.mineconfig.version>
</properties> </properties>
<groupId>cc.carm.plugin</groupId> <groupId>cc.carm.plugin</groupId>
<artifactId>moeteleport</artifactId> <artifactId>moeteleport</artifactId>
<version>4.0.1</version> <version>4.0.2</version>
<name>MoeTeleport</name> <name>MoeTeleport</name>
<description>喵喵传送,简单的传送、设置家的插件。</description> <description>喵喵传送,简单的传送、设置家的插件。</description>
@ -44,13 +44,6 @@
</developers> </developers>
<repositories> <repositories>
<repository>
<id>carm-repo</id>
<name>Carm's Repo</name>
<url>https://repo.carm.cc/repository/maven-public/</url>
</repository>
<repository> <repository>
<id>spigot-repo</id> <id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url> <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
@ -87,10 +80,11 @@
</repository> </repository>
<repository> <repository>
<id>github</id> <id>carm-repo</id>
<name>GitHub Packages</name> <name>Carm's Repo</name>
<url>https://maven.pkg.github.com/CarmJos/${project.name}</url> <url>https://repo.carm.cc/repository/maven-public/</url>
</repository> </repository>
</repositories> </repositories>
<distributionManagement> <distributionManagement>
@ -98,7 +92,7 @@
<repository> <repository>
<id>github</id> <id>github</id>
<name>GitHub Packages</name> <name>GitHub Packages</name>
<url>https://maven.pkg.github.com/CarmJos/${project.name}</url> <url>https://maven.pkg.github.com/CarmJos/MoeTeleport</url>
</repository> </repository>
</distributionManagement> </distributionManagement>
@ -128,6 +122,14 @@
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>cc.carm.lib</groupId>
<artifactId>easyplugin-command-alias</artifactId>
<version>${deps.easyplugin.version}</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency> <dependency>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<artifactId>easyplugin-githubchecker</artifactId> <artifactId>easyplugin-githubchecker</artifactId>
@ -295,7 +297,7 @@
</execution> </execution>
</executions> </executions>
<configuration> <configuration>
<finalName>${project.name}-${project.version}</finalName> <finalName>MoeTeleport-${project.version}</finalName>
<outputDirectory>${project.basedir}/asset/</outputDirectory> <outputDirectory>${project.basedir}/asset/</outputDirectory>
<createDependencyReducedPom>false</createDependencyReducedPom> <createDependencyReducedPom>false</createDependencyReducedPom>
<filters> <filters>

View File

@ -2,6 +2,7 @@ package cc.carm.plugin.moeteleport;
import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.configuration.core.source.ConfigurationProvider;
import cc.carm.lib.easyplugin.EasyPlugin; import cc.carm.lib.easyplugin.EasyPlugin;
import cc.carm.lib.easyplugin.command.alias.AliasCommandManager;
import cc.carm.lib.easyplugin.updatechecker.GHUpdateChecker; import cc.carm.lib.easyplugin.updatechecker.GHUpdateChecker;
import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration; import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration;
import cc.carm.plugin.moeteleport.command.MainCommands; import cc.carm.plugin.moeteleport.command.MainCommands;
@ -15,6 +16,7 @@ import cc.carm.plugin.moeteleport.storage.StorageMethod;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie; import org.bstats.charts.SimplePie;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.particle.utils.ReflectionUtils; import xyz.xenondevs.particle.utils.ReflectionUtils;
public class Main extends EasyPlugin { public class Main extends EasyPlugin {
@ -28,7 +30,7 @@ public class Main extends EasyPlugin {
protected UserManager userManager; protected UserManager userManager;
protected RequestManager requestManager; protected RequestManager requestManager;
protected TeleportManager teleportManager; protected TeleportManager teleportManager;
protected CommandManager commandManager; protected AliasCommandManager commandManager;
public Main() { public Main() {
instance = this; instance = this;
@ -85,14 +87,15 @@ public class Main extends EasyPlugin {
log("注册指令..."); log("注册指令...");
registerCommand("MoeTeleport", new MainCommands(this)); registerCommand("MoeTeleport", new MainCommands(this));
try { if (PluginConfig.COMMAND.ENABLE.getNotNull()) {
this.commandManager = new CommandManager(this); log("注册简化指令映射...");
if (PluginConfig.COMMAND.ENABLE.getNotNull()) { try {
this.commandManager = new AliasCommandManager(this);
PluginConfig.COMMAND.ALIAS.getNotNull().forEach(commandManager::register); PluginConfig.COMMAND.ALIAS.getNotNull().forEach(commandManager::register);
} catch (Exception e) {
log("注册简化指令失败: " + e.getMessage());
e.printStackTrace();
} }
} catch (Exception e) {
log("注册简化指令失败: " + e.getMessage());
e.printStackTrace();
} }
if (PluginConfig.METRICS.getNotNull()) { if (PluginConfig.METRICS.getNotNull()) {
@ -116,8 +119,8 @@ public class Main extends EasyPlugin {
@Override @Override
protected void shutdown() { protected void shutdown() {
log("清空简化指令..."); if (PluginConfig.COMMAND.ENABLE.getNotNull() && this.commandManager != null) {
if (this.commandManager != null) { log("清空简化指令...");
this.commandManager.unregisterAll(); this.commandManager.unregisterAll();
} }

View File

@ -39,4 +39,9 @@ public class BackCommand extends SubCommand<MainCommands> {
return null; return null;
} }
@Override
public boolean hasPermission(CommandSender sender) {
return sender.hasPermission("MoeTeleport.back");
}
} }

View File

@ -48,4 +48,9 @@ public class HomeCommands extends CommandHandler {
return main.noPermission(sender); return main.noPermission(sender);
} }
@Override
public boolean hasPermission(CommandSender sender) {
return sender.hasPermission("MoeTeleport.home");
}
} }

View File

@ -35,7 +35,7 @@ public class ReloadCommand extends SubCommand<MainCommands> {
@Override @Override
public boolean hasPermission(CommandSender sender) { public boolean hasPermission(CommandSender sender) {
return sender.hasPermission("moeteleport.reload"); return sender.hasPermission("MoeTeleport.admin");
} }
} }

View File

@ -22,7 +22,7 @@ public class TeleportCommands extends CommandHandler {
registerSubCommand(new TeleportRequestCommand(this, TeleportRequest.Type.TPA_TO, "to")); registerSubCommand(new TeleportRequestCommand(this, TeleportRequest.Type.TPA_TO, "to"));
registerSubCommand(new TeleportRequestCommand(this, TeleportRequest.Type.TPA_HERE, "here")); registerSubCommand(new TeleportRequestCommand(this, TeleportRequest.Type.TPA_HERE, "here"));
registerSubCommand(new TeleportHandleCommand(this, true, "cancel")); registerSubCommand(new TeleportHandleCommand(this, true, "accept", "agree"));
registerSubCommand(new TeleportHandleCommand(this, false, "deny", "refuse")); registerSubCommand(new TeleportHandleCommand(this, false, "deny", "refuse"));
registerSubCommand(new TeleportCancelCommand(this, "cancel")); registerSubCommand(new TeleportCancelCommand(this, "cancel"));
} }
@ -38,4 +38,9 @@ public class TeleportCommands extends CommandHandler {
return main.noPermission(sender); return main.noPermission(sender);
} }
@Override
public boolean hasPermission(CommandSender sender) {
return sender.hasPermission("MoeTeleport.teleport");
}
} }

View File

@ -49,4 +49,10 @@ public class WarpCommands extends CommandHandler {
return main.noPermission(sender); return main.noPermission(sender);
} }
@Override
public boolean hasPermission(CommandSender sender) {
return sender.hasPermission("MoeTeleport.warp");
}
} }

View File

@ -1,122 +0,0 @@
package cc.carm.plugin.moeteleport.manager;
import cc.carm.plugin.moeteleport.Main;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.SimpleCommandMap;
import org.bukkit.plugin.SimplePluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Field;
import java.util.*;
public class CommandManager {
protected final JavaPlugin plugin;
protected final SimpleCommandMap commandMap;
protected final Field knownCommandsFiled;
protected final Map<String, AliasCommand> registeredCommands = new HashMap<>();
public CommandManager(JavaPlugin plugin) throws Exception {
this.plugin = plugin;
SimplePluginManager manager = (SimplePluginManager) Bukkit.getPluginManager();
Field commandMapField = SimplePluginManager.class.getDeclaredField("commandMap");
commandMapField.setAccessible(true);
this.commandMap = (SimpleCommandMap) commandMapField.get(manager);
this.knownCommandsFiled = SimpleCommandMap.class.getDeclaredField("knownCommands");
this.knownCommandsFiled.setAccessible(true);
}
@SuppressWarnings("unchecked")
protected Map<String, Command> getKnownCommands() {
try {
return (Map<String, Command>) knownCommandsFiled.get(commandMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return new HashMap<>();
}
public String getPrefix() {
return this.plugin.getName().toLowerCase() + " ";
}
protected SimpleCommandMap getCommandMap() {
return commandMap;
}
public void register(String alias, String target) {
AliasCommand current = this.registeredCommands.get(alias);
if (current != null) current.unregister(getCommandMap());
AliasCommand cmd = new AliasCommand(alias, this, getPrefix() + target);
this.registeredCommands.put(alias, cmd);
getCommandMap().register(Main.getInstance().getName(), cmd);
}
public void unregister(String alias) {
AliasCommand current = this.registeredCommands.remove(alias);
if (current != null) {
getKnownCommands().remove(alias);
current.unregister(getCommandMap());
}
}
public void unregisterAll() {
registeredCommands.forEach((k, v) -> {
getKnownCommands().remove(k);
v.unregister(getCommandMap());
});
registeredCommands.clear();
}
public static class AliasCommand extends Command {
protected final CommandManager commandManager;
protected final String targetCommand;
public AliasCommand(String name, CommandManager commandManager, String targetCommand) {
super(name);
this.commandManager = commandManager;
this.targetCommand = targetCommand;
}
protected SimpleCommandMap getCommandMap() {
return this.commandManager.getCommandMap();
}
protected String buildCommand(String[] args) {
return this.targetCommand + " " + String.join(" ", args);
}
@Override
public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) {
return getCommandMap().dispatch(sender, buildCommand(args));
}
@NotNull
@Override
public List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias,
@NotNull String[] args, @Nullable Location location) throws IllegalArgumentException {
return Optional.ofNullable(getCommandMap().tabComplete(sender, buildCommand(args))).orElse(Collections.emptyList());
}
@NotNull
@Override
public List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException {
return tabComplete(sender, alias, args, null);
}
}
}

View File

@ -13,18 +13,30 @@ softdepend:
- CMI - CMI
permissions: permissions:
"MoeTeleport":
description: "插件的主权限节点"
default: false
"MoeTeleport.admin": "MoeTeleport.admin":
description: "插件的管理员权限节点" description: "插件的管理员权限节点"
default: op default: op
"MoeTeleport.teleport":
description: "使用传送请求相关指令的权限。"
default: true
"MoeTeleport.home":
description: "使用家相关指令的权限。"
default: true
"MoeTeleport.warp":
description: "使用传送请求相关指令的权限。"
default: true
"MoeTeleport.back":
description: "使用返回相关指令的权限。"
default: true
commands: commands:
"MoeTeleport": "MoeTeleport":
description: "插件的主命令,用于重载插件或查看插件信息。" description: "插件的主命令,用于重载插件或查看插件信息。"
permission: "MoeTeleport.admin" usage: "您可以输入 /MoeTeleport help 查看插件的相关帮助。"
usage: "/MoeTeleport reload"
aliases: aliases:
- mt - mt