From ee967fbb4df4dce0e0486a209d6b25322a9e41dd Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Tue, 6 Feb 2024 17:42:02 +0800 Subject: [PATCH] finish main controller some command api --- .../java/cn/lunadeer/dominion/Dominion.java | 7 + .../cn/lunadeer/dominion/commands/Apis.java | 33 ++++ .../dominion/commands/DominionOperate.java | 114 +++++++++++++ .../lunadeer/dominion/controllers/Apis.java | 154 +++++++++++++++++ .../controllers/DominionController.java | 139 +++++++++++++--- .../dominion/controllers/FlagsController.java | 82 +++++++++ .../dominion/controllers/GroupController.java | 148 +++++++++++++++++ .../controllers/PrivilegeController.java | 155 ++++++++++++++++++ .../dominion/dtos/PlayerPrivilegeDTO.java | 27 ++- .../dominion/dtos/PrivilegeTemplateDTO.java | 29 ++++ .../cn/lunadeer/dominion/utils/Database.java | 1 + .../dominion/utils/STUI/Pagination.java | 3 +- .../cn/lunadeer/dominion/utils/STUI/View.java | 2 +- src/main/resources/plugin.yml | 5 + 14 files changed, 856 insertions(+), 43 deletions(-) create mode 100644 src/main/java/cn/lunadeer/dominion/commands/Apis.java create mode 100644 src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java create mode 100644 src/main/java/cn/lunadeer/dominion/controllers/Apis.java create mode 100644 src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java create mode 100644 src/main/java/cn/lunadeer/dominion/controllers/GroupController.java create mode 100644 src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java diff --git a/src/main/java/cn/lunadeer/dominion/Dominion.java b/src/main/java/cn/lunadeer/dominion/Dominion.java index 5dc8ed6..ae8b79e 100644 --- a/src/main/java/cn/lunadeer/dominion/Dominion.java +++ b/src/main/java/cn/lunadeer/dominion/Dominion.java @@ -3,9 +3,15 @@ package cn.lunadeer.dominion; import cn.lunadeer.dominion.utils.ConfigManager; import cn.lunadeer.dominion.utils.Database; import cn.lunadeer.dominion.utils.XLogger; +import org.bukkit.Location; import org.bukkit.plugin.java.JavaPlugin; +import org.postgresql.core.Tuple; import java.sql.Connection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; public final class Dominion extends JavaPlugin { @@ -37,4 +43,5 @@ public final class Dominion extends JavaPlugin { public static Dominion instance; public static ConfigManager config; public static Connection dbConnection; + public static Map> pointsSelect = new HashMap<>(); } diff --git a/src/main/java/cn/lunadeer/dominion/commands/Apis.java b/src/main/java/cn/lunadeer/dominion/commands/Apis.java new file mode 100644 index 0000000..be4b562 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/commands/Apis.java @@ -0,0 +1,33 @@ +package cn.lunadeer.dominion.commands; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.utils.Notification; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class Apis { + public static Player playerOnly(CommandSender sender) { + if (!(sender instanceof Player)) { + Notification.error(sender, "该命令只能由玩家执行"); + return null; + } + return (Player) sender; + } + + public static void sizeInfo(CommandSender sender, DominionDTO dominionDTO) { + Integer x1 = dominionDTO.getX1(); + Integer y1 = dominionDTO.getY1(); + Integer z1 = dominionDTO.getZ1(); + Integer x2 = dominionDTO.getX2(); + Integer y2 = dominionDTO.getY2(); + Integer z2 = dominionDTO.getZ2(); + Notification.info(sender, "领地 " + dominionDTO.getName() + " 的尺寸信息:"); + Notification.info(sender, " 大小为" + (x2 - x1) + " x" + (y2 - y1) + " x" + (z2 - z1)); + Notification.info(sender, " 中心坐标为 " + (x1 + (x2 - x1) / 2) + " " + (y1 + (y2 - y1) / 2) + " " + (z1 + (z2 - z1) / 2)); + Notification.info(sender, " 高度为 " + (y2 - y1)); + Notification.info(sender, " 体积为 " + (x2 - x1) * (y2 - y1) * (z2 - z1)); + Notification.info(sender, " 领地的世界为 " + dominionDTO.getWorld()); + Notification.info(sender, " 领地的对角点坐标为 x1=" + x1 + " y1=" + y1 + " z1=" + z1 + " x2=" + x2 + " y2=" + y2 + " z2=" + z2); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java new file mode 100644 index 0000000..4cd55c5 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java @@ -0,0 +1,114 @@ +package cn.lunadeer.dominion.commands; + +import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.dominion.controllers.DominionController; +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.utils.Notification; +import net.kyori.adventure.text.Component; +import org.bukkit.Location; +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.commands.Apis.sizeInfo; + +public class DominionOperate { + /** + * 创建领地 + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void createDominion(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length != 2) { + Notification.error(sender, "用法: /dominion create <领地名称>"); + return; + } + List points = Dominion.pointsSelect.get(player.getUniqueId()); + if (points == null || points.size() != 2) { + Notification.error(sender, "请先使用木棍选择领地的对角线两点,或使用 /dominion auto_create <领地名称> 创建自动领地"); + return; + } + String name = args[1]; + DominionDTO dominionDTO = DominionDTO.select(name); + if (dominionDTO != null) { + Notification.error(sender, "已经存在名称为 " + name + " 的领地"); + return; + } + dominionDTO = DominionController.create(player, name, points.get(0), points.get(1)); + if (dominionDTO == null) { + Notification.error(sender, "创建领地失败"); + return; + } + Notification.info(sender, "成功创建领地: " + name); + } + + /** + * 自动创建领地 + * 会在玩家当前位置的周围创建一个 20x20x20 的领地 + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void autoCreateDominion(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length != 2) { + Notification.error(sender, "用法: /dominion auto_create <领地名称>"); + return; + } + String name = args[1]; + DominionDTO dominionDTO = DominionDTO.select(name); + if (dominionDTO != null) { + Notification.error(sender, "已经存在名称为 " + name + " 的领地"); + return; + } + Location location = player.getLocation(); + Location location1 = new Location(location.getWorld(), location.getX() - 10, location.getY() - 10, location.getZ() - 10); + Location location2 = new Location(location.getWorld(), location.getX() + 10, location.getY() + 10, location.getZ() + 10); + dominionDTO = DominionController.create(player, name, location1, location2); + if (dominionDTO == null) { + Notification.error(sender, "创建领地失败"); + return; + } + Notification.info(sender, "成功创建领地: " + name); + } + + public static void expandDominion(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length != 2 && args.length != 3) { + Notification.error(sender, "用法: /dominion expand [大小] [领地名称]"); + return; + } + int size = 10; + String name = ""; + if (args.length == 2) { + try { + size = Integer.parseInt(args[1]); + } catch (Exception e) { + Notification.error(sender, "大小格式错误"); + return; + } + } + if (args.length == 3) { + name = args[2]; + } + DominionDTO dominionDTO; + if (name.isEmpty()) { + dominionDTO = DominionController.expand(player, size); + } else { + dominionDTO = DominionController.expand(player, size, name); + } + if (dominionDTO == null) { + Notification.error(sender, "扩展领地失败"); + } else { + Notification.info(sender, "成功扩展领地: " + dominionDTO.getName() + " " + size); + sizeInfo(sender, dominionDTO); + } + } +} diff --git a/src/main/java/cn/lunadeer/dominion/controllers/Apis.java b/src/main/java/cn/lunadeer/dominion/controllers/Apis.java new file mode 100644 index 0000000..956d619 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/controllers/Apis.java @@ -0,0 +1,154 @@ +package cn.lunadeer.dominion.controllers; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; +import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; +import cn.lunadeer.dominion.utils.Notification; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.List; + +public class Apis { + + public static boolean notOwner(Player player, DominionDTO dominion) { + if (player.isOp()) return false; + if (dominion.getOwner().equals(player.getUniqueId())) return false; + Notification.error(player, "你不是领地 " + dominion.getName() + " 的拥有者,无法执行此操作"); + return true; + } + + public static boolean noAuthToChangeFlags(Player player, DominionDTO dominion) { + if (player.isOp()) return false; + if (!dominion.getOwner().equals(player.getUniqueId())) { + List privileges = PlayerPrivilegeDTO.select(player.getUniqueId(), dominion.getId()); + for (PlayerPrivilegeDTO privilege : privileges) { + if (privilege.getAdmin()) return false; + } + Notification.error(player, "你不是领地 " + dominion.getName() + " 的拥有者或管理员,无法执行此操作"); + return true; + } else { + return false; + } + } + + /** + * 获取玩家当前所在的领地 + * 如果玩家不在一个领地内或者在子领地内,会提示玩家手动指定要操作的领地名称 + * + * @param player 玩家 + * @return 当前所在的领地 + */ + public static DominionDTO getPlayerCurrentDominion(Player player) { + Location location = player.getLocation(); + List dominions = DominionDTO.selectByLocation(location.getWorld().getName(), + (int) location.getX(), (int) location.getY(), (int) location.getZ()); + if (dominions.size() != 1) { + Notification.error(player, "你不在一个领地内或在子领地内,无法确定你要操作的领地,请手动指定要操作的领地名称"); + return null; + } + return dominions.get(0); + } + + + public static boolean updateTemplateFlag(PrivilegeTemplateDTO privilege, String flag, boolean value) { + switch (flag) { + case "anchor": + privilege.setAnchor(value); + break; + case "animal_killing": + privilege.setAnimalKilling(value); + break; + case "anvil": + privilege.setAnvil(value); + break; + case "beacon": + privilege.setBeacon(value); + break; + case "bed": + privilege.setBed(value); + break; + case "brew": + privilege.setBrew(value); + break; + case "button": + privilege.setButton(value); + break; + case "cake": + privilege.setCake(value); + break; + case "container": + privilege.setContainer(value); + break; + case "craft": + privilege.setCraft(value); + break; + case "diode": + privilege.setDiode(value); + break; + case "door": + privilege.setDoor(value); + break; + case "dye": + privilege.setDye(value); + break; + case "egg": + privilege.setEgg(value); + break; + case "enchant": + privilege.setEnchant(value); + break; + case "ender_pearl": + privilege.setEnderPearl(value); + break; + case "feed": + privilege.setFeed(value); + break; + case "glow": + privilege.setGlow(value); + break; + case "honey": + privilege.setHoney(value); + break; + case "hook": + privilege.setHook(value); + break; + case "ignite": + privilege.setIgnite(value); + break; + case "mob_killing": + privilege.setMobKilling(value); + break; + case "move": + privilege.setMove(value); + break; + case "place": + privilege.setPlace(value); + break; + case "pressure": + privilege.setPressure(value); + break; + case "riding": + privilege.setRiding(value); + break; + case "shear": + privilege.setShear(value); + break; + case "shoot": + privilege.setShoot(value); + break; + case "trade": + privilege.setTrade(value); + break; + case "vehicle_destroy": + privilege.setVehicleDestroy(value); + break; + case "harvest": + privilege.setHarvest(value); + break; + default: + return false; + } + 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 c6bd1f8..a6f6bbf 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java @@ -1,8 +1,6 @@ package cn.lunadeer.dominion.controllers; -import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.dtos.DominionDTO; -import cn.lunadeer.dominion.utils.Database; import cn.lunadeer.dominion.utils.Notification; import cn.lunadeer.dominion.utils.Time; import cn.lunadeer.dominion.utils.XLogger; @@ -11,7 +9,9 @@ import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; import java.util.List; -import java.util.UUID; + +import static cn.lunadeer.dominion.controllers.Apis.getPlayerCurrentDominion; +import static cn.lunadeer.dominion.controllers.Apis.notOwner; public class DominionController { @@ -67,7 +67,7 @@ public class DominionController { return null; } // 是否是父领地的拥有者 - if (!isOwner(owner, parent_dominion) && parent_dominion.getId() != -1) { + if (notOwner(owner, parent_dominion) && parent_dominion.getId() != -1) { return null; } // 如果parent_dominion不为-1 检查是否在同一世界 @@ -80,7 +80,7 @@ public class DominionController { Notification.error(owner, "超出父领地 " + parent_dominion_name + " 范围"); return null; } - // 获取此父领地的所有子领地 + // 获取此领地的所有同级领地 List sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), parent_dominion.getId()); // 检查是否与其他子领地冲突 for (DominionDTO sub_dominion : sub_dominions) { @@ -107,14 +107,11 @@ public class DominionController { * @return 扩展后的领地 */ public static DominionDTO expand(Player operator, Integer size) { - Location location = operator.getLocation(); - List dominions = DominionDTO.selectByLocation(location.getWorld().getName(), - (int) location.getX(), (int) location.getY(), (int) location.getZ()); - if (dominions.size() != 1) { - Notification.error(operator, "你不在一个领地内或在一个子领地内,无法确定你要操作的领地,请手动指定要操作的领地名称"); + DominionDTO dominion = getPlayerCurrentDominion(operator); + if (dominion == null) { return null; } - return expand(operator, size, dominions.get(0).getName()); + return expand(operator, size, dominion.getName()); } /** @@ -133,7 +130,7 @@ public class DominionController { Notification.error(operator, "领地 " + dominion_name + " 不存在"); return null; } - if (!isOwner(operator, dominion)) { + if (notOwner(operator, dominion)) { return null; } if (!location.getWorld().getName().equals(dominion.getWorld())) { @@ -202,14 +199,11 @@ public class DominionController { * @return 缩小后的领地 */ public static DominionDTO contract(Player operator, Integer size) { - Location location = operator.getLocation(); - List dominions = DominionDTO.selectByLocation(location.getWorld().getName(), - (int) location.getX(), (int) location.getY(), (int) location.getZ()); - if (dominions.size() != 1) { - Notification.error(operator, "你不在一个领地内或在子领地内,无法确定你要操作的领地,请手动指定要操作的领地名称"); + DominionDTO dominion = getPlayerCurrentDominion(operator); + if (dominion == null) { return null; } - return contract(operator, size, dominions.get(0).getName()); + return contract(operator, size, dominion.getName()); } /** @@ -228,7 +222,7 @@ public class DominionController { Notification.error(operator, "领地 " + dominion_name + " 不存在"); return null; } - if (!isOwner(operator, dominion)) { + if (notOwner(operator, dominion)) { return null; } if (!location.getWorld().getName().equals(dominion.getWorld())) { @@ -280,6 +274,105 @@ public class DominionController { return dominion.setXYZ(x1, y1, z1, x2, y2, z2); } + /** + * 删除领地 会同时删除其所有子领地 + * + * @param operator 操作者 + * @param dominion_name 领地名称 + * @param force 是否强制删除 + */ + public static void delete(Player operator, String dominion_name, boolean force) { + DominionDTO dominion = DominionDTO.select(dominion_name); + if (dominion == null) { + Notification.error(operator, "领地 " + dominion_name + " 不存在"); + return; + } + if (notOwner(operator, dominion)) { + return; + } + List sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getId()); + if (!force) { + Notification.warn(operator, "删除领地 " + dominion_name + " 会同时删除其所有子领地,是否继续?"); + String sub_names = ""; + for (DominionDTO sub_dominion : sub_dominions) { + sub_names = sub_dominion.getName() + ", "; + } + if (sub_dominions.size() > 0) { + sub_names = sub_names.substring(0, sub_names.length() - 2); + Notification.warn(operator, "当前子领地(不包含子领地的子领地等):" + sub_names); + } + Notification.warn(operator, "输入 /dominion force_delete " + dominion_name + " 确认删除"); + return; + } + DominionDTO.delete(dominion); + Notification.info(operator, "领地 " + dominion_name + " 及其所有子领地已删除"); + } + + /** + * 设置领地的进入消息 + * + * @param operator 操作者 + * @param message 消息 + */ + public static void setJoinMessage(Player operator, String message) { + DominionDTO dominion = getPlayerCurrentDominion(operator); + if (dominion == null) { + return; + } + setJoinMessage(operator, dominion.getName(), message); + } + + /** + * 设置进入领地的消息 + * + * @param operator 操作者 + * @param dominion_name 领地名称 + * @param message 消息 + */ + public static void setJoinMessage(Player operator, String dominion_name, String message) { + DominionDTO dominion = DominionDTO.select(dominion_name); + if (dominion == null) { + Notification.error(operator, "领地 " + dominion_name + " 不存在"); + return; + } + if (notOwner(operator, dominion)) { + return; + } + dominion.setJoinMessage(message); + } + + /** + * 设置领地的离开消息 + * + * @param operator 操作者 + * @param message 消息 + */ + public static void setLeaveMessage(Player operator, String message) { + DominionDTO dominion = getPlayerCurrentDominion(operator); + if (dominion == null) { + return; + } + setLeaveMessage(operator, dominion.getName(), message); + } + + /** + * 设置离开领地的消息 + * + * @param operator 操作者 + * @param dominion_name 领地名称 + * @param message 消息 + */ + public static void setLeaveMessage(Player operator, String dominion_name, String message) { + DominionDTO dominion = DominionDTO.select(dominion_name); + if (dominion == null) { + Notification.error(operator, "领地 " + dominion_name + " 不存在"); + return; + } + if (notOwner(operator, dominion)) { + return; + } + dominion.setLeaveMessage(message); + } /** * 判断两个领地是否相交 @@ -316,12 +409,4 @@ public class DominionController { sub.getY1() >= y1 && sub.getY2() <= y2 && sub.getZ1() >= z1 && sub.getZ2() <= z2; } - - public static boolean isOwner(Player player, DominionDTO dominion) { - if (dominion.getOwner().equals(player.getUniqueId())) return true; - Notification.error(player, "你不是领地 " + dominion.getName() + " 的拥有者,无法执行此操作"); - return false; - } - - } diff --git a/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java b/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java new file mode 100644 index 0000000..6e7f3c0 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java @@ -0,0 +1,82 @@ +package cn.lunadeer.dominion.controllers; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.utils.Notification; +import org.bukkit.entity.Player; + +import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags; + +public class FlagsController { + + /** + * 设置领地权限 + * @param operator 操作者 + * @param flag 权限名称 + * @param value 权限值 + * @return 设置后的领地信息 + */ + public static DominionDTO setFlag(Player operator, String flag, boolean value){ + DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); + if (dominion == null) return null; + return setFlag(operator, flag, value, dominion.getName()); + } + + /** + * 设置领地权限 + * @param operator 操作者 + * @param flag 权限名称 + * @param value 权限值 + * @param dominionName 领地名称 + * @return 设置后的领地信息 + */ + public static DominionDTO setFlag(Player operator, String flag, boolean value, String dominionName) { + DominionDTO dominion = DominionDTO.select(dominionName); + if (dominion == null) { + Notification.error(operator, "领地 " + dominionName + " 不存在"); + return null; + } + if (noAuthToChangeFlags(operator, dominion)) return null; + switch (flag) { + case "anchor": return dominion.setAnchor(value); + case "animal_killing": return dominion.setAnimalKilling(value); + case "anvil": return dominion.setAnvil(value); + case "beacon": return dominion.setBeacon(value); + case "bed": return dominion.setBed(value); + case "brew": return dominion.setBrew(value); + case "button": return dominion.setButton(value); + case "cake": return dominion.setCake(value); + case "container": return dominion.setContainer(value); + case "craft": return dominion.setCraft(value); + case "creeper_explode": return dominion.setCreeperExplode(value); + case "diode": return dominion.setDiode(value); + case "door": return dominion.setDoor(value); + case "dye": return dominion.setDye(value); + case "egg": return dominion.setEgg(value); + case "enchant": return dominion.setEnchant(value); + case "ender_pearl": return dominion.setEnderPearl(value); + case "feed": return dominion.setFeed(value); + case "fire_spread": return dominion.setFireSpread(value); + case "flow_in_protection": return dominion.setFlowInProtection(value); + case "glow": return dominion.setGlow(value); + case "grow": return dominion.setGrow(value); + case "honey": return dominion.setHoney(value); + case "hook": return dominion.setHook(value); + case "ignite": return dominion.setIgnite(value); + case "mob_killing": return dominion.setMobKilling(value); + case "move": return dominion.setMove(value); + case "place": return dominion.setPlace(value); + case "pressure": return dominion.setPressure(value); + case "riding": return dominion.setRiding(value); + case "shear": return dominion.setShear(value); + case "shoot": return dominion.setShoot(value); + case "tnt_explode": return dominion.setTntExplode(value); + case "trade": return dominion.setTrade(value); + case "vehicle_destroy": return dominion.setVehicleDestroy(value); + case "wither_spawn": return dominion.setWitherSpawn(value); + case "harvest": return dominion.setHarvest(value); + default: + Notification.error(operator, "未知的领地权限 " + flag); + return null; + } + } +} 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..2b56551 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/controllers/GroupController.java @@ -0,0 +1,148 @@ +package cn.lunadeer.dominion.controllers; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; +import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; +import cn.lunadeer.dominion.utils.Notification; +import org.bukkit.entity.Player; + +import java.util.UUID; + +import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags; + +public class GroupController { + + /** + * 创建权限组 + * + * @param operator 操作者 + * @param name 权限组名称 + * @return 是否创建成功 + */ + public static PrivilegeTemplateDTO create(Player operator, String name) { + PrivilegeTemplateDTO template = new PrivilegeTemplateDTO(name, operator.getUniqueId(), true); + template = PrivilegeTemplateDTO.insert(template); + if (template == null) { + Notification.error(operator, "创建权限组失败"); + return null; + } + return template; + } + + /** + * 删除权限组 + * + * @param operator 操作者 + * @param name 权限组名称 + * @return 是否删除成功 + */ + public static boolean delete(Player operator, String name) { + PrivilegeTemplateDTO.delete(operator.getUniqueId(), name); + return true; + } + + /** + * 设置权限组的权限 + * + * @param operator 操作者 + * @param name 权限组名称 + * @param flag 权限名称 + * @param value 权限值 + * @return 是否设置成功 + */ + public static boolean setFlag(Player operator, String name, String flag, boolean value) { + PrivilegeTemplateDTO privilege = PrivilegeTemplateDTO.select(operator.getUniqueId(), name); + if (privilege == null) { + Notification.error(operator, "没有找到权限组 " + name); + return false; + } + if (!Apis.updateTemplateFlag(privilege, flag, value)) { + Notification.error(operator, "未知的领地权限 " + flag); + return false; + } + return true; + } + + /** + * 添加玩家到权限组 + * + * @param operator 操作者 + * @param player 玩家 + * @param groupName 权限组名称 + * @return 是否添加成功 + */ + public static boolean addPlayer(Player operator, UUID player, String groupName) { + DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); + if (dominion == null) return false; + return addPlayer(operator, player, groupName, dominion.getName()); + } + + /** + * 添加玩家到权限组 + * + * @param operator 操作者 + * @param player 玩家 + * @param groupName 权限组名称 + * @param dominionName 领地名称 + * @return 是否添加成功 + */ + public static boolean addPlayer(Player operator, UUID player, String groupName, String dominionName) { + PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), groupName); + if (template == null) { + Notification.error(operator, "没有找到权限组 " + groupName + " 或者需要先创建权限组"); + return false; + } + DominionDTO dominion = DominionDTO.select(dominionName); + if (dominion == null) { + Notification.error(operator, "领地 " + dominionName + " 不存在"); + return false; + } + if (noAuthToChangeFlags(operator, dominion)) return false; + PlayerPrivilegeDTO privilege = new PlayerPrivilegeDTO(player, false, dominion.getId(), template.getId()); + privilege = PlayerPrivilegeDTO.insert(privilege); + if (privilege == null) { + Notification.error(operator, "添加玩家 " + player + " 到权限组 " + groupName + " 失败"); + return false; + } + return true; + } + + /** + * 从权限组中移除玩家 + * + * @param operator 操作者 + * @param player 玩家 + * @param groupName 权限组名称 + * @return 是否移除成功 + */ + public static boolean removePlayer(Player operator, UUID player, String groupName) { + DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); + if (dominion == null) return false; + return removePlayer(operator, player, groupName, dominion.getName()); + } + + /** + * 从权限组中移除玩家 + * + * @param operator 操作者 + * @param player 玩家 + * @param groupName 权限组名称 + * @param dominionName 领地名称 + * @return 是否移除成功 + */ + public static boolean removePlayer(Player operator, UUID player, String groupName, String dominionName) { + PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), groupName); + if (template == null) { + Notification.error(operator, "没有找到权限组 " + groupName); + return false; + } + DominionDTO dominion = DominionDTO.select(dominionName); + if (dominion == null) { + Notification.error(operator, "领地 " + dominionName + " 不存在"); + return false; + } + if (noAuthToChangeFlags(operator, dominion)) return false; + PlayerPrivilegeDTO.delete(player, dominion.getId(), template.getId()); + return true; + } +} diff --git a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java new file mode 100644 index 0000000..7d6c620 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java @@ -0,0 +1,155 @@ +package cn.lunadeer.dominion.controllers; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; +import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; +import cn.lunadeer.dominion.utils.Notification; +import cn.lunadeer.dominion.utils.XLogger; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags; + +public class PrivilegeController { + + /** + * 清空玩家特权 + * + * @param operator 操作者 + * @param player 玩家 + * @return 是否清空成功 + */ + public static boolean clearPrivilege(Player operator, UUID player) { + DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); + if (dominion == null) return false; + return clearPrivilege(operator, player, dominion.getName()); + } + + /** + * 清空玩家特权 + * + * @param operator 操作者 + * @param player 玩家 + * @param dominionName 领地名称 + * @return 是否清空成功 + */ + public static boolean clearPrivilege(Player operator, UUID player, String dominionName) { + DominionDTO dominion = DominionDTO.select(dominionName); + if (dominion == null) { + Notification.error(operator, "领地 " + dominionName + " 不存在"); + return false; + } + if (noAuthToChangeFlags(operator, dominion)) return false; + List privileges = PlayerPrivilegeDTO.select(player, dominion.getId()); + List templates = getPlayerPrivilegeTemplates(player, dominion.getId()); + if (templates.size() < 1) { + return true; + } + for (PrivilegeTemplateDTO template : templates) { + PlayerPrivilegeDTO.delete(player, dominion.getId(), template.getId()); + } + return true; + } + + /** + * 设置玩家特权 + * + * @param operator 操作者 + * @param player 玩家 + * @param flag 权限名称 + * @param value 权限值 + * @return 是否设置成功 + */ + public static boolean setPrivilege(Player operator, UUID player, String flag, boolean value) { + DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); + if (dominion == null) return false; + return setPrivilege(operator, player, flag, value, dominion.getName()); + } + + /** + * 设置玩家特权 + * + * @param operator 操作者 + * @param player 玩家 + * @param flag 权限名称 + * @param value 权限值 + * @param dominionName 领地名称 + * @return 是否设置成功 + */ + public static boolean setPrivilege(Player operator, UUID player, String flag, boolean value, String dominionName) { + DominionDTO dominion = DominionDTO.select(dominionName); + if (dominion == null) { + Notification.error(operator, "领地 " + dominionName + " 不存在"); + return false; + } + if (noAuthToChangeFlags(operator, dominion)) return false; + List templates = getPlayerPrivilegeTemplates(player, dominion.getId()); + if (templates.size() < 1) { + PrivilegeTemplateDTO template = createPlayerPrivilege(operator, player, dominion.getId()); + if (template == null) return false; + templates.add(template); + } + if (templates.size() > 1) { + Notification.error(operator, "玩家特权拥有多个权限模板,建议使用 clear_privilege 清空此玩家特权后重新设置"); + XLogger.warn("玩家特权拥有多个权限模板,使用搜索到的第一个 id: " + templates.get(0).getId() + " 进行操作,请检查数据库"); + XLogger.warn("其他权限模板如下:"); + for (int i = 1; i < templates.size(); i++) { + XLogger.warn(" id: " + templates.get(i).getId()); + } + } + PrivilegeTemplateDTO privilege = templates.get(0); + if (Objects.equals(flag, "admin")) { + List privileges = PlayerPrivilegeDTO.select(player, dominion.getId()); + for (PlayerPrivilegeDTO p : privileges) { + if (p.getPrivilegeTemplateID().equals(privilege.getId())) { + p = p.setAdmin(value); + if (p == null) { + Notification.error(operator, "更新玩家特权失败"); + return false; + } + return true; + } + } + Notification.error(operator, "没有找到玩家权限关联数据"); + return false; + } + if (!Apis.updateTemplateFlag(privilege, flag, value)){ + Notification.error(operator, "未知的领地权限 " + flag); + return false; + } + return true; + } + + private static PrivilegeTemplateDTO createPlayerPrivilege(Player operator, UUID player, Integer domID) { + PrivilegeTemplateDTO template = new PrivilegeTemplateDTO(player.toString(), operator.getUniqueId(), false); + template = PrivilegeTemplateDTO.insert(template); + if (template == null) { + Notification.error(operator, "创建玩家特权失败"); + return null; + } + PlayerPrivilegeDTO privilege = new PlayerPrivilegeDTO(player, false, domID, template.getId()); + privilege = PlayerPrivilegeDTO.insert(privilege); + if (privilege == null) { + Notification.error(operator, "创建玩家特权关联玩家时失败"); + PrivilegeTemplateDTO.delete(template); + return null; + } + return template; + } + + private static List getPlayerPrivilegeTemplates(UUID player, Integer domID) { + List privileges = PlayerPrivilegeDTO.select(player, domID); + List templates = new ArrayList<>(); + for (PlayerPrivilegeDTO privilege : privileges) { + PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(privilege.getPrivilegeTemplateID()); + if (template == null) continue; + if (template.getGroup()) continue; // 跳过组权限 + templates.add(template); + } + return templates; + } +} diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java index 6da13af..0f64dc0 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java @@ -22,11 +22,10 @@ public class PlayerPrivilegeDTO { return players.get(0); } - public static PlayerPrivilegeDTO select(UUID playerUUID) { - String sql = "SELECT * FROM player_privilege WHERE player_uuid = '" + playerUUID + "'"; - List players = query(sql); - if (players.size() == 0) return null; - return players.get(0); + public static List select(UUID playerUUID, Integer dom_id) { + String sql = "SELECT * FROM player_privilege WHERE player_uuid = '" + playerUUID + "' " + + "AND dom_id = " + dom_id; + return query(sql); } public static PlayerPrivilegeDTO select(Integer dom_id) { @@ -36,15 +35,15 @@ public class PlayerPrivilegeDTO { return players.get(0); } - public static PlayerPrivilegeDTO select(Integer dom_id, UUID playerUUID) { - String sql = "SELECT * FROM player_privilege WHERE dom_id = " + dom_id + " AND player_uuid = '" + playerUUID + "'"; - List players = query(sql); - if (players.size() == 0) return null; - return players.get(0); + public static void delete(UUID player, Integer domID, Integer privilegeTemplateID) { + String sql = "DELETE FROM player_privilege WHERE player_uuid = '" + player + "' " + + "AND dom_id = " + domID + " " + + "AND privilege_template_id = " + privilegeTemplateID; + query(sql); } - public static void delete(PlayerPrivilegeDTO player) { - String sql = "DELETE FROM player_privilege WHERE id = " + player.getId(); + public static void delete(UUID player) { + String sql = "DELETE FROM player_privilege WHERE player_uuid = '" + player + "'"; query(sql); } @@ -79,9 +78,9 @@ public class PlayerPrivilegeDTO { return privilegeTemplateID; } - public void setAdmin(Boolean admin) { + public PlayerPrivilegeDTO setAdmin(Boolean admin) { this.admin = admin; - update(this); + return update(this); } private PlayerPrivilegeDTO(Integer id, UUID playerUUID, Boolean admin, Integer domID, Integer privilegeTemplateID) { diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java index 7c698bd..6e9575e 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java @@ -28,6 +28,30 @@ public class PrivilegeTemplateDTO { return query(sql); } + public static List searchGroup(String name){ + String sql = "SELECT * FROM privilege_template WHERE name LIKE '%" + name + "%' AND group = true"; + return query(sql); + } + + public static List searchGroup(UUID creator){ + String sql = "SELECT * FROM privilege_template WHERE creator = '" + creator.toString() + "' AND group = true"; + return query(sql); + } + + public static PrivilegeTemplateDTO select(Integer id) { + String sql = "SELECT * FROM privilege_template WHERE id = " + id; + List templates = query(sql); + if (templates.size() == 0) return null; + return templates.get(0); + } + + public static PrivilegeTemplateDTO select(UUID creator, String name) { + String sql = "SELECT * FROM privilege_template WHERE creator = '" + creator.toString() + "' AND name = '" + name + "'"; + List templates = query(sql); + if (templates.size() == 0) return null; + return templates.get(0); + } + public static List search(String name) { String sql = "SELECT * FROM privilege_template WHERE name LIKE '%" + name + "%'"; return query(sql); @@ -43,6 +67,11 @@ public class PrivilegeTemplateDTO { query(sql); } + public static void delete(UUID creator, String name) { + String sql = "DELETE FROM privilege_template WHERE creator = '" + creator.toString() + "' AND name = '" + name + "'"; + query(sql); + } + private static PrivilegeTemplateDTO update(PrivilegeTemplateDTO privilege) { String sql = "UPDATE privilege_template SET " + "name = '" + privilege.getName() + "', " + diff --git a/src/main/java/cn/lunadeer/dominion/utils/Database.java b/src/main/java/cn/lunadeer/dominion/utils/Database.java index d8beab9..f0d899f 100644 --- a/src/main/java/cn/lunadeer/dominion/utils/Database.java +++ b/src/main/java/cn/lunadeer/dominion/utils/Database.java @@ -143,6 +143,7 @@ public class Database { " trade BOOLEAN NOT NULL DEFAULT FALSE," + " vehicle_destroy BOOLEAN NOT NULL DEFAULT FALSE," + " harvest BOOLEAN NOT NULL DEFAULT FALSE," + + " UNIQUE (name, creator)," + " FOREIGN KEY (creator) REFERENCES player_name(uuid)" + ")"; diff --git a/src/main/java/cn/lunadeer/dominion/utils/STUI/Pagination.java b/src/main/java/cn/lunadeer/dominion/utils/STUI/Pagination.java index 8d4aac3..4aa361d 100644 --- a/src/main/java/cn/lunadeer/dominion/utils/STUI/Pagination.java +++ b/src/main/java/cn/lunadeer/dominion/utils/STUI/Pagination.java @@ -6,7 +6,8 @@ import net.kyori.adventure.text.TextComponent; import java.util.ArrayList; import java.util.List; -import static cn.lunadeer.dominion.utils.STUI.ViewStyles.*; +import static cn.lunadeer.dominion.utils.STUI.ViewStyles.main_color; +import static cn.lunadeer.dominion.utils.STUI.ViewStyles.sub_color; public class Pagination { diff --git a/src/main/java/cn/lunadeer/dominion/utils/STUI/View.java b/src/main/java/cn/lunadeer/dominion/utils/STUI/View.java index c704d01..ac1037f 100644 --- a/src/main/java/cn/lunadeer/dominion/utils/STUI/View.java +++ b/src/main/java/cn/lunadeer/dominion/utils/STUI/View.java @@ -7,7 +7,7 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; -import static cn.lunadeer.dominion.utils.STUI.ViewStyles.*; +import static cn.lunadeer.dominion.utils.STUI.ViewStyles.main_color; public class View { protected TextComponent title_decorate = Component.text("━", main_color); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 994bb50..343f455 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,3 +4,8 @@ main: cn.lunadeer.dominion.Dominion api-version: '1.20' load: STARTUP folia-supported: true +commands: + Dominion: + description: 领地插件命令 + usage: /dominion + aliases: [dominion, dom] \ No newline at end of file