From ae1444c469f7e1c249b777a896bc32df54e84b0c Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Fri, 7 Jun 2024 13:11:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E6=88=90=E5=91=98?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=A8=A1=E6=9D=BF=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/cn/lunadeer/dominion/Commands.java | 29 ++- .../dominion/commands/DominionOperate.java | 5 +- .../lunadeer/dominion/commands/OpenCUI.java | 184 ------------------ .../lunadeer/dominion/commands/Template.java | 99 ++++++++++ .../controllers/DominionController.java | 5 +- .../dominion/controllers/FlagsController.java | 2 - .../controllers/PrivilegeController.java | 2 - .../controllers/TemplateController.java | 65 +++++++ .../dominion/cuis/CreateDominion.java | 56 ++++++ .../dominion/cuis/CreatePrivilege.java | 58 ++++++ .../dominion/cuis/CreateTemplate.java | 41 ++++ .../dominion/cuis/EditJoinMessage.java | 47 +++++ .../dominion/cuis/EditLeaveMessage.java | 47 +++++ .../dominion/cuis/RenameDominion.java | 40 ++++ .../dominion/dtos/PlayerPrivilegeDTO.java | 8 + .../dominion/dtos/PrivilegeTemplateDTO.java | 117 +++++++++++ .../cn/lunadeer/dominion/events/Apis.java | 3 - .../dominion/managers/DatabaseTables.java | 18 ++ .../java/cn/lunadeer/dominion/tuis/Apis.java | 1 - .../dominion/tuis/DominionPrivilegeList.java | 1 - .../java/cn/lunadeer/dominion/tuis/Menu.java | 17 +- .../lunadeer/dominion/tuis/TemplateList.java | 46 +++++ .../dominion/tuis/TemplateManage.java | 73 +++++++ 24 files changed, 759 insertions(+), 207 deletions(-) delete mode 100644 src/main/java/cn/lunadeer/dominion/commands/OpenCUI.java create mode 100644 src/main/java/cn/lunadeer/dominion/commands/Template.java create mode 100644 src/main/java/cn/lunadeer/dominion/controllers/TemplateController.java create mode 100644 src/main/java/cn/lunadeer/dominion/cuis/CreateDominion.java create mode 100644 src/main/java/cn/lunadeer/dominion/cuis/CreatePrivilege.java create mode 100644 src/main/java/cn/lunadeer/dominion/cuis/CreateTemplate.java create mode 100644 src/main/java/cn/lunadeer/dominion/cuis/EditJoinMessage.java create mode 100644 src/main/java/cn/lunadeer/dominion/cuis/EditLeaveMessage.java create mode 100644 src/main/java/cn/lunadeer/dominion/cuis/RenameDominion.java create mode 100644 src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java create mode 100644 src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java create mode 100644 src/main/java/cn/lunadeer/dominion/tuis/TemplateManage.java diff --git a/pom.xml b/pom.xml index b7f814a..f3a02a4 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.30.15-beta + 1.31.0-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/Commands.java b/src/main/java/cn/lunadeer/dominion/Commands.java index e5ec4ce..52a0f00 100644 --- a/src/main/java/cn/lunadeer/dominion/Commands.java +++ b/src/main/java/cn/lunadeer/dominion/Commands.java @@ -2,6 +2,7 @@ package cn.lunadeer.dominion; import cn.lunadeer.dominion.commands.*; import cn.lunadeer.dominion.controllers.PlayerController; +import cn.lunadeer.dominion.cuis.*; import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.tuis.*; import org.bukkit.command.Command; @@ -152,21 +153,39 @@ public class Commands implements TabExecutor { case "all_dominion": AllDominion.show(sender, args); break; + case "template_list": + TemplateList.show(sender, args); + break; + case "template_manage": + TemplateManage.show(sender, args); + break; + case "template_delete": + Template.deleteTemplate(sender, args); + break; + case "template_create": + Template.createTemplate(sender, args); + break; + case "template_set_flag": + Template.setTemplateFlag(sender, args); + break; // ---=== CUI ===--- case "cui_rename": - OpenCUI.RenameDominion(sender, args); + RenameDominion.open(sender, args); break; case "cui_edit_join_message": - OpenCUI.EditJoinMessage(sender, args); + EditJoinMessage.open(sender, args); break; case "cui_edit_leave_message": - OpenCUI.EditLeaveMessage(sender, args); + EditLeaveMessage.open(sender, args); break; case "cui_create": - OpenCUI.CreateDominion(sender, args); + CreateDominion.open(sender, args); break; case "cui_create_privilege": - OpenCUI.CreatePrivilege(sender, args); + CreatePrivilege.open(sender, args); + break; + case "cui_template_create": + CreateTemplate.open(sender, args); break; default: return false; diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java index 5fb5938..d06ef4f 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java @@ -2,7 +2,6 @@ package cn.lunadeer.dominion.commands; import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Dominion; -import cn.lunadeer.dominion.controllers.AbstractOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.dtos.DominionDTO; @@ -19,10 +18,10 @@ import org.bukkit.entity.Player; import java.time.LocalDateTime; import java.util.Map; -import java.util.Objects; import static cn.lunadeer.dominion.DominionNode.isInDominion; -import static cn.lunadeer.dominion.commands.Apis.*; +import static cn.lunadeer.dominion.commands.Apis.autoPoints; +import static cn.lunadeer.dominion.commands.Apis.playerOnly; public class DominionOperate { /** diff --git a/src/main/java/cn/lunadeer/dominion/commands/OpenCUI.java b/src/main/java/cn/lunadeer/dominion/commands/OpenCUI.java deleted file mode 100644 index db1cfe3..0000000 --- a/src/main/java/cn/lunadeer/dominion/commands/OpenCUI.java +++ /dev/null @@ -1,184 +0,0 @@ -package cn.lunadeer.dominion.commands; - -import cn.lunadeer.dominion.Dominion; -import cn.lunadeer.dominion.controllers.AbstractOperator; -import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; -import cn.lunadeer.dominion.controllers.DominionController; -import cn.lunadeer.dominion.controllers.PrivilegeController; -import cn.lunadeer.dominion.dtos.DominionDTO; -import cn.lunadeer.dominion.tuis.DominionManage; -import cn.lunadeer.dominion.tuis.DominionPrivilegeList; -import cn.lunadeer.dominion.tuis.SelectPlayer; -import cn.lunadeer.minecraftpluginutils.Notification; -import cn.lunadeer.minecraftpluginutils.XLogger; -import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; -import org.bukkit.Location; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.Map; -import java.util.Objects; - -import static cn.lunadeer.dominion.commands.Apis.autoPoints; -import static cn.lunadeer.dominion.commands.Apis.playerOnly; - -public class OpenCUI { - private static class renameDominionCB implements CuiTextInput.InputCallback { - private final Player sender; - private final String oldName; - - public renameDominionCB(Player sender, String oldName) { - this.sender = sender; - this.oldName = oldName; - } - - @Override - public void handleData(String input) { - XLogger.debug("renameDominionCB.run: %s", input); - BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); - DominionController.rename(operator, oldName, input); - DominionManage.show(sender, new String[]{"manage", input}); - } - } - - private static class editJoinMessageCB implements CuiTextInput.InputCallback { - private final Player sender; - private final String dominionName; - - public editJoinMessageCB(Player sender, String dominionName) { - this.sender = sender; - this.dominionName = dominionName; - } - - @Override - public void handleData(String input) { - XLogger.debug("editJoinMessageCB.run: %s", input); - BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); - DominionController.setJoinMessage(operator, input, dominionName); - DominionManage.show(sender, new String[]{"manage", dominionName}); - } - } - - private static class editLeaveMessageCB implements CuiTextInput.InputCallback { - private final Player sender; - private final String dominionName; - - public editLeaveMessageCB(Player sender, String dominionName) { - this.sender = sender; - this.dominionName = dominionName; - } - - @Override - public void handleData(String input) { - XLogger.debug("editLeaveMessageCB.run: %s", input); - BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); - DominionController.setLeaveMessage(operator, input, dominionName); - DominionManage.show(sender, new String[]{"manage", dominionName}); - } - } - - private static class createDominionCB implements CuiTextInput.InputCallback { - private final Player sender; - - public createDominionCB(Player sender) { - this.sender = sender; - } - - @Override - public void handleData(String input) { - XLogger.debug("createDominionCB.run: %s", input); - autoPoints(sender); - BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); - Map points = Dominion.pointsSelect.get(sender.getUniqueId()); - if (points == null || points.get(0) == null || points.get(1) == null) { - Notification.error(sender, "自动选点失败"); - return; - } - operator.getResponse().thenAccept(result -> { - if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)){ - DominionManage.show(sender, new String[]{"list"}); - } - }); - DominionController.create(operator, input, points.get(0), points.get(1)); - } - } - - private static class createPrivilegeCB implements CuiTextInput.InputCallback { - private final Player sender; - private final String dominionName; - - public createPrivilegeCB(Player sender, String dominionName) { - this.sender = sender; - this.dominionName = dominionName; - } - - @Override - public void handleData(String input) { - XLogger.debug("createPrivilegeCB.run: %s", input); - BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); - PrivilegeController.createPrivilege(operator, input, dominionName); - operator.getResponse().thenAccept(result -> { - if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)){ - DominionPrivilegeList.show(sender, new String[]{"privilege_list", dominionName}); - } else { - SelectPlayer.show(sender, new String[]{"select_player_create_privilege", dominionName}); - } - }); - } - } - - public static void RenameDominion(CommandSender sender, String[] args) { - Player player = playerOnly(sender); - if (player == null) return; - CuiTextInput.InputCallback renameDominionCB = new renameDominionCB(player, args[1]); - CuiTextInput view = CuiTextInput.create(renameDominionCB).setText(args[1]).title("领地重命名"); - view.open(player); - } - - public static void EditJoinMessage(CommandSender sender, String[] args) { - Player player = playerOnly(sender); - if (player == null) return; - DominionDTO dominion = DominionDTO.select(args[1]); - if (dominion == null) { - Notification.error(sender, "领地不存在"); - return; - } - CuiTextInput.InputCallback editJoinMessageCB = new editJoinMessageCB(player, dominion.getName()); - CuiTextInput view = CuiTextInput.create(editJoinMessageCB).setText(dominion.getJoinMessage()).title("编辑欢迎提示语"); - view.open(player); - } - - public static void EditLeaveMessage(CommandSender sender, String[] args) { - Player player = playerOnly(sender); - if (player == null) return; - DominionDTO dominion = DominionDTO.select(args[1]); - if (dominion == null) { - Notification.error(sender, "领地不存在"); - return; - } - CuiTextInput.InputCallback editLeaveMessageCB = new editLeaveMessageCB(player, dominion.getName()); - CuiTextInput view = CuiTextInput.create(editLeaveMessageCB).setText(dominion.getLeaveMessage()).title("编辑离开提示语"); - view.open(player); - } - - public static void CreateDominion(CommandSender sender, String[] args) { - Player player = playerOnly(sender); - if (player == null) return; - CuiTextInput.InputCallback createDominionCB = new createDominionCB(player); - CuiTextInput view = CuiTextInput.create(createDominionCB).setText("未命名领地").title("输入要创建的领地名称"); - view.open(player); - } - - public static void CreatePrivilege(CommandSender sender, String[] args) { - Player player = playerOnly(sender); - if (player == null) return; - DominionDTO dominion = DominionDTO.select(args[1]); - if (dominion == null) { - Notification.error(sender, "领地不存在"); - return; - } - CuiTextInput.InputCallback createPrivilegeCB = new createPrivilegeCB(player, dominion.getName()); - CuiTextInput view = CuiTextInput.create(createPrivilegeCB).setText("Steve").title("输入玩家名称以添加为成员"); - view.open(player); - } -} diff --git a/src/main/java/cn/lunadeer/dominion/commands/Template.java b/src/main/java/cn/lunadeer/dominion/commands/Template.java new file mode 100644 index 0000000..453b1e4 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/commands/Template.java @@ -0,0 +1,99 @@ +package cn.lunadeer.dominion.commands; + +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.TemplateController; +import cn.lunadeer.dominion.tuis.TemplateList; +import cn.lunadeer.dominion.tuis.TemplateManage; +import cn.lunadeer.minecraftpluginutils.Notification; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class Template { + + /** + * 删除权限模板 + * /dominion template_delete <模板名称> [页码] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void deleteTemplate(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + if (args.length < 2) { + Notification.error(sender, "用法: /dominion template_delete <模板名称>"); + return; + } + TemplateController.deleteTemplate(operator, args[1]); + String[] newArgs = new String[2]; + newArgs[0] = "template_list"; + if (args.length == 3) { + newArgs[1] = args[2]; + } else { + newArgs[1] = "1"; + } + TemplateList.show(sender, newArgs); + } + + /** + * 创建权限模板 + * /dominion template_create <模板名称> [页码] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void createTemplate(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + if (args.length < 2) { + Notification.error(sender, "用法: /dominion template_create <模板名称>"); + return; + } + TemplateController.createTemplate(operator, args[1]); + String[] newArgs = new String[2]; + newArgs[0] = "template_list"; + newArgs[1] = "1"; + TemplateList.show(sender, newArgs); + } + + /** + * 编辑模板 + * /dominion template_set_flag <模板名称> <权限名称> [页码] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void setTemplateFlag(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + if (args.length < 4) { + Notification.error(sender, "用法: /dominion template_set_flag <模板名称> <权限名称> "); + return; + } + boolean value; + if (args[3].equalsIgnoreCase("true")) { + value = true; + } else if (args[3].equalsIgnoreCase("false")) { + value = false; + } else { + Notification.error(sender, "权限值必须是true或false"); + return; + } + TemplateController.setTemplateFlag(operator, args[1], args[2], value); + String[] newArgs = new String[3]; + newArgs[0] = "template_manage"; + newArgs[1] = args[1]; + if (args.length == 5) { + newArgs[2] = args[4]; + } else { + newArgs[2] = "1"; + } + TemplateManage.show(sender, newArgs); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java index b327672..8ed97cc 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java @@ -2,8 +2,6 @@ package cn.lunadeer.dominion.controllers; import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Dominion; -import cn.lunadeer.dominion.DominionNode; -import cn.lunadeer.dominion.commands.OpenCUI; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.minecraftpluginutils.Notification; @@ -19,7 +17,8 @@ import java.util.List; import java.util.Objects; import static cn.lunadeer.dominion.DominionNode.isInDominion; -import static cn.lunadeer.dominion.controllers.Apis.*; +import static cn.lunadeer.dominion.controllers.Apis.getPlayerCurrentDominion; +import static cn.lunadeer.dominion.controllers.Apis.notOwner; public class DominionController { diff --git a/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java b/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java index 6a6848d..1788651 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java @@ -2,8 +2,6 @@ package cn.lunadeer.dominion.controllers; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.Flag; -import cn.lunadeer.minecraftpluginutils.Notification; -import org.bukkit.entity.Player; import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags; diff --git a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java index f61d40a..561fb99 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java @@ -5,9 +5,7 @@ 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.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.XLogger; -import org.bukkit.entity.Player; import java.util.UUID; diff --git a/src/main/java/cn/lunadeer/dominion/controllers/TemplateController.java b/src/main/java/cn/lunadeer/dominion/controllers/TemplateController.java new file mode 100644 index 0000000..49a5b8b --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/controllers/TemplateController.java @@ -0,0 +1,65 @@ +package cn.lunadeer.dominion.controllers; + +import cn.lunadeer.dominion.dtos.Flag; +import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; + +import java.util.List; + +public class TemplateController { + + public static void createTemplate(AbstractOperator operator, String templateName) { + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建成功"); + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建失败"); + List templates = PrivilegeTemplateDTO.selectAll(operator.getUniqueId()); + for (PrivilegeTemplateDTO template : templates) { + if (template.getName().equals(templateName)) { + operator.setResponse(FAIL.addMessage("已经存在名为" + templateName + "的权限模板")); + return; + } + } + PrivilegeTemplateDTO template = PrivilegeTemplateDTO.create(operator.getUniqueId(), templateName); + if (template == null) { + operator.setResponse(FAIL.addMessage("可能是数据库错误,请联系管理员")); + return; + } + operator.setResponse(SUCCESS.addMessage("成功创建名为" + templateName + "的权限模板")); + } + + public static void deleteTemplate(AbstractOperator operator, String templateName) { + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "删除成功"); + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "删除失败"); + PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName); + if (template == null) { + operator.setResponse(FAIL.addMessage("模板不存在")); + return; + } + if (!template.getCreator().equals(operator.getUniqueId())) { + operator.setResponse(FAIL.addMessage("这不是你的模板")); + return; + } + PrivilegeTemplateDTO.delete(operator.getUniqueId(), templateName); + operator.setResponse(SUCCESS); + } + + public static void setTemplateFlag(AbstractOperator operator, String templateName, String flag_name, boolean value) { + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置成功"); + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置失败"); + PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName); + if (template == null) { + operator.setResponse(FAIL.addMessage("模板不存在")); + return; + } + if (flag_name.equals("admin")) { + template.setAdmin(value); + } else { + Flag f = Flag.getFlag(flag_name); + if (f == null) { + operator.setResponse(FAIL.addMessage("未知的权限 %s", flag_name)); + return; + } + template.setFlagValue(f, value); + } + operator.setResponse(SUCCESS.addMessage("成功设置模板 " + template.getName() + " 的权限 " + flag_name + " 为 " + value)); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/cuis/CreateDominion.java b/src/main/java/cn/lunadeer/dominion/cuis/CreateDominion.java new file mode 100644 index 0000000..dba2604 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/cuis/CreateDominion.java @@ -0,0 +1,56 @@ +package cn.lunadeer.dominion.cuis; + +import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.dominion.controllers.AbstractOperator; +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.DominionController; +import cn.lunadeer.dominion.tuis.DominionManage; +import cn.lunadeer.minecraftpluginutils.Notification; +import cn.lunadeer.minecraftpluginutils.XLogger; +import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.Map; +import java.util.Objects; + +import static cn.lunadeer.dominion.commands.Apis.autoPoints; +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class CreateDominion { + + private static class createDominionCB implements CuiTextInput.InputCallback { + private final Player sender; + + public createDominionCB(Player sender) { + this.sender = sender; + } + + @Override + public void handleData(String input) { + XLogger.debug("createDominionCB.run: %s", input); + autoPoints(sender); + BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); + Map points = Dominion.pointsSelect.get(sender.getUniqueId()); + if (points == null || points.get(0) == null || points.get(1) == null) { + Notification.error(sender, "自动选点失败"); + return; + } + operator.getResponse().thenAccept(result -> { + if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)) { + DominionManage.show(sender, new String[]{"list"}); + } + }); + DominionController.create(operator, input, points.get(0), points.get(1)); + } + } + + public static void open(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + CuiTextInput.InputCallback createDominionCB = new createDominionCB(player); + CuiTextInput view = CuiTextInput.create(createDominionCB).setText("未命名领地").title("输入要创建的领地名称"); + view.open(player); + } +} diff --git a/src/main/java/cn/lunadeer/dominion/cuis/CreatePrivilege.java b/src/main/java/cn/lunadeer/dominion/cuis/CreatePrivilege.java new file mode 100644 index 0000000..1e2a664 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/cuis/CreatePrivilege.java @@ -0,0 +1,58 @@ +package cn.lunadeer.dominion.cuis; + +import cn.lunadeer.dominion.controllers.AbstractOperator; +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.PrivilegeController; +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.tuis.DominionPrivilegeList; +import cn.lunadeer.dominion.tuis.SelectPlayer; +import cn.lunadeer.minecraftpluginutils.Notification; +import cn.lunadeer.minecraftpluginutils.XLogger; +import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.Objects; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class CreatePrivilege { + + private static class createPrivilegeCB implements CuiTextInput.InputCallback { + private final Player sender; + private final String dominionName; + + public createPrivilegeCB(Player sender, String dominionName) { + this.sender = sender; + this.dominionName = dominionName; + } + + @Override + public void handleData(String input) { + XLogger.debug("createPrivilegeCB.run: %s", input); + BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); + operator.getResponse().thenAccept(result -> { + if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)){ + DominionPrivilegeList.show(sender, new String[]{"privilege_list", dominionName}); + } else { + SelectPlayer.show(sender, new String[]{"select_player_create_privilege", dominionName}); + } + }); + PrivilegeController.createPrivilege(operator, input, dominionName); + } + } + + public static void open(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = DominionDTO.select(args[1]); + if (dominion == null) { + Notification.error(sender, "领地不存在"); + return; + } + CuiTextInput.InputCallback createPrivilegeCB = new createPrivilegeCB(player, dominion.getName()); + CuiTextInput view = CuiTextInput.create(createPrivilegeCB).setText("Steve").title("输入玩家名称以添加为成员"); + view.open(player); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/cuis/CreateTemplate.java b/src/main/java/cn/lunadeer/dominion/cuis/CreateTemplate.java new file mode 100644 index 0000000..b83c821 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/cuis/CreateTemplate.java @@ -0,0 +1,41 @@ +package cn.lunadeer.dominion.cuis; + +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.TemplateController; +import cn.lunadeer.dominion.tuis.TemplateList; +import cn.lunadeer.minecraftpluginutils.XLogger; +import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class CreateTemplate { + + private static class createTemplateCB implements CuiTextInput.InputCallback { + private final Player sender; + + public createTemplateCB(Player sender) { + this.sender = sender; + } + + @Override + public void handleData(String input) { + XLogger.debug("createTemplateCB.run: %s", input); + BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); + operator.getResponse().thenAccept(result -> { + TemplateList.show(sender, new String[]{"template_list"}); + }); + TemplateController.createTemplate(operator, input); + } + } + + public static void open(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + CuiTextInput.InputCallback createTemplateCB = new createTemplateCB(player); + CuiTextInput view = CuiTextInput.create(createTemplateCB).setText("未命名模板").title("输入模板名称"); + view.open(player); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/cuis/EditJoinMessage.java b/src/main/java/cn/lunadeer/dominion/cuis/EditJoinMessage.java new file mode 100644 index 0000000..9117b5b --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/cuis/EditJoinMessage.java @@ -0,0 +1,47 @@ +package cn.lunadeer.dominion.cuis; + +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.DominionController; +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.tuis.DominionManage; +import cn.lunadeer.minecraftpluginutils.Notification; +import cn.lunadeer.minecraftpluginutils.XLogger; +import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class EditJoinMessage { + + private static class editJoinMessageCB implements CuiTextInput.InputCallback { + private final Player sender; + private final String dominionName; + + public editJoinMessageCB(Player sender, String dominionName) { + this.sender = sender; + this.dominionName = dominionName; + } + + @Override + public void handleData(String input) { + XLogger.debug("editJoinMessageCB.run: %s", input); + BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); + DominionController.setJoinMessage(operator, input, dominionName); + DominionManage.show(sender, new String[]{"manage", dominionName}); + } + } + + public static void open(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = DominionDTO.select(args[1]); + if (dominion == null) { + Notification.error(sender, "领地不存在"); + return; + } + CuiTextInput.InputCallback editJoinMessageCB = new editJoinMessageCB(player, dominion.getName()); + CuiTextInput view = CuiTextInput.create(editJoinMessageCB).setText(dominion.getJoinMessage()).title("编辑欢迎提示语"); + view.open(player); + } +} diff --git a/src/main/java/cn/lunadeer/dominion/cuis/EditLeaveMessage.java b/src/main/java/cn/lunadeer/dominion/cuis/EditLeaveMessage.java new file mode 100644 index 0000000..5916532 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/cuis/EditLeaveMessage.java @@ -0,0 +1,47 @@ +package cn.lunadeer.dominion.cuis; + +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.DominionController; +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.tuis.DominionManage; +import cn.lunadeer.minecraftpluginutils.Notification; +import cn.lunadeer.minecraftpluginutils.XLogger; +import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class EditLeaveMessage { + + private static class editLeaveMessageCB implements CuiTextInput.InputCallback { + private final Player sender; + private final String dominionName; + + public editLeaveMessageCB(Player sender, String dominionName) { + this.sender = sender; + this.dominionName = dominionName; + } + + @Override + public void handleData(String input) { + XLogger.debug("editLeaveMessageCB.run: %s", input); + BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); + DominionController.setLeaveMessage(operator, input, dominionName); + DominionManage.show(sender, new String[]{"manage", dominionName}); + } + } + + public static void open(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = DominionDTO.select(args[1]); + if (dominion == null) { + Notification.error(sender, "领地不存在"); + return; + } + CuiTextInput.InputCallback editLeaveMessageCB = new editLeaveMessageCB(player, dominion.getName()); + CuiTextInput view = CuiTextInput.create(editLeaveMessageCB).setText(dominion.getLeaveMessage()).title("编辑离开提示语"); + view.open(player); + } +} diff --git a/src/main/java/cn/lunadeer/dominion/cuis/RenameDominion.java b/src/main/java/cn/lunadeer/dominion/cuis/RenameDominion.java new file mode 100644 index 0000000..c5e4db1 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/cuis/RenameDominion.java @@ -0,0 +1,40 @@ +package cn.lunadeer.dominion.cuis; + +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.DominionController; +import cn.lunadeer.dominion.tuis.DominionManage; +import cn.lunadeer.minecraftpluginutils.XLogger; +import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class RenameDominion { + + private static class renameDominionCB implements CuiTextInput.InputCallback { + private final Player sender; + private final String oldName; + + public renameDominionCB(Player sender, String oldName) { + this.sender = sender; + this.oldName = oldName; + } + + @Override + public void handleData(String input) { + XLogger.debug("renameDominionCB.run: %s", input); + BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); + DominionController.rename(operator, oldName, input); + DominionManage.show(sender, new String[]{"manage", input}); + } + } + + public static void open(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + CuiTextInput.InputCallback renameDominionCB = new renameDominionCB(player, args[1]); + CuiTextInput view = CuiTextInput.create(renameDominionCB).setText(args[1]).title("领地重命名"); + view.open(player); + } +} diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java index faf2ecb..ec11ef1 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java @@ -97,6 +97,14 @@ public class PlayerPrivilegeDTO { return update(this); } + public PlayerPrivilegeDTO applyTemplate(PrivilegeTemplateDTO template) { + this.admin = template.getAdmin(); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + this.flags.put(f, template.getFlagValue(f)); + } + return update(this); + } + private PlayerPrivilegeDTO(Integer id, UUID playerUUID, Boolean admin, Integer domID, Map flags) { this.id = id; this.playerUUID = playerUUID; diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java new file mode 100644 index 0000000..67484e7 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java @@ -0,0 +1,117 @@ +package cn.lunadeer.dominion.dtos; + +import cn.lunadeer.dominion.Dominion; + +import java.sql.ResultSet; +import java.util.*; + +public class PrivilegeTemplateDTO { + + private static List query(String sql, Object... params) { + List templates = new ArrayList<>(); + try (ResultSet rs = Dominion.database.query(sql, params)) { + if (rs == null) return templates; + while (rs.next()) { + Map flags = new HashMap<>(); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + flags.put(f, rs.getBoolean(f.getFlagName())); + } + PrivilegeTemplateDTO template = new PrivilegeTemplateDTO( + rs.getInt("id"), + UUID.fromString(rs.getString("creator")), + rs.getString("name"), + rs.getBoolean("admin"), + flags + ); + templates.add(template); + } + } catch (Exception e) { + Dominion.database.handleDatabaseError("查询权限模版失败: ", e, sql); + } + return templates; + } + + public static PrivilegeTemplateDTO create(UUID creator, String name) { + String sql = "INSERT INTO privilege_template (creator, name) VALUES (?, ?) RETURNING *;"; + List templates = query(sql, creator.toString(), name); + if (templates.size() == 0) return null; + return templates.get(0); + } + + public static PrivilegeTemplateDTO select(UUID creator, String name) { + String sql = "SELECT * FROM privilege_template WHERE creator = ? AND name = ?;"; + List templates = query(sql, creator.toString(), name); + if (templates.size() == 0) return null; + return templates.get(0); + } + + public static List selectAll(UUID creator) { + String sql = "SELECT * FROM privilege_template WHERE creator = ?;"; + return query(sql, creator.toString()); + } + + public static void delete(UUID creator, String name) { + String sql = "DELETE FROM privilege_template WHERE creator = ? AND name = ?;"; + query(sql, creator.toString(), name); + } + + private PrivilegeTemplateDTO(Integer id, UUID creator, String name, Boolean admin, Map flags) { + this.id = id; + this.creator = creator; + this.name = name; + this.admin = admin; + this.flags.putAll(flags); + } + + private Integer id; + private UUID creator; + private String name; + private Boolean admin; + + private final Map flags = new HashMap<>(); + + public Integer getId() { + return id; + } + + public UUID getCreator() { + return creator; + } + + public String getName() { + return name; + } + + public Boolean getAdmin() { + return admin; + } + + public Boolean getFlagValue(Flag flag) { + if (!flags.containsKey(flag)) return flag.getDefaultValue(); + return flags.get(flag); + } + + public PrivilegeTemplateDTO setFlagValue(Flag flag, Boolean value) { + flags.put(flag, value); + return update(this); + } + + public PrivilegeTemplateDTO setAdmin(Boolean admin) { + this.admin = admin; + return update(this); + } + + private static PrivilegeTemplateDTO update(PrivilegeTemplateDTO template) { + StringBuilder sql = new StringBuilder("UPDATE privilege_template SET " + + "name = ?, " + + "admin = ?, "); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + sql.append(f.getFlagName()).append(" = ").append(template.getFlagValue(f)).append(", "); + } + sql = new StringBuilder(sql.substring(0, sql.length() - 2) + " WHERE id = ? RETURNING *;"); + List templates = query(sql.toString(), template.getName(), template.getAdmin(), template.getId()); + if (templates.size() == 0) return null; + return templates.get(0); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/events/Apis.java b/src/main/java/cn/lunadeer/dominion/events/Apis.java index 9c91d66..de0d395 100644 --- a/src/main/java/cn/lunadeer/dominion/events/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/events/Apis.java @@ -5,14 +5,11 @@ import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; -import cn.lunadeer.minecraftpluginutils.Notification; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.title.Title; -import net.md_5.bungee.api.ChatMessageType; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.inventory.Inventory; diff --git a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java index 50f83ef..7450ba7 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java @@ -82,5 +82,23 @@ public class DatabaseTables { // 1.18.0 Dominion.database.addColumnIfNotExists("dominion", "tp_location", "TEXT NOT NULL DEFAULT 'default'"); + + // 1.31.0 + sql = "CREATE TABLE IF NOT EXISTS privilege_template (" + + " id SERIAL PRIMARY KEY," + + " creator VARCHAR(36) NOT NULL," + + " name TEXT NOT NULL," + + " admin BOOLEAN NOT NULL DEFAULT FALSE," + + + " UNIQUE (creator, name)," + + " FOREIGN KEY (creator) REFERENCES player_name(uuid) ON DELETE CASCADE" + + ");"; + Dominion.database.query(sql); + + for (Flag flag : Flag.getAllPrivilegeFlags()) { + Dominion.database.addColumnIfNotExists("privilege_template", + flag.getFlagName(), + "BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue()); + } } } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/Apis.java b/src/main/java/cn/lunadeer/dominion/tuis/Apis.java index ca122ff..5befc90 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/Apis.java @@ -11,7 +11,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import static cn.lunadeer.dominion.commands.Apis.playerOnly; -import static cn.lunadeer.dominion.controllers.Apis.getPlayerCurrentDominion; public class Apis { diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java b/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java index a81b718..fab90ac 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java @@ -12,7 +12,6 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.TextColor; -import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/src/main/java/cn/lunadeer/dominion/tuis/Menu.java b/src/main/java/cn/lunadeer/dominion/tuis/Menu.java index da07b0b..f719426 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/Menu.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/Menu.java @@ -14,12 +14,24 @@ public class Menu { public static void show(CommandSender sender, String[] args) { Player player = playerOnly(sender); if (player == null) return; + + int page = 1; + if (args.length == 2) { + try { + page = Integer.parseInt(args[1]); + } catch (Exception ignored) { + } + } + Line create = Line.create() .append(Button.create("创建领地").setExecuteCommand("/dominion cui_create").build()) .append("以你为中心自动创建一个新的领地"); Line list = Line.create() .append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append("查看我的领地"); + Line template = Line.create() + .append(Button.create("权限模板").setExecuteCommand("/dominion template_list").build()) + .append("成员权限模板列表"); Line help = Line.create() .append(Button.create("指令帮助").setExecuteCommand("/dominion help").build()) .append("查看指令帮助"); @@ -38,11 +50,12 @@ public class Menu { Line reload_config = Line.create() .append(Button.create("重载配置").setExecuteCommand("/dominion reload_config").build()) .append("重载配置文件"); - ListView view = ListView.create(10, "/dominion"); + ListView view = ListView.create(10, "/dominion menu"); view.title("Dominion 领地系统") .navigator(Line.create().append("主菜单")) .add(create) .add(list) + .add(template) .add(help) .add(link); if (player.isOp()) { @@ -53,6 +66,6 @@ public class Menu { view.add(reload_cache); view.add(reload_config); } - view.showOn(player, 1); + view.showOn(player, page); } } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java b/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java new file mode 100644 index 0000000..8dce339 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java @@ -0,0 +1,46 @@ +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; +import static cn.lunadeer.dominion.tuis.Apis.getPage; + +public class TemplateList { + + public static void show(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + int page = getPage(args); + ListView view = ListView.create(10, "/dominion template_list"); + + List templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId()); + view.title("成员权限模板列表"); + view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("模板列表")); + + Button create = Button.create("创建成员权限模板").setExecuteCommand("/dominion cui_template_create") + .setHoverText("创建一个新的成员权限模板"); + + view.add(Line.create().append(create.build())); + + for (PrivilegeTemplateDTO template : templates) { + Button manage = Button.createGreen("管理").setExecuteCommand("/dominion template_manage " + template.getName()); + Button delete = Button.createRed("删除").setExecuteCommand("/dominion template_delete " + template.getName()); + Line line = Line.create() + .append(delete.build()) + .append(manage.build()) + .append(template.getName()); + view.add(line); + } + + view.showOn(player, page); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/tuis/TemplateManage.java b/src/main/java/cn/lunadeer/dominion/tuis/TemplateManage.java new file mode 100644 index 0000000..39f5698 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/TemplateManage.java @@ -0,0 +1,73 @@ +package cn.lunadeer.dominion.tuis; + +import cn.lunadeer.dominion.dtos.Flag; +import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; +import cn.lunadeer.minecraftpluginutils.Notification; +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; +import static cn.lunadeer.dominion.tuis.Apis.getPage; + +public class TemplateManage { + + // /dominion template_manage <模板名称> [页码] + public static void show(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + int page = 1; + if (args.length == 3) { + try { + page = Integer.parseInt(args[2]); + } catch (Exception ignored) { + } + } + PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(player.getUniqueId(), args[1]); + if (template == null) { + Notification.error(sender, "模板 %s 不存在", args[1]); + return; + } + + ListView view = ListView.create(10, "/dominion template_manage " + template.getName()); + view.title("模板 " + args[1] + " 权限管理"); + view.navigator(Line.create() + .append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) + .append(Button.create("模板列表").setExecuteCommand("/dominion template_list").build()) + .append("模板管理") + ); + + // /dominion template_set_flag <模板名称> <权限名称> [页码] + + if (template.getAdmin()) { + view.add(Line.create() + .append(Button.createGreen("☑").setExecuteCommand("/dominion template_set_flag " + template.getName() + " admin false " + page).build()) + .append("管理员")); + } else { + view.add(Line.create() + .append(Button.createRed("☐").setExecuteCommand("/dominion template_set_flag " + template.getName() + " admin true " + page).build()) + .append("管理员")); + } + for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { + view.add(createOption(flag, template.getFlagValue(flag), template.getName(), page)); + } + view.showOn(player, page); + } + + private static Line createOption(Flag flag, boolean value, String templateName, int page) { + if (value) { + return Line.create() + .append(Button.createGreen("☑").setExecuteCommand("/dominion template_set_flag " + templateName + " " + flag.getFlagName() + " false " + page).build()) + .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); + } else { + return Line.create() + .append(Button.createRed("☐").setExecuteCommand("/dominion template_set_flag " + templateName + " " + flag.getFlagName() + " true " + page).build()) + .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); + } + } +}