实现了成员权限模板界面

This commit is contained in:
zhangyuheng 2024-06-07 13:11:51 +08:00
parent e7900d72cd
commit ae1444c469
24 changed files with 759 additions and 207 deletions

View File

@ -6,7 +6,7 @@
<groupId>cn.lunadeer</groupId>
<artifactId>Dominion</artifactId>
<version>1.30.15-beta</version>
<version>1.31.0-beta</version>
<packaging>jar</packaging>
<name>Dominion</name>

View File

@ -2,6 +2,7 @@ package cn.lunadeer.dominion;
import cn.lunadeer.dominion.commands.*;
import cn.lunadeer.dominion.controllers.PlayerController;
import cn.lunadeer.dominion.cuis.*;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.tuis.*;
import org.bukkit.command.Command;
@ -152,21 +153,39 @@ public class Commands implements TabExecutor {
case "all_dominion":
AllDominion.show(sender, args);
break;
case "template_list":
TemplateList.show(sender, args);
break;
case "template_manage":
TemplateManage.show(sender, args);
break;
case "template_delete":
Template.deleteTemplate(sender, args);
break;
case "template_create":
Template.createTemplate(sender, args);
break;
case "template_set_flag":
Template.setTemplateFlag(sender, args);
break;
// ---=== CUI ===---
case "cui_rename":
OpenCUI.RenameDominion(sender, args);
RenameDominion.open(sender, args);
break;
case "cui_edit_join_message":
OpenCUI.EditJoinMessage(sender, args);
EditJoinMessage.open(sender, args);
break;
case "cui_edit_leave_message":
OpenCUI.EditLeaveMessage(sender, args);
EditLeaveMessage.open(sender, args);
break;
case "cui_create":
OpenCUI.CreateDominion(sender, args);
CreateDominion.open(sender, args);
break;
case "cui_create_privilege":
OpenCUI.CreatePrivilege(sender, args);
CreatePrivilege.open(sender, args);
break;
case "cui_template_create":
CreateTemplate.open(sender, args);
break;
default:
return false;

View File

@ -2,7 +2,6 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.controllers.AbstractOperator;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO;
@ -19,10 +18,10 @@ import org.bukkit.entity.Player;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Objects;
import static cn.lunadeer.dominion.DominionNode.isInDominion;
import static cn.lunadeer.dominion.commands.Apis.*;
import static cn.lunadeer.dominion.commands.Apis.autoPoints;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class DominionOperate {
/**

View File

@ -1,184 +0,0 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.controllers.AbstractOperator;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.controllers.PrivilegeController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.DominionManage;
import cn.lunadeer.dominion.tuis.DominionPrivilegeList;
import cn.lunadeer.dominion.tuis.SelectPlayer;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Map;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.autoPoints;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class OpenCUI {
private static class renameDominionCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String oldName;
public renameDominionCB(Player sender, String oldName) {
this.sender = sender;
this.oldName = oldName;
}
@Override
public void handleData(String input) {
XLogger.debug("renameDominionCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.rename(operator, oldName, input);
DominionManage.show(sender, new String[]{"manage", input});
}
}
private static class editJoinMessageCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public editJoinMessageCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("editJoinMessageCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.setJoinMessage(operator, input, dominionName);
DominionManage.show(sender, new String[]{"manage", dominionName});
}
}
private static class editLeaveMessageCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public editLeaveMessageCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("editLeaveMessageCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.setLeaveMessage(operator, input, dominionName);
DominionManage.show(sender, new String[]{"manage", dominionName});
}
}
private static class createDominionCB implements CuiTextInput.InputCallback {
private final Player sender;
public createDominionCB(Player sender) {
this.sender = sender;
}
@Override
public void handleData(String input) {
XLogger.debug("createDominionCB.run: %s", input);
autoPoints(sender);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
Map<Integer, Location> points = Dominion.pointsSelect.get(sender.getUniqueId());
if (points == null || points.get(0) == null || points.get(1) == null) {
Notification.error(sender, "自动选点失败");
return;
}
operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)){
DominionManage.show(sender, new String[]{"list"});
}
});
DominionController.create(operator, input, points.get(0), points.get(1));
}
}
private static class createPrivilegeCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public createPrivilegeCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("createPrivilegeCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
PrivilegeController.createPrivilege(operator, input, dominionName);
operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)){
DominionPrivilegeList.show(sender, new String[]{"privilege_list", dominionName});
} else {
SelectPlayer.show(sender, new String[]{"select_player_create_privilege", dominionName});
}
});
}
}
public static void RenameDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
CuiTextInput.InputCallback renameDominionCB = new renameDominionCB(player, args[1]);
CuiTextInput view = CuiTextInput.create(renameDominionCB).setText(args[1]).title("领地重命名");
view.open(player);
}
public static void EditJoinMessage(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback editJoinMessageCB = new editJoinMessageCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(editJoinMessageCB).setText(dominion.getJoinMessage()).title("编辑欢迎提示语");
view.open(player);
}
public static void EditLeaveMessage(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback editLeaveMessageCB = new editLeaveMessageCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(editLeaveMessageCB).setText(dominion.getLeaveMessage()).title("编辑离开提示语");
view.open(player);
}
public static void CreateDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
CuiTextInput.InputCallback createDominionCB = new createDominionCB(player);
CuiTextInput view = CuiTextInput.create(createDominionCB).setText("未命名领地").title("输入要创建的领地名称");
view.open(player);
}
public static void CreatePrivilege(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback createPrivilegeCB = new createPrivilegeCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(createPrivilegeCB).setText("Steve").title("输入玩家名称以添加为成员");
view.open(player);
}
}

View File

@ -0,0 +1,99 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.TemplateController;
import cn.lunadeer.dominion.tuis.TemplateList;
import cn.lunadeer.dominion.tuis.TemplateManage;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class Template {
/**
* 删除权限模板
* /dominion template_delete <模板名称> [页码]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void deleteTemplate(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length < 2) {
Notification.error(sender, "用法: /dominion template_delete <模板名称>");
return;
}
TemplateController.deleteTemplate(operator, args[1]);
String[] newArgs = new String[2];
newArgs[0] = "template_list";
if (args.length == 3) {
newArgs[1] = args[2];
} else {
newArgs[1] = "1";
}
TemplateList.show(sender, newArgs);
}
/**
* 创建权限模板
* /dominion template_create <模板名称> [页码]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void createTemplate(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length < 2) {
Notification.error(sender, "用法: /dominion template_create <模板名称>");
return;
}
TemplateController.createTemplate(operator, args[1]);
String[] newArgs = new String[2];
newArgs[0] = "template_list";
newArgs[1] = "1";
TemplateList.show(sender, newArgs);
}
/**
* 编辑模板
* /dominion template_set_flag <模板名称> <权限名称> <true/false> [页码]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void setTemplateFlag(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length < 4) {
Notification.error(sender, "用法: /dominion template_set_flag <模板名称> <权限名称> <true/false>");
return;
}
boolean value;
if (args[3].equalsIgnoreCase("true")) {
value = true;
} else if (args[3].equalsIgnoreCase("false")) {
value = false;
} else {
Notification.error(sender, "权限值必须是true或false");
return;
}
TemplateController.setTemplateFlag(operator, args[1], args[2], value);
String[] newArgs = new String[3];
newArgs[0] = "template_manage";
newArgs[1] = args[1];
if (args.length == 5) {
newArgs[2] = args[4];
} else {
newArgs[2] = "1";
}
TemplateManage.show(sender, newArgs);
}
}

View File

@ -2,8 +2,6 @@ package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.DominionNode;
import cn.lunadeer.dominion.commands.OpenCUI;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
@ -19,7 +17,8 @@ import java.util.List;
import java.util.Objects;
import static cn.lunadeer.dominion.DominionNode.isInDominion;
import static cn.lunadeer.dominion.controllers.Apis.*;
import static cn.lunadeer.dominion.controllers.Apis.getPlayerCurrentDominion;
import static cn.lunadeer.dominion.controllers.Apis.notOwner;
public class DominionController {

View File

@ -2,8 +2,6 @@ package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags;

View File

@ -5,9 +5,7 @@ import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.entity.Player;
import java.util.UUID;

View File

@ -0,0 +1,65 @@
package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import java.util.List;
public class TemplateController {
public static void createTemplate(AbstractOperator operator, String templateName) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建成功");
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建失败");
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(operator.getUniqueId());
for (PrivilegeTemplateDTO template : templates) {
if (template.getName().equals(templateName)) {
operator.setResponse(FAIL.addMessage("已经存在名为" + templateName + "的权限模板"));
return;
}
}
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.create(operator.getUniqueId(), templateName);
if (template == null) {
operator.setResponse(FAIL.addMessage("可能是数据库错误,请联系管理员"));
return;
}
operator.setResponse(SUCCESS.addMessage("成功创建名为" + templateName + "的权限模板"));
}
public static void deleteTemplate(AbstractOperator operator, String templateName) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "删除成功");
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "删除失败");
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName);
if (template == null) {
operator.setResponse(FAIL.addMessage("模板不存在"));
return;
}
if (!template.getCreator().equals(operator.getUniqueId())) {
operator.setResponse(FAIL.addMessage("这不是你的模板"));
return;
}
PrivilegeTemplateDTO.delete(operator.getUniqueId(), templateName);
operator.setResponse(SUCCESS);
}
public static void setTemplateFlag(AbstractOperator operator, String templateName, String flag_name, boolean value) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置成功");
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置失败");
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName);
if (template == null) {
operator.setResponse(FAIL.addMessage("模板不存在"));
return;
}
if (flag_name.equals("admin")) {
template.setAdmin(value);
} else {
Flag f = Flag.getFlag(flag_name);
if (f == null) {
operator.setResponse(FAIL.addMessage("未知的权限 %s", flag_name));
return;
}
template.setFlagValue(f, value);
}
operator.setResponse(SUCCESS.addMessage("成功设置模板 " + template.getName() + " 的权限 " + flag_name + "" + value));
}
}

View File

@ -0,0 +1,56 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.controllers.AbstractOperator;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.tuis.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Map;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.autoPoints;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class CreateDominion {
private static class createDominionCB implements CuiTextInput.InputCallback {
private final Player sender;
public createDominionCB(Player sender) {
this.sender = sender;
}
@Override
public void handleData(String input) {
XLogger.debug("createDominionCB.run: %s", input);
autoPoints(sender);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
Map<Integer, Location> points = Dominion.pointsSelect.get(sender.getUniqueId());
if (points == null || points.get(0) == null || points.get(1) == null) {
Notification.error(sender, "自动选点失败");
return;
}
operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)) {
DominionManage.show(sender, new String[]{"list"});
}
});
DominionController.create(operator, input, points.get(0), points.get(1));
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
CuiTextInput.InputCallback createDominionCB = new createDominionCB(player);
CuiTextInput view = CuiTextInput.create(createDominionCB).setText("未命名领地").title("输入要创建的领地名称");
view.open(player);
}
}

View File

@ -0,0 +1,58 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.AbstractOperator;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.PrivilegeController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.DominionPrivilegeList;
import cn.lunadeer.dominion.tuis.SelectPlayer;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class CreatePrivilege {
private static class createPrivilegeCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public createPrivilegeCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("createPrivilegeCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)){
DominionPrivilegeList.show(sender, new String[]{"privilege_list", dominionName});
} else {
SelectPlayer.show(sender, new String[]{"select_player_create_privilege", dominionName});
}
});
PrivilegeController.createPrivilege(operator, input, dominionName);
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback createPrivilegeCB = new createPrivilegeCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(createPrivilegeCB).setText("Steve").title("输入玩家名称以添加为成员");
view.open(player);
}
}

View File

@ -0,0 +1,41 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.TemplateController;
import cn.lunadeer.dominion.tuis.TemplateList;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class CreateTemplate {
private static class createTemplateCB implements CuiTextInput.InputCallback {
private final Player sender;
public createTemplateCB(Player sender) {
this.sender = sender;
}
@Override
public void handleData(String input) {
XLogger.debug("createTemplateCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
operator.getResponse().thenAccept(result -> {
TemplateList.show(sender, new String[]{"template_list"});
});
TemplateController.createTemplate(operator, input);
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
CuiTextInput.InputCallback createTemplateCB = new createTemplateCB(player);
CuiTextInput view = CuiTextInput.create(createTemplateCB).setText("未命名模板").title("输入模板名称");
view.open(player);
}
}

View File

@ -0,0 +1,47 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class EditJoinMessage {
private static class editJoinMessageCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public editJoinMessageCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("editJoinMessageCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.setJoinMessage(operator, input, dominionName);
DominionManage.show(sender, new String[]{"manage", dominionName});
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback editJoinMessageCB = new editJoinMessageCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(editJoinMessageCB).setText(dominion.getJoinMessage()).title("编辑欢迎提示语");
view.open(player);
}
}

View File

@ -0,0 +1,47 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class EditLeaveMessage {
private static class editLeaveMessageCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public editLeaveMessageCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("editLeaveMessageCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.setLeaveMessage(operator, input, dominionName);
DominionManage.show(sender, new String[]{"manage", dominionName});
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback editLeaveMessageCB = new editLeaveMessageCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(editLeaveMessageCB).setText(dominion.getLeaveMessage()).title("编辑离开提示语");
view.open(player);
}
}

View File

@ -0,0 +1,40 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.tuis.DominionManage;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class RenameDominion {
private static class renameDominionCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String oldName;
public renameDominionCB(Player sender, String oldName) {
this.sender = sender;
this.oldName = oldName;
}
@Override
public void handleData(String input) {
XLogger.debug("renameDominionCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.rename(operator, oldName, input);
DominionManage.show(sender, new String[]{"manage", input});
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
CuiTextInput.InputCallback renameDominionCB = new renameDominionCB(player, args[1]);
CuiTextInput view = CuiTextInput.create(renameDominionCB).setText(args[1]).title("领地重命名");
view.open(player);
}
}

View File

@ -97,6 +97,14 @@ public class PlayerPrivilegeDTO {
return update(this);
}
public PlayerPrivilegeDTO applyTemplate(PrivilegeTemplateDTO template) {
this.admin = template.getAdmin();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
this.flags.put(f, template.getFlagValue(f));
}
return update(this);
}
private PlayerPrivilegeDTO(Integer id, UUID playerUUID, Boolean admin, Integer domID, Map<Flag, Boolean> flags) {
this.id = id;
this.playerUUID = playerUUID;

View File

@ -0,0 +1,117 @@
package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Dominion;
import java.sql.ResultSet;
import java.util.*;
public class PrivilegeTemplateDTO {
private static List<PrivilegeTemplateDTO> query(String sql, Object... params) {
List<PrivilegeTemplateDTO> templates = new ArrayList<>();
try (ResultSet rs = Dominion.database.query(sql, params)) {
if (rs == null) return templates;
while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
PrivilegeTemplateDTO template = new PrivilegeTemplateDTO(
rs.getInt("id"),
UUID.fromString(rs.getString("creator")),
rs.getString("name"),
rs.getBoolean("admin"),
flags
);
templates.add(template);
}
} catch (Exception e) {
Dominion.database.handleDatabaseError("查询权限模版失败: ", e, sql);
}
return templates;
}
public static PrivilegeTemplateDTO create(UUID creator, String name) {
String sql = "INSERT INTO privilege_template (creator, name) VALUES (?, ?) RETURNING *;";
List<PrivilegeTemplateDTO> templates = query(sql, creator.toString(), name);
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 = ? AND name = ?;";
List<PrivilegeTemplateDTO> templates = query(sql, creator.toString(), name);
if (templates.size() == 0) return null;
return templates.get(0);
}
public static List<PrivilegeTemplateDTO> selectAll(UUID creator) {
String sql = "SELECT * FROM privilege_template WHERE creator = ?;";
return query(sql, creator.toString());
}
public static void delete(UUID creator, String name) {
String sql = "DELETE FROM privilege_template WHERE creator = ? AND name = ?;";
query(sql, creator.toString(), name);
}
private PrivilegeTemplateDTO(Integer id, UUID creator, String name, Boolean admin, Map<Flag, Boolean> flags) {
this.id = id;
this.creator = creator;
this.name = name;
this.admin = admin;
this.flags.putAll(flags);
}
private Integer id;
private UUID creator;
private String name;
private Boolean admin;
private final Map<Flag, Boolean> flags = new HashMap<>();
public Integer getId() {
return id;
}
public UUID getCreator() {
return creator;
}
public String getName() {
return name;
}
public Boolean getAdmin() {
return admin;
}
public Boolean getFlagValue(Flag flag) {
if (!flags.containsKey(flag)) return flag.getDefaultValue();
return flags.get(flag);
}
public PrivilegeTemplateDTO setFlagValue(Flag flag, Boolean value) {
flags.put(flag, value);
return update(this);
}
public PrivilegeTemplateDTO setAdmin(Boolean admin) {
this.admin = admin;
return update(this);
}
private static PrivilegeTemplateDTO update(PrivilegeTemplateDTO template) {
StringBuilder sql = new StringBuilder("UPDATE privilege_template SET " +
"name = ?, " +
"admin = ?, ");
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
sql.append(f.getFlagName()).append(" = ").append(template.getFlagValue(f)).append(", ");
}
sql = new StringBuilder(sql.substring(0, sql.length() - 2) + " WHERE id = ? RETURNING *;");
List<PrivilegeTemplateDTO> templates = query(sql.toString(), template.getName(), template.getAdmin(), template.getId());
if (templates.size() == 0) return null;
return templates.get(0);
}
}

View File

@ -5,14 +5,11 @@ import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.title.Title;
import net.md_5.bungee.api.ChatMessageType;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.inventory.Inventory;

View File

@ -82,5 +82,23 @@ public class DatabaseTables {
// 1.18.0
Dominion.database.addColumnIfNotExists("dominion", "tp_location", "TEXT NOT NULL DEFAULT 'default'");
// 1.31.0
sql = "CREATE TABLE IF NOT EXISTS privilege_template (" +
" id SERIAL PRIMARY KEY," +
" creator VARCHAR(36) NOT NULL," +
" name TEXT NOT NULL," +
" admin BOOLEAN NOT NULL DEFAULT FALSE," +
" UNIQUE (creator, name)," +
" FOREIGN KEY (creator) REFERENCES player_name(uuid) ON DELETE CASCADE" +
");";
Dominion.database.query(sql);
for (Flag flag : Flag.getAllPrivilegeFlags()) {
Dominion.database.addColumnIfNotExists("privilege_template",
flag.getFlagName(),
"BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue());
}
}
}

View File

@ -11,7 +11,6 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.controllers.Apis.getPlayerCurrentDominion;
public class Apis {

View File

@ -12,7 +12,6 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

View File

@ -14,12 +14,24 @@ public class Menu {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
int page = 1;
if (args.length == 2) {
try {
page = Integer.parseInt(args[1]);
} catch (Exception ignored) {
}
}
Line create = Line.create()
.append(Button.create("创建领地").setExecuteCommand("/dominion cui_create").build())
.append("以你为中心自动创建一个新的领地");
Line list = Line.create()
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append("查看我的领地");
Line template = Line.create()
.append(Button.create("权限模板").setExecuteCommand("/dominion template_list").build())
.append("成员权限模板列表");
Line help = Line.create()
.append(Button.create("指令帮助").setExecuteCommand("/dominion help").build())
.append("查看指令帮助");
@ -38,11 +50,12 @@ public class Menu {
Line reload_config = Line.create()
.append(Button.create("重载配置").setExecuteCommand("/dominion reload_config").build())
.append("重载配置文件");
ListView view = ListView.create(10, "/dominion");
ListView view = ListView.create(10, "/dominion menu");
view.title("Dominion 领地系统")
.navigator(Line.create().append("主菜单"))
.add(create)
.add(list)
.add(template)
.add(help)
.add(link);
if (player.isOp()) {
@ -53,6 +66,6 @@ public class Menu {
view.add(reload_cache);
view.add(reload_config);
}
view.showOn(player, 1);
view.showOn(player, page);
}
}

View File

@ -0,0 +1,46 @@
package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class TemplateList {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
int page = getPage(args);
ListView view = ListView.create(10, "/dominion template_list");
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId());
view.title("成员权限模板列表");
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("模板列表"));
Button create = Button.create("创建成员权限模板").setExecuteCommand("/dominion cui_template_create")
.setHoverText("创建一个新的成员权限模板");
view.add(Line.create().append(create.build()));
for (PrivilegeTemplateDTO template : templates) {
Button manage = Button.createGreen("管理").setExecuteCommand("/dominion template_manage " + template.getName());
Button delete = Button.createRed("删除").setExecuteCommand("/dominion template_delete " + template.getName());
Line line = Line.create()
.append(delete.build())
.append(manage.build())
.append(template.getName());
view.add(line);
}
view.showOn(player, page);
}
}

View File

@ -0,0 +1,73 @@
package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class TemplateManage {
// /dominion template_manage <模板名称> [页码]
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
int page = 1;
if (args.length == 3) {
try {
page = Integer.parseInt(args[2]);
} catch (Exception ignored) {
}
}
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(player.getUniqueId(), args[1]);
if (template == null) {
Notification.error(sender, "模板 %s 不存在", args[1]);
return;
}
ListView view = ListView.create(10, "/dominion template_manage " + template.getName());
view.title("模板 " + args[1] + " 权限管理");
view.navigator(Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("模板列表").setExecuteCommand("/dominion template_list").build())
.append("模板管理")
);
// /dominion template_set_flag <模板名称> <权限名称> <true/false> [页码]
if (template.getAdmin()) {
view.add(Line.create()
.append(Button.createGreen("").setExecuteCommand("/dominion template_set_flag " + template.getName() + " admin false " + page).build())
.append("管理员"));
} else {
view.add(Line.create()
.append(Button.createRed("").setExecuteCommand("/dominion template_set_flag " + template.getName() + " admin true " + page).build())
.append("管理员"));
}
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
view.add(createOption(flag, template.getFlagValue(flag), template.getName(), page));
}
view.showOn(player, page);
}
private static Line createOption(Flag flag, boolean value, String templateName, int page) {
if (value) {
return Line.create()
.append(Button.createGreen("").setExecuteCommand("/dominion template_set_flag " + templateName + " " + flag.getFlagName() + " false " + page).build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
} else {
return Line.create()
.append(Button.createRed("").setExecuteCommand("/dominion template_set_flag " + templateName + " " + flag.getFlagName() + " true " + page).build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
}
}
}