diff --git a/src/main/java/cn/lunadeer/dominion/Commands.java b/src/main/java/cn/lunadeer/dominion/Commands.java index 52a0f00..6b1699c 100644 --- a/src/main/java/cn/lunadeer/dominion/Commands.java +++ b/src/main/java/cn/lunadeer/dominion/Commands.java @@ -168,6 +168,12 @@ public class Commands implements TabExecutor { case "template_set_flag": Template.setTemplateFlag(sender, args); break; + case "apply_template": + PlayerPrivilege.applyTemplate(sender, args); + break; + case "select_template": + SelectTemplate.show(sender, args); + break; // ---=== CUI ===--- case "cui_rename": RenameDominion.open(sender, args); @@ -221,7 +227,13 @@ public class Commands implements TabExecutor { "reload_cache", "reload_config", "export_mca", - "config" + "config", + "apply_template", + "template_list", + "template_manage", + "template_delete", + "template_create", + "template_set_flag" ); } if (args.length == 2) { @@ -229,6 +241,7 @@ public class Commands implements TabExecutor { case "help": case "list": case "config": + case "template_list": return Collections.singletonList("页码(可选)"); case "create": case "auto_create": @@ -250,6 +263,7 @@ public class Commands implements TabExecutor { case "set_privilege": case "clear_privilege": case "privilege_info": + case "apply_template": return playerNames(); case "expand": case "contract": @@ -261,6 +275,12 @@ public class Commands implements TabExecutor { return Collections.singletonList("进入提示语内容"); case "set_leave_msg": return Collections.singletonList("离开提示语内容"); + case "template_manage": + case "template_delete": + case "template_set_flag": + return allTemplates(sender); + case "template_create": + return Collections.singletonList("输入模板名称"); } } if (args.length == 3) { @@ -268,6 +288,7 @@ public class Commands implements TabExecutor { case "set": return boolOptions(); case "set_privilege": + case "template_set_flag": return playerPrivileges(); case "expand": case "contract": @@ -278,11 +299,14 @@ public class Commands implements TabExecutor { case "create_sub": case "set_enter_msg": case "set_leave_msg": + case "apply_template": return playerDominions(sender); case "rename": return Collections.singletonList("输入新领地名称"); case "give": return playerNames(); + case "template_manage": + return Collections.singletonList("页码(可选)"); } } if (args.length == 4) { @@ -290,7 +314,10 @@ public class Commands implements TabExecutor { case "set": return playerDominions(sender); case "set_privilege": + case "template_set_flag": return boolOptions(); + case "apply_template": + return allTemplates(sender); } } return null; diff --git a/src/main/java/cn/lunadeer/dominion/commands/Helper.java b/src/main/java/cn/lunadeer/dominion/commands/Helper.java index af50e66..c90bafc 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/Helper.java +++ b/src/main/java/cn/lunadeer/dominion/commands/Helper.java @@ -4,6 +4,7 @@ import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; +import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -75,4 +76,15 @@ public class Helper { return dominions_name; } + public static List allTemplates(CommandSender sender) { + List templates_name = new ArrayList<>(); + Player player = playerOnly(sender); + if (player == null) return templates_name; + List templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId()); + for (PrivilegeTemplateDTO template : templates) { + templates_name.add(template.getName()); + } + return templates_name; + } + } diff --git a/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java b/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java index e1b8e12..216b4a0 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java +++ b/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java @@ -1,6 +1,7 @@ package cn.lunadeer.dominion.commands; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.PrivilegeController; import cn.lunadeer.dominion.tuis.DominionPrivilegeList; import cn.lunadeer.dominion.tuis.PrivilegeInfo; import cn.lunadeer.minecraftpluginutils.Notification; @@ -96,4 +97,32 @@ public class PlayerPrivilege { } } + /** + * 应用权限模板 + * /dominion apply_template <玩家名称> <领地名称> <模板名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void applyTemplate(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length < 4) { + Notification.error(sender, "用法: /dominion apply_template <玩家名称> <领地名称> <模板名称>"); + return; + } + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String playerName = args[1]; + String dominionName = args[2]; + String templateName = args[3]; + PrivilegeController.applyTemplate(operator, dominionName, playerName, templateName); + if (args.length == 5) { + String[] newArgs = new String[3]; + newArgs[0] = "privilege_list"; + newArgs[1] = dominionName; + newArgs[2] = args[4]; + DominionPrivilegeList.show(sender, newArgs); + } + } + } diff --git a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java index 561fb99..c210837 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java @@ -1,10 +1,7 @@ package cn.lunadeer.dominion.controllers; import cn.lunadeer.dominion.Cache; -import cn.lunadeer.dominion.dtos.DominionDTO; -import cn.lunadeer.dominion.dtos.Flag; -import cn.lunadeer.dominion.dtos.PlayerDTO; -import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; +import cn.lunadeer.dominion.dtos.*; import cn.lunadeer.minecraftpluginutils.XLogger; import java.util.UUID; @@ -106,9 +103,9 @@ public class PrivilegeController { privilege = createPlayerPrivilege(operator, player.getUuid(), dominion); if (privilege == null) return; } - if (flag.equals("admin")) { + if (flag.equals("admin") || privilege.getAdmin()) { if (notOwner(operator, dominion)) { - operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法设置/取消其他玩家为管理员", dominionName)); + operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他管理员的权限", dominionName)); return; } privilege.setAdmin(value); @@ -169,4 +166,40 @@ public class PrivilegeController { return privilege; } + public static void applyTemplate(AbstractOperator operator, String dominionName, String playerName, String templateName) { + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "应用模板 %s 到玩家 %s 在领地 %s 的权限成功", templateName, playerName, dominionName); + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "应用模板 %s 到玩家 %s 在领地 %s 的权限失败", templateName, playerName, dominionName); + DominionDTO dominion = DominionDTO.select(dominionName); + if (dominion == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName)); + return; + } + if (noAuthToChangeFlags(operator, dominion)) return; + PlayerDTO player = PlayerDTO.select(playerName); + if (player == null) { + operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", playerName)); + return; + } + PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId()); + if (privilege == null) { + operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", playerName, dominionName)); + return; + } + PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName); + if (template == null) { + operator.setResponse(FAIL.addMessage("模板 %s 不存在", templateName)); + return; + } + if (notOwner(operator, dominion) && privilege.getAdmin()) { + operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他管理员的权限", dominionName)); + return; + } + privilege = privilege.applyTemplate(template); + if (privilege == null) { + operator.setResponse(FAIL); + } else { + operator.setResponse(SUCCESS); + } + } + } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java b/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java index fab90ac..fc93b9e 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java @@ -65,10 +65,18 @@ public class DominionPrivilegeList { } } - line.append(p_player.getLastKnownName()) - .append(Button.createGreen("配置权限").setExecuteCommand("/dominion privilege_info " + p_player.getLastKnownName() + " " + dominion.getName()).build()); - if ((!player.getName().equals(p_player.getLastKnownName()) && !privilege.getAdmin()) || dominion.getOwner().equals(player.getUniqueId())) - line.append(Button.createRed("移除成员").setExecuteCommand("/dominion clear_privilege " + p_player.getLastKnownName() + " " + dominion.getName() + " b").build()); + line.append(Button.createGreen("权限") + .setHoverText("配置成员权限") + .setExecuteCommand("/dominion privilege_info " + p_player.getLastKnownName() + " " + dominion.getName()).build()); + if ((!player.getName().equals(p_player.getLastKnownName()) && !privilege.getAdmin()) || dominion.getOwner().equals(player.getUniqueId())) { + line.append(Button.createRed("移除") + .setHoverText("将此成员移出(变为访客)") + .setExecuteCommand("/dominion clear_privilege " + p_player.getLastKnownName() + " " + dominion.getName() + " b").build()); + line.append(Button.createGreen("模板") + .setHoverText("套用权限模板") + .setExecuteCommand("/dominion select_template " + p_player.getLastKnownName() + " " + dominion.getName() + " " + page).build()); + } + line.append(p_player.getLastKnownName()); view.add(line); } view.showOn(player, page); diff --git a/src/main/java/cn/lunadeer/dominion/tuis/SelectTemplate.java b/src/main/java/cn/lunadeer/dominion/tuis/SelectTemplate.java new file mode 100644 index 0000000..a9a503b --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/SelectTemplate.java @@ -0,0 +1,53 @@ +package cn.lunadeer.dominion.tuis; + +import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; +import cn.lunadeer.minecraftpluginutils.stui.ListView; +import cn.lunadeer.minecraftpluginutils.stui.components.Button; +import cn.lunadeer.minecraftpluginutils.stui.components.Line; +import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class SelectTemplate { + + public static void show(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + + String playerName = args[1]; + String dominionName = args[2]; + String backPage = args[3]; + + int page = 1; + if (args.length == 5) { + try { + page = Integer.parseInt(args[4]); + } catch (Exception ignored) { + } + } + + List templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId()); + + ListView view = ListView.create(10, "/dominion select_template " + playerName + " " + dominionName + " " + backPage); + view.title("选择一个模板"); + Line sub = Line.create() + .append("套用在领地 " + dominionName + " 的成员 " + playerName + " 身上") + .append(Button.create("返回").setExecuteCommand("/dominion privilege_list " + dominionName + " " + backPage).build()); + view.subtitle(sub); + + for (PrivilegeTemplateDTO template : templates) { + // /dominion apply_template <玩家名称> <领地名称> <模板名称> + view.add(Line.create() + .append(Button.create("选择") + .setExecuteCommand("/dominion apply_template " + playerName + " " + dominionName + " " + template.getName() + " " + backPage) + .build()) + .append(Component.text(template.getName()))); + } + view.showOn(player, page); + } + +}