From df812863d095e1e4351d16c08c8e78e22e5d8dbb Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Tue, 21 May 2024 11:36:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E5=AF=B9=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E5=8A=9F=E8=83=BD=E9=87=8D=E5=86=99=E5=90=8E=E7=9A=84?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +- .../miniplayertitle/commands/Apis.java | 2 +- .../miniplayertitle/commands/TitleManage.java | 7 ++- .../commands/TitleShopSale.java | 28 +++++---- .../miniplayertitle/dtos/PlayerInfoDTO.java | 17 ++---- .../miniplayertitle/dtos/PlayerTitleDTO.java | 21 +++++-- .../miniplayertitle/dtos/TitleShopDTO.java | 6 +- .../miniplayertitle/tuis/AllTitles.java | 3 + .../miniplayertitle/tuis/MyTitles.java | 8 ++- .../miniplayertitle/tuis/SaleInfo.java | 12 ++-- .../miniplayertitle/utils/DatabaseTables.java | 58 +++++++++---------- 11 files changed, 93 insertions(+), 73 deletions(-) diff --git a/pom.xml b/pom.xml index a2800f8..ad52f3e 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ lunadeer-repo - https://ssl.lunadeer.cn:14454/repository/maven-public/ + https://ssl.lunadeer.cn:14454/repository/maven-snapshots/ @@ -78,7 +78,7 @@ cn.lunadeer MinecraftPluginUtils - 1.1.8 + 1.2.0-SNAPSHOT diff --git a/src/main/java/cn/lunadeer/miniplayertitle/commands/Apis.java b/src/main/java/cn/lunadeer/miniplayertitle/commands/Apis.java index bcccb29..5d6f728 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/commands/Apis.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/commands/Apis.java @@ -21,7 +21,7 @@ public class Apis { } public static void updateName(Player player, @Nullable TitleDTO title) { - if (title == null) { + if (title == null || title.getId() == -1) { Component newDisplayName = Component.text() .append(Component.text("<")) .append(player.name()) diff --git a/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleManage.java b/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleManage.java index dab76a9..04fd479 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleManage.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleManage.java @@ -3,6 +3,7 @@ package cn.lunadeer.miniplayertitle.commands; import cn.lunadeer.miniplayertitle.MiniPlayerTitle; import cn.lunadeer.miniplayertitle.dtos.PlayerInfoDTO; import cn.lunadeer.miniplayertitle.dtos.TitleDTO; +import cn.lunadeer.miniplayertitle.tuis.AllTitles; import cn.lunadeer.miniplayertitle.tuis.MyTitles; import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; @@ -43,12 +44,16 @@ public class TitleManage { public static void deleteTitle(CommandSender sender, String[] args) { try { if (notOpOrConsole(sender)) return; - if (args.length != 2) { + if (args.length < 2) { MiniPlayerTitle.notification.warn(sender, "用法: /mplt delete_title <称号ID>"); return; } TitleDTO.delete(Integer.parseInt(args[1])); MiniPlayerTitle.notification.info(sender, "已删除称号"); + if (args.length == 3) { + int page = Integer.parseInt(args[2]); + AllTitles.show(sender, new String[]{"all_titles", String.valueOf(page)}); + } } catch (Exception e) { MiniPlayerTitle.notification.error(sender, e.getMessage()); } diff --git a/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleShopSale.java b/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleShopSale.java index 6f5dc16..a6d822c 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleShopSale.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleShopSale.java @@ -7,6 +7,8 @@ import cn.lunadeer.miniplayertitle.dtos.TitleDTO; import cn.lunadeer.miniplayertitle.dtos.TitleShopDTO; import cn.lunadeer.miniplayertitle.tuis.MyTitles; import cn.lunadeer.miniplayertitle.tuis.SaleInfo; +import cn.lunadeer.miniplayertitle.tuis.Shop; +import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -15,6 +17,7 @@ import java.util.List; import java.util.Objects; import static cn.lunadeer.miniplayertitle.commands.Apis.notOpOrConsole; +import static cn.lunadeer.miniplayertitle.tuis.Apis.getArgPage; import static cn.lunadeer.miniplayertitle.tuis.Apis.getLastArgsPage; public class TitleShopSale { @@ -119,8 +122,7 @@ public class TitleShopSale { } if (args.length == 3) { - int page = getLastArgsPage(args); - SaleInfo.show(sender, new String[]{"sale_info", args[1], String.valueOf(page)}); + Shop.show(sender, new String[]{"shop"}); } } @@ -128,8 +130,8 @@ public class TitleShopSale { * 购买商品 * mplt buy_sale <商品ID> * - * @param sender - * @param args + * @param sender CommandSender + * @param args String[] */ public static void buySale(CommandSender sender, String[] args) { if (!(sender instanceof Player)) { @@ -171,23 +173,25 @@ public class TitleShopSale { } if (had == null) { - had = PlayerTitleDTO.create(player.getUniqueId(), titleShop.getTitle(), LocalDateTime.now().plusDays(titleShop.getDays())); + had = PlayerTitleDTO.create(player.getUniqueId(), titleShop.getTitle(), titleShop.getDays() == -1 ? null : LocalDateTime.now().plusDays(titleShop.getDays())); if (had == null) { MiniPlayerTitle.notification.error(player, "购买称号时出现错误,详情请查看控制台日志"); return; } - MiniPlayerTitle.notification.info(player, "成功购买称号: " + had.getTitle().getTitleColored()); + titleShop.setAmount(titleShop.getAmount() - 1); + playerInfo.setCoin(playerInfo.getCoin() - titleShop.getPrice()); + MiniPlayerTitle.notification.info(player, Component.text("成功购买称号: ").append(had.getTitle().getTitleColored())); } else if (!had.isExpired()) { MiniPlayerTitle.notification.warn(player, "你已拥有此称号,在过期前无法再次购买"); } else { - had.setExpireAt(LocalDateTime.now().plusDays(titleShop.getDays())); - MiniPlayerTitle.notification.info(player, "成功续续期称号: " + had.getTitle().getTitleColored()); + had.setExpireAt(titleShop.getDays() == -1 ? null : LocalDateTime.now().plusDays(titleShop.getDays())); + titleShop.setAmount(titleShop.getAmount() - 1); + playerInfo.setCoin(playerInfo.getCoin() - titleShop.getPrice()); + MiniPlayerTitle.notification.info(player, Component.text("成功续续期称号: ").append(had.getTitle().getTitleColored())); } - if (args.length == 2) { - int page = getLastArgsPage(args); - MyTitles.show(sender, new String[]{"my_titles", String.valueOf(page)}); - } + int page = getArgPage(args, 3); + MyTitles.show(sender, new String[]{"my_titles", String.valueOf(page)}); } } diff --git a/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerInfoDTO.java b/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerInfoDTO.java index 5445029..9eaaf8d 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerInfoDTO.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerInfoDTO.java @@ -27,11 +27,9 @@ public class PlayerInfoDTO { String sql = ""; sql = "INSERT INTO mplt_player_info (uuid, coin) " + "VALUES ('" + uuid.toString() + "', " + MiniPlayerTitle.config.getDefaultCoin() + ") " + - "RETURNING " + - "uuid, coin, using_title_id " + - "ON CONFLICT (uuid) DO NOTHING;"; + "ON CONFLICT DO NOTHING;"; try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { - if (rs.next()) return getPlayerInfoDTO(rs); + return get(uuid); } catch (Exception e) { MiniPlayerTitle.database.handleDatabaseError("创建玩家信息失败", e, sql); } @@ -58,10 +56,7 @@ public class PlayerInfoDTO { String sql = ""; sql = "UPDATE mplt_player_info SET using_title_id = " + title.getId() + " WHERE uuid = '" + uuid.toString() + "';"; try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { - if (rs != null && rs.next()) { - using_title = title; - return true; - } + return true; } catch (Exception e) { MiniPlayerTitle.database.handleDatabaseError("设置玩家使用称号失败", e, sql); } @@ -76,10 +71,8 @@ public class PlayerInfoDTO { String sql = ""; sql = "UPDATE mplt_player_info SET coin = " + coin + " WHERE uuid = '" + uuid.toString() + "';"; try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { - if (rs != null && rs.next()) { - this.coin = coin; - return true; - } + this.coin = coin; + return true; } catch (Exception e) { MiniPlayerTitle.database.handleDatabaseError("设置玩家金币失败", e, sql); } diff --git a/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerTitleDTO.java b/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerTitleDTO.java index e4f115e..d8fb9ca 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerTitleDTO.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerTitleDTO.java @@ -2,6 +2,7 @@ package cn.lunadeer.miniplayertitle.dtos; import cn.lunadeer.miniplayertitle.MiniPlayerTitle; +import javax.annotation.Nullable; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDateTime; @@ -33,8 +34,11 @@ public class PlayerTitleDTO { public boolean setExpireAt(LocalDateTime dateTime) { String sql = ""; - sql += "UPDATE mplt_player_title SET expire_at_y = " + dateTime.getYear() + ", expire_at_m = " + dateTime.getMonthValue() + ", expire_at_d = " + dateTime.getDayOfMonth() + " " + - "WHERE id = " + id + ";"; + if (dateTime == null) { + sql += "UPDATE mplt_player_title SET expire_at_y = -1, expire_at_m = -1, expire_at_d = -1 WHERE id = " + id + ";"; + } else { + sql += "UPDATE mplt_player_title SET expire_at_y = " + dateTime.getYear() + ", expire_at_m = " + dateTime.getMonthValue() + ", expire_at_d = " + dateTime.getDayOfMonth() + " WHERE id = " + id + ";"; + } try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { return true; } catch (Exception e) { @@ -43,11 +47,16 @@ public class PlayerTitleDTO { return false; } - public static PlayerTitleDTO create(UUID player_uuid, TitleDTO title, LocalDateTime expire_at) { + public static PlayerTitleDTO create(UUID player_uuid, TitleDTO title, @Nullable LocalDateTime expire_at) { String sql = ""; - sql += "INSERT INTO mplt_player_title (player_uuid, title_id, expire_at_y, expire_at_m, expire_at_d) " + - "VALUES ('" + player_uuid.toString() + "', " + title.getId() + ", " + expire_at.getYear() + ", " + expire_at.getMonthValue() + ", " + expire_at.getDayOfMonth() + ") " + - "RETURNING " + + sql += "INSERT INTO mplt_player_title (player_uuid, title_id, expire_at_y, expire_at_m, expire_at_d) "; + + if (expire_at == null) { + sql += "VALUES ('" + player_uuid.toString() + "', " + title.getId() + ", -1, -1, -1) "; + } else { + sql += "VALUES ('" + player_uuid.toString() + "', " + title.getId() + ", " + expire_at.getYear() + ", " + expire_at.getMonthValue() + ", " + expire_at.getDayOfMonth() + ") "; + } + sql += "RETURNING " + "id, player_uuid, title_id, expire_at_y, expire_at_m, expire_at_d;"; try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { if (rs.next()) { diff --git a/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleShopDTO.java b/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleShopDTO.java index bdfb6bb..eefe554 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleShopDTO.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleShopDTO.java @@ -96,7 +96,8 @@ public class TitleShopDTO { public static TitleShopDTO get(Integer id) { String sql = ""; - sql += "SELECT id, title_id, price, days, amount, sale_end_at FROM mplt_title_shop WHERE id = " + id + ";"; + sql += "SELECT id, title_id, price, days, amount, sale_end_at_y, sale_end_at_m, sale_end_at_d " + + "FROM mplt_title_shop WHERE id = " + id + ";"; try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { if (rs.next()) { return getTitleShop(rs); @@ -109,7 +110,8 @@ public class TitleShopDTO { public static List getAll() { String sql = ""; - sql += "SELECT id, title_id, price, days, amount, sale_end_at FROM mplt_title_shop;"; + sql += "SELECT id, title_id, price, days, amount, sale_end_at_y, sale_end_at_m, sale_end_at_d " + + "FROM mplt_title_shop;"; List titleShops = new ArrayList<>(); try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { while (rs != null && rs.next()) { diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/AllTitles.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/AllTitles.java index 5be372a..35e8796 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/tuis/AllTitles.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/AllTitles.java @@ -26,6 +26,9 @@ public class AllTitles { .append("所有称号")); for (TitleDTO title : titles) { + if (title.getId() == -1){ + continue; + } Line line = Line.create() .append(title.getId().toString()) .append(title.getTitleColored()); diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/MyTitles.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/MyTitles.java index ccf676d..11cc344 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/tuis/MyTitles.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/MyTitles.java @@ -38,8 +38,12 @@ public class MyTitles { continue; } Line line = Line.create() - .append(title.getTitle().getTitleColored()) - .append("有效期至: " + title.getExpireAt().getYear() + "年" + title.getExpireAt().getMonthValue() + "月" + title.getExpireAt().getDayOfMonth() + "日"); + .append(title.getTitle().getTitleColored()); + if (title.getExpireAt() == null) { + line.append("永久"); + } else { + line.append("有效期至: " + title.getExpireAt().getYear() + "年" + title.getExpireAt().getMonthValue() + "月" + title.getExpireAt().getDayOfMonth() + "日"); + } if (Objects.equals(playerInfo.getUsingTitle().getId(), title.getId())) { line.append(Button.createRed("卸下").setExecuteCommand("/mplt use_title -1 " + page).build()); } else { diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/SaleInfo.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/SaleInfo.java index 9300577..40b9296 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/tuis/SaleInfo.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/SaleInfo.java @@ -99,11 +99,11 @@ public class SaleInfo { } } else { if (player.isOp()) { - end_at.append(Button.create("<<").setHoverText("提前10天").setExecuteCommand("/mplt set_sale less_end_at " + titleShop.getId() + " 10 " + page).build()); - end_at.append(Button.create("-").setHoverText("提前1天").setExecuteCommand("/mplt set_sale less_end_at " + titleShop.getId() + " 1 " + page).build()); + end_at.append(Button.create("<<").setPreSufIx("", "").setHoverText("提前10天").setExecuteCommand("/mplt set_sale less_end_at " + titleShop.getId() + " 10 " + page).build()); + end_at.append(Button.create("-").setPreSufIx("", "").setHoverText("提前1天").setExecuteCommand("/mplt set_sale less_end_at " + titleShop.getId() + " 1 " + page).build()); end_at.append(titleShop.getSaleEndAt().getYear() + "年" + titleShop.getSaleEndAt().getMonthValue() + "月" + titleShop.getSaleEndAt().getDayOfMonth() + "日"); - end_at.append(Button.create("+").setHoverText("延后1天").setExecuteCommand("/mplt set_sale more_end_at " + titleShop.getId() + " 1 " + page).build()); - end_at.append(Button.create(">>").setHoverText("延后10天").setExecuteCommand("/mplt set_sale more_end_at " + titleShop.getId() + " 10 " + page).build()); + end_at.append(Button.create("+").setPreSufIx("", "").setHoverText("延后1天").setExecuteCommand("/mplt set_sale more_end_at " + titleShop.getId() + " 1 " + page).build()); + end_at.append(Button.create(">>").setPreSufIx("", "").setHoverText("延后10天").setExecuteCommand("/mplt set_sale more_end_at " + titleShop.getId() + " 10 " + page).build()); end_at.append(Button.create("转为常驻").setExecuteCommand("/mplt set_sale end_at " + titleShop.getId() + " -1:-1:-1 " + page).build()); } else { end_at.append(titleShop.getSaleEndAt().getYear() + "年" + titleShop.getSaleEndAt().getMonthValue() + "月" + titleShop.getSaleEndAt().getDayOfMonth() + "日"); @@ -120,8 +120,10 @@ public class SaleInfo { operate.append(Button.createGreen("购买").setExecuteCommand("/mplt buy_sale " + titleShop.getId()).build()); } if (player.isOp()) { - operate.append(Button.create("删除").setExecuteCommand("/mplt delete_sale " + args[1] + " " + page).build()); + operate.append(Button.create("删除").setExecuteCommand("/mplt delete_sale " + args[1] + " b").build()); } + view.add(Line.create().append("---------------------")); + view.add(operate); view.showOn(player, page); } } diff --git a/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java b/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java index 4240c62..4a60ba6 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java @@ -56,23 +56,6 @@ public class DatabaseTables { ");"; MiniPlayerTitle.database.query(sql); - sql = "INSERT INTO mplt_title (" + - "id, " + - "title, " + - "description," + - "enabled, " + - "created_at, " + - "updated_at " + - ") VALUES (" + - "-1, " + - "'default', " + - "'default', " + - "TRUE, " + - "CURRENT_TIMESTAMP, " + - "CURRENT_TIMESTAMP " + - ") ON CONFLICT (id) DO NOTHING;"; - MiniPlayerTitle.database.query(sql); - MiniPlayerTitle.database.deleteColumnIfExists("mplt_title", "created_at"); MiniPlayerTitle.database.deleteColumnIfExists("mplt_title", "updated_at"); MiniPlayerTitle.database.deleteColumnIfExists("mplt_title", "enabled"); @@ -89,24 +72,39 @@ public class DatabaseTables { MiniPlayerTitle.database.addColumnIfNotExists("mplt_title_shop", "sale_end_at_y", "INTEGER NOT NULL DEFAULT -1"); MiniPlayerTitle.database.addColumnIfNotExists("mplt_title_shop", "sale_end_at_m", "INTEGER NOT NULL DEFAULT -1"); MiniPlayerTitle.database.addColumnIfNotExists("mplt_title_shop", "sale_end_at_d", "INTEGER NOT NULL DEFAULT -1"); - // convert sale_end_at(YYYYMMDD) to sale_end_at_y, sale_end_at_m, sale_end_at_d - sql = "UPDATE mplt_title_shop SET " + - "sale_end_at_y = (sale_end_at / 10000), " + - "sale_end_at_m = (sale_end_at % 10000 / 100), " + - "sale_end_at_d = (sale_end_at % 100) " + - "WHERE sale_end_at != -1;"; - MiniPlayerTitle.database.query(sql); + // convert sale_end_at(YYYYMMDD) to sale_end_at_y, sale_end_at_m, sale_end_at_d if sale_end_at column exists + if (MiniPlayerTitle.database.isColumnExist("mplt_title_shop", "sale_end_at")) { + sql = "UPDATE mplt_title_shop SET " + + "sale_end_at_y = (sale_end_at / 10000), " + + "sale_end_at_m = (sale_end_at % 10000 / 100), " + + "sale_end_at_d = (sale_end_at % 100) " + + "WHERE sale_end_at != -1;"; + MiniPlayerTitle.database.query(sql); + } MiniPlayerTitle.database.deleteColumnIfExists("mplt_title_shop", "sale_end_at"); MiniPlayerTitle.database.addColumnIfNotExists("mplt_player_title", "expire_at_y", "INTEGER NOT NULL DEFAULT -1"); MiniPlayerTitle.database.addColumnIfNotExists("mplt_player_title", "expire_at_m", "INTEGER NOT NULL DEFAULT -1"); MiniPlayerTitle.database.addColumnIfNotExists("mplt_player_title", "expire_at_d", "INTEGER NOT NULL DEFAULT -1"); - sql = "UPDATE mplt_player_title SET " + - "expire_at_y = (expire_at / 10000), " + - "expire_at_m = (expire_at % 10000 / 100), " + - "expire_at_d = (expire_at % 100) " + - "WHERE expire_at != -1;"; - MiniPlayerTitle.database.query(sql); + if (MiniPlayerTitle.database.isColumnExist("mplt_player_title", "expire_at")) { + sql = "UPDATE mplt_player_title SET " + + "expire_at_y = (expire_at / 10000), " + + "expire_at_m = (expire_at % 10000 / 100), " + + "expire_at_d = (expire_at % 100) " + + "WHERE expire_at != -1;"; + MiniPlayerTitle.database.query(sql); + } MiniPlayerTitle.database.deleteColumnIfExists("mplt_player_title", "expire_at"); + + sql = "INSERT INTO mplt_title (" + + "id, " + + "title, " + + "description " + + ") VALUES (" + + "-1, " + + "'default', " + + "'default' " + + ") ON CONFLICT (id) DO NOTHING;"; + MiniPlayerTitle.database.query(sql); } }