mirror of
https://e.coding.net/circlecloud/Yum.git
synced 2024-11-22 14:28:46 +00:00
添加File文件操作命令...
Signed-off-by: 502647092 <jtb1@163.com>
This commit is contained in:
parent
8819fe6ad2
commit
3f52c0462a
4
pom.xml
4
pom.xml
@ -3,7 +3,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>cn.citycraft</groupId>
|
||||
<artifactId>Yum</artifactId>
|
||||
<version>1.8.9</version>
|
||||
<version>1.9</version>
|
||||
<name>Yum</name>
|
||||
<description>Minecraft 服务器插件管理系统</description>
|
||||
<build>
|
||||
@ -55,7 +55,7 @@
|
||||
</build>
|
||||
<properties>
|
||||
<jenkins.url>http://ci.citycraft.cn:8080</jenkins.url>
|
||||
<update.description>&a通过检测NMS版本实现多端兼容处理...</update.description>
|
||||
<update.description>&c添加File文件操作命令...</update.description>
|
||||
<env.BUILD_NUMBER>Debug</env.BUILD_NUMBER>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
@ -9,6 +9,7 @@ import cn.citycraft.PluginHelper.config.FileConfig;
|
||||
import cn.citycraft.PluginHelper.utils.VersionChecker;
|
||||
import cn.citycraft.Yum.api.YumAPI;
|
||||
import cn.citycraft.Yum.commands.YumCommand;
|
||||
import cn.citycraft.Yum.file.commands.FileCommand;
|
||||
|
||||
/**
|
||||
* MC插件仓库
|
||||
@ -25,8 +26,9 @@ public class Yum extends JavaPlugin {
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
new YumCommand(this);
|
||||
new YumAPI(this);
|
||||
new YumCommand(this);
|
||||
new FileCommand(this);
|
||||
YumAPI.getRepo().jsonToCache(config);
|
||||
YumAPI.updaterepo();
|
||||
new VersionChecker(this);
|
||||
|
@ -2,6 +2,8 @@ package cn.citycraft.Yum.api;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
@ -34,7 +36,7 @@ public class YumAPI {
|
||||
* 初始化Yum管理中心
|
||||
*
|
||||
* @param plugin
|
||||
* - 插件实体
|
||||
* 插件实体
|
||||
*/
|
||||
public YumAPI(final Plugin plugin) {
|
||||
YumAPI.main = plugin;
|
||||
@ -47,7 +49,7 @@ public class YumAPI {
|
||||
* 删除插件
|
||||
*
|
||||
* @param plugin
|
||||
* - 插件实体
|
||||
* 插件实体
|
||||
*/
|
||||
public static void delete(final Plugin plugin) {
|
||||
plugman.deletePlugin(plugin);
|
||||
@ -84,11 +86,11 @@ public class YumAPI {
|
||||
* 安装新插件
|
||||
*
|
||||
* @param sender
|
||||
* - 命令发送者
|
||||
* 命令发送者
|
||||
* @param pluginname
|
||||
* - 插件名称
|
||||
* 插件名称
|
||||
* @param version
|
||||
* - 插件版本
|
||||
* 插件版本
|
||||
* @return 是否安装成功
|
||||
*/
|
||||
public static boolean install(final CommandSender sender, final String pluginname, final String url) {
|
||||
@ -103,9 +105,9 @@ public class YumAPI {
|
||||
* 安装新插件
|
||||
*
|
||||
* @param pluginname
|
||||
* - 插件名称
|
||||
* 插件名称
|
||||
* @param version
|
||||
* - 插件版本
|
||||
* 插件版本
|
||||
* @return 是否安装成功
|
||||
*/
|
||||
public static boolean install(final String pluginname, final String url) {
|
||||
@ -116,9 +118,9 @@ public class YumAPI {
|
||||
* 安装新插件
|
||||
*
|
||||
* @param sender
|
||||
* - 命令发送者
|
||||
* 命令发送者
|
||||
* @param pluginname
|
||||
* - 插件名称
|
||||
* 插件名称
|
||||
* @return 是否安装成功
|
||||
*/
|
||||
public static boolean installfromyum(final CommandSender sender, final String pluginname) {
|
||||
@ -129,11 +131,11 @@ public class YumAPI {
|
||||
* 安装新插件
|
||||
*
|
||||
* @param sender
|
||||
* - 命令发送者
|
||||
* 命令发送者
|
||||
* @param pluginname
|
||||
* - 插件名称
|
||||
* 插件名称
|
||||
* @param version
|
||||
* - 插件版本
|
||||
* 插件版本
|
||||
* @return 是否安装成功
|
||||
*/
|
||||
public static boolean installfromyum(final CommandSender sender, final String pluginname, final String version) {
|
||||
@ -148,7 +150,7 @@ public class YumAPI {
|
||||
* 载入插件
|
||||
*
|
||||
* @param pluginname
|
||||
* - 插件名称
|
||||
* 插件名称
|
||||
*/
|
||||
public static void load(final File pluginFile) {
|
||||
plugman.load(pluginFile);
|
||||
@ -158,7 +160,7 @@ public class YumAPI {
|
||||
* 载入插件
|
||||
*
|
||||
* @param pluginname
|
||||
* - 插件名称
|
||||
* 插件名称
|
||||
*/
|
||||
public static void load(final String pluginname) {
|
||||
plugman.load(pluginname);
|
||||
@ -168,7 +170,7 @@ public class YumAPI {
|
||||
* 重载插件
|
||||
*
|
||||
* @param plugin
|
||||
* - 插件实体
|
||||
* 插件实体
|
||||
*/
|
||||
public static void reload(final Plugin plugin) {
|
||||
plugman.reload(plugin);
|
||||
@ -178,7 +180,7 @@ public class YumAPI {
|
||||
* 卸载插件
|
||||
*
|
||||
* @param plugin
|
||||
* - 插件实体
|
||||
* 插件实体
|
||||
*/
|
||||
public static void unload(final Plugin plugin) {
|
||||
plugman.unload(plugin);
|
||||
@ -188,11 +190,11 @@ public class YumAPI {
|
||||
* 更新插件
|
||||
*
|
||||
* @param sender
|
||||
* - 命令发送者
|
||||
* 命令发送者
|
||||
* @param plugin
|
||||
* - 插件实体
|
||||
* 插件实体
|
||||
* @param url
|
||||
* - 新插件的下载地址
|
||||
* 新插件的下载地址
|
||||
* @return 是否更新成功
|
||||
*/
|
||||
public static boolean update(final CommandSender sender, final Plugin plugin, final URL url) {
|
||||
@ -208,9 +210,9 @@ public class YumAPI {
|
||||
* 更新插件
|
||||
*
|
||||
* @param plugin
|
||||
* - 插件实体
|
||||
* 插件实体
|
||||
* @param url
|
||||
* - 新插件的下载地址
|
||||
* 新插件的下载地址
|
||||
* @return 是否更新成功
|
||||
*/
|
||||
public static boolean update(final Plugin plugin, final URL url) {
|
||||
@ -221,30 +223,29 @@ public class YumAPI {
|
||||
* 更新支持Yum的插件
|
||||
*
|
||||
* @param sender
|
||||
* - 命令发送者
|
||||
* 命令发送者
|
||||
*/
|
||||
public static void updateall(final CommandSender sender) {
|
||||
final List<Plugin> ulist = new ArrayList<>();
|
||||
try {
|
||||
|
||||
final Map<String, Plugin> updatelist = UpdatePlugin.getUpdateList();
|
||||
if (updatelist.size() > 0) {
|
||||
for (final Entry<String, Plugin> updateplugin : UpdatePlugin.getUpdateList().entrySet()) {
|
||||
sender.sendMessage("§d一键更新: §a开始更新" + updateplugin.getKey() + "!");
|
||||
updatefromyum(sender, updateplugin.getValue(), null);
|
||||
ulist.add(updateplugin.getValue());
|
||||
}
|
||||
UpdatePlugin.clearList();
|
||||
sender.sendMessage("§d一键更新: §e已下载所有需要升级的插件到 服务器更新 文件夹");
|
||||
sender.sendMessage("§d一键更新: §e插件将在重启后自动更新(或使用§b/yum upgrade§e直接升级)!");
|
||||
} else {
|
||||
sender.sendMessage("§6更新: §e未找到需要更新且可以用Yum处理的插件!");
|
||||
}
|
||||
} catch (final Exception | Error e) {
|
||||
try {
|
||||
final Map<Plugin, String> updatelist = UpdatePlugin.getList();
|
||||
if (updatelist.size() > 0) {
|
||||
for (final Entry<Plugin, String> updateplugin : UpdatePlugin.getList().entrySet()) {
|
||||
sender.sendMessage("§d一键更新: §a开始更新" + updateplugin.getKey().getName() + "!");
|
||||
updatefromyum(sender, updateplugin.getKey(), null);
|
||||
ulist.addAll(updatelist.keySet());
|
||||
UpdatePlugin.getList().clear();
|
||||
} catch (final Exception | Error e2) {
|
||||
sender.sendMessage("§4错误: §c无法检索全体更新列表!");
|
||||
sender.sendMessage("§4异常: §c" + e2.getMessage());
|
||||
}
|
||||
}
|
||||
if (ulist.size() > 0) {
|
||||
for (final Plugin updateplugin : ulist) {
|
||||
sender.sendMessage("§d一键更新: §a开始更新" + updateplugin.getName() + "!");
|
||||
updatefromyum(sender, updateplugin, null, true);
|
||||
}
|
||||
UpdatePlugin.getList().clear();
|
||||
sender.sendMessage("§d一键更新: §e已下载所有需要升级的插件到 服务器更新 文件夹");
|
||||
@ -252,20 +253,15 @@ public class YumAPI {
|
||||
} else {
|
||||
sender.sendMessage("§6更新: §e未找到需要更新且可以用Yum处理的插件!");
|
||||
}
|
||||
} catch (final Exception | Error e2) {
|
||||
sender.sendMessage("§4错误: §c无法检索全体更新列表!");
|
||||
sender.sendMessage("§4异常: §c" + e2.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新插件
|
||||
*
|
||||
* @param sender
|
||||
* - 命令发送者
|
||||
* 命令发送者
|
||||
* @param plugin
|
||||
* - 插件实体
|
||||
* 插件实体
|
||||
* @return 是否更新成功
|
||||
*/
|
||||
public static boolean updatefromyum(final CommandSender sender, final Plugin plugin) {
|
||||
@ -276,19 +272,38 @@ public class YumAPI {
|
||||
* 从Yum内部更新插件
|
||||
*
|
||||
* @param sender
|
||||
* - 命令发送者
|
||||
* 命令发送者
|
||||
* @param plugin
|
||||
* - 插件实体
|
||||
* 插件实体
|
||||
* @param version
|
||||
* - 插件版本(null则自动获取)
|
||||
* 插件版本(null则自动获取)
|
||||
* @return
|
||||
*/
|
||||
public static boolean updatefromyum(final CommandSender sender, final Plugin plugin, final String version) {
|
||||
return updatefromyum(sender, plugin, version, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 从Yum内部更新插件
|
||||
*
|
||||
* @param sender
|
||||
* 命令发送者
|
||||
* @param plugin
|
||||
* 插件实体
|
||||
* @param version
|
||||
* 插件版本(null则自动获取)
|
||||
* @param oneKeyUpdate
|
||||
* 是否一键更新
|
||||
* @return
|
||||
*/
|
||||
public static boolean updatefromyum(final CommandSender sender, final Plugin plugin, final String version, final boolean oneKeyUpdate) {
|
||||
final PluginInfo pi = repo.getPlugin(plugin.getName());
|
||||
if (pi != null) {
|
||||
if (download.run(sender, pi.getUrl(sender, version), new File(Bukkit.getUpdateFolderFile(), plugman.getPluginFile(plugin).getName()))) {
|
||||
if (!oneKeyUpdate) {
|
||||
sender.sendMessage("§6更新: §e已下载 " + plugin.getName() + " 插件到服务器更新文件夹");
|
||||
sender.sendMessage("§6更新: §e插件将在重启后自动更新(或使用§b/yum upgrade§e直接升级)!");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
@ -311,9 +326,9 @@ public class YumAPI {
|
||||
|
||||
/**
|
||||
* @param sender
|
||||
* - 命令发送者
|
||||
* 命令发送者
|
||||
* @param plugin
|
||||
* - 插件实体
|
||||
* 插件实体
|
||||
*/
|
||||
public static void upgrade(final CommandSender sender, final Plugin plugin) {
|
||||
plugman.upgrade(sender, plugin);
|
||||
|
@ -22,7 +22,7 @@ public class CommandDelete extends BaseCommand {
|
||||
Yum main;
|
||||
|
||||
public CommandDelete(final Yum main) {
|
||||
super("d");
|
||||
super("del");
|
||||
this.main = main;
|
||||
setMinimumArguments(1);
|
||||
setDescription("删除插件");
|
||||
|
@ -34,7 +34,7 @@ public class CommandList extends BaseCommand {
|
||||
public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException {
|
||||
sender.sendMessage("§6[Yum仓库]§3服务器已安装插件: ");
|
||||
for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
|
||||
sender.sendMessage("§6 - " + YumAPI.getPlugman().getFormattedName(plugin, true));
|
||||
sender.sendMessage("§6- " + YumAPI.getPlugman().getFormattedName(plugin, true));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -0,0 +1,49 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package cn.citycraft.Yum.file.commands;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandException;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import cn.citycraft.PluginHelper.commands.BaseCommand;
|
||||
import cn.citycraft.Yum.Yum;
|
||||
|
||||
/**
|
||||
* 插件删除命令类
|
||||
*
|
||||
* @author 蒋天蓓 2015年8月12日下午2:04:05
|
||||
*/
|
||||
public class CommandDelete extends BaseCommand {
|
||||
Yum main;
|
||||
|
||||
public CommandDelete(final Yum main) {
|
||||
super("del");
|
||||
this.main = main;
|
||||
setMinimumArguments(1);
|
||||
setDescription("删除文件(服务器JAR为根目录)");
|
||||
setPossibleArguments("<文件相对目录>");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException {
|
||||
final String fpath = args[0];
|
||||
final File file = new File(fpath);
|
||||
if (!file.exists()) {
|
||||
sendMessage(sender, "§c文件 " + file.getAbsolutePath() + " 不存在!");
|
||||
} else {
|
||||
if (file.isDirectory()) {
|
||||
sendMessage(sender, "§e" + file.getAbsolutePath() + " §c是一个目录 请使用file rm!");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
sendMessage(sender, "§d文件 §e" + file.getAbsolutePath() + " " + (file.delete() ? "§a删除成功!" : "§c删除失败!"));
|
||||
} catch (final Exception e) {
|
||||
sendMessage(sender, "§d文件 §e" + file.getAbsolutePath() + " 删除失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package cn.citycraft.Yum.file.commands;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandException;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import cn.citycraft.PluginHelper.commands.BaseCommand;
|
||||
import cn.citycraft.Yum.Yum;
|
||||
import cn.citycraft.Yum.api.YumAPI;
|
||||
import cn.citycraft.Yum.manager.DownloadManager;
|
||||
|
||||
/**
|
||||
* 插件删除命令类
|
||||
*
|
||||
* @author 蒋天蓓 2015年8月12日下午2:04:05
|
||||
*/
|
||||
public class CommandDownLoad extends BaseCommand {
|
||||
Yum main;
|
||||
DownloadManager dl;
|
||||
|
||||
public CommandDownLoad(final Yum main) {
|
||||
super("d");
|
||||
this.main = main;
|
||||
dl = YumAPI.getDownload();
|
||||
setMinimumArguments(1);
|
||||
setDescription("下载文件(默认保存到服务器更新文件夹)");
|
||||
setPossibleArguments("<下载地址> [保存文件路径]");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException {
|
||||
String urlstr = args[0];
|
||||
if (!urlstr.startsWith("http")) {
|
||||
urlstr = "http://" + urlstr;
|
||||
}
|
||||
File file = null;
|
||||
if (args.length == 2) {
|
||||
file = new File(args[1]);
|
||||
} else {
|
||||
file = new File(Bukkit.getUpdateFolderFile(), dl.getFileName(urlstr));
|
||||
}
|
||||
if (args.length == 1) {
|
||||
dl.run(sender, urlstr, file);
|
||||
}
|
||||
}
|
||||
}
|
55
src/main/java/cn/citycraft/Yum/file/commands/CommandLs.java
Normal file
55
src/main/java/cn/citycraft/Yum/file/commands/CommandLs.java
Normal file
@ -0,0 +1,55 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package cn.citycraft.Yum.file.commands;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandException;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import cn.citycraft.PluginHelper.commands.BaseCommand;
|
||||
import cn.citycraft.Yum.Yum;
|
||||
|
||||
/**
|
||||
* 插件删除命令类
|
||||
*
|
||||
* @author 蒋天蓓 2015年8月12日下午2:04:05
|
||||
*/
|
||||
public class CommandLs extends BaseCommand {
|
||||
|
||||
public CommandLs(final Yum main) {
|
||||
super();
|
||||
setDescription("列出当前目录(服务器JAR为根目录)");
|
||||
setPossibleArguments("<相对目录>");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException {
|
||||
File dir = new File(".");
|
||||
if (args.length == 1) {
|
||||
dir = new File(args[0]);
|
||||
}
|
||||
if (!dir.isDirectory()) {
|
||||
sendMessage(sender, "§6路径: §e " + dir.getAbsolutePath() + " §c不是一个目录!");
|
||||
return;
|
||||
}
|
||||
final StringBuffer sb = new StringBuffer();
|
||||
for (final File file : dir.listFiles()) {
|
||||
if (file.isDirectory()) {
|
||||
sb.append("§b");
|
||||
} else {
|
||||
sb.append("§a");
|
||||
}
|
||||
sb.append(file.getName() + " ");
|
||||
}
|
||||
final String filelist = sb.toString();
|
||||
if (filelist.isEmpty()) {
|
||||
sendMessage(sender, "§6目录: §e" + dir.getAbsolutePath() + " §c下没有文件或文件夹!");
|
||||
} else {
|
||||
sendMessage(sender, "§6目录: §e" + dir.getAbsolutePath() + " §a存在如下文件!");
|
||||
sendMessage(sender, sb.toString());
|
||||
}
|
||||
}
|
||||
}
|
53
src/main/java/cn/citycraft/Yum/file/commands/CommandRm.java
Normal file
53
src/main/java/cn/citycraft/Yum/file/commands/CommandRm.java
Normal file
@ -0,0 +1,53 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package cn.citycraft.Yum.file.commands;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandException;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import cn.citycraft.PluginHelper.commands.BaseCommand;
|
||||
import cn.citycraft.PluginHelper.utils.FileUtil;
|
||||
import cn.citycraft.Yum.Yum;
|
||||
|
||||
/**
|
||||
* 插件删除命令类
|
||||
*
|
||||
* @author 蒋天蓓 2015年8月12日下午2:04:05
|
||||
*/
|
||||
public class CommandRm extends BaseCommand {
|
||||
|
||||
public CommandRm(final Yum main) {
|
||||
super();
|
||||
setMinimumArguments(1);
|
||||
setDescription("删除文件夹(服务器JAR为根目录)");
|
||||
setPossibleArguments("<文件相对目录>");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException {
|
||||
final String fpath = args[0];
|
||||
final File file = new File(fpath);
|
||||
if (!file.exists()) {
|
||||
sendMessage(sender, "§c目录 " + file.getAbsolutePath() + " 不存在!");
|
||||
} else {
|
||||
if (!file.isDirectory()) {
|
||||
sendMessage(sender, "§d路径 §e" + file.getAbsolutePath() + " §c是一个文件 请使用file delete!");
|
||||
return;
|
||||
}
|
||||
if (file.getAbsolutePath().toLowerCase().endsWith("plugins") || file.getAbsolutePath().toLowerCase().endsWith("world")) {
|
||||
sendMessage(sender, "§d路径 §e" + file.getAbsolutePath() + " §c不允许被删除!");
|
||||
return;
|
||||
}
|
||||
if (file.listFiles().length != 0 && !(args.length > 1 && args[1].equalsIgnoreCase("-rf"))) {
|
||||
sendMessage(sender, "§d目录 §e" + file.getAbsolutePath() + " §c不为空!");
|
||||
sendMessage(sender, "§c请使用 §a/file rm " + fpath + " -rf §c强行删除!");
|
||||
return;
|
||||
}
|
||||
sendMessage(sender, "§d目录 §e" + file.getAbsolutePath() + " " + (FileUtil.deleteDir(sender, file) ? "§a删除成功!" : "§c删除失败!"));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package cn.citycraft.Yum.file.commands;
|
||||
|
||||
import cn.citycraft.PluginHelper.commands.HandlerSubCommand;
|
||||
import cn.citycraft.Yum.Yum;
|
||||
|
||||
public class FileCommand {
|
||||
public FileCommand(final Yum yum) {
|
||||
final HandlerSubCommand cmdhandler = new HandlerSubCommand(yum, "file");
|
||||
cmdhandler.setAllCommandOnlyConsole(yum.config.getBoolean("onlyCommandConsole", false));
|
||||
cmdhandler.registerCommand(new CommandDownLoad(yum));
|
||||
cmdhandler.registerCommand(new CommandDelete(yum));
|
||||
cmdhandler.registerCommand(new CommandRm(yum));
|
||||
cmdhandler.registerCommand(new CommandLs(yum));
|
||||
}
|
||||
}
|
@ -10,6 +10,11 @@ commands:
|
||||
usage: §6使用§a/yum help§6查看帮助!
|
||||
permission: yum.use
|
||||
permission-message: §c你没有 <permission> 的权限来执行此命令!
|
||||
file:
|
||||
description: MC文件管理命令
|
||||
usage: §6使用§a/yum help§6查看帮助!
|
||||
permission: yum.use
|
||||
permission-message: §c你没有 <permission> 的权限来执行此命令!
|
||||
permissions:
|
||||
yum.use:
|
||||
description: 插件管理系统使用权限!
|
||||
|
Loading…
Reference in New Issue
Block a user