finish main controller some command api

This commit is contained in:
zhangyuheng 2024-02-06 17:42:02 +08:00
parent f2dfe0c6a1
commit ee967fbb4d
14 changed files with 856 additions and 43 deletions

View File

@ -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<UUID, List<Location>> pointsSelect = new HashMap<>();
}

View File

@ -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);
}
}

View File

@ -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<Location> 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);
}
}
}

View File

@ -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<PlayerPrivilegeDTO> 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<DominionDTO> 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;
}
}

View File

@ -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<DominionDTO> 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<DominionDTO> 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<DominionDTO> 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<DominionDTO> 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;
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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<PlayerPrivilegeDTO> privileges = PlayerPrivilegeDTO.select(player, dominion.getId());
List<PrivilegeTemplateDTO> 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<PrivilegeTemplateDTO> 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<PlayerPrivilegeDTO> 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<PrivilegeTemplateDTO> getPlayerPrivilegeTemplates(UUID player, Integer domID) {
List<PlayerPrivilegeDTO> privileges = PlayerPrivilegeDTO.select(player, domID);
List<PrivilegeTemplateDTO> 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;
}
}

View File

@ -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<PlayerPrivilegeDTO> players = query(sql);
if (players.size() == 0) return null;
return players.get(0);
public static List<PlayerPrivilegeDTO> 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<PlayerPrivilegeDTO> 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) {

View File

@ -28,6 +28,30 @@ public class PrivilegeTemplateDTO {
return query(sql);
}
public static List<PrivilegeTemplateDTO> searchGroup(String name){
String sql = "SELECT * FROM privilege_template WHERE name LIKE '%" + name + "%' AND group = true";
return query(sql);
}
public static List<PrivilegeTemplateDTO> 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<PrivilegeTemplateDTO> 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<PrivilegeTemplateDTO> templates = query(sql);
if (templates.size() == 0) return null;
return templates.get(0);
}
public static List<PrivilegeTemplateDTO> 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() + "', " +

View File

@ -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)" +
")";

View File

@ -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 {

View File

@ -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);

View File

@ -4,3 +4,8 @@ main: cn.lunadeer.dominion.Dominion
api-version: '1.20'
load: STARTUP
folia-supported: true
commands:
Dominion:
description: 领地插件命令
usage: /dominion <cmd>
aliases: [dominion, dom]