引入remove功能

This commit is contained in:
2024-12-20 05:01:56 +08:00
parent a9bfb32db0
commit 6715fbf1b7

View File

@@ -14,16 +14,19 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;
import org.jetbrains.annotations.NotNull;
import org.jooq.impl.DSL;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static ling.database.tables.LocationnotepadTB.LOCATIONNOTEPAD;
/// zb命令处理器
public class ZbCommand implements CommandExecutor, TabCompleter {
protected final static List<String> TAB_1 = Arrays.asList("add", "remove", "help", "reload");
protected final static List<String> TAB_1 = Arrays.asList("add", "remove", "help", "reload", "list");
public ZbCommand() {
@@ -53,14 +56,62 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
return;
}
try {
if (data.addLocation(name, isFixed))
player.sendMessage("坐标记录完毕!");
if (data.addLocation(name, isFixed)) player.sendMessage("坐标记录完毕!");
} catch (SQLException e) {
CoordinateRecorder.getCurrent().getLogger().severe("记录坐标出错:" + e.getMessage());
player.sendMessage(ChatColor.RED + "服务器内部错误:记录数据失败");
}
}
protected void list(Player player, String[] strings) throws SQLException {
if (strings.length > 2) {
player.sendMessage(ChatColor.RED + "命令过长");
return;
}
PlayerData data = PlayerMap.getCurrent().getPlayerData(player);
if (data == null) {
player.sendMessage(ChatColor.RED + "玩家未登录");
return;
}
int page = 1;
if (strings.length == 2) {
try {
page = Integer.parseInt(strings[1]);
if (page < 1) {
player.sendMessage(ChatColor.RED + "Page小于1");
}
} catch (NumberFormatException e) {
player.sendMessage(ChatColor.RED + strings[1] + "无法解析为数字!");
}
}
final int PAGE_SIZE = 8;
//开始查询数据
var ctx = CoordinateRecorder.getDatabase().getDSL();
Integer count = ctx.select(DSL.count()).from(LOCATIONNOTEPAD)
.where(LOCATIONNOTEPAD.UID.eq(player.getUniqueId().toString())
.and(LOCATIONNOTEPAD.ISDELETE.eq(false)))
.fetchOne(DSL.count());
assert count != null;
int pageCount = (count / PAGE_SIZE) + (count % PAGE_SIZE == 0 ? 0 : 1);
if (pageCount < page) {
player.sendMessage(ChatColor.RED + "没有第" + page + "页数据");
return;
}
List<LocationnotepadPO> result = ctx.select().from(LOCATIONNOTEPAD)
.where(LOCATIONNOTEPAD.UID.eq(player.getUniqueId().toString()).and(LOCATIONNOTEPAD.ISDELETE.eq(false)))
.orderBy(LOCATIONNOTEPAD.ID.asc())
.limit(PAGE_SIZE).offset(PAGE_SIZE * (page - 1)).fetch().into(LocationnotepadPO.class);
player.sendMessage("共查询到" + result.size() + "条结果:");
for (LocationnotepadPO po : result) {
player.sendMessage(po.getName() + " X " + po.getX() + " Y " + po.getY() + " Z " + po.getZ());
}
player.sendMessage("当前第" + page + "页,共" + pageCount + "");
}
protected void remove(Player player, String[] strings) {
if (strings.length > 2) {
player.sendMessage(ChatColor.RED + "命令过长");
@@ -76,8 +127,7 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
return;
}
try {
if (data.removeLocation(strings[1]))
player.sendMessage("操作完成");
if (data.removeLocation(strings[1])) player.sendMessage("操作完成");
} catch (SQLException e) {
CoordinateRecorder.getCurrent().getLogger().severe("移除坐标出错:" + e.getMessage());
player.sendMessage(ChatColor.RED + "服务器内部错误:移除数据失败");
@@ -92,18 +142,10 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
bookMeta.setGeneration(BookMeta.Generation.COPY_OF_COPY);
bookMeta.setTitle("帮助信息");
bookMeta.setAuthor("StarPoles");
bookMeta.addPage("欢迎使用坐标管理器!你好," + player.getName() + "\n\n" +
"本书将向你介绍如何使用指令记录曾探索过的地点,以避免迷路\n" +
"如果需要再次查看帮助信息,请使用 /zb help\n",
"/zb add <地点名称> <固定到侧边栏> \n" +
"记录当前地点到数据库中,例如\n" +
"/zb add Home\n" +
"将会记录当前的位置,取名为 Home并固定到屏幕右侧\n",
"如果不想固定到屏幕右侧,可以像这样使用\n" +
"/zb add Home false\n" +
"然后,你可以使用/zb list来查看已经保存的位置\n" +
"使用/zb fixed <Name> 来将地点固定到屏幕右侧\n" +
"使用/zb unfixed <Name> 来取消固定。\n");
bookMeta.addPage(
"欢迎使用坐标管理器!你好," + player.getName() + "\n\n" + "本书将向你介绍如何使用指令记录曾探索过的地点,以避免迷路\n" + "如果需要再次查看帮助信息,请使用 /zb help\n",
"/zb add <地点名称> <固定到侧边栏> \n" + "记录当前地点到数据库中,例如\n" + "/zb add Home\n" + "将会记录当前的位置,取名为 Home并固定到屏幕右侧\n",
"如果不想固定到屏幕右侧,可以像这样使用\n" + "/zb add Home false\n" + "然后,你可以使用/zb list来查看已经保存的位置\n" + "使用/zb fixed <Name> 来将地点固定到屏幕右侧\n" + "使用/zb unfixed <Name> 来取消固定。\n");
book.setItemMeta(bookMeta);
player.openBook(book);
@@ -142,6 +184,9 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
case "reload":
reload(player, strings);
break;
case "list":
list(player, strings);
break;
}
} catch (SQLException e) {
player.sendMessage(ChatColor.RED + "服务器内部错误,请联系管理员");
@@ -151,8 +196,8 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
}
@Override
public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command,
@NotNull String s, @NotNull String[] strings) {
public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s,
@NotNull String[] strings) {
assert s.equals("zb");
if (!(commandSender instanceof Player player)) {
System.out.println("该命令只能由玩家执行");
@@ -163,8 +208,7 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
protected List<String> onRemoveTab(Player player, String latest, String[] strings) {
var data = PlayerMap.getCurrent().getPlayerData(player);
if (data == null)
return List.of();
if (data == null) return List.of();
List<String> list = new ArrayList<>();
List<LocationnotepadPO> poList = data.getLocationList();
for (LocationnotepadPO locationnotepadPO : poList) {
@@ -182,11 +226,12 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
if (strings.length != 0) {
latest = strings[strings.length - 1];
}
if (strings.length == 1)
return filter(latest, new ArrayList<>(TAB_1));
if (strings.length == 1) return filter(latest, new ArrayList<>(TAB_1));
if (strings.length == 2) {
if (strings[0].equals("remove")) {
return onRemoveTab(player, latest, strings);
} else if (strings[0].equals("list")) {
return List.of("<页码>");
}
}
return List.of();