diff --git a/README.md b/README.md index feb2fa2..55ee011 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ - 支持经济系统(需要 Vault 前置); - 领地区域可视化; - 管理员可在游戏内使用TUI配置领地系统; +- 支持[从 Residence 迁移](https://ssl.lunadeer.cn:14448/doc/73/)领地数据(1.33.7+);
diff --git a/pom.xml b/pom.xml index 255de71..422a449 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.33.7-global-tp-beta + 1.35.0-global-tp-beta jar Dominion @@ -90,5 +90,10 @@ v2.6.2 provided + + org.yaml + snakeyaml + 2.0 + diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java index 3f465e3..f2f4ef1 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -1,5 +1,7 @@ package cn.lunadeer.dominion; +import cn.lunadeer.dominion.dtos.*; +import cn.lunadeer.dominion.utils.ResMigration; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.PlayerDTO; @@ -27,7 +29,8 @@ public class Cache { public Cache() { player_current_dominion_id = new HashMap<>(); loadDominions(); - loadPlayerPrivileges(); + loadMembers(); + loadGroups(); } /** @@ -106,56 +109,101 @@ public class Cache { * * @param player_uuid 玩家UUID */ - public void loadPlayerPrivileges(UUID player_uuid) { - if (_last_update_privilege.get() + UPDATE_INTERVAL < System.currentTimeMillis()) { - XLogger.debug("run loadPlayerPrivilegesExecution directly"); - loadPlayerPrivilegesExecution(player_uuid); + public void loadMembers(UUID player_uuid) { + if (_last_update_member.get() + UPDATE_INTERVAL < System.currentTimeMillis()) { + XLogger.debug("run loadMembersExecution directly"); + loadMembersExecution(player_uuid); } else { - if (_update_privilege_is_scheduled.get()) return; - XLogger.debug("schedule loadPlayerPrivilegesExecution"); - _update_privilege_is_scheduled.set(true); - long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_privilege.get())) / 1000 * 20L; + if (_update_member_is_scheduled.get()) return; + XLogger.debug("schedule loadMembersExecution"); + _update_member_is_scheduled.set(true); + long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_member.get())) / 1000 * 20L; Scheduler.runTaskLaterAsync(() -> { - XLogger.debug("run loadPlayerPrivilegesExecution scheduled"); - loadPlayerPrivilegesExecution(player_uuid); - _update_privilege_is_scheduled.set(false); + XLogger.debug("run loadMembersExecution scheduled"); + loadMembersExecution(player_uuid); + _update_member_is_scheduled.set(false); }, delay_tick); } } - public void loadPlayerPrivileges() { - loadPlayerPrivileges(null); + public void loadMembers() { + loadMembers(null); } - private void loadPlayerPrivilegesExecution(UUID player_to_update) { + private void loadMembersExecution(UUID player_to_update) { Scheduler.runTaskAsync(() -> { long start = System.currentTimeMillis(); - List all_privileges; + List all_privileges; if (player_to_update == null) { - all_privileges = PlayerPrivilegeDTO.selectAll(); - player_uuid_to_privilege = new ConcurrentHashMap<>(); + all_privileges = MemberDTO.selectAll(); + player_uuid_to_member = new ConcurrentHashMap<>(); } else { - all_privileges = PlayerPrivilegeDTO.selectAll(player_to_update); - if (!player_uuid_to_privilege.containsKey(player_to_update)) { - player_uuid_to_privilege.put(player_to_update, new ConcurrentHashMap<>()); + all_privileges = MemberDTO.selectAll(player_to_update); + if (!player_uuid_to_member.containsKey(player_to_update)) { + player_uuid_to_member.put(player_to_update, new ConcurrentHashMap<>()); } - player_uuid_to_privilege.get(player_to_update).clear(); + player_uuid_to_member.get(player_to_update).clear(); } - for (PlayerPrivilegeDTO privilege : all_privileges) { + for (MemberDTO privilege : all_privileges) { UUID player_uuid = privilege.getPlayerUUID(); - if (!player_uuid_to_privilege.containsKey(player_uuid)) { - player_uuid_to_privilege.put(player_uuid, new ConcurrentHashMap<>()); + if (!player_uuid_to_member.containsKey(player_uuid)) { + player_uuid_to_member.put(player_uuid, new ConcurrentHashMap<>()); } - player_uuid_to_privilege.get(player_uuid).put(privilege.getDomID(), privilege); + player_uuid_to_member.get(player_uuid).put(privilege.getDomID(), privilege); } recheckPlayerState = true; - _last_update_privilege.set(System.currentTimeMillis()); - XLogger.debug("loadPlayerPrivilegesExecution cost: %d ms for %d privileges" + _last_update_member.set(System.currentTimeMillis()); + XLogger.debug("loadMembersExecution cost: %d ms for %d privileges" , System.currentTimeMillis() - start, all_privileges.size()); }); } + public void loadGroups() { + loadGroups(null); + } + + public void loadGroups(Integer groupId) { + if (_last_update_group.get() + UPDATE_INTERVAL < System.currentTimeMillis()) { + XLogger.debug("run loadGroupsExecution directly"); + loadGroupExecution(groupId); + } else { + if (_update_group_is_scheduled.get()) return; + XLogger.debug("schedule loadGroupsExecution"); + _update_group_is_scheduled.set(true); + long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_group.get())) / 1000 * 20L; + Scheduler.runTaskLaterAsync(() -> { + XLogger.debug("run loadGroupsExecution 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("loadGroupsExecution cost: %d ms", System.currentTimeMillis() - start); + }); + } + /** * 获取玩家当前所在领地 * 此方法会先判断缓存中是否有玩家当前所在领地,如果没有则遍历所有领地判断玩家所在位置 @@ -240,9 +288,18 @@ public class Cache { player.setGlowing(false); return; } - PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion); + MemberDTO privilege = getMember(player, dominion); if (privilege != null) { - player.setGlowing(privilege.getFlagValue(Flag.GLOW)); + if (privilege.getGroupId() == -1) { + player.setGlowing(privilege.getFlagValue(Flag.GLOW)); + } else { + GroupDTO group = getGroup(privilege.getGroupId()); + if (group != null) { + player.setGlowing(group.getFlagValue(Flag.GLOW)); + } else { + player.setGlowing(dominion.getFlagValue(Flag.GLOW)); + } + } } else { player.setGlowing(dominion.getFlagValue(Flag.GLOW)); } @@ -268,9 +325,18 @@ public class Cache { player.setAllowFlight(false); return; } - PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion); + MemberDTO privilege = getMember(player, dominion); if (privilege != null) { - player.setAllowFlight(privilege.getFlagValue(Flag.FLY)); + if (privilege.getGroupId() == -1) { + player.setAllowFlight(privilege.getFlagValue(Flag.FLY)); + } else { + GroupDTO group = getGroup(privilege.getGroupId()); + if (group != null) { + player.setAllowFlight(group.getFlagValue(Flag.FLY)); + } else { + player.setAllowFlight(dominion.getFlagValue(Flag.FLY)); + } + } } else { player.setAllowFlight(dominion.getFlagValue(Flag.FLY)); } @@ -302,6 +368,10 @@ public class Cache { return dominionTree; } + public GroupDTO getGroup(Integer id) { + return id_groups.get(id); + } + /** * 获取玩家在指定领地的特权 * 如果玩家不存在特权,则返回null @@ -310,14 +380,14 @@ public class Cache { * @param dominion 领地 * @return 特权表 */ - public PlayerPrivilegeDTO getPlayerPrivilege(Player player, DominionDTO dominion) { - if (!player_uuid_to_privilege.containsKey(player.getUniqueId())) return null; - return player_uuid_to_privilege.get(player.getUniqueId()).get(dominion.getId()); + public MemberDTO getMember(Player player, DominionDTO dominion) { + if (!player_uuid_to_member.containsKey(player.getUniqueId())) return null; + return player_uuid_to_member.get(player.getUniqueId()).get(dominion.getId()); } - public PlayerPrivilegeDTO getPlayerPrivilege(UUID player_uuid, DominionDTO dominion) { - if (!player_uuid_to_privilege.containsKey(player_uuid)) return null; - return player_uuid_to_privilege.get(player_uuid).get(dominion.getId()); + public MemberDTO getMember(UUID player_uuid, DominionDTO dominion) { + if (!player_uuid_to_member.containsKey(player_uuid)) return null; + return player_uuid_to_member.get(player_uuid).get(dominion.getId()); } private static boolean isInDominion(@Nullable DominionDTO dominion, Player player) { @@ -345,6 +415,25 @@ public class Cache { return count; } + public List getResidenceData(UUID player_uuid) { + if (residence_data == null) { + residence_data = new HashMap<>(); + List residences = ResMigration.extractFromResidence(Dominion.instance); + for (ResMigration.ResidenceNode node : residences) { + if (node == null) { + continue; + } + if (!residence_data.containsKey(node.owner)) { + XLogger.debug("residence_data put %s", node.owner); + residence_data.put(node.owner, new ArrayList<>()); + } + residence_data.get(node.owner).add(node); + } + XLogger.debug("residence_data: %d", residence_data.size()); + } + return residence_data.get(player_uuid); + } + public List getDominions() { return new ArrayList<>(id_dominions.values()); } @@ -352,14 +441,19 @@ public class Cache { public static Cache instance; private ConcurrentHashMap id_dominions; private ConcurrentHashMap> world_dominion_tree; - private ConcurrentHashMap> player_uuid_to_privilege; // 玩家所有的特权 + private ConcurrentHashMap id_groups; + private ConcurrentHashMap> player_uuid_to_member; // 玩家所有的特权 private final Map player_current_dominion_id; // 玩家当前所在领地 private ConcurrentHashMap> dominion_children; private final AtomicLong _last_update_dominion = new AtomicLong(0); 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_member = new AtomicLong(0); + private final AtomicBoolean _update_member_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<>(); + + private Map> residence_data = null; } diff --git a/src/main/java/cn/lunadeer/dominion/Commands.java b/src/main/java/cn/lunadeer/dominion/Commands.java index 15657d5..edcd23a 100644 --- a/src/main/java/cn/lunadeer/dominion/Commands.java +++ b/src/main/java/cn/lunadeer/dominion/Commands.java @@ -5,7 +5,15 @@ import cn.lunadeer.dominion.controllers.PlayerController; import cn.lunadeer.dominion.cuis.*; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.PlayerDTO; -import cn.lunadeer.dominion.tuis.*; +import cn.lunadeer.dominion.tuis.AllDominion; +import cn.lunadeer.dominion.tuis.Menu; +import cn.lunadeer.dominion.tuis.MigrateList; +import cn.lunadeer.dominion.tuis.SysConfig; +import cn.lunadeer.dominion.tuis.dominion.DominionList; +import cn.lunadeer.dominion.tuis.dominion.DominionManage; +import cn.lunadeer.dominion.tuis.dominion.manage.EnvSetting; +import cn.lunadeer.dominion.tuis.dominion.manage.GuestSetting; +import cn.lunadeer.dominion.tuis.dominion.manage.SizeInfo; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; @@ -20,24 +28,6 @@ import java.util.List; import static cn.lunadeer.dominion.commands.Helper.*; public class Commands implements TabExecutor { - /* - 创建领地: /dominion create <领地名称> - 自动创建领地: /dominion auto_create <领地名称> - 创建子领地: /dominion create_sub <子领地名称> [父领地名称] - 自动创建子领地: /dominion auto_create_sub <子领地名称> [父领地名称] - 扩张领地: /dominion expand [大小] [领地名称] - 缩小领地: /dominion contract [大小] [领地名称] - 删除领地: /dominion delete <领地名称> [force] - 设置领地权限: /dominion set <权限名称> [领地名称] - 设置玩家权限: /dominion set_privilege <玩家名称> <权限名称> [领地名称] - 重置玩家权限: /dominion clear_privilege <玩家名称> [领地名称] - 创建权限组: /dominion create_group <权限组名称> - 删除权限组: /dominion delete_group <权限组名称> - 设置权限组权限: /dominion set_group <权限组名称> <权限名称> - 设置玩家在某个领地归属的权限组: /dominion add_player <玩家名称> <权限组名称> [领地名称] - 删除玩家在某个领地归属的权限组: /dominion remove_player <玩家名称> <权限组名称> [领地名称] - */ - /** * Executes the given command, returning its success. @@ -62,19 +52,19 @@ public class Commands implements TabExecutor { Menu.show(sender, args); break; case "list": - ListDominion.show(sender, args); + DominionList.show(sender, args); break; case "help": cn.lunadeer.dominion.tuis.Apis.printHelp(sender, args); break; case "info": - DominionSizeInfo.show(sender, args); + SizeInfo.show(sender, args); break; case "manage": DominionManage.show(sender, args); break; - case "flag_info": - DominionFlagInfo.show(sender, args); + case "guest_setting": + GuestSetting.show(sender, args); break; case "create": DominionOperate.createDominion(sender, args); @@ -100,24 +90,6 @@ public class Commands implements TabExecutor { case "set": DominionFlag.setDominionFlag(sender, args); break; - case "create_privilege": - PlayerPrivilege.createPlayerPrivilege(sender, args); - break; - case "set_privilege": - PlayerPrivilege.setPlayerPrivilege(sender, args); - break; - case "clear_privilege": - PlayerPrivilege.clearPlayerPrivilege(sender, args); - break; - case "privilege_list": - DominionPrivilegeList.show(sender, args); - break; - case "privilege_info": - PrivilegeInfo.show(sender, args); - break; - case "select_player_create_privilege": - SelectPlayer.show(sender, args); - break; case "set_enter_msg": DominionOperate.setEnterMessage(sender, args); break; @@ -145,8 +117,8 @@ public class Commands implements TabExecutor { case "export_mca": Operator.exportMca(sender, args); break; - case "config": - DominionConfig.show(sender, args); + case "sys_config": + SysConfig.show(sender, args); break; case "set_config": SetConfig.handler(sender, args); @@ -154,32 +126,27 @@ public class Commands implements TabExecutor { case "all_dominion": AllDominion.show(sender, args); break; - case "template_list": - TemplateList.show(sender, args); + case "migrate_list": + MigrateList.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; - case "apply_template": - PlayerPrivilege.applyTemplate(sender, args); - break; - case "select_template": - SelectTemplate.show(sender, args); + case "migrate": + Migration.migrate(sender, args); break; case "set_map_color": DominionOperate.setMapColor(sender, args); break; - case "env_info": - DominionEnvInfo.show(sender, args); + case "env_setting": + EnvSetting.show(sender, args); + break; + // ---=== Sub Command ===--- + case "member": + Member.handle(sender, args); + break; + case "group": + Group.handle(sender, args); + break; + case "template": + Template.handle(sender, args); break; // ---=== CUI ===--- case "cui_rename": @@ -194,8 +161,8 @@ public class Commands implements TabExecutor { case "cui_create": CreateDominion.open(sender, args); break; - case "cui_create_privilege": - CreatePrivilege.open(sender, args); + case "cui_member_add": + MemberAdd.open(sender, args); break; case "cui_template_create": CreateTemplate.open(sender, args); @@ -203,6 +170,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; } @@ -225,9 +198,8 @@ public class Commands implements TabExecutor { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (args.length == 1) { - return Arrays.asList("menu", "help", "info", "manage", "flag_info", "privilege_list", + return Arrays.asList("menu", "help", "info", "manage", "guest_setting", "create", "auto_create", "create_sub", "auto_create_sub", "expand", "contract", "delete", "set", - "create_privilege", "set_privilege", "clear_privilege", "list", "privilege_info", "set_enter_msg", "set_leave_msg", "set_tp_location", @@ -237,32 +209,35 @@ public class Commands implements TabExecutor { "reload_cache", "reload_config", "export_mca", - "config", - "apply_template", - "template_list", - "template_manage", - "template_delete", - "template_create", - "template_set_flag", + "sys_config", "all_dominion", - "set_map_color" + "set_map_color", + "member", + "group", + "template" ); } + if (args.length > 1 && args[0].equals("member")) { + return Member.handleTab(sender, args); + } + if (args.length > 1 && args[0].equals("group")) { + return Group.handleTab(sender, args); + } + if (args.length > 1 && args[0].equals("template")) { + return Template.handleTab(sender, args); + } if (args.length == 2) { switch (args[0]) { case "help": case "list": - case "config": - case "template_list": - return Collections.singletonList("页码(可选)"); + case "sys_config": case "create": case "auto_create": return Collections.singletonList("输入领地名称"); case "delete": case "info": case "manage": - case "flag_info": - case "privilege_list": + case "guest_setting": case "rename": case "give": case "set_tp_location": @@ -271,12 +246,6 @@ public class Commands implements TabExecutor { return DominionDTO.selectAllNames(); case "set": return dominionFlags(); - case "create_privilege": - case "set_privilege": - case "clear_privilege": - case "privilege_info": - case "apply_template": - return playerNames(); case "expand": case "contract": return Collections.singletonList("大小(整数)"); @@ -287,12 +256,6 @@ public class Commands implements TabExecutor { return Collections.singletonList("进入提示语内容"); case "set_leave_msg": return Collections.singletonList("离开提示语内容"); - case "template_manage": - case "template_delete": - case "template_set_flag": - return allTemplates(sender); - case "template_create": - return Collections.singletonList("输入模板名称"); case "set_map_color": return Collections.singletonList("输入颜色(16进制)"); } @@ -301,48 +264,34 @@ public class Commands implements TabExecutor { switch (args[0]) { case "set": return boolOptions(); - case "set_privilege": - case "template_set_flag": - return playerPrivileges(); case "expand": case "contract": - case "clear_privilege": - case "create_privilege": - case "privilege_info": case "auto_create_sub": case "create_sub": case "set_enter_msg": case "set_leave_msg": - case "apply_template": case "set_map_color": return playerDominions(sender); case "rename": return Collections.singletonList("输入新领地名称"); case "give": return playerNames(); - case "template_manage": - return Collections.singletonList("页码(可选)"); } } if (args.length == 4) { switch (args[0]) { case "set": return playerDominions(sender); - case "set_privilege": - case "template_set_flag": - return boolOptions(); - case "apply_template": - return allTemplates(sender); } } return null; } - private static List boolOptions() { + public static List boolOptions() { return Arrays.asList("true", "false"); } - private static List playerNames() { + public static List playerNames() { List players = PlayerController.allPlayers(); List names = new ArrayList<>(); for (PlayerDTO player : players) { diff --git a/src/main/java/cn/lunadeer/dominion/commands/Apis.java b/src/main/java/cn/lunadeer/dominion/commands/Apis.java index 7d70562..cd94657 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/commands/Apis.java @@ -62,4 +62,8 @@ public class Apis { return false; } + public static String CommandParser(String command, Object... args) { + return String.format(command, args); + } + } diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java b/src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java index bb53985..3b25b3c 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java @@ -3,8 +3,8 @@ package cn.lunadeer.dominion.commands; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.FlagsController; import cn.lunadeer.dominion.dtos.Flag; -import cn.lunadeer.dominion.tuis.DominionEnvInfo; -import cn.lunadeer.dominion.tuis.DominionFlagInfo; +import cn.lunadeer.dominion.tuis.dominion.manage.EnvSetting; +import cn.lunadeer.dominion.tuis.dominion.manage.GuestSetting; import cn.lunadeer.minecraftpluginutils.Notification; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -35,9 +35,9 @@ public class DominionFlag { newArgs[1] = args[3]; newArgs[2] = args[4]; if (Flag.isDominionOnlyFlag(args[1])) { - DominionEnvInfo.show(sender, newArgs); + EnvSetting.show(sender, newArgs); } else { - DominionFlagInfo.show(sender, newArgs); + GuestSetting.show(sender, newArgs); } } else { diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java index d8ebd45..c860288 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java @@ -8,6 +8,7 @@ import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; import cn.lunadeer.dominion.managers.GlobalTeleport; +import cn.lunadeer.dominion.dtos.MemberDTO; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Teleport; @@ -372,7 +373,7 @@ public class DominionOperate { return; } - PlayerPrivilegeDTO privilegeDTO = PlayerPrivilegeDTO.select(player.getUniqueId(), dominionDTO.getId()); + MemberDTO privilegeDTO = MemberDTO.select(player.getUniqueId(), dominionDTO.getId()); if (!player.getUniqueId().equals(dominionDTO.getOwner())) { // 领地所有人可以传送到自己的领地 if (privilegeDTO == null) { if (!dominionDTO.getFlagValue(Flag.TELEPORT)) { 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..f8110d0 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/commands/Group.java @@ -0,0 +1,261 @@ +package cn.lunadeer.dominion.commands; + +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.GroupController; +import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupList; +import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupSetting; +import cn.lunadeer.dominion.tuis.dominion.manage.group.SelectMember; +import cn.lunadeer.minecraftpluginutils.Notification; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static cn.lunadeer.dominion.Commands.boolOptions; +import static cn.lunadeer.dominion.commands.Apis.playerOnly; +import static cn.lunadeer.dominion.commands.Helper.*; +import static cn.lunadeer.dominion.tuis.Apis.getPage; + +public class Group { + + /** + * /dominion group create <领地名称> <权限组名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void createGroup(CommandSender sender, String[] args) { + try { + if (args.length < 4) { + Notification.error(sender, "用法: /dominion group create <领地名称> <权限组名称>"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[2]; + String groupName = args[3]; + GroupController.createGroup(operator, dominionName, groupName); + GroupList.show(sender, dominionName); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); + } + } + + /** + * /dominion group delete <领地名称> <权限组名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void deleteGroup(CommandSender sender, String[] args) { + try { + if (args.length < 4) { + Notification.error(sender, "用法: /dominion group delete <领地名称> <权限组名称>"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[2]; + String groupName = args[3]; + GroupController.deleteGroup(operator, dominionName, groupName); + GroupList.show(sender, dominionName); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); + } + } + + /** + * /dominion group rename <领地名称> <权限组旧名称> <新名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void renameGroup(CommandSender sender, String[] args) { + try { + if (args.length < 5) { + Notification.error(sender, "用法: /dominion group rename <领地名称> <权限组旧名称> <新名称>"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[2]; + String oldGroupName = args[3]; + String newGroupName = args[4]; + GroupController.renameGroup(operator, dominionName, oldGroupName, newGroupName); + GroupSetting.show(sender, dominionName, newGroupName); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); + } + } + + /** + * /dominion group set_flag <领地名称> <权限组名称> <权限名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void setGroupFlag(CommandSender sender, String[] args) { + try { + if (args.length < 6) { + Notification.error(sender, "用法: /dominion group set_flag <领地名称> <权限组名称> <权限名称> "); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[2]; + String groupName = args[3]; + String flag = args[4]; + boolean value = Boolean.parseBoolean(args[5]); + int page = getPage(args, 6); + GroupController.setGroupFlag(operator, dominionName, groupName, flag, value); + GroupSetting.show(sender, dominionName, groupName, page); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); + } + } + + /** + * /dominion group add_member <领地名称> <权限组名称> <玩家名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void addMember(CommandSender sender, String[] args) { + try { + if (args.length < 5) { + Notification.error(sender, "用法: /dominion group add_member <领地名称> <权限组名称> <玩家名称>"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[2]; + String groupName = args[3]; + String playerName = args[4]; + int page = getPage(args, 5); + GroupController.addMember(operator, dominionName, groupName, playerName); + GroupList.show(sender, dominionName, page); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); + } + } + + /** + * /dominion group remove_member <领地名称> <权限组名称> <玩家名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void removeMember(CommandSender sender, String[] args) { + try { + if (args.length < 5) { + Notification.error(sender, "用法: /dominion group remove_member <领地名称> <权限组名称> <玩家名称>"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[2]; + String groupName = args[3]; + String playerName = args[4]; + int page = getPage(args, 5); + GroupController.removeMember(operator, dominionName, groupName, playerName); + GroupList.show(sender, dominionName, page); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); + } + } + + public static void handle(@NotNull CommandSender sender, @NotNull String[] args) { + switch (args[1]) { + case "create": + createGroup(sender, args); + break; + case "delete": + deleteGroup(sender, args); + break; + case "rename": + renameGroup(sender, args); + break; + case "set_flag": + setGroupFlag(sender, args); + break; + case "add_member": + addMember(sender, args); + break; + case "remove_member": + removeMember(sender, args); + break; + case "select_member": + SelectMember.show(sender, args); + break; + case "setting": + GroupSetting.show(sender, args); + break; + case "list": + GroupList.show(sender, args); + break; + } + } + + public static @Nullable List handleTab(@NotNull CommandSender sender, @NotNull String[] args) { + if (args.length == 2) { + return Arrays.asList("create", "delete", "rename", "set_flag", "add_member", "remove_member", + "select_member", "list"); + } + if (args.length == 3) { + switch (args[1]) { + case "create": + case "delete": + case "rename": + case "set_flag": + case "add_member": + case "remove_member": + case "select_member": + case "setting": + case "list": + return playerDominions(sender); + } + } + if (args.length == 4) { + switch (args[1]) { + case "create": + return Collections.singletonList("新权限组名称"); + case "delete": + case "rename": + case "set_flag": + case "add_member": + case "remove_member": + case "select_member": + case "setting": + return dominionGroups(args[2]); + } + } + if (args.length == 5) { + switch (args[1]) { + case "rename": + return Collections.singletonList("权限组新名称"); + case "set_flag": + return playerPrivileges(); + case "remove_member": + return groupPlayers(args[2], args[3]); + } + } + if (args.length == 6) { + switch (args[1]) { + case "set_flag": + return boolOptions(); + } + } + return null; + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/commands/Helper.java b/src/main/java/cn/lunadeer/dominion/commands/Helper.java index 20fa202..4955c41 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 = MemberDTO.selectByDomGroupId(dominion.getId(), group.getId()); + for (MemberDTO 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); @@ -56,8 +79,8 @@ public class Helper { List dominions_name = new ArrayList<>(); Player player = playerOnly(sender); if (player == null) return dominions_name; - List dominions_admin = PlayerPrivilegeDTO.selectAll(player.getUniqueId()); - for (PlayerPrivilegeDTO privilege : dominions_admin) { + List dominions_admin = MemberDTO.selectAll(player.getUniqueId()); + for (MemberDTO privilege : dominions_admin) { if (privilege.getAdmin()) { DominionDTO dom = DominionDTO.select(privilege.getDomID()); if (dom == null) continue; diff --git a/src/main/java/cn/lunadeer/dominion/commands/Member.java b/src/main/java/cn/lunadeer/dominion/commands/Member.java new file mode 100644 index 0000000..a6e9136 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/commands/Member.java @@ -0,0 +1,210 @@ +package cn.lunadeer.dominion.commands; + +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.MemberController; +import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberList; +import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberSetting; +import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectPlayer; +import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectTemplate; +import cn.lunadeer.minecraftpluginutils.Notification; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static cn.lunadeer.dominion.Commands.boolOptions; +import static cn.lunadeer.dominion.Commands.playerNames; +import static cn.lunadeer.dominion.commands.Apis.playerOnly; +import static cn.lunadeer.dominion.commands.Helper.*; + +public class Member { + + /** + * 创建玩家特权 + * /dominion member add <领地名称> <玩家名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void member_add(CommandSender sender, String[] args) { + try { + if (args.length < 4) { + Notification.error(sender, "用法: /dominion member add <领地名称> <玩家名称>"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[2]; + String playerName = args[3]; + MemberController.memberAdd(operator, dominionName, playerName); + MemberList.show(sender, dominionName); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); + } + } + + /** + * 设置玩家权限 + * /dominion member set_flag <领地名称> <玩家名称> <权限名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void member_set_flag(CommandSender sender, String[] args) { + try { + if (args.length < 6) { + Notification.error(sender, "用法: /dominion member set_flag <领地名称> <玩家名称> <权限名称> "); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[2]; + String playerName = args[3]; + String flagName = args[4]; + boolean flagValue = Boolean.parseBoolean(args[5]); + Integer page = args.length == 7 ? Integer.parseInt(args[6]) : 1; + MemberController.setMemberFlag(operator, dominionName, playerName, flagName, flagValue); + MemberSetting.show(sender, dominionName, playerName, page); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); + } + } + + /** + * 重置玩家权限 + * /dominion member remove <领地名称> <玩家名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void member_remove(CommandSender sender, String[] args) { + try { + if (args.length < 4) { + Notification.error(sender, "用法: /dominion member remove <领地名称> <玩家名称>"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[2]; + String playerName = args[3]; + MemberController.memberRemove(operator, dominionName, playerName); + MemberList.show(sender, dominionName); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); + } + } + + /** + * 应用权限模板 + * /dominion member apply_template <领地名称> <玩家名称> <模板名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void member_apply_template(CommandSender sender, String[] args) { + try { + if (args.length < 5) { + Notification.error(sender, "用法: /dominion member apply_template <领地名称> <玩家名称> <模板名称>"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String dominionName = args[2]; + String playerName = args[3]; + String templateName = args[4]; + MemberController.applyTemplate(operator, dominionName, playerName, templateName); + MemberSetting.show(sender, dominionName, playerName); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); + } + } + + public static void handle(@NotNull CommandSender sender, @NotNull String[] args) { + switch (args[1]) { + case "add": + Member.member_add(sender, args); + break; + case "set_flag": + Member.member_set_flag(sender, args); + break; + case "remove": + Member.member_remove(sender, args); + break; + case "apply_template": + Member.member_apply_template(sender, args); + break; + case "list": + MemberList.show(sender, args); + break; + case "setting": + MemberSetting.show(sender, args); + break; + case "select_player": + SelectPlayer.show(sender, args); + break; + case "select_template": + SelectTemplate.show(sender, args); + break; + } + } + + public static @Nullable List handleTab(@NotNull CommandSender sender, @NotNull String[] args) { + if (args.length == 2) { + return Arrays.asList("add", "set_flag", "remove", "apply_template", "list", "setting", "select_player", "select_template"); + } + if (args.length == 3) { + switch (args[1]) { + case "add": + case "remove": + case "list": + case "setting": + case "set_flag": + case "apply_template": + case "select_player": + case "select_template": + return playerDominions(sender); + } + } + if (args.length == 4) { + switch (args[1]) { + case "add": + case "remove": + case "set_flag": + case "apply_template": + case "setting": + case "select_template": + case "select_player": + return playerNames(); + case "list": + return Collections.singletonList("页码(可选)"); + } + } + if (args.length == 5) { + switch (args[1]) { + case "set_flag": + return playerPrivileges(); + case "apply_template": + return allTemplates(sender); + case "setting": + case "select_template": + return Collections.singletonList("页码(可选)"); + } + } + if (args.length == 6) { + switch (args[1]) { + case "set_flag": + return boolOptions(); + } + } + return null; + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/commands/Migration.java b/src/main/java/cn/lunadeer/dominion/commands/Migration.java new file mode 100644 index 0000000..3a7df89 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/commands/Migration.java @@ -0,0 +1,95 @@ +package cn.lunadeer.dominion.commands; + +import cn.lunadeer.dominion.Cache; +import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.DominionController; +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.tuis.MigrateList; +import cn.lunadeer.dominion.utils.ResMigration; +import cn.lunadeer.minecraftpluginutils.Notification; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; +import java.util.Objects; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class Migration { + + public static void migrate(CommandSender sender, String[] args) { + try { + Player player = playerOnly(sender); + if (player == null) return; + + if (!Dominion.config.getResidenceMigration()) { + Notification.error(sender, "Residence 迁移功能没有开启"); + return; + } + + if (args.length < 2) { + Notification.error(sender, "用法: /dominion migrate "); + return; + } + String resName = args[1]; + List res_data = Cache.instance.getResidenceData(player.getUniqueId()); + if (res_data == null) { + Notification.error(sender, "你没有可迁移的数据"); + return; + } + ResMigration.ResidenceNode resNode = res_data.stream().filter(node -> node.name.equals(resName)).findFirst().orElse(null); + if (resNode == null) { + Notification.error(sender, "未找到指定的 Residence 领地"); + return; + } + if (!resNode.owner.equals(player.getUniqueId())) { + Notification.error(sender, "你不是该领地的所有者,无法迁移此领地"); + return; + } + create(player, resNode, ""); + if (args.length == 3 ) { + int parentId = Integer.parseInt(args[2]); + String[] newArgs = new String[2]; + newArgs[0] = "migrate_list"; + newArgs[1] = String.valueOf(parentId); + MigrateList.show(sender, newArgs); + } + } catch (Exception e) { + Notification.error(sender, "迁移失败: " + e.getMessage()); + } + } + + private static void create(Player player, ResMigration.ResidenceNode node, String parentName) { + BukkitPlayerOperator operator = new BukkitPlayerOperator(player); + operator.getResponse().thenAccept(result -> { + if (Objects.equals(result.getStatus(), BukkitPlayerOperator.Result.SUCCESS)) { + DominionDTO dominion = DominionDTO.select(node.name); + if (dominion == null) { + return; + } + dominion.setTpLocation(node.tpLoc) + .setJoinMessage(node.joinMessage) + .setLeaveMessage(node.leaveMessage); + for (String msg : result.getMessages()) { + Notification.info(player, msg); + } + Notification.info(player, "领地 " + node.name + " 已从 Residence 迁移至 Dominion"); + if (node.children != null) { + for (ResMigration.ResidenceNode child : node.children) { + create(player, child, node.name); + } + } + } else if (Objects.equals(result.getStatus(), BukkitPlayerOperator.Result.WARNING)) { + for (String msg : result.getMessages()) { + Notification.warn(player, msg); + } + } else { + for (String msg : result.getMessages()) { + Notification.error(player, msg); + } + } + }); + DominionController.create(operator, node.name, node.loc1, node.loc2, parentName, true); + } +} diff --git a/src/main/java/cn/lunadeer/dominion/commands/Operator.java b/src/main/java/cn/lunadeer/dominion/commands/Operator.java index 455a126..52650d5 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/Operator.java +++ b/src/main/java/cn/lunadeer/dominion/commands/Operator.java @@ -28,9 +28,14 @@ public class Operator { }); Scheduler.runTaskAsync(() -> { Notification.info(sender, "正在从数据库重新加载玩家权限缓存..."); - Cache.instance.loadPlayerPrivileges(); + Cache.instance.loadMembers(); Notification.info(sender, "玩家权限缓存已重新加载"); }); + Scheduler.runTaskAsync(() -> { + Notification.info(sender, "正在从数据库重新加载权限组缓存..."); + Cache.instance.loadGroups(); + Notification.info(sender, "权限组缓存已重新加载"); + }); } public static void exportMca(CommandSender sender, String[] args) { diff --git a/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java b/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java deleted file mode 100644 index 216b4a0..0000000 --- a/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java +++ /dev/null @@ -1,128 +0,0 @@ -package cn.lunadeer.dominion.commands; - -import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; -import cn.lunadeer.dominion.controllers.PrivilegeController; -import cn.lunadeer.dominion.tuis.DominionPrivilegeList; -import cn.lunadeer.dominion.tuis.PrivilegeInfo; -import cn.lunadeer.minecraftpluginutils.Notification; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import static cn.lunadeer.dominion.commands.Apis.playerOnly; -import static cn.lunadeer.dominion.controllers.PrivilegeController.*; - -public class PlayerPrivilege { - - /** - * 创建玩家特权 - * /dominion create_privilege <玩家名称> [领地名称] - * - * @param sender 命令发送者 - * @param args 命令参数 - */ - public static void createPlayerPrivilege(CommandSender sender, String[] args) { - Player player = playerOnly(sender); - if (player == null) return; - BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); - if (args.length != 2 && args.length != 3 && args.length != 4) { - Notification.error(sender, "用法: /dominion create_privilege <玩家名称> [领地名称]"); - return; - } - if (args.length == 2) { - createPrivilege(operator, args[1]); - } else { - createPrivilege(operator, args[1], args[2]); - } - if (args.length == 4) { - String[] newArgs = new String[2]; - newArgs[0] = "privilege_list"; - newArgs[1] = args[2]; - DominionPrivilegeList.show(sender, newArgs); - } - } - - /** - * 设置玩家权限 - * /dominion set_privilege <玩家名称> <权限名称> [领地名称] - * - * @param sender 命令发送者 - * @param args 命令参数 - */ - public static void setPlayerPrivilege(CommandSender sender, String[] args) { - Player player = playerOnly(sender); - if (player == null) return; - BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); - if (args.length == 4) { - setPrivilege(operator, args[1], args[2], Boolean.parseBoolean(args[3])); - } else if (args.length == 5) { - setPrivilege(operator, args[1], args[2], Boolean.parseBoolean(args[3]), args[4]); - } else if (args.length == 6) { - setPrivilege(operator, args[1], args[2], Boolean.parseBoolean(args[3]), args[4]); - String[] newArgs = new String[4]; - newArgs[0] = "privilege_info"; - newArgs[1] = args[1]; - newArgs[2] = args[4]; - newArgs[3] = args[5]; - PrivilegeInfo.show(sender, newArgs); - } else { - Notification.error(sender, "用法: /dominion set_privilege <玩家名称> <权限名称> [领地名称]"); - } - } - - /** - * 重置玩家权限 - * /dominion clear_privilege <玩家名称> [领地名称] - * - * @param sender 命令发送者 - * @param args 命令参数 - */ - public static void clearPlayerPrivilege(CommandSender sender, String[] args) { - Player player = playerOnly(sender); - if (player == null) return; - BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); - if (args.length != 2 && args.length != 3 && args.length != 4) { - Notification.error(sender, "用法: /dominion clear_privilege <玩家名称> [领地名称]"); - return; - } - if (args.length == 2) { - clearPrivilege(operator, args[1]); - } else { - clearPrivilege(operator, args[1], args[2]); - } - if (args.length == 4) { - String[] newArgs = new String[3]; - newArgs[0] = "privilege_list"; - newArgs[1] = args[2]; - DominionPrivilegeList.show(sender, newArgs); - } - } - - /** - * 应用权限模板 - * /dominion apply_template <玩家名称> <领地名称> <模板名称> - * - * @param sender 命令发送者 - * @param args 命令参数 - */ - public static void applyTemplate(CommandSender sender, String[] args) { - Player player = playerOnly(sender); - if (player == null) return; - if (args.length < 4) { - Notification.error(sender, "用法: /dominion apply_template <玩家名称> <领地名称> <模板名称>"); - return; - } - BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); - String playerName = args[1]; - String dominionName = args[2]; - String templateName = args[3]; - PrivilegeController.applyTemplate(operator, dominionName, playerName, templateName); - if (args.length == 5) { - String[] newArgs = new String[3]; - newArgs[0] = "privilege_list"; - newArgs[1] = dominionName; - newArgs[2] = args[4]; - DominionPrivilegeList.show(sender, newArgs); - } - } - -} diff --git a/src/main/java/cn/lunadeer/dominion/commands/SetConfig.java b/src/main/java/cn/lunadeer/dominion/commands/SetConfig.java index a8f0671..08d2619 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/SetConfig.java +++ b/src/main/java/cn/lunadeer/dominion/commands/SetConfig.java @@ -1,7 +1,7 @@ package cn.lunadeer.dominion.commands; import cn.lunadeer.dominion.Dominion; -import cn.lunadeer.dominion.tuis.DominionConfig; +import cn.lunadeer.dominion.tuis.SysConfig; import cn.lunadeer.minecraftpluginutils.Notification; import org.bukkit.command.CommandSender; @@ -67,6 +67,9 @@ public class SetConfig { case "economy_refund": setEconomyRefund(sender, args); break; + case "residence_migration": + setResidenceMigration(sender, args); + break; default: Notification.error(sender, "未知参数"); } @@ -78,7 +81,7 @@ public class SetConfig { String[] newArgs = new String[2]; newArgs[0] = "config"; newArgs[1] = String.valueOf(page); - DominionConfig.show(sender, newArgs); + SysConfig.show(sender, newArgs); } } @@ -250,4 +253,10 @@ public class SetConfig { Dominion.config.setEconomyRefund(economyRefund); } } + + private static void setResidenceMigration(CommandSender sender, String[] args) { + boolean residenceMigration = Boolean.parseBoolean(args[2]); + Dominion.config.setResidenceMigration(residenceMigration); + refreshPageOrNot(sender, args); + } } diff --git a/src/main/java/cn/lunadeer/dominion/commands/Template.java b/src/main/java/cn/lunadeer/dominion/commands/Template.java index 453b1e4..a844ad5 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/Template.java +++ b/src/main/java/cn/lunadeer/dominion/commands/Template.java @@ -2,98 +2,150 @@ 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.dominion.tuis.template.TemplateList; +import cn.lunadeer.dominion.tuis.template.TemplateSetting; import cn.lunadeer.minecraftpluginutils.Notification; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static cn.lunadeer.dominion.Commands.boolOptions; import static cn.lunadeer.dominion.commands.Apis.playerOnly; +import static cn.lunadeer.dominion.commands.Helper.allTemplates; +import static cn.lunadeer.dominion.commands.Helper.playerPrivileges; +import static cn.lunadeer.dominion.tuis.Apis.getPage; 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 <模板名称> [页码] + * /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; + try { + if (args.length < 3) { + Notification.error(sender, "用法: /dominion template create <模板名称>"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + TemplateController.createTemplate(operator, args[2]); + TemplateList.show(sender); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); + } + } + + /** + * 删除权限模板 + * /dominion template delete <模板名称> [页码] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void deleteTemplate(CommandSender sender, String[] args) { + try { + if (args.length < 3) { + Notification.error(sender, "用法: /dominion template delete <模板名称>"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + TemplateController.deleteTemplate(operator, args[2]); + TemplateList.show(sender, getPage(args, 3)); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); } - 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 <模板名称> <权限名称> [页码] + * /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; + try { + if (args.length < 5) { + Notification.error(sender, "用法: /dominion template set_flag <模板名称> <权限名称> "); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + String templateName = args[2]; + String flagName = args[3]; + boolean value = Boolean.parseBoolean(args[4]); + TemplateController.setTemplateFlag(operator, templateName, flagName, value); + TemplateSetting.show(sender, templateName, getPage(args, 5)); + } catch (Exception e) { + Notification.error(sender, e.getMessage()); } - boolean value; - if (args[3].equalsIgnoreCase("true")) { - value = true; - } else if (args[3].equalsIgnoreCase("false")) { - value = false; - } else { - Notification.error(sender, "权限值必须是true或false"); - return; + } + + + public static void handle(@NotNull CommandSender sender, @NotNull String[] args) { + switch (args[1]) { + case "list": + TemplateList.show(sender, args); + break; + case "setting": + TemplateSetting.show(sender, args); + break; + case "delete": + Template.deleteTemplate(sender, args); + break; + case "create": + Template.createTemplate(sender, args); + break; + case "set_flag": + Template.setTemplateFlag(sender, args); + break; + } + } + + public static @Nullable List handleTab(@NotNull CommandSender sender, @NotNull String[] args) { + if (args.length == 2) { + return Arrays.asList("list", "setting", "delete", "create", "set_flag"); + } + if (args.length == 3) { + switch (args[1]) { + case "create": + return Collections.singletonList("输入模板名称"); + case "delete": + case "set_flag": + case "setting": + return allTemplates(sender); + case "list": + return Collections.singletonList("页码(可选)"); + } + } + if (args.length == 4) { + switch (args[1]) { + case "set_flag": + return playerPrivileges(); + case "setting": + return Collections.singletonList("页码(可选)"); + } } - 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"; + switch (args[1]) { + case "set_flag": + return boolOptions(); + } } - TemplateManage.show(sender, newArgs); + return null; } } diff --git a/src/main/java/cn/lunadeer/dominion/controllers/Apis.java b/src/main/java/cn/lunadeer/dominion/controllers/Apis.java index 4e8f27a..0fa63eb 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/Apis.java @@ -2,7 +2,7 @@ package cn.lunadeer.dominion.controllers; import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.dtos.DominionDTO; -import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; +import cn.lunadeer.dominion.dtos.MemberDTO; import org.bukkit.Location; public class Apis { @@ -15,7 +15,7 @@ public class Apis { public static boolean noAuthToChangeFlags(AbstractOperator player, DominionDTO dominion) { if (player.isOp()) return false; if (!dominion.getOwner().equals(player.getUniqueId())) { - PlayerPrivilegeDTO privileges = PlayerPrivilegeDTO.select(player.getUniqueId(), dominion.getId()); + MemberDTO privileges = MemberDTO.select(player.getUniqueId(), dominion.getId()); if (privileges == null || !privileges.getAdmin()) { player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不是领地 %s 的拥有者或管理员,无权修改权限", dominion.getName())); return true; diff --git a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java index c74cdf1..e4f8cf3 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java @@ -59,6 +59,22 @@ public class DominionController { public static void create(AbstractOperator operator, String name, Location loc1, Location loc2, String parent_dominion_name) { + create(operator, name, loc1, loc2, parent_dominion_name, false); + } + + /** + * 创建子领地 + * + * @param operator 拥有者 + * @param name 领地名称 + * @param loc1 位置1 + * @param loc2 位置2 + * @param parent_dominion_name 父领地名称 + * @param skipEco 是否跳过经济检查 + */ + public static void create(AbstractOperator operator, String name, + Location loc1, Location loc2, + String parent_dominion_name, boolean skipEco) { AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建领地失败"); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功创建领地 %s", name); if (name.isEmpty()) { 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..a43a556 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/controllers/GroupController.java @@ -0,0 +1,218 @@ +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); + if (groupName.contains(" ")) { + operator.setResponse(FAIL.addMessage("权限组名称不能包含空格")); + return; + } + 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 { + 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); + if (newName.contains(" ")) { + operator.setResponse(FAIL.addMessage("权限组名称不能包含空格")); + return; + } + 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; + } + MemberDTO privilege = MemberDTO.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; + } + MemberDTO privilege = MemberDTO.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/controllers/PrivilegeController.java b/src/main/java/cn/lunadeer/dominion/controllers/MemberController.java similarity index 50% rename from src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java rename to src/main/java/cn/lunadeer/dominion/controllers/MemberController.java index 5ea74c7..b83d9a9 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/MemberController.java @@ -1,30 +1,11 @@ package cn.lunadeer.dominion.controllers; -import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.dtos.*; -import cn.lunadeer.minecraftpluginutils.XLogger; - -import java.util.UUID; import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags; import static cn.lunadeer.dominion.controllers.Apis.notOwner; -public class PrivilegeController { - - /** - * 清空玩家成员权限 - * - * @param operator 操作者 - * @param player_name 玩家 - */ - public static void clearPrivilege(AbstractOperator operator, String player_name) { - DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); - if (dominion == null) { - operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不在任何领地内,请指定领地名称 /dominion clear_privilege <玩家名称> <领地名称>")); - return; - } - clearPrivilege(operator, player_name, dominion.getName()); - } +public class MemberController { /** * 清空玩家成员权限 @@ -33,8 +14,9 @@ public class PrivilegeController { * @param player_name 玩家 * @param dominionName 领地名称 */ - public static void clearPrivilege(AbstractOperator operator, String player_name, String dominionName) { - AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "清空玩家 %s 在领地 %s 的权限失败", player_name, dominionName); + public static void memberRemove(AbstractOperator operator, String dominionName, String player_name) { + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "将玩家 %s 从领地 %s 移除失败", player_name, dominionName); + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "将玩家 %s 从领地 %s 移除成功", player_name, dominionName); DominionDTO dominion = DominionDTO.select(dominionName); if (dominion == null) { operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName)); @@ -46,7 +28,7 @@ public class PrivilegeController { operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name)); return; } - PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId()); + MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId()); if (privilege == null) { operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", player_name, dominionName)); return; @@ -55,25 +37,8 @@ public class PrivilegeController { operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法移除一个领地管理员", dominionName)); return; } - PlayerPrivilegeDTO.delete(player.getUuid(), dominion.getId()); - operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "清空玩家 %s 在领地 %s 的权限成功", player_name, dominionName)); - } - - /** - * 设置玩家成员权限 - * - * @param operator 操作者 - * @param player_name 玩家 - * @param flag 权限名称 - * @param value 权限值 - */ - public static void setPrivilege(AbstractOperator operator, String player_name, String flag, boolean value) { - DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); - if (dominion == null) { - operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不在任何领地内,请指定领地名称 /dominion set_privilege <玩家名称> <权限名称> [领地名称]")); - return; - } - setPrivilege(operator, player_name, flag, value, dominion.getName()); + MemberDTO.delete(player.getUuid(), dominion.getId()); + operator.setResponse(SUCCESS); } /** @@ -85,8 +50,9 @@ public class PrivilegeController { * @param value 权限值 * @param dominionName 领地名称 */ - public static void setPrivilege(AbstractOperator operator, String player_name, String flag, boolean value, String dominionName) { + public static void setMemberFlag(AbstractOperator operator, String dominionName, String player_name, String flag, boolean value) { AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置玩家 %s 在领地 %s 的权限 %s 为 %s 失败", player_name, dominionName, flag, value); + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置玩家 %s 在领地 %s 的权限 %s 为 %s 成功", player_name, dominionName, flag, value); DominionDTO dominion = DominionDTO.select(dominionName); if (dominion == null) { operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName)); @@ -98,10 +64,10 @@ public class PrivilegeController { operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name)); return; } - PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId()); + MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId()); if (privilege == null) { - privilege = createPlayerPrivilege(operator, player.getUuid(), dominion); - if (privilege == null) return; + operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", player_name, dominionName)); + return; } if ((flag.equals("admin") || privilege.getAdmin()) && notOwner(operator, dominion)) { operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他玩家管理员的权限", dominionName)); @@ -110,10 +76,6 @@ public class PrivilegeController { if (flag.equals("admin")) { privilege.setAdmin(value); } else { - if (privilege.getAdmin()) { - operator.setResponse(FAIL.addMessage("管理员拥有所有权限,无需单独设置权限")); - return; - } Flag f = Flag.getFlag(flag); if (f == null) { operator.setResponse(FAIL.addMessage("未知的领地权限 %s", flag)); @@ -121,53 +83,34 @@ public class PrivilegeController { } privilege.setFlagValue(f, value); } - operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置玩家 %s 在领地 %s 的权限 %s 为 %s 成功", player_name, dominionName, flag, value)); + operator.setResponse(SUCCESS); } - public static void createPrivilege(AbstractOperator operator, String player_name) { - DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); - if (dominion == null) { - operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不在任何领地内,请指定领地名称 /dominion create_privilege <玩家名称> <领地名称>")); - return; - } - createPrivilege(operator, player_name, dominion.getName()); - } - - public static void createPrivilege(AbstractOperator operator, String player_name, String dominionName) { + public static void memberAdd(AbstractOperator operator, String dominionName, String player_name) { + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "将玩家 %s 添加到领地成员 %s 失败", player_name, dominionName); + AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "将玩家 %s 添加到领地成员 %s 成功", player_name, dominionName); DominionDTO dominion = DominionDTO.select(dominionName); if (dominion == null) { - operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "领地 %s 不存在,无法创建成员权限", dominionName)); + operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName)); return; } if (noAuthToChangeFlags(operator, dominion)) return; PlayerDTO player = PlayerController.getPlayerDTO(player_name); if (player == null) { - operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "玩家 %s 不存在或没有登录过", player_name)); + operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name)); return; } - if (createPlayerPrivilege(operator, player.getUuid(), dominion) != null) { - operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建玩家 %s 在领地 %s 的成员权限成功", player_name, dominionName)); - } - } - - private static PlayerPrivilegeDTO createPlayerPrivilege(AbstractOperator operator, UUID player, DominionDTO dom) { - XLogger.debug("operator: " + operator.getUniqueId() + " player: " + player); - if (operator.getUniqueId().equals(player)) { - operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不能给自己设置成员权限")); - return null; - } - PlayerDTO playerDTO = PlayerDTO.select(player); - PlayerPrivilegeDTO privilege = Cache.instance.getPlayerPrivilege(player, dom); + MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId()); if (privilege != null) { - operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建玩家成员权限失败,玩家 %s 已经是领地 %s 的成员", playerDTO.getLastKnownName(), dom.getName())); - return null; + operator.setResponse(FAIL.addMessage("玩家 %s 已经是领地 %s 的成员", player_name, dominionName)); + return; } - privilege = PlayerPrivilegeDTO.insert(new PlayerPrivilegeDTO(player, dom)); + privilege = MemberDTO.insert(new MemberDTO(player.getUuid(), dominion)); if (privilege == null) { - operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建玩家成员权限失败,请联系管理员")); - return null; + operator.setResponse(FAIL); + } else { + operator.setResponse(SUCCESS); } - return privilege; } public static void applyTemplate(AbstractOperator operator, String dominionName, String playerName, String templateName) { @@ -184,7 +127,7 @@ public class PrivilegeController { operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", playerName)); return; } - PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId()); + MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId()); if (privilege == null) { operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", playerName, dominionName)); return; diff --git a/src/main/java/cn/lunadeer/dominion/controllers/TemplateController.java b/src/main/java/cn/lunadeer/dominion/controllers/TemplateController.java index 49a5b8b..306ed17 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/TemplateController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/TemplateController.java @@ -10,10 +10,14 @@ 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, "创建失败"); + if (templateName.contains(" ")) { + operator.setResponse(FAIL.addMessage("模板名称不能包含空格")); + return; + } List templates = PrivilegeTemplateDTO.selectAll(operator.getUniqueId()); for (PrivilegeTemplateDTO template : templates) { if (template.getName().equals(templateName)) { - operator.setResponse(FAIL.addMessage("已经存在名为" + templateName + "的权限模板")); + operator.setResponse(FAIL.addMessage("已经存在名为 %s 的权限模板", templateName)); return; } } @@ -22,7 +26,7 @@ public class TemplateController { operator.setResponse(FAIL.addMessage("可能是数据库错误,请联系管理员")); return; } - operator.setResponse(SUCCESS.addMessage("成功创建名为" + templateName + "的权限模板")); + operator.setResponse(SUCCESS.addMessage("成功创建名为 %s 的权限模板", templateName)); } public static void deleteTemplate(AbstractOperator operator, String templateName) { diff --git a/src/main/java/cn/lunadeer/dominion/cuis/CreateDominion.java b/src/main/java/cn/lunadeer/dominion/cuis/CreateDominion.java index a998666..a1560cd 100644 --- a/src/main/java/cn/lunadeer/dominion/cuis/CreateDominion.java +++ b/src/main/java/cn/lunadeer/dominion/cuis/CreateDominion.java @@ -4,7 +4,7 @@ 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.dominion.tuis.dominion.DominionManage; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; 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..f16fd0c --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/cuis/CreateGroup.java @@ -0,0 +1,50 @@ +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.dominion.manage.group.GroupList; +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); + GroupList.show(sender, 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 createGroupCB = new createGroupCB(player, dominion.getName()); + CuiTextInput view = CuiTextInput.create(createGroupCB).setText("未命名权限组").title("输入要创建的权限组名称"); + view.setSuggestCommand("/dominion group create <领地名称> <权限组名称>"); + 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 index 558438a..552ecf3 100644 --- a/src/main/java/cn/lunadeer/dominion/cuis/CreateTemplate.java +++ b/src/main/java/cn/lunadeer/dominion/cuis/CreateTemplate.java @@ -2,7 +2,7 @@ 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.dominion.tuis.template.TemplateList; import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import org.bukkit.command.CommandSender; @@ -23,10 +23,8 @@ public class CreateTemplate { 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); + TemplateList.show(sender); } } @@ -35,7 +33,7 @@ public class CreateTemplate { if (player == null) return; CuiTextInput.InputCallback createTemplateCB = new createTemplateCB(player); CuiTextInput view = CuiTextInput.create(createTemplateCB).setText("未命名模板").title("输入模板名称"); - view.setSuggestCommand("/dominion template_create <模板名称>"); + view.setSuggestCommand("/dominion template create <模板名称>"); 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 index 068cf88..ffebd43 100644 --- a/src/main/java/cn/lunadeer/dominion/cuis/EditJoinMessage.java +++ b/src/main/java/cn/lunadeer/dominion/cuis/EditJoinMessage.java @@ -3,7 +3,7 @@ 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.dominion.tuis.dominion.DominionManage; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; diff --git a/src/main/java/cn/lunadeer/dominion/cuis/EditLeaveMessage.java b/src/main/java/cn/lunadeer/dominion/cuis/EditLeaveMessage.java index b3d972c..cac667c 100644 --- a/src/main/java/cn/lunadeer/dominion/cuis/EditLeaveMessage.java +++ b/src/main/java/cn/lunadeer/dominion/cuis/EditLeaveMessage.java @@ -3,7 +3,7 @@ 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.dominion.tuis.dominion.DominionManage; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; diff --git a/src/main/java/cn/lunadeer/dominion/cuis/CreatePrivilege.java b/src/main/java/cn/lunadeer/dominion/cuis/MemberAdd.java similarity index 64% rename from src/main/java/cn/lunadeer/dominion/cuis/CreatePrivilege.java rename to src/main/java/cn/lunadeer/dominion/cuis/MemberAdd.java index 9b21d2c..f99a0e9 100644 --- a/src/main/java/cn/lunadeer/dominion/cuis/CreatePrivilege.java +++ b/src/main/java/cn/lunadeer/dominion/cuis/MemberAdd.java @@ -2,10 +2,10 @@ 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.controllers.MemberController; import cn.lunadeer.dominion.dtos.DominionDTO; -import cn.lunadeer.dominion.tuis.DominionPrivilegeList; -import cn.lunadeer.dominion.tuis.SelectPlayer; +import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberList; +import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectPlayer; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; @@ -16,13 +16,13 @@ import java.util.Objects; import static cn.lunadeer.dominion.commands.Apis.playerOnly; -public class CreatePrivilege { +public class MemberAdd { - private static class createPrivilegeCB implements CuiTextInput.InputCallback { + private static class memberAddCB implements CuiTextInput.InputCallback { private final Player sender; private final String dominionName; - public createPrivilegeCB(Player sender, String dominionName) { + public memberAddCB(Player sender, String dominionName) { this.sender = sender; this.dominionName = dominionName; } @@ -32,13 +32,13 @@ public class CreatePrivilege { 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}); + if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)) { + MemberList.show(sender, dominionName); } else { - SelectPlayer.show(sender, new String[]{"select_player_create_privilege", dominionName}); + SelectPlayer.show(sender, dominionName, 1); } }); - PrivilegeController.createPrivilege(operator, input, dominionName); + MemberController.memberAdd(operator, dominionName, input); } } @@ -50,9 +50,9 @@ public class CreatePrivilege { Notification.error(sender, "领地不存在"); return; } - CuiTextInput.InputCallback createPrivilegeCB = new createPrivilegeCB(player, dominion.getName()); + CuiTextInput.InputCallback createPrivilegeCB = new memberAddCB(player, dominion.getName()); CuiTextInput view = CuiTextInput.create(createPrivilegeCB).setText("Steve").title("输入玩家名称以添加为成员"); - view.setSuggestCommand("/dominion create_privilege <玩家名称> [领地名称]"); + view.setSuggestCommand("/dominion member add <领地名称> <玩家名称>"); 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 index ba5e95f..e82f567 100644 --- a/src/main/java/cn/lunadeer/dominion/cuis/RenameDominion.java +++ b/src/main/java/cn/lunadeer/dominion/cuis/RenameDominion.java @@ -2,7 +2,7 @@ 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.dominion.tuis.dominion.DominionManage; import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import org.bukkit.command.CommandSender; 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..f2a396c --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/cuis/RenameGroup.java @@ -0,0 +1,52 @@ +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.dominion.manage.group.GroupSetting; +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); + GroupSetting.show(sender, dominionName, input); + } + } + + 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 group rename <领地名称> <权限组旧名称> <新名称>"); + view.open(player); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/cuis/SetMapColor.java b/src/main/java/cn/lunadeer/dominion/cuis/SetMapColor.java index c177bc5..ff921d7 100644 --- a/src/main/java/cn/lunadeer/dominion/cuis/SetMapColor.java +++ b/src/main/java/cn/lunadeer/dominion/cuis/SetMapColor.java @@ -3,7 +3,7 @@ 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.dominion.tuis.dominion.DominionManage; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; diff --git a/src/main/java/cn/lunadeer/dominion/dtos/Flag.java b/src/main/java/cn/lunadeer/dominion/dtos/Flag.java index 974150b..3e5d1ae 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/Flag.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/Flag.java @@ -28,6 +28,7 @@ public enum Flag { CREEPER_EXPLODE("creeper_explode", "实体爆炸", "包含:苦力怕/凋零头颅/水晶爆炸", false, true, true), COMPARER("comparer", "比较器交互", "是否可以修改比较器状态", false, false, true), DOOR("door", "门交互", "是否可以使用各种材质的门(包括活板门)", false, false, true), + DRAGON_EGG("dragon_egg", "触碰龙蛋", "是否可以触碰龙蛋", false, false, true), DYE("dye", "染色", "是否可以使用染料(对羊、狗项圈、猫项圈)染色", false, false, true), EDIT_SIGN("edit_sign", "编辑告示牌", "是否可以编辑告示牌", false, false, true), EGG("egg", "扔鸡蛋", "是否可以扔鸡蛋", false, false, true), 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..8b4060d --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/dtos/GroupDTO.java @@ -0,0 +1,180 @@ +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("dominion_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; + Cache.instance.loadGroups(groups.get(0).getId()); + 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 dominion_group WHERE id = ?;"; + DatabaseManager.instance.query(sql, id); + Cache.instance.loadGroups(id); + List players = MemberDTO.selectByGroupId(id); + for (MemberDTO player : players) { + player.setGroupId(-1); + } + } + + public static GroupDTO select(Integer id) { + String sql = "SELECT * FROM dominion_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 dominion_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 dominion_group;"; + return getDTOFromRS(DatabaseManager.instance.query(sql)); + } + + public static List selectByDominionId(Integer domID) { + String sql = "SELECT * FROM dominion_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("dominion_group") + .where("id = ?", id.value); + try (ResultSet rs = updateRow.execute()) { + List groups = getDTOFromRS(rs); + if (groups.size() == 0) return null; + Cache.instance.loadGroups((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/MemberDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/MemberDTO.java new file mode 100644 index 0000000..6a0814f --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/dtos/MemberDTO.java @@ -0,0 +1,204 @@ +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.*; + +public class MemberDTO { + + private static List query(String sql, Object... params) { + List players = new ArrayList<>(); + try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { + return getDTOFromRS(rs); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, sql); + } + return players; + } + + private static List getDTOFromRS(ResultSet rs) { + List players = new ArrayList<>(); + if (rs == null) return players; + try { + while (rs.next()) { + Map flags = new HashMap<>(); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + flags.put(f, rs.getBoolean(f.getFlagName())); + } + MemberDTO player = new MemberDTO( + rs.getInt("id"), + UUID.fromString(rs.getString("player_uuid")), + rs.getBoolean("admin"), + rs.getInt("dom_id"), + flags, + rs.getInt("group_id") + ); + players.add(player); + } + } catch (Exception e) { + DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, ""); + } + return players; + } + + private MemberDTO doUpdate(UpdateRow updateRow) { + updateRow.returningAll(id) + .table("dominion_member") + .where("id = ?", id.value); + try (ResultSet rs = updateRow.execute()) { + List players = getDTOFromRS(rs); + if (players.size() == 0) return null; + Cache.instance.loadMembers(getPlayerUUID()); + return players.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, ""); + return null; + } + } + + public static MemberDTO insert(MemberDTO player) { + InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null)) + .table("dominion_member") + .field(player.playerUUID) + .field(player.admin) + .field(player.domID); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f))); + } + try (ResultSet rs = insertRow.execute()) { + Cache.instance.loadMembers(player.getPlayerUUID()); + List players = getDTOFromRS(rs); + if (players.size() == 0) return null; + return players.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("插入玩家权限失败: ", e, ""); + return null; + } + } + + public static MemberDTO select(UUID playerUUID, Integer dom_id) { + String sql = "SELECT * FROM dominion_member WHERE player_uuid = ? AND dom_id = ?;"; + List p = query(sql, playerUUID.toString(), dom_id); + if (p.size() == 0) return null; + return p.get(0); + } + + public static List select(Integer dom_id) { + String sql = "SELECT * FROM dominion_member WHERE dom_id = ?;"; + return query(sql, dom_id); + } + + public static void delete(UUID player, Integer domID) { + String sql = "DELETE FROM dominion_member WHERE player_uuid = ? AND dom_id = ?;"; + query(sql, player.toString(), domID); + Cache.instance.loadMembers(player); + } + + public static List selectAll() { + String sql = "SELECT * FROM dominion_member;"; + return query(sql); + } + + public static List selectAll(UUID player) { + String sql = "SELECT * FROM dominion_member WHERE player_uuid = ?;"; + return query(sql, player.toString()); + } + + public static List selectByGroupId(Integer groupId) { + String sql = "SELECT * FROM dominion_member WHERE group_id = ?;"; + return query(sql, groupId); + } + + public static List selectByDomGroupId(Integer domId, Integer groupId) { + String sql = "SELECT * FROM dominion_member WHERE group_id = ? AND dom_id = ?;"; + return query(sql, groupId, domId); + } + + 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 (Integer) id.value; + } + + public UUID getPlayerUUID() { + return UUID.fromString((String) playerUUID.value); + } + + public Boolean getAdmin() { + return (Boolean) admin.value; + } + + public Integer getDomID() { + return (Integer) domID.value; + } + + public Integer getGroupId() { + return (Integer) groupId.value; + } + + private final Map flags = new HashMap<>(); + + public Boolean getFlagValue(Flag flag) { + if (!flags.containsKey(flag)) return flag.getDefaultValue(); + return flags.get(flag); + } + + public MemberDTO 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 MemberDTO setAdmin(Boolean admin) { + this.admin.value = admin; + UpdateRow updateRow = new UpdateRow().field(this.admin); + return doUpdate(updateRow); + } + + public MemberDTO setGroupId(Integer groupId) { + this.groupId.value = groupId; + UpdateRow updateRow = new UpdateRow().field(this.groupId); + return doUpdate(updateRow); + } + + public MemberDTO applyTemplate(PrivilegeTemplateDTO template) { + this.admin.value = template.getAdmin(); + UpdateRow updateRow = new UpdateRow().field(admin); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + this.flags.put(f, template.getFlagValue(f)); + updateRow.field(new Field(f.getFlagName(), template.getFlagValue(f))); + } + return doUpdate(updateRow); + } + + private MemberDTO(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 MemberDTO(UUID playerUUID, DominionDTO dom) { + 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/dtos/PlayerDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java index a47c309..2daaf8f 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java @@ -4,8 +4,10 @@ import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.Field; import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import javax.annotation.Nullable; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; @@ -24,6 +26,17 @@ public class PlayerDTO { return re; } + public static @Nullable PlayerDTO get(OfflinePlayer player) { + if (player.getName() == null) { + return null; + } + PlayerDTO re = select(player.getUniqueId()); + if (re == null) { + re = insert(new PlayerDTO(player.getUniqueId(), player.getName(), System.currentTimeMillis())); + } + return re; + } + public static List all() { String sql = "SELECT * FROM player_name WHERE id > 0;"; return query(sql); diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java deleted file mode 100644 index 57d533c..0000000 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ /dev/null @@ -1,185 +0,0 @@ -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.syntax.InsertRow; -import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; - -import java.sql.ResultSet; -import java.util.*; - -public class PlayerPrivilegeDTO { - - private static List query(String sql, Object... params) { - List players = new ArrayList<>(); - try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { - return getDTOFromRS(rs); - } catch (Exception e) { - DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, sql); - } - return players; - } - - private static List getDTOFromRS(ResultSet rs) { - List players = new ArrayList<>(); - if (rs == null) return players; - try { - while (rs.next()) { - Map flags = new HashMap<>(); - for (Flag f : Flag.getPrivilegeFlagsEnabled()) { - flags.put(f, rs.getBoolean(f.getFlagName())); - } - PlayerPrivilegeDTO player = new PlayerPrivilegeDTO( - rs.getInt("id"), - UUID.fromString(rs.getString("player_uuid")), - rs.getBoolean("admin"), - rs.getInt("dom_id"), - flags - ); - players.add(player); - } - } catch (Exception e) { - DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, ""); - } - return players; - } - - 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); - return players.get(0); - } catch (Exception e) { - DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, ""); - return null; - } - } - - 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); - for (Flag f : Flag.getPrivilegeFlagsEnabled()) { - insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f))); - } - try (ResultSet rs = insertRow.execute()) { - Cache.instance.loadPlayerPrivileges(player.getPlayerUUID()); - List players = getDTOFromRS(rs); - if (players.size() == 0) return null; - return players.get(0); - } catch (Exception e) { - DatabaseManager.handleDatabaseError("插入玩家权限失败: ", e, ""); - return null; - } - } - - public static PlayerPrivilegeDTO select(UUID playerUUID, Integer dom_id) { - String sql = "SELECT * FROM player_privilege WHERE player_uuid = ? AND dom_id = ?;"; - List p = query(sql, playerUUID.toString(), dom_id); - if (p.size() == 0) return null; - return p.get(0); - } - - public static List select(Integer dom_id) { - String sql = "SELECT * FROM player_privilege WHERE dom_id = ?;"; - return query(sql, dom_id); - } - - public static void delete(UUID player, Integer domID) { - String sql = "DELETE FROM player_privilege WHERE player_uuid = ? AND dom_id = ?;"; - query(sql, player.toString(), domID); - Cache.instance.loadPlayerPrivileges(player); - } - - public static List selectAll() { - String sql = "SELECT * FROM player_privilege;"; - return query(sql); - } - - public static List selectAll(UUID player) { - String sql = "SELECT * FROM player_privilege WHERE player_uuid = ?;"; - return query(sql, player.toString()); - } - - private final Integer id; - private final UUID playerUUID; - private Boolean admin; - private final Integer domID; - - public Integer getId() { - return id; - } - - public UUID getPlayerUUID() { - return playerUUID; - } - - public Boolean getAdmin() { - return admin; - } - - public Integer getDomID() { - return domID; - } - - private final Map flags = new HashMap<>(); - - public Boolean getFlagValue(Flag flag) { - if (!flags.containsKey(flag)) return flag.getDefaultValue(); - return flags.get(flag); - } - - public PlayerPrivilegeDTO 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 PlayerPrivilegeDTO setAdmin(Boolean admin) { - this.admin = admin; - Field f = new Field("admin", admin); - UpdateRow updateRow = new UpdateRow().field(f); - return doUpdate(updateRow); - } - - public PlayerPrivilegeDTO applyTemplate(PrivilegeTemplateDTO template) { - this.admin = template.getAdmin(); - UpdateRow updateRow = new UpdateRow().field(new Field("admin", admin)); - for (Flag f : Flag.getPrivilegeFlagsEnabled()) { - this.flags.put(f, template.getFlagValue(f)); - updateRow.field(new Field(f.getFlagName(), template.getFlagValue(f))); - } - 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; - this.flags.putAll(flags); - } - - public PlayerPrivilegeDTO(UUID playerUUID, DominionDTO dom) { - this.id = null; - this.playerUUID = playerUUID; - this.admin = false; - this.domID = 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..35bbcc9 100644 --- a/src/main/java/cn/lunadeer/dominion/events/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/events/Apis.java @@ -4,7 +4,8 @@ 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.PlayerPrivilegeDTO; +import cn.lunadeer.dominion.dtos.GroupDTO; +import cn.lunadeer.dominion.dtos.MemberDTO; import cn.lunadeer.minecraftpluginutils.Notification; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; @@ -16,7 +17,7 @@ import org.bukkit.event.Cancellable; import org.bukkit.inventory.Inventory; public class Apis { - public static boolean canByPass(Player player, DominionDTO dom, PlayerPrivilegeDTO prev) { + public static boolean canByPass(Player player, DominionDTO dom, MemberDTO prev) { if (player.isOp() && Dominion.config.getLimitOpBypass()) { return true; } @@ -47,13 +48,23 @@ public class Apis { if (dom == null) { return true; } - PlayerPrivilegeDTO prev = Cache.instance.getPlayerPrivilege(player, dom); + MemberDTO prev = Cache.instance.getMember(player, dom); if (canByPass(player, dom, prev)) { 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/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index 351b884..3d21d3d 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -313,6 +313,20 @@ public class PlayerEvents implements Listener { checkFlag(dom, Flag.DOOR, player, event); } + @EventHandler(priority = EventPriority.HIGHEST) // dragon_egg + public void touchDragonEdd(PlayerInteractEvent event) { + Block block = event.getClickedBlock(); + if (block == null) { + return; + } + if (block.getType() != Material.DRAGON_EGG) { + return; + } + Player player = event.getPlayer(); + DominionDTO dom = Cache.instance.getDominion(block.getLocation()); + checkFlag(dom, Flag.DRAGON_EGG, player, event); + } + @EventHandler(priority = EventPriority.HIGHEST) // dye public void dyeEvent(PlayerInteractEntityEvent event) { Player player = event.getPlayer(); diff --git a/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java b/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java index 42e3c15..a7a87bc 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java +++ b/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java @@ -83,6 +83,7 @@ public class ConfigManager { _economy_only_xz = _file.getBoolean("Economy.OnlyXZ", false); _economy_refund = (float) _file.getDouble("Economy.Refund", 0.85); _fly_permission_nodes = _file.getStringList("FlyPermissionNodes"); + _residence_migration = _file.getBoolean("ResidenceMigration", false); saveAll(); // 回写文件 防止文件中的数据不完整 Flag.loadFromJson(); } @@ -111,6 +112,7 @@ public class ConfigManager { _file.set("Economy.OnlyXZ", _economy_only_xz); _file.set("Economy.Refund", _economy_refund); _file.set("FlyPermissionNodes", _fly_permission_nodes); + _file.set("ResidenceMigration", _residence_migration); _plugin.saveConfig(); } @@ -388,6 +390,16 @@ public class ConfigManager { _plugin.saveConfig(); } + public Boolean getResidenceMigration() { + return _residence_migration; + } + + public void setResidenceMigration(Boolean residence_migration) { + _residence_migration = residence_migration; + _file.set("ResidenceMigration", residence_migration); + _plugin.saveConfig(); + } + private final Dominion _plugin; private FileConfiguration _file; private Boolean _debug; @@ -426,4 +438,5 @@ public class ConfigManager { private Boolean _economy_only_xz; private Float _economy_refund; private List _fly_permission_nodes; + private Boolean _residence_migration; } diff --git a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java index 5a46ae9..ca71a4f 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java @@ -6,10 +6,13 @@ import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.Field; import cn.lunadeer.minecraftpluginutils.databse.FieldType; import cn.lunadeer.minecraftpluginutils.databse.TableColumn; +import cn.lunadeer.minecraftpluginutils.databse.*; import cn.lunadeer.minecraftpluginutils.databse.syntax.AddColumn; import cn.lunadeer.minecraftpluginutils.databse.syntax.CreateTable; import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; +import java.sql.ResultSet; + public class DatabaseTables { public static void migrate() { // player name @@ -60,23 +63,35 @@ public class DatabaseTables { .foreignKey(dominion_parent_dom_id_fk); dominion.execute(); + for (Flag flag : Flag.getAllDominionFlags()) { + TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); + new AddColumn(column).table("dominion").ifNotExists().execute(); + } + // player privilege - TableColumn player_privilege_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); - TableColumn player_privilege_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, "''"); - TableColumn player_privilege_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1); - TableColumn player_privilege_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); - CreateTable.ForeignKey player_privilege_player_uuid_fk = new CreateTable.ForeignKey(player_privilege_player_uuid, "player_name", player_name_uuid, true); - CreateTable.ForeignKey player_privilege_dom_id_fk = new CreateTable.ForeignKey(player_privilege_dom_id, "dominion", dominion_id, true); - CreateTable player_privilege = new CreateTable().ifNotExists(); - player_privilege.table("player_privilege") - .field(player_privilege_id) - .field(player_privilege_player_uuid) - .field(player_privilege_dom_id) - .field(player_privilege_admin) - .foreignKey(player_privilege_player_uuid_fk) - .foreignKey(player_privilege_dom_id_fk) - .unique(player_privilege_player_uuid, player_privilege_dom_id); - player_privilege.execute(); + if (!Common.IsTableExist("dominion_member")) { + TableColumn player_privilege_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn player_privilege_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, "''"); + TableColumn player_privilege_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1); + TableColumn player_privilege_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); + CreateTable.ForeignKey player_privilege_player_uuid_fk = new CreateTable.ForeignKey(player_privilege_player_uuid, "player_name", player_name_uuid, true); + CreateTable.ForeignKey player_privilege_dom_id_fk = new CreateTable.ForeignKey(player_privilege_dom_id, "dominion", dominion_id, true); + CreateTable player_privilege = new CreateTable().ifNotExists(); + player_privilege.table("player_privilege") + .field(player_privilege_id) + .field(player_privilege_player_uuid) + .field(player_privilege_dom_id) + .field(player_privilege_admin) + .foreignKey(player_privilege_player_uuid_fk) + .foreignKey(player_privilege_dom_id_fk) + .unique(player_privilege_player_uuid, player_privilege_dom_id); + player_privilege.execute(); + + for (Flag flag : Flag.getAllPrivilegeFlags()) { + TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); + new AddColumn(column).table("player_privilege").ifNotExists().execute(); + } + } // server root player name Field server_player_name_id_field = new Field("id", -1); @@ -118,21 +133,11 @@ public class DatabaseTables { .field(server_dom_leave_message_field); insert_server_dom.execute(); - for (Flag flag : Flag.getAllDominionFlags()) { - TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); - new AddColumn(column).table("dominion").ifNotExists().execute(); - } - - for (Flag flag : Flag.getAllPrivilegeFlags()) { - TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); - new AddColumn(column).table("player_privilege").ifNotExists().execute(); - } - - // 1.18.0 + // 1.18.0 dominion add tp_location TableColumn dominion_tp_location = new TableColumn("tp_location", FieldType.STRING, false, false, true, false, "'default'"); new AddColumn(dominion_tp_location).table("dominion").ifNotExists().execute(); - // 1.31.0 + // 1.31.0 add privilege_template TableColumn privilege_template_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); TableColumn privilege_template_creator = new TableColumn("creator", FieldType.STRING, false, false, true, false, "''"); TableColumn privilege_template_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'"); @@ -154,10 +159,84 @@ public class DatabaseTables { new AddColumn(column).table("privilege_template").ifNotExists().execute(); } - // 1.31.6 + // 1.31.6 dominion add blue-map tile color TableColumn dominion_color = new TableColumn("color", FieldType.STRING, false, false, true, false, "'#00BFFF'"); new AddColumn(dominion_color).table("dominion").ifNotExists().execute(); + // 1.34.0 add dominion_group + if (!Common.IsTableExist("dominion_member")) { + 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 dominion_group_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn dominion_group_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1); + TableColumn dominion_group_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'"); + TableColumn dominion_group_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); + CreateTable.ForeignKey group_dom_id_fk = new CreateTable.ForeignKey(dominion_group_dom_id, "dominion", dominion_id, true); + CreateTable group = new CreateTable().ifNotExists(); + group.table("dominion_group") + .field(dominion_group_id) + .field(dominion_group_dom_id) + .field(dominion_group_name) + .field(dominion_group_admin) + .foreignKey(group_dom_id_fk) + .unique(dominion_group_dom_id, dominion_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("dominion_group").ifNotExists().execute(); + } + + // 1.35.0 migrate player_privilege -> dominion_member + TableColumn dominion_member_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn dominion_member_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, "''"); + TableColumn dominion_member_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1); + TableColumn dominion_member_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); + TableColumn dominion_member_group_id = new TableColumn("group_id", FieldType.INT, false, false, true, false, -1); + CreateTable.ForeignKey dominion_member_player_uuid_fk = new CreateTable.ForeignKey(dominion_member_player_uuid, "player_name", player_name_uuid, true); + CreateTable.ForeignKey dominion_member_dom_id_fk = new CreateTable.ForeignKey(dominion_member_dom_id, "dominion", dominion_id, true); + CreateTable dominion_member = new CreateTable().ifNotExists(); + dominion_member.table("dominion_member") + .field(dominion_member_id) + .field(dominion_member_player_uuid) + .field(dominion_member_dom_id) + .field(dominion_member_admin) + .field(dominion_member_group_id) + .foreignKey(dominion_member_player_uuid_fk) + .foreignKey(dominion_member_dom_id_fk) + .unique(dominion_member_player_uuid, dominion_member_dom_id); + dominion_member.execute(); + for (Flag flag : Flag.getAllPrivilegeFlags()) { + TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); + new AddColumn(column).table("dominion_member").ifNotExists().execute(); + } + if (Common.IsTableExist("player_privilege")) { + // migrate from player_privilege to dominion_member + String sql = "SELECT * FROM player_privilege;"; + try (ResultSet rs = DatabaseManager.instance.query(sql)) { + while (rs.next()) { + String player_uuid = rs.getString("player_uuid"); + int dom_id = rs.getInt("dom_id"); + boolean admin = rs.getBoolean("admin"); + int group_id = rs.getInt("group_id"); + InsertRow insert = new InsertRow().table("dominion_member") + .field(new Field("player_uuid", player_uuid)) + .field(new Field("dom_id", dom_id)) + .field(new Field("group_id", group_id)) + .field(new Field("admin", admin)); + for (Flag flag : Flag.getAllPrivilegeFlags()) { + insert.field(new Field(flag.getFlagName(), rs.getBoolean(flag.getFlagName()))); + } + insert.execute(); + } + sql = "DROP TABLE player_privilege;"; + DatabaseManager.instance.query(sql); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("迁移 player_privilege 到 dominion_member 失败", e, sql); + } + } + // global teleport TableColumn server_info_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); TableColumn server_info_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'server'"); diff --git a/src/main/java/cn/lunadeer/dominion/tuis/AllDominion.java b/src/main/java/cn/lunadeer/dominion/tuis/AllDominion.java index 187e025..137cf9f 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/AllDominion.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/AllDominion.java @@ -13,7 +13,7 @@ import java.util.List; import static cn.lunadeer.dominion.commands.Apis.playerOnly; import static cn.lunadeer.dominion.tuis.Apis.getPage; import static cn.lunadeer.dominion.tuis.Apis.notOp; -import static cn.lunadeer.dominion.tuis.ListDominion.BuildTreeLines; +import static cn.lunadeer.dominion.tuis.dominion.DominionList.BuildTreeLines; public class AllDominion { @@ -21,7 +21,7 @@ public class AllDominion { Player player = playerOnly(sender); if (player == null) return; if (notOp(player)) return; - int page = getPage(args); + int page = getPage(args, 1); List allDominions = Cache.instance.getAllDominionTree(); diff --git a/src/main/java/cn/lunadeer/dominion/tuis/Apis.java b/src/main/java/cn/lunadeer/dominion/tuis/Apis.java index 5befc90..77f028a 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/Apis.java @@ -2,7 +2,7 @@ package cn.lunadeer.dominion.tuis; import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.dtos.DominionDTO; -import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; +import cn.lunadeer.dominion.dtos.MemberDTO; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.components.Button; @@ -14,11 +14,11 @@ import static cn.lunadeer.dominion.commands.Apis.playerOnly; public class Apis { - public static int getPage(String[] args) { + public static int getPage(String[] args, int pos) { int page = 1; - if (args.length == 2) { + if (args.length > pos) { try { - page = Integer.parseInt(args[1]); + page = Integer.parseInt(args[pos]); } catch (Exception e) { return 1; } @@ -42,26 +42,10 @@ public class Apis { } } - /** - * 尝试从 arg[2] 获取领地名称 - * 如果没有此参数则会尝试获取玩家当前所在位置 - * - * @param player 玩家 - * @param args 参数 - * @return 领地信息 - */ - public static DominionDTO getDominionNameArg_2(Player player, String[] args) { - if (args.length >= 3) { - return DominionDTO.select(args[2]); - } else { - return Cache.instance.getPlayerCurrentDominion(player); - } - } - public static boolean noAuthToManage(Player player, DominionDTO dominion) { if (player.isOp()) return false; if (!dominion.getOwner().equals(player.getUniqueId())) { - PlayerPrivilegeDTO privileges = PlayerPrivilegeDTO.select(player.getUniqueId(), dominion.getId()); + MemberDTO privileges = MemberDTO.select(player.getUniqueId(), dominion.getId()); if (privileges == null || !privileges.getAdmin()) { Notification.error(player, "你不是领地 %s 的拥有者或管理员,无权访问此页面", dominion.getName()); return true; @@ -81,11 +65,11 @@ public class Apis { public static void printHelp(CommandSender sender, String[] args) { Player player = playerOnly(sender); if (player == null) return; - int page = getPage(args); + int page = getPage(args, 1); ListView view = ListView.create(10, "/dominion help"); view.title("领地插件命令帮助 <>表示必填参数 []表示可选参数") - .add(Line.create().append("打开交互菜单").append(Button.create("/dominion menu").setExecuteCommand("/dominion menu").build())) - .add(Line.create().append("查看帮助").append(Button.create("/dominion help [页码]").setExecuteCommand("/dominion help 1").build())) + .add(Line.create().append("打开交互菜单").append("/dominion menu")) + .add(Line.create().append("查看帮助").append("/dominion help [页码]")) .add(Line.create().append("创建领地").append("/dominion create <领地名称>")) .add(Line.create().append("自动创建领地").append("/dominion auto_create <领地名称>")) .add(Line.create().append("创建子领地").append("/dominion create_sub <子领地名称> [父领地名称]")) @@ -104,18 +88,6 @@ public class Apis { .add(Line.create().append("---[管理员指令]---")) .add(Line.create().append("刷新缓存").append(Button.create("/dominion reload_cache").setExecuteCommand("/dominion reload_cache").build())) .add(Line.create().append("重载配置").append(Button.create("/dominion reload_config").setExecuteCommand("/dominion reload_config").build())) - // 以下指令主要被用于 ui 触发 - .add(Line.create().append("---[以下主要用于UI触发]---")) - .add(Line.create().append("列出所有领地").append(Button.create("/dominion list [页码]").setExecuteCommand("/dominion list").build())) - .add(Line.create().append("查看领地信息").append(Button.create("/dominion info [领地名称]").setExecuteCommand("/dominion info").build())) - .add(Line.create().append("查看领地权限信息").append(Button.create("/dominion flag_info <领地名称> [页码]").setExecuteCommand("/dominion flag_info").build())) - .add(Line.create().append("设置领地权限").append("/dominion set <权限名称> [领地名称]")) - .add(Line.create().append("创建玩家特权").append("/dominion create_privilege <玩家名称> [领地名称]")) - .add(Line.create().append("设置玩家特权").append("/dominion set_privilege <玩家名称> <权限名称> [领地名称]")) - .add(Line.create().append("重置玩家特权").append("/dominion clear_privilege <玩家名称> [领地名称]")) - .add(Line.create().append("查看领地玩家特权列表").append("/dominion privilege_list [领地名称] [页码]")) - .add(Line.create().append("查看玩家特权信息").append("/dominion privilege_info <玩家名称> [领地名称] [页码]")) - .add(Line.create().append("系统配置").append(Button.create("/dominion config [页码]").setExecuteCommand("/dominion config").build())) .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 deleted file mode 100644 index fc93b9e..0000000 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionPrivilegeList.java +++ /dev/null @@ -1,91 +0,0 @@ -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.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 net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.format.Style; -import net.kyori.adventure.text.format.TextColor; -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 DominionPrivilegeList { - - public static void show(CommandSender sender, String[] args) { - int page = 1; - if (args.length == 3) { - try { - page = Integer.parseInt(args[2]); - } catch (Exception ignored) { - } - } - Player player = playerOnly(sender); - if (player == null) return; - DominionDTO dominion = getDominionNameArg_1(player, args); - if (dominion == null) { - Notification.error(sender, "你不在任何领地内,请指定领地名称 /dominion privilege_list <领地名称>"); - return; - } - ListView view = ListView.create(10, "/dominion privilege_list " + dominion.getName()); - if (noAuthToManage(player, dominion)) return; - List privileges = PlayerPrivilegeDTO.select(dominion.getId()); - view.title("领地 " + dominion.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("成员列表") - ); - view.add(Line.create().append(Button.create("添加成员").setExecuteCommand("/dominion select_player_create_privilege " + dominion.getName()).build())); - for (PlayerPrivilegeDTO privilege : privileges) { - PlayerDTO p_player = PlayerDTO.select(privilege.getPlayerUUID()); - if (p_player == null) continue; - Line line = Line.create(); - - if (privilege.getAdmin()) { - line.append(adminTag); - } else { - if (!privilege.getFlagValue(Flag.MOVE)) { - line.append(banTag); - } else { - line.append(normalTag); - } - } - - line.append(Button.createGreen("权限") - .setHoverText("配置成员权限") - .setExecuteCommand("/dominion privilege_info " + p_player.getLastKnownName() + " " + dominion.getName()).build()); - if ((!player.getName().equals(p_player.getLastKnownName()) && !privilege.getAdmin()) || dominion.getOwner().equals(player.getUniqueId())) { - line.append(Button.createRed("移除") - .setHoverText("将此成员移出(变为访客)") - .setExecuteCommand("/dominion clear_privilege " + p_player.getLastKnownName() + " " + dominion.getName() + " b").build()); - line.append(Button.createGreen("模板") - .setHoverText("套用权限模板") - .setExecuteCommand("/dominion select_template " + p_player.getLastKnownName() + " " + dominion.getName() + " " + page).build()); - } - line.append(p_player.getLastKnownName()); - view.add(line); - } - view.showOn(player, page); - } - - private static final TextComponent adminTag = Component.text("[A]", Style.style(TextColor.color(97, 97, 210))) - .hoverEvent(Component.text("这是一个管理员")); - private static final TextComponent normalTag = Component.text("[N]", Style.style(TextColor.color(255, 255, 255))) - .hoverEvent(Component.text("这是一个普通成员")); - private static final TextComponent banTag = Component.text("[B]", Style.style(TextColor.color(255, 67, 0))) - .hoverEvent(Component.text("这是一个黑名单成员")); -} diff --git a/src/main/java/cn/lunadeer/dominion/tuis/Menu.java b/src/main/java/cn/lunadeer/dominion/tuis/Menu.java index 014a4a6..5499939 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/Menu.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/Menu.java @@ -1,5 +1,6 @@ package cn.lunadeer.dominion.tuis; +import cn.lunadeer.dominion.Dominion; import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ViewStyles; import cn.lunadeer.minecraftpluginutils.stui.components.Button; @@ -30,7 +31,7 @@ public class Menu { .append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append("查看我的领地"); Line template = Line.create() - .append(Button.create("模板列表").setExecuteCommand("/dominion template_list").build()) + .append(Button.create("模板列表").setExecuteCommand("/dominion template list").build()) .append("成员权限模板列表"); Line help = Line.create() .append(Button.create("指令帮助").setExecuteCommand("/dominion help").build()) @@ -38,6 +39,9 @@ public class Menu { Line link = Line.create() .append(Button.create("使用文档").setOpenURL("https://ssl.lunadeer.cn:14448/doc/23/").build()) .append("在浏览器中打开使用文档"); + Line migrate = Line.create() + .append(Button.create("迁移数据").setExecuteCommand("/dominion migrate_list").build()) + .append("把你的领地从Residence迁移到Dominion"); Line all = Line.create() .append(Button.create("所有领地").setExecuteCommand("/dominion all_dominion").build()) .append("查看所有领地"); @@ -58,6 +62,9 @@ public class Menu { .add(template) .add(help) .add(link); + if (Dominion.config.getResidenceMigration()) { + view.add(migrate); + } if (player.isOp()) { view.add(Line.create().append("")); view.add(Line.create().append(Component.text("--- 以下选项仅OP可见 ---", ViewStyles.main_color))); diff --git a/src/main/java/cn/lunadeer/dominion/tuis/MigrateList.java b/src/main/java/cn/lunadeer/dominion/tuis/MigrateList.java new file mode 100644 index 0000000..475f2b7 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/MigrateList.java @@ -0,0 +1,75 @@ +package cn.lunadeer.dominion.tuis; + +import cn.lunadeer.dominion.Cache; +import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.dominion.utils.ResMigration; +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 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; + +import java.util.ArrayList; +import java.util.List; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class MigrateList { + + public static void show(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + + if (!Dominion.config.getResidenceMigration()) { + Notification.error(sender, "Residence 迁移功能没有开启"); + return; + } + + int page = Apis.getPage(args, 1); + + ListView view = ListView.create(10, "/dominion migrate_list"); + + view.title("从 Residence 迁移数据"); + view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("Res数据")); + + List res_data = Cache.instance.getResidenceData(player.getUniqueId()); + + if (res_data == null) { + view.add(Line.create().append("你没有可迁移的数据")); + } else { + view.addLines(BuildTreeLines(res_data, 0, page)); + } + + view.showOn(player, page); + } + + public static List BuildTreeLines(List dominionTree, Integer depth, int page) { + List lines = new ArrayList<>(); + StringBuilder prefix = new StringBuilder(); + for (int i = 0; i < depth; i++) { + prefix.append(" | "); + } + for (ResMigration.ResidenceNode node : dominionTree) { + TextComponent migrate = Button.create("迁移").setExecuteCommand("/dominion migrate " + node.name + " " + page).build(); + Line line = Line.create(); + if (depth == 0) { + line.append(migrate); + } else { + line.append(Component.text("[迁移]", + Style.style(TextColor.color(190, 190, 190), + TextDecoration.STRIKETHROUGH)) + .hoverEvent(Component.text("子领地无法手动迁移,会随父领地自动迁移"))); + } + line.append(prefix + node.name); + lines.add(line); + lines.addAll(BuildTreeLines(node.children, depth + 1, page)); + } + return lines; + } +} diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionConfig.java b/src/main/java/cn/lunadeer/dominion/tuis/SysConfig.java similarity index 92% rename from src/main/java/cn/lunadeer/dominion/tuis/DominionConfig.java rename to src/main/java/cn/lunadeer/dominion/tuis/SysConfig.java index c47547f..0059fc8 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionConfig.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/SysConfig.java @@ -15,13 +15,13 @@ import static cn.lunadeer.dominion.commands.Apis.playerOnly; import static cn.lunadeer.dominion.tuis.Apis.getPage; import static cn.lunadeer.dominion.tuis.Apis.notOp; -public class DominionConfig { +public class SysConfig { public static void show(CommandSender sender, String[] args) { Player player = playerOnly(sender); if (player == null) return; if (notOp(player)) return; - int page = getPage(args); - ListView view = ListView.create(10, "/dominion config"); + int page = getPage(args, 1); + ListView view = ListView.create(10, "/dominion sys_config"); view.title("系统配置"); view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("系统配置")); @@ -151,6 +151,15 @@ public class DominionConfig { .append(NumChanger.create(Dominion.config.getEconomyRefund(), "/dominion set_config economy_refund", 0.01).setPageNumber(page).build()); view.add(refund); } + if (Dominion.config.getResidenceMigration()) { + view.add(Line.create() + .append("是否允许从Residence迁移数据") + .append(Button.createGreen("☑").setExecuteCommand("/dominion set_config residence_migration false " + page).build())); + } else { + view.add(Line.create() + .append("是否允许从Residence迁移数据") + .append(Button.createRed("☐").setExecuteCommand("/dominion set_config residence_migration true " + page).build())); + } view.showOn(player, page); } } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/ListDominion.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/DominionList.java similarity index 97% rename from src/main/java/cn/lunadeer/dominion/tuis/ListDominion.java rename to src/main/java/cn/lunadeer/dominion/tuis/dominion/DominionList.java index 79662e4..499b949 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/ListDominion.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/DominionList.java @@ -1,4 +1,4 @@ -package cn.lunadeer.dominion.tuis; +package cn.lunadeer.dominion.tuis.dominion; import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.DominionNode; @@ -21,11 +21,11 @@ import static cn.lunadeer.dominion.commands.Apis.playerOnly; import static cn.lunadeer.dominion.commands.Helper.playerAdminDominions; import static cn.lunadeer.dominion.tuis.Apis.getPage; -public class ListDominion { +public class DominionList { public static void show(CommandSender sender, String[] args) { Player player = playerOnly(sender); if (player == null) return; - int page = getPage(args); + int page = getPage(args, 1); ListView view = ListView.create(10, "/dominion list"); view.title("我的领地列表"); diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/DominionManage.java similarity index 85% rename from src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java rename to src/main/java/cn/lunadeer/dominion/tuis/dominion/DominionManage.java index 92d62b8..807144d 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/DominionManage.java @@ -1,4 +1,4 @@ -package cn.lunadeer.dominion.tuis; +package cn.lunadeer.dominion.tuis.dominion; import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.dtos.DominionDTO; @@ -12,8 +12,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_1; -import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage; +import static cn.lunadeer.dominion.tuis.Apis.*; public class DominionManage { public static void show(CommandSender sender, String[] args) { @@ -25,18 +24,22 @@ public class DominionManage { return; } if (noAuthToManage(player, dominion)) return; + int page = getPage(args, 2); Line size_info = Line.create() .append(Button.create("详细信息").setExecuteCommand("/dominion info " + dominion.getName()).build()) .append("查看领地详细信息"); Line env_info = Line.create() - .append(Button.create("环境设置").setExecuteCommand("/dominion env_info " + dominion.getName()).build()) + .append(Button.create("环境设置").setExecuteCommand("/dominion env_setting " + dominion.getName()).build()) .append("设置领地内的一些非玩家相关效果"); Line flag_info = Line.create() - .append(Button.create("访客权限").setExecuteCommand("/dominion flag_info " + dominion.getName()).build()) + .append(Button.create("访客权限").setExecuteCommand("/dominion guest_setting " + dominion.getName()).build()) .append("访客在此领地的权限"); Line privilege_list = Line.create() - .append(Button.create("成员权限").setExecuteCommand("/dominion privilege_list " + dominion.getName()).build()) + .append(Button.create("成员管理").setExecuteCommand("/dominion member 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 +67,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 +75,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/DominionEnvInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/EnvSetting.java similarity index 84% rename from src/main/java/cn/lunadeer/dominion/tuis/DominionEnvInfo.java rename to src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/EnvSetting.java index 50c909e..17516aa 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionEnvInfo.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/EnvSetting.java @@ -1,4 +1,4 @@ -package cn.lunadeer.dominion.tuis; +package cn.lunadeer.dominion.tuis.dominion.manage; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.Flag; @@ -11,29 +11,24 @@ 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 DominionEnvInfo { +public class EnvSetting { public static void show(CommandSender sender, String[] args) { - Player player = playerOnly(sender); - if (player == null) return; if (args.length < 2) { - Notification.error(sender, "用法: /dominion env_info <领地名称> [页码]"); + Notification.error(sender, "用法: /dominion env_setting <领地名称> [页码]"); 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; } - int page = 1; - if (args.length == 3) { - try { - page = Integer.parseInt(args[2]); - } catch (Exception ignored) { - } - } - ListView view = ListView.create(10, "/dominion env_info " + dominion.getName()); + int page = getPage(args, 2); + ListView view = ListView.create(10, "/dominion env_setting " + dominion.getName()); view.title("领地 " + dominion.getName() + " 环境设置") .navigator(Line.create() .append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/GuestSetting.java similarity index 84% rename from src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java rename to src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/GuestSetting.java index 4a9eb91..f825d1a 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/GuestSetting.java @@ -1,4 +1,4 @@ -package cn.lunadeer.dominion.tuis; +package cn.lunadeer.dominion.tuis.dominion.manage; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.Flag; @@ -11,29 +11,24 @@ 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 DominionFlagInfo { +public class GuestSetting { public static void show(CommandSender sender, String[] args) { - Player player = playerOnly(sender); - if (player == null) return; if (args.length < 2) { - Notification.error(sender, "用法: /dominion flag_info <领地名称> [页码]"); + Notification.error(sender, "用法: /dominion guest_setting <领地名称> [页码]"); 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; } - int page = 1; - if (args.length == 3) { - try { - page = Integer.parseInt(args[2]); - } catch (Exception ignored) { - } - } - ListView view = ListView.create(10, "/dominion flag_info " + dominion.getName()); + int page = getPage(args, 2); + ListView view = ListView.create(10, "/dominion guest_setting " + dominion.getName()); view.title("领地 " + dominion.getName() + " 访客权限") .navigator(Line.create() .append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionSizeInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/SizeInfo.java similarity index 93% rename from src/main/java/cn/lunadeer/dominion/tuis/DominionSizeInfo.java rename to src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/SizeInfo.java index 86878ad..3d28b2a 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionSizeInfo.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/SizeInfo.java @@ -1,4 +1,4 @@ -package cn.lunadeer.dominion.tuis; +package cn.lunadeer.dominion.tuis.dominion.manage; import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.controllers.PlayerController; @@ -15,7 +15,7 @@ import org.bukkit.entity.Player; import static cn.lunadeer.dominion.commands.Apis.playerOnly; import static cn.lunadeer.dominion.tuis.Apis.getDominionNameArg_1; -public class DominionSizeInfo { +public class SizeInfo { public static void show(CommandSender sender, String[] args) { Player player = playerOnly(sender); if (player == null) return; @@ -47,7 +47,7 @@ public class DominionSizeInfo { )) .actionBar(Line.create() .append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) - .append(Button.create("权限列表").setExecuteCommand("/dominion flag_info " + dominion.getName()).build())) + .append(Button.create("访客权限").setExecuteCommand("/dominion guest_setting " + dominion.getName()).build())) .showOn(player); ParticleRender.showBoxFace(Dominion.instance, player, dominion.getLocation1(), diff --git a/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/group/GroupList.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/group/GroupList.java new file mode 100644 index 0000000..99047bb --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/group/GroupList.java @@ -0,0 +1,93 @@ +package cn.lunadeer.dominion.tuis.dominion.manage.group; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.GroupDTO; +import cn.lunadeer.dominion.dtos.MemberDTO; +import cn.lunadeer.dominion.dtos.PlayerDTO; +import cn.lunadeer.dominion.tuis.Apis; +import cn.lunadeer.minecraftpluginutils.Notification; +import cn.lunadeer.minecraftpluginutils.XLogger; +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.noAuthToManage; + +public class GroupList { + + public static void show(CommandSender sender, String dominionName) { + show(sender, new String[]{"", "", dominionName}); + } + + public static void show(CommandSender sender, String dominionName, int page) { + show(sender, new String[]{"", "", dominionName, String.valueOf(page)}); + } + + public static void show(CommandSender sender, String[] args) { + if (args.length < 3) { + Notification.error(sender, "用法: /dominion group list <领地名称> [页码]"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = DominionDTO.select(args[2]); + if (dominion == null) { + Notification.error(sender, "领地 %s 不存在", args[2]); + return; + } + if (noAuthToManage(player, dominion)) return; + int page = Apis.getPage(args, 3); + 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 group delete " + dominion.getName() + " " + group.getName()); + Button edit = Button.create("编辑") + .setHoverText("编辑权限组 " + group.getName()) + .setExecuteCommand("/dominion group setting " + dominion.getName() + " " + group.getName()); + Button add = Button.createGreen("+") + .setHoverText("添加成员到权限组 " + group.getName()) + .setExecuteCommand("/dominion group select_member " + dominion.getName() + " " + group.getName() + " " + page); + line.append(del.build()).append(edit.build()).append(group.getName()).append(add.build()); + view.add(line); + List players = MemberDTO.selectByGroupId(group.getId()); + XLogger.debug("players: " + players.size()); + for (MemberDTO 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().setDivider(""); + playerLine.append(Component.text(" ")); + playerLine.append(remove.build()).append(" | " + p.getLastKnownName()); + view.add(playerLine); + } + view.add(new Line().append("")); + } + view.showOn(player, page); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/group/GroupSetting.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/group/GroupSetting.java new file mode 100644 index 0000000..c0fdd2e --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/group/GroupSetting.java @@ -0,0 +1,101 @@ +package cn.lunadeer.dominion.tuis.dominion.manage.group; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.Flag; +import cn.lunadeer.dominion.dtos.GroupDTO; +import cn.lunadeer.dominion.tuis.Apis; +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 GroupSetting { + public static void show(CommandSender sender, String dominionName, String groupName) { + show(sender, new String[]{"", "", dominionName, groupName}); + } + + public static void show(CommandSender sender, String dominionName, String groupName, Integer page) { + show(sender, new String[]{"", "", dominionName, groupName, page.toString()}); + } + + public static void show(CommandSender sender, String[] args) { + if (args.length < 4) { + Notification.error(sender, "用法: /dominion group setting <领地名称> <权限组名称> [页码]"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = DominionDTO.select(args[2]); + if (dominion == null) { + Notification.error(sender, "领地 %s 不存在", args[2]); + return; + } + if (noAuthToManage(player, dominion)) return; + int page = Apis.getPage(args, 4); + GroupDTO group = GroupDTO.select(dominion.getId(), args[3]); + if (group == null) { + Notification.error(sender, "权限组 %s 不存在", args[3]); + return; + } + + ListView view = ListView.create(10, "/dominion group setting " + 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()) + .append("权限组管理") + ); + 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(parseCommand(dominion.getName(), group.getName(), "admin", false, page)) + .build()) + .append("管理员")); + view.add(createOption(Flag.GLOW, group.getFlagValue(Flag.GLOW), dominion.getName(), group.getName(), page)); + } else { + view.add(Line.create() + .append(Button.createRed("☐") + .setExecuteCommand(parseCommand(dominion.getName(), group.getName(), "admin", true, 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(parseCommand(DominionName, groupName, flag.getFlagName(), false, page)) + .build()) + .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); + } else { + return Line.create() + .append(Button.createRed("☐") + .setExecuteCommand(parseCommand(DominionName, groupName, flag.getFlagName(), true, page)) + .build()) + .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); + } + } + + private static String parseCommand(String dominionName, String groupName, String flagName, boolean value, int page) { + return String.format("/dominion group set_flag %s %s %s %s %d", dominionName, groupName, flagName, value, page); + } +} diff --git a/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/group/SelectMember.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/group/SelectMember.java new file mode 100644 index 0000000..2575148 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/group/SelectMember.java @@ -0,0 +1,57 @@ +package cn.lunadeer.dominion.tuis.dominion.manage.group; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.GroupDTO; +import cn.lunadeer.dominion.dtos.MemberDTO; +import cn.lunadeer.dominion.dtos.PlayerDTO; +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.getPage; +import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage; + +public class SelectMember { + public static void show(CommandSender sender, String[] args) { + if (args.length < 4) { + Notification.error(sender, "用法: /dominion group select_member <领地名称> <权限组名称> [回显页码] [页码]"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = DominionDTO.select(args[2]); + if (dominion == null) { + Notification.error(sender, "领地 %s 不存在", args[2]); + return; + } + if (noAuthToManage(player, dominion)) return; + GroupDTO group = GroupDTO.select(dominion.getId(), args[3]); + if (group == null) { + Notification.error(sender, "权限组不存在"); + return; + } + int backPage = getPage(args, 4); + int page = getPage(args, 5); + ListView view = ListView.create(10, "/dominion group select_member " + dominion.getName() + " " + group.getName() + " " + backPage); + view.title("选择成员"); + Line sub = Line.create().append("选择成员添加到权限组 " + group.getName()) + .append(Button.create("返回").setExecuteCommand("/dominion group list " + dominion.getName() + " " + backPage).build()); + view.subtitle(sub); + List members = MemberDTO.selectByDomGroupId(dominion.getId(), -1); + for (MemberDTO 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())); + } + view.showOn(player, page); + } +} diff --git a/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/MemberList.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/MemberList.java new file mode 100644 index 0000000..9646fbc --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/MemberList.java @@ -0,0 +1,119 @@ +package cn.lunadeer.dominion.tuis.dominion.manage.member; + +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; +import cn.lunadeer.minecraftpluginutils.stui.components.Line; +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 org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; + +import static cn.lunadeer.dominion.commands.Apis.CommandParser; +import static cn.lunadeer.dominion.commands.Apis.playerOnly; +import static cn.lunadeer.dominion.tuis.Apis.getPage; +import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage; + +public class MemberList { + + public static void show(CommandSender sender, String dominionName, Integer page) { + show(sender, new String[]{"", "", dominionName, page.toString()}); + } + + public static void show(CommandSender sender, String dominionName) { + show(sender, new String[]{"", "", dominionName}); + } + + public static void show(CommandSender sender, String[] args) { + if (args.length < 3) { + Notification.error(sender, "用法: /dominion member list <领地名称> [页码]"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = DominionDTO.select(args[2]); + if (dominion == null) { + Notification.error(sender, "领地 %s 不存在", args[2]); + return; + } + int page = getPage(args, 3); + ListView view = ListView.create(10, "/dominion member list " + dominion.getName()); + if (noAuthToManage(player, dominion)) return; + List privileges = MemberDTO.select(dominion.getId()); + view.title("领地 " + dominion.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("成员列表") + ); + view.add(Line.create().append(Button.create("添加成员") + .setExecuteCommand(CommandParser("/dominion member select_player %s", dominion.getName())).build())); + for (MemberDTO 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 (group != null) { + line.append(groupTag); + } else if (privilege.getAdmin()) { + line.append(adminTag); + } else { + if (!privilege.getFlagValue(Flag.MOVE)) { + line.append(banTag); + } else { + line.append(normalTag); + } + } + + Button prev = Button.createGreen("权限") + .setHoverText("配置成员权限") + .setExecuteCommand(CommandParser("/dominion member setting %s %s", dominion.getName(), p_player.getLastKnownName())); + Button remove = Button.createRed("移除") + .setHoverText("将此成员移出(变为访客)") + .setExecuteCommand(CommandParser("/dominion member remove %s %s", dominion.getName(), p_player.getLastKnownName())); + + 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); + } + view.showOn(player, page); + } + + private static final TextComponent adminTag = Component.text("[A]", Style.style(TextColor.color(97, 97, 210))) + .hoverEvent(Component.text("这是一个管理员")); + private static final TextComponent normalTag = Component.text("[N]", Style.style(TextColor.color(255, 255, 255))) + .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/PrivilegeInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/MemberSetting.java similarity index 58% rename from src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java rename to src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/MemberSetting.java index 1999ad8..938787a 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/MemberSetting.java @@ -1,9 +1,9 @@ -package cn.lunadeer.dominion.tuis; +package cn.lunadeer.dominion.tuis.dominion.manage.member; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.Flag; +import cn.lunadeer.dominion.dtos.MemberDTO; 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; @@ -13,35 +13,40 @@ 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.getPage; import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage; -public class PrivilegeInfo { - // /dominion privilege_info <玩家名称> [领地名称] [页码] +public class MemberSetting { + public static void show(CommandSender sender, String dominionName, String playerName, Integer page) { + show(sender, new String[]{"", "", dominionName, playerName, page.toString()}); + } + + public static void show(CommandSender sender, String dominionName, String playerName) { + show(sender, new String[]{"", "", dominionName, playerName}); + } + public static void show(CommandSender sender, String[] args) { - 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) { - } - } - String playerName = args[1]; - if (dominion == null) { - Notification.error(sender, "你不在任何领地内,请指定领地名称 /dominion privilege_info <玩家名称> [领地名称]"); + if (args.length < 3) { + Notification.error(sender, "用法: /dominion member setting <领地名称> <玩家名称> [页码]"); + return; + } + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = DominionDTO.select(args[2]); + if (dominion == null) { + Notification.error(sender, "领地 %s 不存在", args[2]); return; } - ListView view = ListView.create(10, "/dominion privilege_info " + playerName + " " + dominion.getName()); if (noAuthToManage(player, dominion)) return; + int page = getPage(args, 4); + String playerName = args[3]; + ListView view = ListView.create(10, "/dominion member setting " + dominion.getName() + " " + playerName); PlayerDTO playerDTO = PlayerDTO.select(playerName); if (playerDTO == null) { Notification.error(sender, "玩家 %s 不存在", playerName); return; } - PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(playerDTO.getUuid(), dominion.getId()); + MemberDTO privilege = MemberDTO.select(playerDTO.getUuid(), dominion.getId()); if (privilege == null) { Notification.warn(sender, "玩家 %s 不是领地 %s 的成员", playerName, dominion.getName()); return; @@ -52,17 +57,24 @@ public class PrivilegeInfo { .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 privilege_list " + dominion.getName()).build()) + .append(Button.create("成员列表").setExecuteCommand("/dominion member list " + dominion.getName()).build()) .append("成员权限") ); + view.add(Line.create().append(Button.createGreen("套用模板") + .setHoverText("选择一个权限模板套用") + .setExecuteCommand("/dominion member select_template " + dominion.getName() + " " + playerName).build())); if (privilege.getAdmin()) { view.add(Line.create() - .append(Button.createGreen("☑").setExecuteCommand("/dominion set_privilege " + playerName + " admin false " + dominion.getName() + " " + page).build()) + .append(Button.createGreen("☑").setExecuteCommand( + parseCommand(dominion.getName(), playerName, "admin", false, page) + ).build()) .append("管理员")); view.add(createOption(Flag.GLOW, privilege.getFlagValue(Flag.GLOW), playerName, dominion.getName(), page)); } else { view.add(Line.create() - .append(Button.createRed("☐").setExecuteCommand("/dominion set_privilege " + playerName + " admin true " + dominion.getName() + " " + page).build()) + .append(Button.createRed("☐").setExecuteCommand( + parseCommand(dominion.getName(), playerName, "admin", true, page) + ).build()) .append("管理员")); for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { view.add(createOption(flag, privilege.getFlagValue(flag), playerName, dominion.getName(), page)); @@ -74,12 +86,20 @@ public class PrivilegeInfo { private static Line createOption(Flag flag, boolean value, String player_name, String dominion_name, int page) { if (value) { return Line.create() - .append(Button.createGreen("☑").setExecuteCommand("/dominion set_privilege " + player_name + " " + flag.getFlagName() + " false " + dominion_name + " " + page).build()) + .append(Button.createGreen("☑").setExecuteCommand( + parseCommand(dominion_name, player_name, flag.getFlagName(), false, page) + ).build()) .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); } else { return Line.create() - .append(Button.createRed("☐").setExecuteCommand("/dominion set_privilege " + player_name + " " + flag.getFlagName() + " true " + dominion_name + " " + page).build()) + .append(Button.createRed("☐").setExecuteCommand( + parseCommand(dominion_name, player_name, flag.getFlagName(), true, page) + ).build()) .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); } } + + private static String parseCommand(String dominionName, String playerName, String flagName, boolean value, int page) { + return String.format("/dominion member set_flag %s %s %s %s %d", dominionName, playerName, flagName, value, page); + } } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/SelectPlayer.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/SelectPlayer.java similarity index 57% rename from src/main/java/cn/lunadeer/dominion/tuis/SelectPlayer.java rename to src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/SelectPlayer.java index 480003f..b0be8cb 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/SelectPlayer.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/SelectPlayer.java @@ -1,7 +1,8 @@ -package cn.lunadeer.dominion.tuis; +package cn.lunadeer.dominion.tuis.dominion.manage.member; import cn.lunadeer.dominion.controllers.PlayerController; import cn.lunadeer.dominion.dtos.PlayerDTO; +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; @@ -10,26 +11,29 @@ import org.bukkit.entity.Player; import java.util.List; +import static cn.lunadeer.dominion.commands.Apis.CommandParser; import static cn.lunadeer.dominion.commands.Apis.playerOnly; +import static cn.lunadeer.dominion.tuis.Apis.getPage; public class SelectPlayer { - // /dominion select_player_create_privilege <领地名称> [页码] + public static void show(CommandSender sender, String dominionName, Integer page) { + show(sender, new String[]{"", "", dominionName, page.toString()}); + } + public static void show(CommandSender sender, String[] args) { + if (args.length < 3) { + Notification.error(sender, "用法: /dominion member select_player <领地名称> [页码]"); + return; + } Player player = playerOnly(sender); if (player == null) return; - int page = 1; - if (args.length == 3) { - try { - page = Integer.parseInt(args[2]); - } catch (Exception ignored) { - } - } - String dominion_name = args[1]; - ListView view = ListView.create(10, "/dominion select_player_create_privilege " + dominion_name); + int page = getPage(args, 3); + String dominion_name = args[2]; + ListView view = ListView.create(10, "/dominion member select_player " + dominion_name); Line sub = Line.create() .append("只能选择已经登录过的玩家") - .append(Button.create("搜索").setExecuteCommand("/dominion cui_create_privilege " + dominion_name).build()) - .append(Button.create("返回").setExecuteCommand("/dominion privilege_list " + dominion_name).build()); + .append(Button.create("搜索").setExecuteCommand("/dominion cui_member_add " + dominion_name).build()) + .append(Button.create("返回").setExecuteCommand("/dominion member list " + dominion_name).build()); view.title("选择玩家添加为成员").subtitle(sub); List players = PlayerController.allPlayers(); for (PlayerDTO p : players) { @@ -38,7 +42,7 @@ public class SelectPlayer { } view.add(Line.create(). append(Button.create(p.getLastKnownName()) - .setExecuteCommand("/dominion create_privilege " + p.getLastKnownName() + " " + dominion_name + " b") + .setExecuteCommand(CommandParser("/dominion member add %s %s", dominion_name, p.getLastKnownName())) .build())); } view.showOn(player, page); diff --git a/src/main/java/cn/lunadeer/dominion/tuis/SelectTemplate.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/SelectTemplate.java similarity index 57% rename from src/main/java/cn/lunadeer/dominion/tuis/SelectTemplate.java rename to src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/SelectTemplate.java index a9a503b..38cb431 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/SelectTemplate.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/SelectTemplate.java @@ -1,6 +1,7 @@ -package cn.lunadeer.dominion.tuis; +package cn.lunadeer.dominion.tuis.dominion.manage.member; 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; @@ -10,40 +11,42 @@ import org.bukkit.entity.Player; import java.util.List; +import static cn.lunadeer.dominion.commands.Apis.CommandParser; import static cn.lunadeer.dominion.commands.Apis.playerOnly; +import static cn.lunadeer.dominion.tuis.Apis.getPage; public class SelectTemplate { public static void show(CommandSender sender, String[] args) { + if (args.length < 4) { + // /dominion member select_template <领地名称> <玩家名称> [页码] + Notification.error(sender, "用法: /dominion member select_template <领地名称> <玩家名称> [页码]"); + return; + } + Player player = playerOnly(sender); if (player == null) return; - String playerName = args[1]; String dominionName = args[2]; - String backPage = args[3]; + String playerName = args[3]; - int page = 1; - if (args.length == 5) { - try { - page = Integer.parseInt(args[4]); - } catch (Exception ignored) { - } - } + + int page = getPage(args, 4); List templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId()); - ListView view = ListView.create(10, "/dominion select_template " + playerName + " " + dominionName + " " + backPage); + ListView view = ListView.create(10, "/dominion member select_template " + dominionName + " " + playerName); view.title("选择一个模板"); Line sub = Line.create() .append("套用在领地 " + dominionName + " 的成员 " + playerName + " 身上") - .append(Button.create("返回").setExecuteCommand("/dominion privilege_list " + dominionName + " " + backPage).build()); + .append(Button.create("返回").setExecuteCommand("/dominion member setting " + dominionName + " " + playerName).build()); view.subtitle(sub); for (PrivilegeTemplateDTO template : templates) { - // /dominion apply_template <玩家名称> <领地名称> <模板名称> + // /dominion member apply_template <领地名称> <成员名称> <模板名称> view.add(Line.create() .append(Button.create("选择") - .setExecuteCommand("/dominion apply_template " + playerName + " " + dominionName + " " + template.getName() + " " + backPage) + .setExecuteCommand(CommandParser("/dominion member apply_template %s %s %s", dominionName, playerName, template.getName())) .build()) .append(Component.text(template.getName()))); } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java b/src/main/java/cn/lunadeer/dominion/tuis/template/TemplateList.java similarity index 76% rename from src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java rename to src/main/java/cn/lunadeer/dominion/tuis/template/TemplateList.java index 62603c6..61e0f0e 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/template/TemplateList.java @@ -1,4 +1,4 @@ -package cn.lunadeer.dominion.tuis; +package cn.lunadeer.dominion.tuis.template; import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; import cn.lunadeer.minecraftpluginutils.stui.ListView; @@ -14,11 +14,19 @@ import static cn.lunadeer.dominion.tuis.Apis.getPage; public class TemplateList { + public static void show(CommandSender sender) { + show(sender, 1); + } + + public static void show(CommandSender sender, int page) { + show(sender, new String[]{"", "", String.valueOf(page)}); + } + 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"); + int page = getPage(args, 2); + ListView view = ListView.create(10, "/dominion template list"); List templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId()); view.title("成员权限模板列表"); @@ -30,8 +38,8 @@ public class TemplateList { 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()); + Button manage = Button.createGreen("配置").setExecuteCommand("/dominion template setting " + template.getName()); + Button delete = Button.createRed("删除").setExecuteCommand("/dominion template delete " + template.getName()); Line line = Line.create() .append(delete.build()) .append(manage.build()) diff --git a/src/main/java/cn/lunadeer/dominion/tuis/TemplateManage.java b/src/main/java/cn/lunadeer/dominion/tuis/template/TemplateSetting.java similarity index 73% rename from src/main/java/cn/lunadeer/dominion/tuis/TemplateManage.java rename to src/main/java/cn/lunadeer/dominion/tuis/template/TemplateSetting.java index 3a8d46c..d1ab2be 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/TemplateManage.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/template/TemplateSetting.java @@ -1,4 +1,4 @@ -package cn.lunadeer.dominion.tuis; +package cn.lunadeer.dominion.tuis.template; import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; @@ -11,31 +11,34 @@ 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 TemplateManage { +public class TemplateSetting { + + // /dominion template setting <模板名称> [页码] + public static void show(CommandSender sender, String templateName, int page) { + show(sender, new String[]{"", "", templateName, String.valueOf(page)}); + } + + public static void show(CommandSender sender, String templateName) { + show(sender, new String[]{"", "", templateName}); + } - // /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]); + int page = getPage(args, 3); + PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(player.getUniqueId(), args[2]); if (template == null) { - Notification.error(sender, "模板 %s 不存在", args[1]); + Notification.error(sender, "模板 %s 不存在", args[2]); return; } - ListView view = ListView.create(10, "/dominion template_manage " + template.getName()); + 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(Button.create("模板列表").setExecuteCommand("/dominion template list").build()) .append("模板管理") ); @@ -43,11 +46,11 @@ public class TemplateManage { if (template.getAdmin()) { view.add(Line.create() - .append(Button.createGreen("☑").setExecuteCommand("/dominion template_set_flag " + template.getName() + " admin false " + page).build()) + .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(Button.createRed("☐").setExecuteCommand("/dominion template set_flag " + template.getName() + " admin true " + page).build()) .append("管理员")); } for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { @@ -59,11 +62,11 @@ public class TemplateManage { 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(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(Button.createRed("☐").setExecuteCommand("/dominion template set_flag " + templateName + " " + flag.getFlagName() + " true " + page).build()) .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); } } diff --git a/src/main/java/cn/lunadeer/dominion/utils/ResMigration.java b/src/main/java/cn/lunadeer/dominion/utils/ResMigration.java new file mode 100644 index 0000000..96adcc4 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/utils/ResMigration.java @@ -0,0 +1,155 @@ +package cn.lunadeer.dominion.utils; + +import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.dominion.dtos.PlayerDTO; +import cn.lunadeer.dominion.utils.Residence.Message; +import cn.lunadeer.dominion.utils.Residence.Permission; +import cn.lunadeer.dominion.utils.Residence.Residence; +import cn.lunadeer.dominion.utils.Residence.SaveFile; +import cn.lunadeer.minecraftpluginutils.XLogger; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.plugin.java.JavaPlugin; +import org.yaml.snakeyaml.Yaml; + +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.*; + +public class ResMigration { + public static class ResidenceNode { + public UUID owner; + public World world; + public String name; + public Location loc1; + public Location loc2; + public Location tpLoc; + public String joinMessage; + public String leaveMessage; + public List children = new ArrayList<>(); + } + + public static List extractFromResidence(JavaPlugin plugin) { + List dominions = new ArrayList<>(); + File resSave = new File(plugin.getDataFolder().getParent(), "Residence"); + resSave = new File(resSave, "Save"); + resSave = new File(resSave, "Worlds"); + if (!resSave.exists()) { + XLogger.info("Residence Save not found, skipping migration"); + return dominions; + } + // list .yml files + File[] files = resSave.listFiles((dir, name) -> name.endsWith(".yml")); + if (files == null || files.length == 0) { + XLogger.info("No save files found"); + return dominions; + } + for (File file : files) { + try { + dominions.addAll(processWorld(file)); + } catch (Exception e) { + XLogger.err("Failed to process file: %s, %s", file.getName(), e.getMessage()); + } + } + XLogger.info("Extract %d residences", dominions.size()); + return dominions; + } + + private static ResidenceNode parseDominion(String name, World world, Residence res, SaveFile save) { + OfflinePlayer bukkitOwner = Dominion.instance.getServer().getOfflinePlayer(UUID.fromString(res.Permissions.OwnerUUID)); + PlayerDTO owner = PlayerDTO.get(bukkitOwner); + if (owner == null) { + XLogger.warn("Owner not found: " + res.Permissions.OwnerUUID); + return null; + } + String[] loc = res.Areas.values().toArray()[0].toString().split(":"); + if (loc.length != 6) { + XLogger.warn("Invalid location: " + res.Areas.get("main")); + return null; + } + ResidenceNode dominionNode = new ResidenceNode(); + dominionNode.owner = owner.getUuid(); + dominionNode.world = world; + dominionNode.name = name; + dominionNode.joinMessage = save.Messages.get(res.Messages).EnterMessage; + dominionNode.leaveMessage = save.Messages.get(res.Messages).LeaveMessage; + dominionNode.loc1 = new Location(world, Double.parseDouble(loc[0]), Double.parseDouble(loc[1]), Double.parseDouble(loc[2])); + dominionNode.loc2 = new Location(world, Double.parseDouble(loc[3]), Double.parseDouble(loc[4]), Double.parseDouble(loc[5])); + if (res.TPLoc != null) { + String[] tpLocStr = res.TPLoc.split(":"); + if (tpLocStr.length >= 3) { + dominionNode.tpLoc = new Location(world, Double.parseDouble(tpLocStr[0]), Double.parseDouble(tpLocStr[1]), Double.parseDouble(tpLocStr[2])); + } + } + if (res.Subzones != null) { + for (Map.Entry entry : res.Subzones.entrySet()) { + ResidenceNode sub = parseDominion(entry.getKey(), world, entry.getValue(), save); + if (sub != null) { + dominionNode.children.add(sub); + } + } + } + return dominionNode; + } + + private static Map parseResYml(Map zones) { + Map res = new HashMap<>(); + for (Map.Entry entry : zones.entrySet()) { + Map zone = (Map) entry.getValue(); + Residence residence = new Residence(); + if (zone.containsKey("TPLoc")) { + residence.setTPLoc((String) zone.get("TPLoc")); + } + residence.setMessages((int) zone.get("Messages")); + Permission permission = new Permission(); + permission.OwnerUUID = ((Map) zone.get("Permissions")).get("OwnerUUID").toString(); + permission.OwnerLastKnownName = ((Map) zone.get("Permissions")).get("OwnerLastKnownName").toString(); + residence.setPermissions(permission); + residence.setAreas((Map) zone.get("Areas")); + if (zone.containsKey("Subzones")) { + residence.setSubzones(parseResYml((Map) zone.get("Subzones"))); + } + res.put(entry.getKey(), residence); + } + return res; + } + + private static List processWorld(File saveFile) throws Exception { + XLogger.debug("====================================="); + XLogger.debug("Processing file: %s", saveFile.getName()); + String worldName = saveFile.getName().replace("res_", "").replace(".yml", ""); + World world = Dominion.instance.getServer().getWorld(worldName); + InputStream inputStream = Files.newInputStream(saveFile.toPath()); + + Map yaml = new Yaml().load(inputStream); + + SaveFile save = new SaveFile(); + + Map Messages = (Map) yaml.get("Messages"); + Map messages = new HashMap<>(); + for (Map.Entry entry : Messages.entrySet()) { + Map message = (Map) entry.getValue(); + Message msg = new Message(); + msg.EnterMessage = (String) message.get("EnterMessage"); + msg.LeaveMessage = (String) message.get("LeaveMessage"); + messages.put(entry.getKey(), msg); + } + save.setMessages(messages); + + Map Residences = (Map) yaml.get("Residences"); + save.Residences = parseResYml(Residences); + + inputStream.close(); + List dominions = new ArrayList<>(); + for (Map.Entry entry : save.Residences.entrySet()) { + String name = entry.getKey(); + Residence residence = entry.getValue(); + ResidenceNode dominion = parseDominion(name, world, residence, save); + dominions.add(dominion); + } + return dominions; + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/utils/Residence/Message.java b/src/main/java/cn/lunadeer/dominion/utils/Residence/Message.java new file mode 100644 index 0000000..8dc1d24 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/utils/Residence/Message.java @@ -0,0 +1,24 @@ +package cn.lunadeer.dominion.utils.Residence; + +public class Message { + public String LeaveMessage; + public String EnterMessage; + + // getters and setters + + public String getLeaveMessage() { + return LeaveMessage; + } + + public void setLeaveMessage(String leaveMessage) { + LeaveMessage = leaveMessage; + } + + public String getEnterMessage() { + return EnterMessage; + } + + public void setEnterMessage(String enterMessage) { + EnterMessage = enterMessage; + } +} \ No newline at end of file diff --git a/src/main/java/cn/lunadeer/dominion/utils/Residence/Permission.java b/src/main/java/cn/lunadeer/dominion/utils/Residence/Permission.java new file mode 100644 index 0000000..71a46ae --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/utils/Residence/Permission.java @@ -0,0 +1,24 @@ +package cn.lunadeer.dominion.utils.Residence; + +public class Permission { + public String OwnerUUID; + public String OwnerLastKnownName; + + // getters and setters + + public String getOwnerUUID() { + return OwnerUUID; + } + + public void setOwnerUUID(String ownerUUID) { + OwnerUUID = ownerUUID; + } + + public String getOwnerLastKnownName() { + return OwnerLastKnownName; + } + + public void setOwnerLastKnownName(String ownerLastKnownName) { + OwnerLastKnownName = ownerLastKnownName; + } +} \ No newline at end of file diff --git a/src/main/java/cn/lunadeer/dominion/utils/Residence/Residence.java b/src/main/java/cn/lunadeer/dominion/utils/Residence/Residence.java new file mode 100644 index 0000000..0ac0004 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/utils/Residence/Residence.java @@ -0,0 +1,53 @@ +package cn.lunadeer.dominion.utils.Residence; + +import java.util.Map; + +public class Residence { + public String TPLoc; + public Map Subzones; + public int Messages; + public Permission Permissions; + public Map Areas; + + // getters and setters + + public String getTPLoc() { + return TPLoc; + } + + public void setTPLoc(String TPLoc) { + this.TPLoc = TPLoc; + } + + public Map getSubzones() { + return Subzones; + } + + public void setSubzones(Map subzones) { + Subzones = subzones; + } + + public int getMessages() { + return Messages; + } + + public void setMessages(int messages) { + Messages = messages; + } + + public Permission getPermissions() { + return Permissions; + } + + public void setPermissions(Permission permissions) { + Permissions = permissions; + } + + public Map getAreas() { + return Areas; + } + + public void setAreas(Map areas) { + Areas = areas; + } +} \ No newline at end of file diff --git a/src/main/java/cn/lunadeer/dominion/utils/Residence/SaveFile.java b/src/main/java/cn/lunadeer/dominion/utils/Residence/SaveFile.java new file mode 100644 index 0000000..6bdc34f --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/utils/Residence/SaveFile.java @@ -0,0 +1,25 @@ +package cn.lunadeer.dominion.utils.Residence; + +import java.util.Map; + +public class SaveFile { + public Map Residences; + public Map Messages; + + // getters and setters + public Map getResidences() { + return Residences; + } + + public void setResidences(Map residences) { + Residences = residences; + } + + public Map getMessages() { + return Messages; + } + + public void setMessages(Map messages) { + Messages = messages; + } +} \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index fd791f3..a30669e 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -49,6 +49,9 @@ FlyPermissionNodes: - essentials.fly - cmi.command.fly +# 是否允许玩家从 Residence 迁移领地数据 +ResidenceMigration: false + BlueMap: true CheckUpdate: true