diff --git a/pom.xml b/pom.xml index 427be4f..909baf8 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.33.7-beta + 1.34.0-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java index 4ab7c4e..83ecb9e 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -1,9 +1,6 @@ package cn.lunadeer.dominion; -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.dominion.utils.ResMigration; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.ParticleRender; @@ -28,6 +25,7 @@ public class Cache { player_current_dominion_id = new HashMap<>(); loadDominions(); loadPlayerPrivileges(); + loadGroup(); } /** @@ -156,6 +154,51 @@ public class Cache { }); } + public void loadGroup() { + loadGroup(null); + } + + public void loadGroup(Integer groupId) { + if (_last_update_group.get() + UPDATE_INTERVAL < System.currentTimeMillis()) { + XLogger.debug("run loadGroupExecution directly"); + loadGroupExecution(groupId); + } else { + if (_update_group_is_scheduled.get()) return; + XLogger.debug("schedule loadGroupExecution"); + _update_group_is_scheduled.set(true); + long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_group.get())) / 1000 * 20L; + Scheduler.runTaskLaterAsync(() -> { + XLogger.debug("run loadGroupExecution scheduled"); + loadGroupExecution(groupId); + _update_group_is_scheduled.set(false); + }, + delay_tick); + } + } + + private void loadGroupExecution(Integer groupId) { + Scheduler.runTaskAsync(() -> { + long start = System.currentTimeMillis(); + if (groupId == null) { + id_groups = new ConcurrentHashMap<>(); + List groups = GroupDTO.selectAll(); + for (GroupDTO group : groups) { + id_groups.put(group.getId(), group); + } + } else { + GroupDTO group = GroupDTO.select(groupId); + if (group == null && id_groups.containsKey(groupId)) { + id_groups.remove(groupId); + } else if (group != null) { + id_groups.put(groupId, group); + } + } + recheckPlayerState = true; + _last_update_group.set(System.currentTimeMillis()); + XLogger.debug("loadGroupExecution cost: %d ms", System.currentTimeMillis() - start); + }); + } + /** * 获取玩家当前所在领地 * 此方法会先判断缓存中是否有玩家当前所在领地,如果没有则遍历所有领地判断玩家所在位置 @@ -302,6 +345,10 @@ public class Cache { return dominionTree; } + public GroupDTO getGroup(Integer id) { + return id_groups.get(id); + } + /** * 获取玩家在指定领地的特权 * 如果玩家不存在特权,则返回null @@ -371,6 +418,7 @@ public class Cache { public static Cache instance; private ConcurrentHashMap id_dominions; private ConcurrentHashMap> world_dominion_tree; + private ConcurrentHashMap id_groups; private ConcurrentHashMap> player_uuid_to_privilege; // 玩家所有的特权 private final Map player_current_dominion_id; // 玩家当前所在领地 private ConcurrentHashMap> dominion_children; @@ -378,6 +426,8 @@ public class Cache { private final AtomicBoolean _update_dominion_is_scheduled = new AtomicBoolean(false); private final AtomicLong _last_update_privilege = new AtomicLong(0); private final AtomicBoolean _update_privilege_is_scheduled = new AtomicBoolean(false); + private final AtomicLong _last_update_group = new AtomicLong(0); + private final AtomicBoolean _update_group_is_scheduled = new AtomicBoolean(false); private static final long UPDATE_INTERVAL = 1000 * 4; private boolean recheckPlayerState = false; // 是否需要重新检查玩家状态(发光、飞行) public final Map NextTimeAllowTeleport = new java.util.HashMap<>(); diff --git a/src/main/java/cn/lunadeer/dominion/Commands.java b/src/main/java/cn/lunadeer/dominion/Commands.java index 4bfbf04..ebfba02 100644 --- a/src/main/java/cn/lunadeer/dominion/Commands.java +++ b/src/main/java/cn/lunadeer/dominion/Commands.java @@ -187,6 +187,33 @@ public class Commands implements TabExecutor { case "env_info": DominionEnvInfo.show(sender, args); break; + case "create_group": + Group.createGroup(sender, args); + break; + case "delete_group": + Group.deleteGroup(sender, args); + break; + case "rename_group": + Group.renameGroup(sender, args); + break; + case "set_group_flag": + Group.setGroupFlag(sender, args); + break; + case "group_add_member": + Group.addMember(sender, args); + break; + case "group_remove_member": + Group.removeMember(sender, args); + break; + case "group_list": + DominionGroupList.show(sender, args); + break; + case "select_member_add_group": + SelectMember.show(sender, args); + break; + case "group_manage": + GroupManage.show(sender, args); + break; // ---=== CUI ===--- case "cui_rename": RenameDominion.open(sender, args); @@ -209,6 +236,12 @@ public class Commands implements TabExecutor { case "cui_set_map_color": SetMapColor.open(sender, args); break; + case "cui_create_group": + CreateGroup.open(sender, args); + break; + case "cui_rename_group": + RenameGroup.open(sender, args); + break; default: return false; } @@ -251,7 +284,8 @@ public class Commands implements TabExecutor { "template_create", "template_set_flag", "all_dominion", - "set_map_color" + "set_map_color", + "create_group", "delete_group", "rename_group", "set_group_flag", "group_add_member", "group_remove_member" ); } if (args.length == 2) { @@ -272,6 +306,12 @@ public class Commands implements TabExecutor { case "rename": case "give": case "set_tp_location": + case "create_group": + case "delete_group": + case "rename_group": + case "set_group_flag": + case "group_add_member": + case "group_remove_member": return playerDominions(sender); case "tp": return allDominions(); @@ -328,6 +368,14 @@ public class Commands implements TabExecutor { return playerNames(); case "template_manage": return Collections.singletonList("页码(可选)"); + case "create_group": + return Collections.singletonList("输入要创建的权限组名称"); + case "delete_group": + case "rename_group": + case "set_group_flag": + case "group_add_member": + case "group_remove_member": + return dominionGroups(args[1]); } } if (args.length == 4) { @@ -339,6 +387,20 @@ public class Commands implements TabExecutor { return boolOptions(); case "apply_template": return allTemplates(sender); + case "rename_group": + return Collections.singletonList("输入新的权限组名称"); + case "set_group_flag": + return playerPrivileges(); + case "group_add_member": + return playerNames(); + case "group_remove_member": + return groupPlayers(args[1], args[2]); + } + } + if (args.length == 5) { + switch (args[0]) { + case "set_group_flag": + return boolOptions(); } } return null; diff --git a/src/main/java/cn/lunadeer/dominion/commands/Group.java b/src/main/java/cn/lunadeer/dominion/commands/Group.java new file mode 100644 index 0000000..b700eee --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/commands/Group.java @@ -0,0 +1,157 @@ +package cn.lunadeer.dominion.commands; + +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.GroupController; +import cn.lunadeer.dominion.tuis.DominionGroupList; +import cn.lunadeer.dominion.tuis.GroupManage; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; +import static cn.lunadeer.dominion.tuis.Apis.getPage; + +public class Group { + + /** + * /dominion create_group <领地名称> <权限组名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void createGroup(CommandSender sender, String[] args) { + if (args.length < 3) { + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[1]; + String groupName = args[2]; + GroupController.createGroup(operator, dominionName, groupName); + String[] newArgs = new String[2]; + newArgs[0] = "group_list"; + newArgs[1] = dominionName; + DominionGroupList.show(sender, newArgs); + } + + /** + * /dominion delete_group <领地名称> <权限组名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void deleteGroup(CommandSender sender, String[] args) { + if (args.length < 3) { + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[1]; + String groupName = args[2]; + GroupController.deleteGroup(operator, dominionName, groupName); + String[] newArgs = new String[2]; + newArgs[0] = "group_list"; + newArgs[1] = dominionName; + DominionGroupList.show(sender, newArgs); + } + + /** + * /dominion rename_group <领地名称> <权限组旧名称> <新名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void renameGroup(CommandSender sender, String[] args) { + if (args.length < 4) { + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[1]; + String oldGroupName = args[2]; + String newGroupName = args[3]; + GroupController.renameGroup(operator, dominionName, oldGroupName, newGroupName); + String[] newArgs = new String[3]; + newArgs[0] = "group_manage"; + newArgs[1] = dominionName; + newArgs[2] = newGroupName; + GroupManage.show(sender, newArgs); + } + + /** + * /dominion set_group_flag <领地名称> <权限组名称> <权限名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void setGroupFlag(CommandSender sender, String[] args) { + if (args.length < 5) { + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[1]; + String groupName = args[2]; + String flag = args[3]; + boolean value = Boolean.parseBoolean(args[4]); + GroupController.setGroupFlag(operator, dominionName, groupName, flag, value); + String[] newArgs = new String[4]; + newArgs[0] = "group_manage"; + newArgs[1] = dominionName; + newArgs[2] = groupName; + newArgs[3] = String.valueOf(getPage(args, 5)); + GroupManage.show(sender, newArgs); + } + + /** + * /dominion group_add_member <领地名称> <权限组名称> <玩家名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void addMember(CommandSender sender, String[] args) { + if (args.length < 4) { + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[1]; + String groupName = args[2]; + String playerName = args[3]; + GroupController.addMember(operator, dominionName, groupName, playerName); + String[] newArgs = new String[3]; + newArgs[0] = "group_list"; + newArgs[1] = dominionName; + newArgs[2] = String.valueOf(getPage(args, 4)); + DominionGroupList.show(sender, newArgs); + } + + /** + * /dominion group_remove_member <领地名称> <权限组名称> <玩家名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void removeMember(CommandSender sender, String[] args) { + if (args.length < 4) { + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[1]; + String groupName = args[2]; + String playerName = args[3]; + GroupController.removeMember(operator, dominionName, groupName, playerName); + String[] newArgs = new String[3]; + newArgs[0] = "group_list"; + newArgs[1] = dominionName; + newArgs[2] = String.valueOf(getPage(args, 4)); + DominionGroupList.show(sender, newArgs); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/commands/Helper.java b/src/main/java/cn/lunadeer/dominion/commands/Helper.java index c90bafc..f077678 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/Helper.java +++ b/src/main/java/cn/lunadeer/dominion/commands/Helper.java @@ -1,10 +1,7 @@ package cn.lunadeer.dominion.commands; 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 cn.lunadeer.dominion.dtos.*; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -41,6 +38,32 @@ public class Helper { return dominions_name; } + public static List dominionGroups(String dominionName) { + List groups_name = new ArrayList<>(); + DominionDTO dominion = DominionDTO.select(dominionName); + if (dominion == null) return groups_name; + List groups = GroupDTO.selectByDominionId(dominion.getId()); + for (GroupDTO group : groups) { + groups_name.add(group.getName()); + } + return groups_name; + } + + public static List groupPlayers(String domName, String groupName) { + List players_name = new ArrayList<>(); + DominionDTO dominion = DominionDTO.select(domName); + if (dominion == null) return players_name; + GroupDTO group = GroupDTO.select(dominion.getId(), groupName); + if (group == null) return players_name; + List privileges = PlayerPrivilegeDTO.selectByGroupId(group.getId()); + for (PlayerPrivilegeDTO privilege : privileges) { + PlayerDTO player = PlayerDTO.select(privilege.getPlayerUUID()); + if (player == null) continue; + players_name.add(player.getLastKnownName()); + } + return players_name; + } + public static List playerOwnDominions(CommandSender sender) { List dominions_name = new ArrayList<>(); Player player = playerOnly(sender); diff --git a/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java b/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java index 216b4a0..a204148 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java +++ b/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java @@ -118,9 +118,9 @@ public class PlayerPrivilege { 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]; + newArgs[0] = "privilege_info"; + newArgs[1] = playerName; + newArgs[2] = dominionName; DominionPrivilegeList.show(sender, newArgs); } } diff --git a/src/main/java/cn/lunadeer/dominion/controllers/GroupController.java b/src/main/java/cn/lunadeer/dominion/controllers/GroupController.java new file mode 100644 index 0000000..ecae31a --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/controllers/GroupController.java @@ -0,0 +1,214 @@ +package cn.lunadeer.dominion.controllers; + +import cn.lunadeer.dominion.dtos.*; + +import java.util.Objects; + +import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags; +import static cn.lunadeer.dominion.controllers.Apis.notOwner; + +public class GroupController { + + public static void createGroup(AbstractOperator operator, String domName, String groupName) { + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建权限组 %s 失败", groupName); + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建权限组 %s 成功", groupName); + DominionDTO dominion = DominionDTO.select(domName); + if (dominion == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); + return; + } + if (notOwner(operator, dominion)) { + operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法创建权限组", domName)); + return; + } + GroupDTO group = GroupDTO.select(dominion.getId(), groupName); + if (group != null) { + operator.setResponse(FAIL.addMessage("领地 %s 已存在名为 %s 的权限组", domName, groupName)); + return; + } + group = GroupDTO.create(groupName, dominion); + if (group == null) { + operator.setResponse(FAIL.addMessage("请联系服务器管理员")); + return; + } + operator.setResponse(SUCCESS); + } + + public static void deleteGroup(AbstractOperator operator, String domName, String groupName) { + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "删除权限组 %s 失败", groupName); + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "删除权限组 %s 成功", groupName); + DominionDTO dominion = DominionDTO.select(domName); + if (dominion == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); + return; + } + if (notOwner(operator, dominion)) { + operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法删除权限组", domName)); + return; + } + GroupDTO group = GroupDTO.select(dominion.getId(), groupName); + if (group == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName)); + return; + } + group.delete(); + operator.setResponse(SUCCESS); + } + + public static void setGroupFlag(AbstractOperator operator, String domName, String groupName, String flag, boolean value) { + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置权限组 %s 的权限 %s 为 %s 失败", groupName, flag, value); + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置权限组 %s 的权限 %s 为 %s 成功", groupName, flag, value); + DominionDTO dominion = DominionDTO.select(domName); + if (dominion == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); + return; + } + if (noAuthToChangeFlags(operator, dominion)) { + return; + } + GroupDTO group = GroupDTO.select(dominion.getId(), groupName); + if (group == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName)); + return; + } + if ((flag.equals("admin") || group.getAdmin()) && notOwner(operator, dominion)) { + operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改管理员权限组权限", domName)); + return; + } + if (flag.equals("admin")) { + group = group.setAdmin(value); + } else { + if (group.getAdmin()) { + operator.setResponse(FAIL.addMessage("管理员拥有所有权限,无需单独设置权限")); + return; + } + Flag f = Flag.getFlag(flag); + if (f == null) { + operator.setResponse(FAIL.addMessage("未知的权限 %s", flag)); + return; + } + group = group.setFlagValue(f, value); + } + if (group == null) { + operator.setResponse(FAIL.addMessage("请联系服务器管理员")); + return; + } + operator.setResponse(SUCCESS); + } + + public static void renameGroup(AbstractOperator operator, String domName, String oldName, String newName) { + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "重命名权限组 %s 为 %s 失败", oldName, newName); + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "重命名权限组 %s 为 %s 成功", oldName, newName); + DominionDTO dominion = DominionDTO.select(domName); + if (dominion == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); + return; + } + if (notOwner(operator, dominion)) { + operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法重命名权限组", domName)); + return; + } + GroupDTO group = GroupDTO.select(dominion.getId(), oldName); + if (group == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, oldName)); + return; + } + group = group.setName(newName); + if (group == null) { + operator.setResponse(FAIL.addMessage("请联系服务器管理员")); + return; + } + operator.setResponse(SUCCESS); + } + + public static void addMember(AbstractOperator operator, String domName, String groupName, String playerName) { + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "添加成员 %s 到权限组 %s 失败", playerName, groupName); + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "添加成员 %s 到权限组 %s 成功", playerName, groupName); + DominionDTO dominion = DominionDTO.select(domName); + if (dominion == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); + return; + } + GroupDTO group = GroupDTO.select(dominion.getId(), groupName); + if (group == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName)); + return; + } + if (noAuthToChangeFlags(operator, dominion)) { + operator.setResponse(FAIL.addMessage("你没有权限修改领地 %s 的权限组 %s 成员", domName, groupName)); + return; + } + if (group.getAdmin() && notOwner(operator, dominion)) { + operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法添加成员到管理员权限组", domName)); + 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, domName)); + return; + } + if (Objects.equals(privilege.getGroupId(), group.getId())) { + operator.setResponse(FAIL.addMessage("玩家 %s 已在权限组 %s 中", playerName, groupName)); + return; + } + if (notOwner(operator, dominion) && privilege.getAdmin()) { + operator.setResponse(FAIL.addMessage("%s 是管理员,你不是领地 %s 的拥有者,无法添加管理员到权限组", playerName, domName)); + return; + } + privilege = privilege.setGroupId(group.getId()); + if (privilege == null) { + operator.setResponse(FAIL.addMessage("请联系服务器管理员")); + return; + } + operator.setResponse(SUCCESS); + } + + public static void removeMember(AbstractOperator operator, String domName, String groupName, String playerName) { + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "从权限组 %s 移除成员 %s 失败", groupName, playerName); + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "从权限组 %s 移除成员 %s 成功", groupName, playerName); + DominionDTO dominion = DominionDTO.select(domName); + if (dominion == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); + return; + } + GroupDTO group = GroupDTO.select(dominion.getId(), groupName); + if (group == null) { + operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName)); + return; + } + if (noAuthToChangeFlags(operator, dominion)) { + operator.setResponse(FAIL.addMessage("你没有权限移除领地 %s 的权限组 %s 成员", domName, groupName)); + return; + } + if (group.getAdmin() && notOwner(operator, dominion)) { + operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法从管理员权限组移除成员", domName)); + 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, domName)); + return; + } + if (!Objects.equals(privilege.getGroupId(), group.getId())) { + operator.setResponse(FAIL.addMessage("玩家 %s 不在权限组 %s 中", playerName, groupName)); + return; + } + privilege = privilege.setGroupId(-1); + if (privilege == null) { + operator.setResponse(FAIL.addMessage("请联系服务器管理员")); + return; + } + operator.setResponse(SUCCESS); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/cuis/CreateGroup.java b/src/main/java/cn/lunadeer/dominion/cuis/CreateGroup.java new file mode 100644 index 0000000..d594c82 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/cuis/CreateGroup.java @@ -0,0 +1,53 @@ +package cn.lunadeer.dominion.cuis; + +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.GroupController; +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.tuis.DominionGroupList; +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 CreateGroup { + + private static class createGroupCB implements CuiTextInput.InputCallback { + + private final Player sender; + private final String dominionName; + + public createGroupCB(Player sender, String dominionName) { + this.sender = sender; + this.dominionName = dominionName; + } + + @Override + public void handleData(String input) { + XLogger.debug("createGroupCB.run: %s", input); + BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); + GroupController.createGroup(operator, dominionName, input); + String[] newArgs = new String[2]; + newArgs[0] = "group_list"; + newArgs[1] = dominionName; + DominionGroupList.show(sender, newArgs); + } + } + + 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 createGroupCB = new createGroupCB(player, dominion.getName()); + CuiTextInput view = CuiTextInput.create(createGroupCB).setText("未命名权限组").title("输入要创建的权限组名称"); + view.setSuggestCommand("/dominion create_group <领地名称> <权限组名称>"); + view.open(player); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/cuis/RenameGroup.java b/src/main/java/cn/lunadeer/dominion/cuis/RenameGroup.java new file mode 100644 index 0000000..5c9dd86 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/cuis/RenameGroup.java @@ -0,0 +1,57 @@ +package cn.lunadeer.dominion.cuis; + +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.GroupController; +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.tuis.DominionGroupList; +import cn.lunadeer.dominion.tuis.GroupManage; +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 RenameGroup { + + private static class renameGroupCB implements CuiTextInput.InputCallback { + + private final Player sender; + private final String dominionName; + private final String oldName; + + public renameGroupCB(Player sender, String dominionName, String oldName) { + this.sender = sender; + this.dominionName = dominionName; + this.oldName = oldName; + } + + @Override + public void handleData(String input) { + XLogger.debug("renameGroupCB.run: %s", input); + BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); + GroupController.renameGroup(operator, dominionName, oldName, input); + String[] newArgs = new String[3]; + newArgs[0] = "group_manage"; + newArgs[1] = dominionName; + newArgs[2] = input; + GroupManage.show(sender, newArgs); + } + } + + 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 renameGroupCB = new renameGroupCB(player, dominion.getName(), args[2]); + CuiTextInput view = CuiTextInput.create(renameGroupCB).setText(args[2]).title("输入新的权限组名称"); + view.setSuggestCommand("/dominion rename_group <领地名称> <权限组旧名称> <新名称>"); + view.open(player); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/dtos/GroupDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/GroupDTO.java new file mode 100644 index 0000000..88745c4 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/dtos/GroupDTO.java @@ -0,0 +1,179 @@ +package cn.lunadeer.dominion.dtos; + +import cn.lunadeer.dominion.Cache; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; +import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.FieldType; +import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; +import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; + +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GroupDTO { + + Field id = new Field("id", FieldType.INT); + Field domID = new Field("dom_id", FieldType.INT); + Field name = new Field("name", FieldType.STRING); + Field admin = new Field("admin", FieldType.BOOLEAN); + private final Map flags = new HashMap<>(); + + public Integer getId() { + return (Integer) id.value; + } + + public Integer getDomID() { + return (Integer) domID.value; + } + + public String getName() { + return (String) name.value; + } + + public Boolean getAdmin() { + return (Boolean) admin.value; + } + + public Boolean getFlagValue(Flag flag) { + if (!flags.containsKey(flag)) return flag.getDefaultValue(); + return flags.get(flag); + } + + public GroupDTO setName(String name) { + this.name.value = name; + UpdateRow updateRow = new UpdateRow().field(this.name); + return doUpdate(updateRow); + } + + public GroupDTO setAdmin(Boolean admin) { + this.admin.value = admin; + UpdateRow updateRow = new UpdateRow().field(this.admin); + return doUpdate(updateRow); + } + + public GroupDTO setFlagValue(Flag flag, Boolean value) { + flags.put(flag, value); + Field f = new Field(flag.getFlagName(), value); + UpdateRow updateRow = new UpdateRow().field(f); + return doUpdate(updateRow); + } + + public static GroupDTO create(String name, DominionDTO dominionDTO) { + GroupDTO group = new GroupDTO(name, dominionDTO.getId()); + InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null)); + insertRow.table("group") + .field(group.domID) + .field(group.name) + .field(group.admin); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + insertRow.field(new Field(f.getFlagName(), dominionDTO.getFlagValue(f))); + } + try (ResultSet rs = insertRow.execute()) { + List groups = getDTOFromRS(rs); + if (groups.size() == 0) return null; + return groups.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("创建权限组失败: ", e, ""); + return null; + } + } + + public void delete() { + delete(getId()); + } + + public static void delete(Integer id) { + String sql = "DELETE FROM group WHERE id = ?;"; + DatabaseManager.instance.query(sql, id); + Cache.instance.loadGroup(id); + List players = PlayerPrivilegeDTO.selectByGroupId(id); + for (PlayerPrivilegeDTO player : players) { + player.setGroupId(-1); + } + } + + public static GroupDTO select(Integer id) { + String sql = "SELECT * FROM group WHERE id = ?;"; + List groups = getDTOFromRS(DatabaseManager.instance.query(sql, id)); + if (groups.size() == 0) return null; + return groups.get(0); + } + + public static GroupDTO select(Integer domID, String name) { + String sql = "SELECT * FROM group WHERE dom_id = ? AND name = ?;"; + List groups = getDTOFromRS(DatabaseManager.instance.query(sql, domID, name)); + if (groups.size() == 0) return null; + return groups.get(0); + } + + public static List selectAll() { + String sql = "SELECT * FROM group;"; + return getDTOFromRS(DatabaseManager.instance.query(sql)); + } + + public static List selectByDominionId(Integer domID) { + String sql = "SELECT * FROM group WHERE dom_id = ?;"; + return getDTOFromRS(DatabaseManager.instance.query(sql, domID)); + } + + private GroupDTO(String name, Integer domID) { + this.domID.value = domID; + this.name.value = name; + this.admin.value = false; + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + flags.put(f, f.getDefaultValue()); + } + } + + private GroupDTO(Integer id, Integer domID, String name, Boolean admin, Map flags) { + this.id.value = id; + this.domID.value = domID; + this.name.value = name; + this.admin.value = admin; + this.flags.putAll(flags); + } + + private static List getDTOFromRS(ResultSet rs) { + List list = new ArrayList<>(); + if (rs == null) return list; + try { + while (rs.next()) { + Map flags = new HashMap<>(); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + flags.put(f, rs.getBoolean(f.getFlagName())); + } + GroupDTO group = new GroupDTO( + rs.getInt("id"), + rs.getInt("dom_id"), + rs.getString("name"), + rs.getBoolean("admin"), + flags + ); + list.add(group); + } + } catch (Exception e) { + DatabaseManager.handleDatabaseError("查询权限组失败: ", e, ""); + } + return list; + } + + private GroupDTO doUpdate(UpdateRow updateRow) { + updateRow.returningAll(id) + .table("group") + .where("id = ?", id.value); + try (ResultSet rs = updateRow.execute()) { + List groups = getDTOFromRS(rs); + if (groups.size() == 0) return null; + Cache.instance.loadGroup((Integer) id.value); + return groups.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("更新权限组失败: ", e, ""); + return null; + } + } + + +} diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java index 57d533c..2c5353e 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java @@ -3,6 +3,7 @@ package cn.lunadeer.dominion.dtos; import cn.lunadeer.dominion.Cache; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.FieldType; import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; @@ -35,7 +36,8 @@ public class PlayerPrivilegeDTO { UUID.fromString(rs.getString("player_uuid")), rs.getBoolean("admin"), rs.getInt("dom_id"), - flags + flags, + rs.getInt("group_id") ); players.add(player); } @@ -46,14 +48,13 @@ public class PlayerPrivilegeDTO { } private PlayerPrivilegeDTO doUpdate(UpdateRow updateRow) { - Field id = new Field("id", this.id); updateRow.returningAll(id) .table("player_privilege") .where("id = ?", id.value); try (ResultSet rs = updateRow.execute()) { List players = getDTOFromRS(rs); if (players.size() == 0) return null; - Cache.instance.loadPlayerPrivileges(playerUUID); + Cache.instance.loadPlayerPrivileges(getPlayerUUID()); return players.get(0); } catch (Exception e) { DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, ""); @@ -62,14 +63,11 @@ public class PlayerPrivilegeDTO { } public static PlayerPrivilegeDTO insert(PlayerPrivilegeDTO player) { - Field playerUUID = new Field("player_uuid", player.getPlayerUUID().toString()); - Field admin = new Field("admin", player.getAdmin()); - Field domID = new Field("dom_id", player.getDomID()); InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null)) .table("player_privilege") - .field(playerUUID) - .field(admin) - .field(domID); + .field(player.playerUUID) + .field(player.admin) + .field(player.domID); for (Flag f : Flag.getPrivilegeFlagsEnabled()) { insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f))); } @@ -112,25 +110,35 @@ public class PlayerPrivilegeDTO { return query(sql, player.toString()); } - private final Integer id; - private final UUID playerUUID; - private Boolean admin; - private final Integer domID; + public static List selectByGroupId(Integer groupId) { + String sql = "SELECT * FROM player_privilege WHERE group_id = ?;"; + return query(sql, groupId); + } + + Field id = new Field("id", FieldType.INT); + Field playerUUID = new Field("player_uuid", FieldType.STRING); + Field admin = new Field("admin", FieldType.BOOLEAN); + Field domID = new Field("dom_id", FieldType.INT); + Field groupId = new Field("group_id", FieldType.INT); public Integer getId() { - return id; + return (Integer) id.value; } public UUID getPlayerUUID() { - return playerUUID; + return UUID.fromString((String) playerUUID.value); } public Boolean getAdmin() { - return admin; + return (Boolean) admin.value; } public Integer getDomID() { - return domID; + return (Integer) domID.value; + } + + public Integer getGroupId() { + return (Integer) groupId.value; } private final Map flags = new HashMap<>(); @@ -148,14 +156,19 @@ public class PlayerPrivilegeDTO { } public PlayerPrivilegeDTO setAdmin(Boolean admin) { - this.admin = admin; - Field f = new Field("admin", admin); - UpdateRow updateRow = new UpdateRow().field(f); + this.admin.value = admin; + UpdateRow updateRow = new UpdateRow().field(this.admin); + return doUpdate(updateRow); + } + + public PlayerPrivilegeDTO setGroupId(Integer groupId) { + this.groupId.value = groupId; + UpdateRow updateRow = new UpdateRow().field(this.groupId); return doUpdate(updateRow); } public PlayerPrivilegeDTO applyTemplate(PrivilegeTemplateDTO template) { - this.admin = template.getAdmin(); + this.admin.value = template.getAdmin(); UpdateRow updateRow = new UpdateRow().field(new Field("admin", admin)); for (Flag f : Flag.getPrivilegeFlagsEnabled()) { this.flags.put(f, template.getFlagValue(f)); @@ -164,19 +177,20 @@ public class PlayerPrivilegeDTO { return doUpdate(updateRow); } - private PlayerPrivilegeDTO(Integer id, UUID playerUUID, Boolean admin, Integer domID, Map flags) { - this.id = id; - this.playerUUID = playerUUID; - this.admin = admin; - this.domID = domID; + private PlayerPrivilegeDTO(Integer id, UUID playerUUID, Boolean admin, Integer domID, Map flags, Integer groupId) { + this.id.value = id; + this.playerUUID.value = playerUUID.toString(); + this.admin.value = admin; + this.domID.value = domID; + this.groupId.value = groupId; this.flags.putAll(flags); } public PlayerPrivilegeDTO(UUID playerUUID, DominionDTO dom) { - this.id = null; - this.playerUUID = playerUUID; - this.admin = false; - this.domID = dom.getId(); + this.id.value = null; + this.playerUUID.value = playerUUID.toString(); + this.admin.value = false; + this.domID.value = dom.getId(); for (Flag f : Flag.getPrivilegeFlagsEnabled()) { this.flags.put(f, dom.getFlagValue(f)); } diff --git a/src/main/java/cn/lunadeer/dominion/events/Apis.java b/src/main/java/cn/lunadeer/dominion/events/Apis.java index f4956c1..446d433 100644 --- a/src/main/java/cn/lunadeer/dominion/events/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/events/Apis.java @@ -4,6 +4,7 @@ import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.Flag; +import cn.lunadeer.dominion.dtos.GroupDTO; import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; import cn.lunadeer.minecraftpluginutils.Notification; import net.kyori.adventure.text.Component; @@ -52,8 +53,18 @@ public class Apis { return true; } if (prev != null) { - if (prev.getFlagValue(flag)) { - return true; + if (prev.getGroupId() != -1) { + if (prev.getFlagValue(flag)) { + return true; + } + } else { + GroupDTO group = Cache.instance.getGroup(prev.getGroupId()); + if (group == null) { + return false; + } + if (group.getFlagValue(flag)) { + return true; + } } } else { if (dom.getFlagValue(flag)) { diff --git a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java index f141507..073d63c 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java @@ -155,5 +155,28 @@ public class DatabaseTables { // 1.31.6 TableColumn dominion_color = new TableColumn("color", FieldType.STRING, false, false, true, false, "'#00BFFF'"); new AddColumn(dominion_color).table("dominion").ifNotExists().execute(); + + // 1.34.0 + TableColumn player_privilege_group_id = new TableColumn("group_id", FieldType.INT, false, false, true, false, -1); + new AddColumn(player_privilege_group_id).table("player_privilege").ifNotExists().execute(); + + TableColumn group_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn group_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1); + TableColumn group_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'"); + TableColumn group_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); + CreateTable.ForeignKey group_dom_id_fk = new CreateTable.ForeignKey(group_dom_id, "dominion", dominion_id, true); + CreateTable group = new CreateTable().ifNotExists(); + group.table("group") + .field(group_id) + .field(group_dom_id) + .field(group_name) + .field(group_admin) + .foreignKey(group_dom_id_fk) + .unique(group_dom_id, group_name); + group.execute(); + for (Flag flag : Flag.getAllPrivilegeFlags()) { + TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); + new AddColumn(column).table("group").ifNotExists().execute(); + } } } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/Apis.java b/src/main/java/cn/lunadeer/dominion/tuis/Apis.java index 5befc90..8db52ab 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/Apis.java @@ -26,6 +26,18 @@ public class Apis { return page; } + public static int getPage(String[] args, int pos) { + int page = 1; + if (args.length > pos) { + try { + page = Integer.parseInt(args[pos]); + } catch (Exception e) { + return 1; + } + } + return page; + } + /** * 尝试从 arg[1] 获取领地名称 * 如果没有此参数则会尝试获取玩家当前所在位置 diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionGroupList.java b/src/main/java/cn/lunadeer/dominion/tuis/DominionGroupList.java new file mode 100644 index 0000000..5f7fff8 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/DominionGroupList.java @@ -0,0 +1,75 @@ +package cn.lunadeer.dominion.tuis; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.GroupDTO; +import cn.lunadeer.dominion.dtos.PlayerDTO; +import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; +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 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.getDominionNameArg_1; +import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage; + +public class DominionGroupList { + + public static void show(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = getDominionNameArg_1(player, args); + if (dominion == null) { + Notification.error(sender, "你不在任何领地内,请指定领地名称 /dominion group_list <领地名称>"); + return; + } + if (noAuthToManage(player, dominion)) return; + int page = Apis.getPage(args, 2); + List groups = GroupDTO.selectByDominionId(dominion.getId()); + ListView view = ListView.create(10, "/dominion group_list " + dominion.getName()); + view.title("权限组列表"); + view.navigator( + Line.create() + .append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) + .append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) + .append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) + .append("权限组列表") + ); + + Button create_btn = Button.createGreen("创建权限组") + .setHoverText("创建一个新的权限组") + .setExecuteCommand("/dominion cui_create_group " + dominion.getName()); + view.add(new Line().append(create_btn.build())); + + for (GroupDTO group : groups) { + Line line = new Line(); + Button del = Button.createRed("删除") + .setHoverText("删除权限组 " + group.getName()) + .setExecuteCommand("/dominion delete_group " + dominion.getName() + " " + group.getName()); + Button edit = Button.create("编辑") + .setHoverText("编辑权限组 " + group.getName()) + .setExecuteCommand("/dominion group_manage " + dominion.getName() + " " + group.getName()); + Button add = Button.createGreen("+") + .setHoverText("添加成员到权限组 " + group.getName()) + .setExecuteCommand("/dominion select_member_add_group " + dominion.getName() + " " + group.getName() + " " + page); + line.append(del.build()).append(edit.build()).append(group.getName()).append(add.build()); + view.add(line); + List players = PlayerPrivilegeDTO.selectByGroupId(group.getId()); + for (PlayerPrivilegeDTO playerPrivilege : players) { + PlayerDTO p = PlayerDTO.select(playerPrivilege.getPlayerUUID()); + if (p == null) continue; + Button remove = Button.createRed("移出权限组") + .setHoverText("把 " + p.getLastKnownName() + " 移出权限组 " + group.getName()) + .setExecuteCommand("/dominion group_remove_member " + dominion.getName() + " " + group.getName() + " " + p.getLastKnownName() + " " + page); + Line playerLine = new Line(); + playerLine.append(remove.build()).append(" | " + p.getLastKnownName()); + } + } + view.showOn(player, page); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java b/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java index 92d62b8..6938ecb 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java @@ -25,6 +25,7 @@ public class DominionManage { return; } if (noAuthToManage(player, dominion)) return; + int page = Apis.getPage(args, 2); Line size_info = Line.create() .append(Button.create("详细信息").setExecuteCommand("/dominion info " + dominion.getName()).build()) .append("查看领地详细信息"); @@ -37,6 +38,9 @@ public class DominionManage { Line privilege_list = Line.create() .append(Button.create("成员权限").setExecuteCommand("/dominion privilege_list " + dominion.getName()).build()) .append("管理此领地成员的权限"); + Line group_list = Line.create() + .append(Button.create("权限组").setExecuteCommand("/dominion group_list " + dominion.getName()).build()) + .append("管理此领地的权限组"); Line set_tp = Line.create() .append(Button.create("设置传送点").setExecuteCommand("/dominion set_tp_location " + dominion.getName()).build()) .append("设置当前位置为此领地传送点"); @@ -64,6 +68,7 @@ public class DominionManage { .add(env_info) .add(flag_info) .add(privilege_list) + .add(group_list) .add(set_tp) .add(rename) .add(join_msg) @@ -71,6 +76,6 @@ public class DominionManage { if (Dominion.config.getBlueMap()) { view.add(map_color); } - view.showOn(player, 1); + view.showOn(player, page); } } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java b/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java index fc93b9e..b9dcf2d 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java @@ -1,9 +1,7 @@ package cn.lunadeer.dominion.tuis; -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.Cache; +import cn.lunadeer.dominion.dtos.*; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.components.Button; @@ -53,9 +51,12 @@ public class DominionPrivilegeList { for (PlayerPrivilegeDTO privilege : privileges) { PlayerDTO p_player = PlayerDTO.select(privilege.getPlayerUUID()); if (p_player == null) continue; + GroupDTO group = Cache.instance.getGroup(privilege.getGroupId()); Line line = Line.create(); - if (privilege.getAdmin()) { + if (group != null) { + line.append(groupTag); + } else if (privilege.getAdmin()) { line.append(adminTag); } else { if (!privilege.getFlagValue(Flag.MOVE)) { @@ -65,17 +66,34 @@ public class DominionPrivilegeList { } } - line.append(Button.createGreen("权限") + Button prev = 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()); + .setExecuteCommand("/dominion privilege_info " + p_player.getLastKnownName() + " " + dominion.getName()); + Button remove = Button.createRed("移除") + .setHoverText("将此成员移出(变为访客)") + .setExecuteCommand("/dominion clear_privilege " + p_player.getLastKnownName() + " " + dominion.getName() + " b"); + + if (!player.getUniqueId().equals(dominion.getOwner())) { + boolean disable = false; + if (group == null) { + if (privilege.getAdmin()) { + disable = true; + } + } else { + if (group.getAdmin()) { + disable = true; + } + } + if (disable) { + prev.setDisabled("你不是领地主人,无法编辑管理员权限"); + remove.setDisabled("你不是领地主人,无法移除管理员"); + } } + if (group != null) { + prev.setDisabled(String.format("此成员属于权限组 %s 无法单独编辑权限", group.getName())); + } + line.append(remove.build()); + line.append(prev.build()); line.append(p_player.getLastKnownName()); view.add(line); } @@ -88,4 +106,6 @@ public class DominionPrivilegeList { .hoverEvent(Component.text("这是一个普通成员")); private static final TextComponent banTag = Component.text("[B]", Style.style(TextColor.color(255, 67, 0))) .hoverEvent(Component.text("这是一个黑名单成员")); + private static final TextComponent groupTag = Component.text("[G]", Style.style(TextColor.color(0, 185, 153))) + .hoverEvent(Component.text("这个成员在一个权限组里")); } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/GroupManage.java b/src/main/java/cn/lunadeer/dominion/tuis/GroupManage.java new file mode 100644 index 0000000..78c0664 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/GroupManage.java @@ -0,0 +1,86 @@ +package cn.lunadeer.dominion.tuis; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.Flag; +import cn.lunadeer.dominion.dtos.GroupDTO; +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 static cn.lunadeer.dominion.commands.Apis.playerOnly; +import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage; + +public class GroupManage { + public static void show(CommandSender sender, String[] args) { + if (args.length < 3) { + return; + } + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = DominionDTO.select(args[1]); + if (dominion == null) { + Notification.error(sender, "领地 %s 不存在", args[1]); + return; + } + if (noAuthToManage(player, dominion)) return; + int page = Apis.getPage(args, 3); + GroupDTO group = GroupDTO.select(dominion.getId(), args[2]); + if (group == null) { + Notification.error(sender, "权限组 %s 不存在", args[2]); + return; + } + + ListView view = ListView.create(10, "/dominion group_manage " + dominion.getName() + " " + group.getName()); + view.title("权限组 " + group.getName() + " 管理"); + view.navigator( + Line.create() + .append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) + .append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) + .append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) + .append(Button.create("权限组列表").setExecuteCommand("/dominion group_list" + dominion.getName()).build()) + ); + Button rename_btn = Button.create("重命名") + .setHoverText("重命名权限组 " + group.getName()) + .setExecuteCommand("/dominion cui_rename_group " + dominion.getName() + " " + group.getName()); + view.add(Line.create().append(rename_btn.build())); + + if (group.getAdmin()) { + view.add(Line.create() + .append(Button.createGreen("☑") + .setExecuteCommand(String.format("/dominion set_group_flag %s %s admin false %s", dominion.getName(), group.getName(), page)) + .build()) + .append("管理员")); + view.add(createOption(Flag.GLOW, group.getFlagValue(Flag.GLOW), dominion.getName(), group.getName(), page)); + } else { + view.add(Line.create() + .append(Button.createGreen("☐") + .setExecuteCommand(String.format("/dominion set_group_flag %s %s admin true %s", dominion.getName(), group.getName(), page)) + .build()) + .append("管理员")); + for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { + view.add(createOption(flag, group.getFlagValue(flag), dominion.getName(), group.getName(), page)); + } + } + view.showOn(player, page); + } + + private static Line createOption(Flag flag, boolean value, String DominionName, String groupName, int page) { + if (value) { + return Line.create() + .append(Button.createGreen("☑") + .setExecuteCommand(String.format("/dominion set_group_flag %s %s %s false %s", DominionName, groupName, flag.getFlagName(), page)) + .build()) + .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); + } else { + return Line.create() + .append(Button.createRed("☐") + .setExecuteCommand(String.format("/dominion set_group_flag %s %s %s true %s", DominionName, groupName, flag.getFlagName(), page)) + .build()) + .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); + } + } +} diff --git a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java index 1999ad8..e32f4c5 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java @@ -13,8 +13,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import static cn.lunadeer.dominion.commands.Apis.playerOnly; -import static cn.lunadeer.dominion.tuis.Apis.getDominionNameArg_2; -import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage; +import static cn.lunadeer.dominion.tuis.Apis.*; public class PrivilegeInfo { // /dominion privilege_info <玩家名称> [领地名称] [页码] @@ -22,13 +21,7 @@ public class PrivilegeInfo { Player player = playerOnly(sender); if (player == null) return; DominionDTO dominion = getDominionNameArg_2(player, args); - int page = 1; - if (args.length == 4) { - try { - page = Integer.parseInt(args[3]); - } catch (Exception ignored) { - } - } + int page = getPage(args, 3); String playerName = args[1]; if (dominion == null) { Notification.error(sender, "你不在任何领地内,请指定领地名称 /dominion privilege_info <玩家名称> [领地名称]"); @@ -55,6 +48,9 @@ public class PrivilegeInfo { .append(Button.create("成员列表").setExecuteCommand("/dominion privilege_list " + dominion.getName()).build()) .append("成员权限") ); + view.add(Line.create().append(Button.createGreen("套用模板") + .setHoverText("选择一个权限模板套用") + .setExecuteCommand("/dominion select_template " + playerName + " " + dominion.getName()).build())); if (privilege.getAdmin()) { view.add(Line.create() .append(Button.createGreen("☑").setExecuteCommand("/dominion set_privilege " + playerName + " admin false " + dominion.getName() + " " + page).build()) diff --git a/src/main/java/cn/lunadeer/dominion/tuis/SelectMember.java b/src/main/java/cn/lunadeer/dominion/tuis/SelectMember.java new file mode 100644 index 0000000..f6acaa3 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/SelectMember.java @@ -0,0 +1,55 @@ +package cn.lunadeer.dominion.tuis; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.GroupDTO; +import cn.lunadeer.dominion.dtos.PlayerDTO; +import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; +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 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.*; + +public class SelectMember { + public static void show(CommandSender sender, String[] args) { + if (args.length < 3) { + return; + } + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = getDominionNameArg_1(player, args); + if (dominion == null) { + Notification.error(sender, "领地不存在"); + return; + } + if (noAuthToManage(player, dominion)) return; + GroupDTO group = GroupDTO.select(dominion.getId(), args[2]); + if (group == null) { + Notification.error(sender, "权限组不存在"); + return; + } + int backPage = getPage(args, 3); + ListView view = ListView.create(10, "/dominion select_member_add_group " + dominion.getName() + " " + group.getName() + " " + backPage); + view.title("选择成员"); + view.navigator( + Line.create() + .append("添加到权限组 " + group.getName()) + .append(Button.create("返回").setExecuteCommand("/dominion group_list " + dominion.getName() + " " + backPage).build()) + ); + List members = PlayerPrivilegeDTO.selectByGroupId(-1); + for (PlayerPrivilegeDTO member : members) { + PlayerDTO p = PlayerDTO.select(member.getPlayerUUID()); + if (p == null) continue; + view.add(Line.create() + .append(Button.create(p.getLastKnownName()) + .setExecuteCommand("/dominion group_add_member " + dominion.getName() + " " + group.getName() + " " + p.getLastKnownName() + " " + backPage) + .build())); + } + } +} diff --git a/src/main/java/cn/lunadeer/dominion/tuis/SelectTemplate.java b/src/main/java/cn/lunadeer/dominion/tuis/SelectTemplate.java index a9a503b..94ec764 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/SelectTemplate.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/SelectTemplate.java @@ -20,7 +20,6 @@ public class SelectTemplate { String playerName = args[1]; String dominionName = args[2]; - String backPage = args[3]; int page = 1; if (args.length == 5) { @@ -32,18 +31,18 @@ public class SelectTemplate { List templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId()); - ListView view = ListView.create(10, "/dominion select_template " + playerName + " " + dominionName + " " + backPage); + ListView view = ListView.create(10, "/dominion select_template " + playerName + " " + dominionName); view.title("选择一个模板"); Line sub = Line.create() .append("套用在领地 " + dominionName + " 的成员 " + playerName + " 身上") - .append(Button.create("返回").setExecuteCommand("/dominion privilege_list " + dominionName + " " + backPage).build()); + .append(Button.create("返回").setExecuteCommand("/dominion privilege_info " + playerName + " " + dominionName).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) + .setExecuteCommand("/dominion apply_template " + playerName + " " + dominionName + " " + template.getName()) .build()) .append(Component.text(template.getName()))); }