diff --git a/pom.xml b/pom.xml index 5d56f5a..a2befe2 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.34.7-beta + 1.35.0-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java index 6ab256c..7c63635 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -24,8 +24,8 @@ public class Cache { public Cache() { player_current_dominion_id = new HashMap<>(); loadDominions(); - loadPlayerPrivileges(); - loadGroup(); + loadMembers(); + loadGroups(); } /** @@ -104,71 +104,71 @@ 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 loadGroup() { - loadGroup(null); + public void loadGroups() { + loadGroups(null); } - public void loadGroup(Integer groupId) { + public void loadGroups(Integer groupId) { if (_last_update_group.get() + UPDATE_INTERVAL < System.currentTimeMillis()) { - XLogger.debug("run loadGroupExecution directly"); + XLogger.debug("run loadGroupsExecution directly"); loadGroupExecution(groupId); } else { if (_update_group_is_scheduled.get()) return; - XLogger.debug("schedule loadGroupExecution"); + 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 loadGroupExecution scheduled"); + XLogger.debug("run loadGroupsExecution scheduled"); loadGroupExecution(groupId); _update_group_is_scheduled.set(false); }, @@ -195,7 +195,7 @@ public class Cache { } recheckPlayerState = true; _last_update_group.set(System.currentTimeMillis()); - XLogger.debug("loadGroupExecution cost: %d ms", System.currentTimeMillis() - start); + XLogger.debug("loadGroupsExecution cost: %d ms", System.currentTimeMillis() - start); }); } @@ -283,7 +283,7 @@ public class Cache { player.setGlowing(false); return; } - PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion); + MemberDTO privilege = getMember(player, dominion); if (privilege != null) { if (privilege.getGroupId() == -1) { player.setGlowing(privilege.getFlagValue(Flag.GLOW)); @@ -320,7 +320,7 @@ public class Cache { player.setAllowFlight(false); return; } - PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion); + MemberDTO privilege = getMember(player, dominion); if (privilege != null) { if (privilege.getGroupId() == -1) { player.setAllowFlight(privilege.getFlagValue(Flag.FLY)); @@ -375,14 +375,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) { @@ -437,13 +437,13 @@ public class Cache { private ConcurrentHashMap id_dominions; private ConcurrentHashMap> world_dominion_tree; private ConcurrentHashMap id_groups; - private ConcurrentHashMap> player_uuid_to_privilege; // 玩家所有的特权 + 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; diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java index b63ad5f..9489e44 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java @@ -6,7 +6,7 @@ import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; 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.MemberDTO; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Teleport; @@ -374,7 +374,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/Helper.java b/src/main/java/cn/lunadeer/dominion/commands/Helper.java index e291c14..862f5e0 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/Helper.java +++ b/src/main/java/cn/lunadeer/dominion/commands/Helper.java @@ -55,8 +55,8 @@ public class Helper { if (dominion == null) return players_name; GroupDTO group = GroupDTO.select(dominion.getId(), groupName); if (group == null) return players_name; - List privileges = PlayerPrivilegeDTO.selectByDomGroupId(dominion.getId(), group.getId()); - for (PlayerPrivilegeDTO privilege : privileges) { + 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()); @@ -79,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/Operator.java b/src/main/java/cn/lunadeer/dominion/commands/Operator.java index 8ea0af4..52650d5 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/Operator.java +++ b/src/main/java/cn/lunadeer/dominion/commands/Operator.java @@ -28,12 +28,12 @@ public class Operator { }); Scheduler.runTaskAsync(() -> { Notification.info(sender, "正在从数据库重新加载玩家权限缓存..."); - Cache.instance.loadPlayerPrivileges(); + Cache.instance.loadMembers(); Notification.info(sender, "玩家权限缓存已重新加载"); }); Scheduler.runTaskAsync(() -> { Notification.info(sender, "正在从数据库重新加载权限组缓存..."); - Cache.instance.loadGroup(); + Cache.instance.loadGroups(); Notification.info(sender, "权限组缓存已重新加载"); }); } 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/GroupController.java b/src/main/java/cn/lunadeer/dominion/controllers/GroupController.java index 2bf1bfc..a43a556 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/GroupController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/GroupController.java @@ -151,7 +151,7 @@ public class GroupController { 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, domName)); return; @@ -198,7 +198,7 @@ public class GroupController { 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, domName)); return; diff --git a/src/main/java/cn/lunadeer/dominion/controllers/MemberController.java b/src/main/java/cn/lunadeer/dominion/controllers/MemberController.java index 872cff5..b83d9a9 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/MemberController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/MemberController.java @@ -28,7 +28,7 @@ public class MemberController { 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; @@ -37,7 +37,7 @@ public class MemberController { operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法移除一个领地管理员", dominionName)); return; } - PlayerPrivilegeDTO.delete(player.getUuid(), dominion.getId()); + MemberDTO.delete(player.getUuid(), dominion.getId()); operator.setResponse(SUCCESS); } @@ -64,7 +64,7 @@ public class MemberController { 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; @@ -100,7 +100,12 @@ public class MemberController { operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name)); return; } - PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.insert(new PlayerPrivilegeDTO(player.getUuid(), dominion)); + MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId()); + if (privilege != null) { + operator.setResponse(FAIL.addMessage("玩家 %s 已经是领地 %s 的成员", player_name, dominionName)); + return; + } + privilege = MemberDTO.insert(new MemberDTO(player.getUuid(), dominion)); if (privilege == null) { operator.setResponse(FAIL); } else { @@ -122,7 +127,7 @@ public class MemberController { 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/dtos/GroupDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/GroupDTO.java index c6a81e1..8b4060d 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/GroupDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/GroupDTO.java @@ -74,7 +74,7 @@ public class GroupDTO { try (ResultSet rs = insertRow.execute()) { List groups = getDTOFromRS(rs); if (groups.size() == 0) return null; - Cache.instance.loadGroup(groups.get(0).getId()); + Cache.instance.loadGroups(groups.get(0).getId()); return groups.get(0); } catch (Exception e) { DatabaseManager.handleDatabaseError("创建权限组失败: ", e, ""); @@ -89,9 +89,9 @@ public class GroupDTO { public static void delete(Integer id) { String sql = "DELETE FROM dominion_group WHERE id = ?;"; DatabaseManager.instance.query(sql, id); - Cache.instance.loadGroup(id); - List players = PlayerPrivilegeDTO.selectByGroupId(id); - for (PlayerPrivilegeDTO player : players) { + Cache.instance.loadGroups(id); + List players = MemberDTO.selectByGroupId(id); + for (MemberDTO player : players) { player.setGroupId(-1); } } @@ -168,7 +168,7 @@ public class GroupDTO { try (ResultSet rs = updateRow.execute()) { List groups = getDTOFromRS(rs); if (groups.size() == 0) return null; - Cache.instance.loadGroup((Integer) id.value); + Cache.instance.loadGroups((Integer) id.value); return groups.get(0); } catch (Exception e) { DatabaseManager.handleDatabaseError("更新权限组失败: ", e, ""); diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/MemberDTO.java similarity index 67% rename from src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java rename to src/main/java/cn/lunadeer/dominion/dtos/MemberDTO.java index 8d8830f..6a0814f 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/MemberDTO.java @@ -10,10 +10,10 @@ import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import java.sql.ResultSet; import java.util.*; -public class PlayerPrivilegeDTO { +public class MemberDTO { - private static List query(String sql, Object... params) { - List players = new ArrayList<>(); + 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) { @@ -22,8 +22,8 @@ public class PlayerPrivilegeDTO { return players; } - private static List getDTOFromRS(ResultSet rs) { - List players = new ArrayList<>(); + private static List getDTOFromRS(ResultSet rs) { + List players = new ArrayList<>(); if (rs == null) return players; try { while (rs.next()) { @@ -31,7 +31,7 @@ public class PlayerPrivilegeDTO { for (Flag f : Flag.getPrivilegeFlagsEnabled()) { flags.put(f, rs.getBoolean(f.getFlagName())); } - PlayerPrivilegeDTO player = new PlayerPrivilegeDTO( + MemberDTO player = new MemberDTO( rs.getInt("id"), UUID.fromString(rs.getString("player_uuid")), rs.getBoolean("admin"), @@ -47,14 +47,14 @@ public class PlayerPrivilegeDTO { return players; } - private PlayerPrivilegeDTO doUpdate(UpdateRow updateRow) { + private MemberDTO doUpdate(UpdateRow updateRow) { updateRow.returningAll(id) - .table("player_privilege") + .table("dominion_member") .where("id = ?", id.value); try (ResultSet rs = updateRow.execute()) { - List players = getDTOFromRS(rs); + List players = getDTOFromRS(rs); if (players.size() == 0) return null; - Cache.instance.loadPlayerPrivileges(getPlayerUUID()); + Cache.instance.loadMembers(getPlayerUUID()); return players.get(0); } catch (Exception e) { DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, ""); @@ -62,9 +62,9 @@ public class PlayerPrivilegeDTO { } } - public static PlayerPrivilegeDTO insert(PlayerPrivilegeDTO player) { + public static MemberDTO insert(MemberDTO player) { InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null)) - .table("player_privilege") + .table("dominion_member") .field(player.playerUUID) .field(player.admin) .field(player.domID); @@ -72,8 +72,8 @@ public class PlayerPrivilegeDTO { insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f))); } try (ResultSet rs = insertRow.execute()) { - Cache.instance.loadPlayerPrivileges(player.getPlayerUUID()); - List players = getDTOFromRS(rs); + Cache.instance.loadMembers(player.getPlayerUUID()); + List players = getDTOFromRS(rs); if (players.size() == 0) return null; return players.get(0); } catch (Exception e) { @@ -82,41 +82,41 @@ public class PlayerPrivilegeDTO { } } - 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); + 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 player_privilege WHERE dom_id = ?;"; + 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 player_privilege WHERE player_uuid = ? AND dom_id = ?;"; + String sql = "DELETE FROM dominion_member WHERE player_uuid = ? AND dom_id = ?;"; query(sql, player.toString(), domID); - Cache.instance.loadPlayerPrivileges(player); + Cache.instance.loadMembers(player); } - public static List selectAll() { - String sql = "SELECT * FROM player_privilege;"; + public static List selectAll() { + String sql = "SELECT * FROM dominion_member;"; return query(sql); } - public static List selectAll(UUID player) { - String sql = "SELECT * FROM player_privilege WHERE player_uuid = ?;"; + 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 player_privilege WHERE group_id = ?;"; + 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 player_privilege WHERE group_id = ? AND dom_id = ?;"; + 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); } @@ -153,26 +153,26 @@ public class PlayerPrivilegeDTO { return flags.get(flag); } - public PlayerPrivilegeDTO setFlagValue(Flag flag, Boolean value) { + 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 PlayerPrivilegeDTO setAdmin(Boolean admin) { + public MemberDTO setAdmin(Boolean admin) { this.admin.value = admin; UpdateRow updateRow = new UpdateRow().field(this.admin); return doUpdate(updateRow); } - public PlayerPrivilegeDTO setGroupId(Integer groupId) { + public MemberDTO setGroupId(Integer groupId) { this.groupId.value = groupId; UpdateRow updateRow = new UpdateRow().field(this.groupId); return doUpdate(updateRow); } - public PlayerPrivilegeDTO applyTemplate(PrivilegeTemplateDTO template) { + public MemberDTO applyTemplate(PrivilegeTemplateDTO template) { this.admin.value = template.getAdmin(); UpdateRow updateRow = new UpdateRow().field(admin); for (Flag f : Flag.getPrivilegeFlagsEnabled()) { @@ -182,7 +182,7 @@ public class PlayerPrivilegeDTO { return doUpdate(updateRow); } - private PlayerPrivilegeDTO(Integer id, UUID playerUUID, Boolean admin, Integer domID, Map flags, Integer groupId) { + 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; @@ -191,7 +191,7 @@ public class PlayerPrivilegeDTO { this.flags.putAll(flags); } - public PlayerPrivilegeDTO(UUID playerUUID, DominionDTO dom) { + public MemberDTO(UUID playerUUID, DominionDTO dom) { this.id.value = null; this.playerUUID.value = playerUUID.toString(); this.admin.value = false; diff --git a/src/main/java/cn/lunadeer/dominion/events/Apis.java b/src/main/java/cn/lunadeer/dominion/events/Apis.java index aaab174..35bbcc9 100644 --- a/src/main/java/cn/lunadeer/dominion/events/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/events/Apis.java @@ -5,7 +5,7 @@ import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.GroupDTO; -import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; +import cn.lunadeer.dominion.dtos.MemberDTO; import cn.lunadeer.minecraftpluginutils.Notification; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; @@ -17,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; } @@ -48,7 +48,7 @@ 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; } diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index 898d46c..3d21d3d 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -6,7 +6,6 @@ import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Teleport; -import io.papermc.paper.event.block.DragonEggFormEvent; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Tag; diff --git a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java index fd184be..ae8f391 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java @@ -1,13 +1,13 @@ package cn.lunadeer.dominion.managers; import cn.lunadeer.dominion.dtos.Flag; -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 @@ -58,23 +58,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); @@ -116,21 +128,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, "'未命名'"); @@ -152,31 +154,82 @@ 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 - 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(); + // 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 group_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); - TableColumn group_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1); - TableColumn group_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'"); - TableColumn group_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); - CreateTable.ForeignKey group_dom_id_fk = new CreateTable.ForeignKey(group_dom_id, "dominion", dominion_id, true); + 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(group_id) - .field(group_dom_id) - .field(group_name) - .field(group_admin) + .field(dominion_group_id) + .field(dominion_group_dom_id) + .field(dominion_group_name) + .field(dominion_group_admin) .foreignKey(group_dom_id_fk) - .unique(group_dom_id, group_name); + .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); + } + } } } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/Apis.java b/src/main/java/cn/lunadeer/dominion/tuis/Apis.java index 5cfee19..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; @@ -45,7 +45,7 @@ public class Apis { 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; 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 index 84f08d8..99047bb 100644 --- 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 @@ -2,8 +2,8 @@ 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.dtos.PlayerPrivilegeDTO; import cn.lunadeer.dominion.tuis.Apis; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.XLogger; @@ -72,9 +72,9 @@ public class GroupList { .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 = PlayerPrivilegeDTO.selectByGroupId(group.getId()); + List players = MemberDTO.selectByGroupId(group.getId()); XLogger.debug("players: " + players.size()); - for (PlayerPrivilegeDTO playerPrivilege : players) { + for (MemberDTO playerPrivilege : players) { PlayerDTO p = PlayerDTO.select(playerPrivilege.getPlayerUUID()); if (p == null) continue; Button remove = Button.createRed("-") 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 index 000dd75..2575148 100644 --- 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 @@ -2,8 +2,8 @@ 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.dtos.PlayerPrivilegeDTO; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.components.Button; @@ -43,8 +43,8 @@ public class SelectMember { Line sub = Line.create().append("选择成员添加到权限组 " + group.getName()) .append(Button.create("返回").setExecuteCommand("/dominion group list " + dominion.getName() + " " + backPage).build()); view.subtitle(sub); - List members = PlayerPrivilegeDTO.selectByDomGroupId(dominion.getId(), -1); - for (PlayerPrivilegeDTO member : members) { + 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() 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 index d266bd5..9646fbc 100644 --- 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 @@ -45,7 +45,7 @@ public class MemberList { int page = getPage(args, 3); ListView view = ListView.create(10, "/dominion member list " + dominion.getName()); if (noAuthToManage(player, dominion)) return; - List privileges = PlayerPrivilegeDTO.select(dominion.getId()); + List privileges = MemberDTO.select(dominion.getId()); view.title("领地 " + dominion.getName() + " 成员列表"); view.navigator( Line.create() @@ -56,7 +56,7 @@ public class MemberList { ); view.add(Line.create().append(Button.create("添加成员") .setExecuteCommand(CommandParser("/dominion member select_player %s", dominion.getName())).build())); - for (PlayerPrivilegeDTO privilege : privileges) { + for (MemberDTO privilege : privileges) { PlayerDTO p_player = PlayerDTO.select(privilege.getPlayerUUID()); if (p_player == null) continue; GroupDTO group = Cache.instance.getGroup(privilege.getGroupId()); diff --git a/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/MemberSetting.java b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/MemberSetting.java index 0a0ac8a..938787a 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/MemberSetting.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/dominion/manage/member/MemberSetting.java @@ -2,8 +2,8 @@ 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; @@ -46,7 +46,7 @@ public class MemberSetting { 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;