diff --git a/src/main/java/cn/lunadeer/miniplayertitle/Commands.java b/src/main/java/cn/lunadeer/miniplayertitle/Commands.java index c135298..7e7ad5e 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/Commands.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/Commands.java @@ -1,280 +1,60 @@ package cn.lunadeer.miniplayertitle; -import cn.lunadeer.minecraftpluginutils.stui.View; -import cn.lunadeer.minecraftpluginutils.stui.ViewStyles; -import cn.lunadeer.minecraftpluginutils.stui.components.Button; -import cn.lunadeer.minecraftpluginutils.stui.components.Line; -import cn.lunadeer.miniplayertitle.commands.AdminCommands; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.event.ClickEvent; +import cn.lunadeer.miniplayertitle.commands.TitleShopSale; +import cn.lunadeer.miniplayertitle.tuis.*; +import cn.lunadeer.miniplayertitle.tuis.Shop; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; -import static cn.lunadeer.miniplayertitle.commands.PlayerCommands.*; - public class Commands implements TabExecutor { - /** - * Executes the given command, returning its success. - *
- * If false is returned, then the "usage" plugin.yml entry for this command - * (if defined) will be sent to the player. - * - * @param sender Source of the command - * @param command Command which was executed - * @param label Alias of the command which was used - * @param args Passed command arguments - * @return true if a valid command, otherwise false - */ + @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - switch (label) { - case "mplt": - if (args.length == 0) { - home_view(sender); - return true; - } - switch (args[0]) { - case "use": - use(sender, args); - return true; - case "list": - list(sender, args); - return true; - case "shop": - shop(sender, args); - return true; - case "buy": - buy(sender, args); - return true; - case "custom": - custom(sender, args); - return true; - case "custominfo": - custom_info(sender); - return true; - case "create": - AdminCommands.createTitle(sender, args); - return true; - case "delete": - AdminCommands.deleteTitle(sender, args); - return true; - case "setdesc": - AdminCommands.setTitleDescription(sender, args); - return true; - case "setname": - AdminCommands.setTitleName(sender, args); - return true; - case "addshop": - AdminCommands.addShop(sender, args); - return true; - case "removeshop": - AdminCommands.removeShop(sender, args); - return true; - case "setprice": - AdminCommands.setPrice(sender, args); - return true; - case "setamount": - AdminCommands.setAmount(sender, args); - return true; - case "setendat": - AdminCommands.setSaleEndAt(sender, args); - return true; - case "listall": - AdminCommands.listAllTitle(sender, args); - return true; - case "addcoin": - AdminCommands.addCoin(sender, args); - return true; - case "setcoin": - AdminCommands.setCoin(sender, args); - return true; - default: - printHelp(sender); - return true; - } + if (args.length == 0) { + Menu.show(sender, args); + return true; + } + switch (args[0]) { + case "menu": + Menu.show(sender, args); + break; + case "all_titles": + AllTitles.show(sender, args); + break; + case "my_titles": + MyTitles.show(sender, args); + break; + case "shop": + Shop.show(sender, args); + break; + case "custom_info": + CustomInfo.show(sender, args); + break; + case "sale_info": + SaleInfo.show(sender, args); + break; + case "create_sale": + TitleShopSale.createSale(sender, args); + break; + case "set_sale": + TitleShopSale.setSale(sender, args); + break; + case "delete_sale": + TitleShopSale.deleteSale(sender, args); + break; default: return false; } + return true; } - private static void printHelp(@NotNull CommandSender sender) { - if (sender instanceof Player) { - Player player = (Player) sender; - MiniPlayerTitle.notification.warn(player, "用法: /mplt "); - if (player.isOp()) { - MiniPlayerTitle.notification.warn(player, "用法: /mplt "); - } - } else { - MiniPlayerTitle.logger.info("用法: /mplt "); - MiniPlayerTitle.logger.info("用法: /mplt "); - } - } - - public static void home_view(CommandSender sender) { - if (!(sender instanceof Player)) { - printHelp(sender); - return; - } - View view = View.create(); - view.title("称号系统"); - Line line_1 = Line.create(); - line_1.append(Component.text("当前版本:")); - line_1.append(Component.text(MiniPlayerTitle.instance.getPluginMeta().getVersion())); - Line line_2 = Line.create(); - line_2.append(Component.text("帮助文档:")); - line_2.append(Component.text("[点击在浏览器中打开]").clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, "https://ssl.lunadeer.cn:14446/zhangyuheng/MiniPlayerTitle"))); - Component backpack = Button.create("称号背包").setExecuteCommand("/mplt list").build(); - Component shop = Button.create("称号商店").setExecuteCommand("/mplt shop").build(); - Component custom = Button.create("自定义称号").setExecuteCommand("/mplt custominfo").build(); - Line line = Line.create(); - line.append(backpack).append(shop).append(custom); - view.actionBar(line).addLine(line_1).addLine(line_2); - view.showOn((Player) sender); - } - - private void custom_info(CommandSender sender) { - if (!(sender instanceof Player)) { - printHelp(sender); - return; - } - Player player = (Player) sender; - View view = View.create(); - view.title("自定义称号帮助"); - view.subtitle("当前余额: " + XPlayer.getCoin(player) + "称号币"); - Line line_1 = Line.create(); - line_1.append("当前自定义称号状态:") - .append(MiniPlayerTitle.config.isEnableCustom() ? - Component.text("开启", ViewStyles.success_color) : - Component.text("关闭", ViewStyles.error_color)); - Line line_2 = Line.create(); - line_2.append("自定义称号花费:") - .append(MiniPlayerTitle.config.getCustomCost().toString()); - Line line_3 = Line.create(); - line_3.append("自定义方法:") - .append(Component.text("在聊天框输入 /mplt custom <称号>")); - Line line_4 = Line.create(); - line_4.append("可以使用 Minecraft渐变颜色生成器 来生成具有渐变效果的称号") - .append(Component.text("[点击在浏览器中打开生成器]", ViewStyles.action_color) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, "https://ssl.lunadeer.cn:14440/"))); - Line line_5 = Line.create(); - line_5.append("最大长度(不含颜色代码):") - .append(MiniPlayerTitle.config.getMaxLength().toString()); - view.addLine(line_1) - .addLine(line_2) - .addLine(line_5) - .addLine(line_3) - .addLine(line_4); - view.showOn(player); - } - - /** - * Requests a list of possible completions for a command argument. - * - * @param sender Source of the command. For players tab-completing a - * command inside a command block, this will be the player, not - * the command block. - * @param command Command which was executed - * @param label Alias of the command which was used - * @param args The arguments passed to the command, including final - * partial argument to be completed - * @return A List of possible completions for the final argument, or null - * to default to the command executor - */ @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if (args.length == 1) { - String[] player_cmd = {"use", "list", "shop", "buy", "custom", "custominfo"}; - String[] admin_cmd = {"create", "delete", "setdesc", "setname", "addshop", "removeshop", "setprice", "setamount", "setendat", "listall", "addcoin", "setcoin"}; - List res = new ArrayList<>(); - if (sender instanceof Player) { - Player player = (Player) sender; - if (player.isOp()) { - res.addAll(Arrays.asList(player_cmd)); - res.addAll(Arrays.asList(admin_cmd)); - } else { - res.addAll(Arrays.asList(player_cmd)); - } - } else { - res.addAll(Arrays.asList(player_cmd)); - res.addAll(Arrays.asList(admin_cmd)); - } - return res; - } - if (args.length == 2) { - switch (args[0]) { - case "use": - return Collections.singletonList("要使用的称号ID"); - case "custom": - return Collections.singletonList("自定义称号"); - case "list": - case "shop": - case "listall": - return Collections.singletonList("页数(可选)"); - case "buy": - return Collections.singletonList("要购买的条目ID"); - case "create": - return Collections.singletonList("<称号名称> <称号描述>"); - case "delete": - case "addshop": - return Collections.singletonList("<称号ID>"); - case "setdesc": - return Collections.singletonList("<称号ID> <称号描述>"); - case "setname": - return Collections.singletonList("<称号ID> <称号名称>"); - case "removeshop": - return Collections.singletonList("<商品ID>"); - case "setprice": - return Collections.singletonList("<商品ID> <价格> <天数>(-1为永久)"); - case "setamount": - return Collections.singletonList("<商品ID> <数量>(-1为无限)"); - case "setendat": - return Collections.singletonList("<商品ID> <结束时间YYYYMMDD>(-1为永久)"); - case "addcoin": - case "setcoin": - // return player list - List res = new ArrayList<>(); - for (Player player : MiniPlayerTitle.instance.getServer().getOnlinePlayers()) { - res.add(player.getName()); - } - return res; - default: - return Arrays.asList("use", "list", "shop", "buy"); - } - } - if (args.length == 3) { - switch (args[0]) { - case "addcoin": - case "setcoin": - return Collections.singletonList("<金币数量>"); - case "create": - case "setdesc": - return Collections.singletonList("<称号描述>"); - case "setname": - return Collections.singletonList("<称号名称>"); - case "setprice": - return Collections.singletonList("<价格> <天数>(-1为永久)"); - case "setamount": - return Collections.singletonList("<数量>(-1为无限)"); - case "setendat": - return Collections.singletonList("<结束时间YYYYMMDD>(-1为永久)"); - } - } - if (args.length == 4) { - if (args[0].equals("setprice")) { - return Collections.singletonList("<天数>(-1为永久)"); - } - } - return Arrays.asList("use", "list", "shop", "buy", "custom", "custominfo"); + return null; } - - } diff --git a/src/main/java/cn/lunadeer/miniplayertitle/Events.java b/src/main/java/cn/lunadeer/miniplayertitle/Events.java index a8d8be9..9140e51 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/Events.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/Events.java @@ -1,5 +1,6 @@ package cn.lunadeer.miniplayertitle; +import cn.lunadeer.miniplayertitle.dtos.PlayerInfoDTO; import io.papermc.paper.event.player.AsyncChatEvent; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; @@ -12,8 +13,7 @@ public class Events implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Player bukkitPlayer = event.getPlayer(); - XPlayer player = new XPlayer(bukkitPlayer); - Commands.home_view(bukkitPlayer); + PlayerInfoDTO player = PlayerInfoDTO.get(bukkitPlayer.getUniqueId()); player.updateName(); } diff --git a/src/main/java/cn/lunadeer/miniplayertitle/Title.java b/src/main/java/cn/lunadeer/miniplayertitle/Title.java deleted file mode 100644 index 328612d..0000000 --- a/src/main/java/cn/lunadeer/miniplayertitle/Title.java +++ /dev/null @@ -1,192 +0,0 @@ -package cn.lunadeer.miniplayertitle; - -import cn.lunadeer.minecraftpluginutils.stui.ListView; -import cn.lunadeer.minecraftpluginutils.stui.components.Line; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.event.HoverEvent; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.ResultSet; -import java.util.ArrayList; -import java.util.List; - -public class Title { - protected Integer _id = null; - protected String _title; - protected String _description; - protected Boolean _enabled; - - public static Title create(String title, String description) { - String sql = ""; - sql += "INSERT INTO mplt_title (title, description, enabled) VALUES ("; - sql += "'" + title + "', "; - sql += "'" + description + "', "; - sql += "true "; - sql += ") RETURNING id;"; - try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { - if (rs != null && rs.next()) { - int titleId = rs.getInt("id"); - return new Title(titleId); - } - } catch (Exception e) { - MiniPlayerTitle.logger.err("Title create failed: " + e.getMessage()); - } - return null; - } - - public static List all() { - List<Title> titles = new ArrayList<>(); - String sql = ""; - sql += "SELECT id FROM mplt_title;"; - try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { - if (rs != null) { - while (rs.next()) { - Integer id = rs.getInt("id"); - titles.add(new Title(id)); - } - } - } catch (Exception e) { - MiniPlayerTitle.logger.err("Title all failed: " + e.getMessage()); - } - return titles; - } - - public static void listAllTitle(CommandSender sender, Integer page) { - List<Title> titles = all(); - if (!(sender instanceof Player)) { - for (Title title : titles) { - Component idx = Component.text("[" + title.getId() + "]"); - MiniPlayerTitle.notification.info(sender, idx.append(title.getTitle())); - } - return; - } - Player player = (Player) sender; - ListView view = ListView.create(5, "/mplt listall"); - view.title("所有称号"); - for (Title title : titles) { - TextComponent idx = Component.text("[" + title.getId() + "] "); - Line line = Line.create(); - line.append(idx).append(title.getTitle()); - view.add(line); - } - view.showOn(player, page); - } - - public Title(Integer id) { - this._id = id; - String sql = ""; - sql += "SELECT id, title, description, enabled "; - sql += "FROM mplt_title "; - sql += "WHERE id = " + id + ";"; - try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { - if (rs != null && rs.next()) { - this._title = rs.getString("title"); - this._description = rs.getString("description"); - this._enabled = rs.getBoolean("enabled"); - } - } catch (Exception e) { - MiniPlayerTitle.logger.err("Title load failed: " + e.getMessage()); - } - } - - public static void delete(Integer id) { - String sql = ""; - sql += "DELETE FROM mplt_title WHERE id = " + id + ";"; - MiniPlayerTitle.database.query(sql); - } - - private void save() { - String sql = ""; - if (this._id == null) { - sql += "INSERT INTO mplt_title (title, description, enabled) VALUES ("; - sql += "'" + this._title + "', "; - sql += "'" + this._description + "', "; - sql += this._enabled + " "; - sql += ");"; - } else { - sql += "UPDATE mplt_title SET "; - sql += "title = '" + this._title + "', "; - sql += "description = '" + this._description + "', "; - sql += "enabled = " + this._enabled + " "; - sql += "WHERE id = " + this._id + ";"; - } - MiniPlayerTitle.database.query(sql); - } - - public Integer getId() { - return this._id; - } - - public TextComponent getTitle() { - TextComponent prefix = Component.text(MiniPlayerTitle.config.getPrefix()); - TextComponent suffix = Component.text(MiniPlayerTitle.config.getSuffix()); - String[] parts = this._title.split("&#"); - List<TextComponent> components = new ArrayList<>(); - components.add(prefix); - for (String part : parts) { - if (part.isEmpty()) { - continue; - } - // match hex regx ^[0-9a-fA-F]{6}$ - Color color = new Color("#ffffff"); - String content; - if (part.length() > 6 && part.substring(0, 6).matches("^[0-9a-fA-F]{6}$")) { - String color_str = part.substring(0, 6); - color = new Color("#" + color_str); - content = part.substring(6); - } else { - content = part; - } - components.add(Component.text(content, color.getStyle())); - } - components.add(suffix); - TextComponent.Builder title_component = Component.text(); - for (TextComponent component : components) { - title_component.append(component); - } - return title_component.build().hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text(this._description))); - } - - public String getTitleContent() { - String[] parts = this._title.split("&#"); - StringBuilder res = new StringBuilder(); - for (String part : parts) { - if (part.isEmpty()) { - continue; - } - String content; - if (part.length() > 6 && part.substring(0, 6).matches("^[0-9a-fA-F]{6}$")) { - content = part.substring(6); - } else { - content = part; - } - res.append(content); - } - return res.toString(); - } - - public void setTitle(String title) { - this._title = title; - this.save(); - } - - public String getDescription() { - return this._description; - } - - public void setDescription(String description) { - this._description = description; - this.save(); - } - - public Boolean getEnabled() { - return this._enabled; - } - - public void setEnabled(Boolean enabled) { - this._enabled = enabled; - this.save(); - } -} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/commands/AdminCommands.java b/src/main/java/cn/lunadeer/miniplayertitle/commands/AdminCommands.java deleted file mode 100644 index 97327d8..0000000 --- a/src/main/java/cn/lunadeer/miniplayertitle/commands/AdminCommands.java +++ /dev/null @@ -1,319 +0,0 @@ -package cn.lunadeer.miniplayertitle.commands; - -import cn.lunadeer.miniplayertitle.MiniPlayerTitle; -import cn.lunadeer.miniplayertitle.SaleTitle; -import cn.lunadeer.miniplayertitle.Title; -import cn.lunadeer.miniplayertitle.XPlayer; -import net.kyori.adventure.text.Component; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -public class AdminCommands { - public static void createTitle(CommandSender sender, String[] args) { - if (sender instanceof org.bukkit.entity.Player) { - Player player = (org.bukkit.entity.Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - if (args.length != 3) { - MiniPlayerTitle.notification.warn(sender, "用法: /mplt create <称号名称> <称号描述>"); - return; - } - Title title = Title.create(args[1], args[2]); - if (title != null) { - MiniPlayerTitle.notification.info(sender, Component.text("成功创建称号: [" + title.getId() + "]").append(title.getTitle())); - } else { - MiniPlayerTitle.notification.error(sender, "创建称号失败"); - } - } - - public static void deleteTitle(CommandSender sender, String[] args) { - try { - if (sender instanceof org.bukkit.entity.Player) { - Player player = (org.bukkit.entity.Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - if (args.length != 2) { - MiniPlayerTitle.notification.warn(sender, "用法: /mplt delete <称号ID>"); - return; - } - Title.delete(Integer.parseInt(args[1])); - MiniPlayerTitle.notification.info(sender, "已删除称号"); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, e.getMessage()); - } - } - - public static void listAllTitle(CommandSender sender, String[] args) { - try { - if (sender instanceof Player) { - Player player = (Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - int page = 1; - if (args.length == 2) { - try { - page = Integer.parseInt(args[1]); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, "页数格式错误"); - return; - } - } - Title.listAllTitle(sender, page); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, e.getMessage()); - } - } - - public static void setTitleDescription(CommandSender sender, String[] args) { - try { - if (sender instanceof org.bukkit.entity.Player) { - Player player = (org.bukkit.entity.Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - if (args.length != 3) { - MiniPlayerTitle.notification.warn(sender, "用法: /mplt setdesc <称号ID> <称号描述>"); - return; - } - Title title = new Title(Integer.parseInt(args[1])); - title.setDescription(args[2]); - MiniPlayerTitle.notification.info(sender, "已设置称号描述"); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, e.getMessage()); - } - } - - public static void setTitleName(CommandSender sender, String[] args) { - try { - if (sender instanceof org.bukkit.entity.Player) { - Player player = (org.bukkit.entity.Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - if (args.length != 3) { - MiniPlayerTitle.notification.warn(sender, "用法: /mplt setname <称号ID> <称号名称>"); - return; - } - Title title = new Title(Integer.parseInt(args[1])); - title.setTitle(args[2]); - MiniPlayerTitle.notification.info(sender, "已设置称号名称"); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, e.getMessage()); - } - } - - public static void addShop(CommandSender sender, String[] args) { - try { - if (sender instanceof org.bukkit.entity.Player) { - Player player = (org.bukkit.entity.Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - if (args.length != 2) { - MiniPlayerTitle.notification.warn(sender, "用法: /mplt addshop <称号ID>"); - return; - } - SaleTitle title = SaleTitle.create(Integer.parseInt(args[1])); - if (title == null) { - MiniPlayerTitle.notification.error(sender, "添加商品失败"); - } else { - MiniPlayerTitle.notification.info(sender, "已添加称号到商店, 商品ID: " + title.getSaleId()); - MiniPlayerTitle.notification.info(sender, title.getTitle()); - } - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, e.getMessage()); - } - } - - public static void removeShop(CommandSender sender, String[] args) { - try { - if (sender instanceof org.bukkit.entity.Player) { - Player player = (org.bukkit.entity.Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - if (args.length != 2) { - MiniPlayerTitle.notification.warn(sender, "用法: /mplt removeshop <商品ID>"); - return; - } - SaleTitle.delete(Integer.parseInt(args[1])); - MiniPlayerTitle.notification.info(sender, "已从商店移除商品"); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, e.getMessage()); - } - } - - public static void setPrice(CommandSender sender, String[] args) { - try { - if (sender instanceof org.bukkit.entity.Player) { - Player player = (org.bukkit.entity.Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - if (args.length != 4) { - MiniPlayerTitle.notification.warn(sender, "用法: /mplt setprice <商品ID> <价格> <天数>(-1为永久)"); - return; - } - int price; - int days; - int id; - try { - price = Integer.parseInt(args[2]); - days = Integer.parseInt(args[3]); - id = Integer.parseInt(args[1]); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, "价格或天数格式错误"); - return; - } - if (price < 0 || days < -1) { - MiniPlayerTitle.notification.error(sender, "价格或天数格式错误"); - return; - } - SaleTitle.setPrice(id, price); - SaleTitle.setDays(id, days); - MiniPlayerTitle.notification.info(sender, "已设置商品价格"); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, e.getMessage()); - } - } - - public static void setAmount(CommandSender sender, String[] args) { - try { - if (sender instanceof org.bukkit.entity.Player) { - Player player = (org.bukkit.entity.Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - if (args.length != 3) { - MiniPlayerTitle.notification.warn(sender, "用法: /mplt setamount <商品ID> <数量>(-1为无限)"); - return; - } - int amount; - int id; - try { - amount = Integer.parseInt(args[2]); - id = Integer.parseInt(args[1]); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, "数量格式错误"); - return; - } - SaleTitle.setAmount(id, amount); - MiniPlayerTitle.notification.info(sender, "已设置商品数量"); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, e.getMessage()); - } - } - - public static void setSaleEndAt(CommandSender sender, String[] args) { - try { - if (sender instanceof org.bukkit.entity.Player) { - Player player = (org.bukkit.entity.Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - if (args.length != 3) { - MiniPlayerTitle.notification.warn(sender, "用法: /mplt setendat <商品ID> <时间YYYYMMDD>(-1为永久)"); - return; - } - long time_stamp; - try { - time_stamp = Long.parseLong(args[2]); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, "时间格式错误"); - return; - } - - SaleTitle.setSaleEndAt(Integer.parseInt(args[1]), time_stamp); - MiniPlayerTitle.notification.info(sender, "已设置商品结束时间"); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, e.getMessage()); - } - } - - public static void addCoin(CommandSender sender, String[] args) { - try { - if (sender instanceof Player) { - Player player = (Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - if (args.length != 3) { - MiniPlayerTitle.notification.warn(sender, "用法: /mplt addcoin <玩家> <数量>"); - return; - } - Player target = sender.getServer().getPlayer(args[1]); - if (target == null) { - MiniPlayerTitle.notification.error(sender, "玩家不在线"); - return; - } - int amount; - try { - amount = Integer.parseInt(args[2]); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, "数量格式错误"); - return; - } - new XPlayer(target).add_coin(amount); - MiniPlayerTitle.notification.info(sender, "已给予玩家 " + target.getName() + " " + amount + " 称号币"); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, e.getMessage()); - } - } - - public static void setCoin(CommandSender sender, String[] args) { - try { - if (sender instanceof Player) { - Player player = (Player) sender; - if (!player.isOp()) { - MiniPlayerTitle.notification.warn(player, "你没有权限执行该命令"); - return; - } - } - if (args.length != 3) { - MiniPlayerTitle.notification.warn(sender, "用法: /mplt setcoin <玩家> <数量>"); - return; - } - Player target = sender.getServer().getPlayer(args[1]); - if (target == null) { - MiniPlayerTitle.notification.error(sender, "玩家不在线"); - return; - } - int amount; - try { - amount = Integer.parseInt(args[2]); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, "数量格式错误"); - return; - } - new XPlayer(target).set_coin(amount); - MiniPlayerTitle.notification.info(sender, "已设置玩家 " + target.getName() + " 称号币为 " + amount); - } catch (Exception e) { - MiniPlayerTitle.notification.error(sender, e.getMessage()); - } - } -} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/commands/Apis.java b/src/main/java/cn/lunadeer/miniplayertitle/commands/Apis.java new file mode 100644 index 0000000..37b7c32 --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/commands/Apis.java @@ -0,0 +1,18 @@ +package cn.lunadeer.miniplayertitle.commands; + +import cn.lunadeer.miniplayertitle.MiniPlayerTitle; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class Apis { + public static boolean notOpOrConsole(CommandSender sender) { + if (sender instanceof Player) { + Player player = (Player) sender; + if (!player.isOp()) { + MiniPlayerTitle.notification.warn(player, "你没有权限使用此命令"); + return true; + } + } + return false; + } +} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleManage.java b/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleManage.java new file mode 100644 index 0000000..8d4610d --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleManage.java @@ -0,0 +1,112 @@ +package cn.lunadeer.miniplayertitle.commands; + +import cn.lunadeer.miniplayertitle.MiniPlayerTitle; +import cn.lunadeer.miniplayertitle.dtos.TitleDTO; +import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; + +import static cn.lunadeer.miniplayertitle.commands.Apis.notOpOrConsole; + +public class TitleManage { + /** + * 创建称号 + * mplt create_title <称号名称> <称号描述> + * + * @param sender CommandSender + * @param args String[] + */ + public static void createTitle(CommandSender sender, String[] args) { + if (notOpOrConsole(sender)) return; + if (args.length != 3) { + MiniPlayerTitle.notification.warn(sender, "用法: /mplt create_title <称号名称> <称号描述>"); + return; + } + TitleDTO title = TitleDTO.create(args[1], args[2]); + if (title != null) { + MiniPlayerTitle.notification.info(sender, Component.text("成功创建称号: [" + title.getId() + "]").append(title.getTitleColored())); + } else { + MiniPlayerTitle.notification.error(sender, "创建称号失败,具体请查看控制台日志"); + } + } + + /** + * 删除称号 + * mplt delete_title <称号ID> + * + * @param sender CommandSender + * @param args String[] + */ + public static void deleteTitle(CommandSender sender, String[] args) { + try { + if (notOpOrConsole(sender)) return; + if (args.length != 2) { + MiniPlayerTitle.notification.warn(sender, "用法: /mplt delete_title <称号ID>"); + return; + } + TitleDTO.delete(Integer.parseInt(args[1])); + MiniPlayerTitle.notification.info(sender, "已删除称号"); + } catch (Exception e) { + MiniPlayerTitle.notification.error(sender, e.getMessage()); + } + } + + /** + * 设置称号名称 + * mplt set_title <称号ID> <称号名称> + * + * @param sender CommandSender + * @param args String[] + */ + public static void setTitle(CommandSender sender, String[] args) { + try { + if (notOpOrConsole(sender)) return; + if (args.length != 3) { + MiniPlayerTitle.notification.warn(sender, "用法: /mplt set_title <称号ID> <称号名称>"); + return; + } + TitleDTO title = TitleDTO.get(Integer.parseInt(args[1])); + if (title == null) { + MiniPlayerTitle.notification.error(sender, "称号不存在"); + return; + } + boolean success = title.updateTitle(args[2]); + if (success) { + MiniPlayerTitle.notification.info(sender, "已更新称号名称"); + } else { + MiniPlayerTitle.notification.error(sender, "更新称号名称失败,具体请查看控制台日志"); + } + } catch (Exception e) { + MiniPlayerTitle.notification.error(sender, e.getMessage()); + } + } + + /** + * 设置称号描述 + * mplt set_desc <称号ID> <称号描述> + * + * @param sender CommandSender + * @param args String[] + */ + public static void setTitleDescription(CommandSender sender, String[] args) { + try { + if (notOpOrConsole(sender)) return; + if (args.length != 3) { + MiniPlayerTitle.notification.warn(sender, "用法: /mplt set_desc <称号ID> <称号描述>"); + return; + } + TitleDTO title = TitleDTO.get(Integer.parseInt(args[1])); + if (title == null) { + MiniPlayerTitle.notification.error(sender, "称号不存在"); + return; + } + boolean success = title.updateDescription(args[2]); + if (success) { + MiniPlayerTitle.notification.info(sender, "已更新称号描述"); + } else { + MiniPlayerTitle.notification.error(sender, "更新称号描述失败,具体请查看控制台日志"); + } + } 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 new file mode 100644 index 0000000..fa37b19 --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleShopSale.java @@ -0,0 +1,121 @@ +package cn.lunadeer.miniplayertitle.commands; + +import cn.lunadeer.miniplayertitle.MiniPlayerTitle; +import cn.lunadeer.miniplayertitle.dtos.TitleDTO; +import cn.lunadeer.miniplayertitle.dtos.TitleShopDTO; +import cn.lunadeer.miniplayertitle.tuis.SaleInfo; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.miniplayertitle.commands.Apis.notOpOrConsole; +import static cn.lunadeer.miniplayertitle.tuis.Apis.getLastArgsPage; + +public class TitleShopSale { + + /** + * 设置商品信息 + * mplt set_sale <price|days|amount|end_at|end_at_y|end_at_m|end_at_d> <商品ID> <值> [页数] + * + * @param sender CommandSender + * @param args String[] + */ + public static void setSale(CommandSender sender, String[] args) { + if (notOpOrConsole(sender)) return; + TitleShopDTO titleShop = TitleShopDTO.get(Integer.valueOf(args[2])); + if (titleShop == null) { + MiniPlayerTitle.notification.error(sender, "获取详情时出现错误,详情请查看控制台日志"); + return; + } + boolean success; + switch (args[1]) { + case "price": + success = titleShop.setPrice(Integer.parseInt(args[3])); + break; + case "days": + success = titleShop.setDays(Integer.parseInt(args[3])); + break; + case "amount": + success = titleShop.setAmount(Integer.parseInt(args[3])); + break; + case "end_at": + String[] date = args[3].split(":"); + int year = Integer.parseInt(date[0]); + int month = Integer.parseInt(date[1]); + int day = Integer.parseInt(date[2]); + success = titleShop.setSaleEndAt(year, month, day); + break; + case "end_at_y": + success = titleShop.setSaleEndAtY(Integer.parseInt(args[3])); + break; + case "end_at_m": + success = titleShop.setSaleEndAtM(Integer.parseInt(args[3])); + break; + case "end_at_d": + success = titleShop.setSaleEndAtD(Integer.parseInt(args[3])); + break; + default: + MiniPlayerTitle.notification.warn(sender, "用法: /mplt set_sale <price|days|amount|end_at|end_at_y|end_at_m|end_at_d> <商品ID> <值> [页数]"); + return; + } + if (!success) { + MiniPlayerTitle.notification.error(sender, "设置商品信息时出现错误,详情请查看控制台日志"); + } + if (args.length == 5) { + int page = getLastArgsPage(args); + SaleInfo.show(sender, new String[]{"sale_info", args[2], String.valueOf(page)}); + } + } + + /** + * 创建商品 + * mplt create_sale <称号ID> + * + * @param sender CommandSender + * @param args String[] + */ + public static void createSale(CommandSender sender, String[] args) { + if (notOpOrConsole(sender)) return; + TitleDTO title = TitleDTO.get(Integer.parseInt(args[1])); + if (title == null) { + MiniPlayerTitle.notification.error(sender, "获取称号详情时出现错误,详情请查看控制台日志"); + return; + } + TitleShopDTO sale = TitleShopDTO.create(title); + if (sale == null) { + MiniPlayerTitle.notification.error(sender, "创建商品时出现错误,详情请查看控制台日志"); + return; + } + MiniPlayerTitle.notification.info(sender, "已创建称号商品"); + if (sender instanceof Player) { + SaleInfo.show(sender, new String[]{"sale_info", String.valueOf(sale.getId())}); + } + } + + /** + * 删除商品 + * mplt delete_sale <商品ID> [页数] + * + * @param sender CommandSender + * @param args String[] + */ + public static void deleteSale(CommandSender sender, String[] args) { + if (notOpOrConsole(sender)) return; + TitleShopDTO titleShop = TitleShopDTO.get(Integer.valueOf(args[1])); + if (titleShop == null) { + MiniPlayerTitle.notification.error(sender, "获取详情时出现错误"); + return; + } + boolean success = titleShop.delete(); + if (success) { + MiniPlayerTitle.notification.info(sender, "已删除商品"); + } else { + MiniPlayerTitle.notification.error(sender, "删除商品时出现错误,详情请查看控制台日志"); + } + + if (args.length == 3) { + int page = getLastArgsPage(args); + SaleInfo.show(sender, new String[]{"sale_info", args[1], 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 new file mode 100644 index 0000000..9bd9cf8 --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerInfoDTO.java @@ -0,0 +1,90 @@ +package cn.lunadeer.miniplayertitle.dtos; + +import cn.lunadeer.miniplayertitle.MiniPlayerTitle; +import org.jetbrains.annotations.Nullable; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.UUID; + +public class PlayerInfoDTO { + private UUID uuid; + private Integer coin; + private TitleDTO using_title; + + public static PlayerInfoDTO get(UUID uuid) { + String sql = ""; + sql = "SELECT uuid, coin, using_title_id FROM mplt_player_info WHERE uuid = '" + uuid.toString() + "';"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + if (rs.next()) return getPlayerInfoDTO(rs); + else return create(uuid); + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("获取玩家信息失败", e, sql); + } + return null; + } + + private static PlayerInfoDTO create(UUID uuid) { + 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;"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + if (rs.next()) return getPlayerInfoDTO(rs); + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("创建玩家信息失败", e, sql); + } + return null; + } + + private static PlayerInfoDTO getPlayerInfoDTO(ResultSet rs) throws SQLException { + PlayerInfoDTO playerInfoDTO = new PlayerInfoDTO(); + playerInfoDTO.uuid = UUID.fromString(rs.getString("uuid")); + playerInfoDTO.coin = rs.getInt("coin"); + playerInfoDTO.using_title = TitleDTO.get(rs.getInt("using_title_id")); + return playerInfoDTO; + } + + public Integer getCoin() { + return coin; + } + + public TitleDTO getUsingTitle() { + return using_title; + } + + public boolean setUsingTitle(TitleDTO title) { + 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; + } + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("设置玩家使用称号失败", e, sql); + } + return false; + } + + public boolean addCoin(Integer coin) { + return setCoin(this.coin + coin); + } + + public boolean setCoin(Integer coin) { + 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; + } + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("设置玩家金币失败", e, sql); + } + return false; + } + +} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleDTO.java b/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleDTO.java new file mode 100644 index 0000000..ddcf21a --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleDTO.java @@ -0,0 +1,163 @@ +package cn.lunadeer.miniplayertitle.dtos; + +import cn.lunadeer.miniplayertitle.Color; +import cn.lunadeer.miniplayertitle.MiniPlayerTitle; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.event.HoverEvent; +import org.jetbrains.annotations.Nullable; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class TitleDTO { + private int id; + private String title; + private String description; + + public static TitleDTO get(int id) { + String sql = ""; + sql += "SELECT id, title, description FROM mplt_title WHERE id = " + id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + if (rs.next()) return getTitleDTO(rs); + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("获取称号失败", e, sql); + } + return null; + } + + public static TitleDTO create(String title, String description) { + String sql = ""; + sql += "INSERT INTO mplt_title (title, description) " + + "VALUES ('" + title + "', '" + description + "') " + + "RETURNING " + + "id, title, description;"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + if (rs.next()) return getTitleDTO(rs); + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("创建称号失败", e, sql); + } + return null; + } + + public static boolean delete(int id) { + String sql = ""; + sql += "DELETE FROM mplt_title WHERE id = " + id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + if (rs != null && rs.next()) { + return true; + } + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("删除称号失败", e, sql); + } + return false; + } + + public static List<TitleDTO> getAll() { + String sql = ""; + sql += "SELECT id, title, description FROM mplt_title;"; + List<TitleDTO> titleDTOs = new ArrayList<>(); + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + while (rs.next()) { + titleDTOs.add(getTitleDTO(rs)); + } + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("获取称号列表失败", e, sql); + } + return titleDTOs; + } + + public TextComponent getTitleColored() { + TextComponent prefix = Component.text(MiniPlayerTitle.config.getPrefix()); + TextComponent suffix = Component.text(MiniPlayerTitle.config.getSuffix()); + String[] parts = this.title.split("&#"); + List<TextComponent> components = new ArrayList<>(); + components.add(prefix); + for (String part : parts) { + if (part.isEmpty()) { + continue; + } + // match hex regx ^[0-9a-fA-F]{6}$ + Color color = new Color("#ffffff"); + String content; + if (part.length() > 6 && part.substring(0, 6).matches("^[0-9a-fA-F]{6}$")) { + String color_str = part.substring(0, 6); + color = new Color("#" + color_str); + content = part.substring(6); + } else { + content = part; + } + components.add(Component.text(content, color.getStyle())); + } + components.add(suffix); + TextComponent.Builder title_component = Component.text(); + for (TextComponent component : components) { + title_component.append(component); + } + return title_component.build().hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text(this.description))); + } + + public String getTitlePlainText() { + String[] parts = this.title.split("&#"); + StringBuilder res = new StringBuilder(); + for (String part : parts) { + if (part.isEmpty()) { + continue; + } + String content; + if (part.length() > 6 && part.substring(0, 6).matches("^[0-9a-fA-F]{6}$")) { + content = part.substring(6); + } else { + content = part; + } + res.append(content); + } + return res.toString(); + } + + public Integer getId() { + return this.id; + } + + public String getDescription() { + return this.description; + } + + public boolean updateTitle(String title) { + String sql = ""; + sql += "UPDATE mplt_title SET title = '" + title + "' WHERE id = " + this.id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + if (rs != null && rs.next()) { + this.title = title; + return true; + } + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("更新称号失败", e, sql); + } + return false; + } + + public boolean updateDescription(String description) { + String sql = ""; + sql += "UPDATE mplt_title SET description = '" + description + "' WHERE id = " + this.id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + if (rs != null && rs.next()) { + this.description = description; + return true; + } + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("更新称号失败", e, sql); + } + return false; + } + + private static TitleDTO getTitleDTO(ResultSet rs) throws SQLException { + TitleDTO titleDTO = new TitleDTO(); + titleDTO.id = rs.getInt("id"); + titleDTO.title = rs.getString("title"); + titleDTO.description = rs.getString("description"); + return titleDTO; + } +} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleShopDTO.java b/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleShopDTO.java new file mode 100644 index 0000000..ee50597 --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleShopDTO.java @@ -0,0 +1,196 @@ +package cn.lunadeer.miniplayertitle.dtos; + +import cn.lunadeer.miniplayertitle.MiniPlayerTitle; + +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class TitleShopDTO { + private Integer id; + private TitleDTO title; + private Integer price; + private Integer days; + private Integer amount; + private Integer sale_end_at_y; + private Integer sale_end_at_m; + private Integer sale_end_at_d; + + public Integer getId() { + return id; + } + + public TitleDTO getTitle() { + return title; + } + + public Integer getPrice() { + return price; + } + + public boolean setPrice(int price) { + String sql = ""; + sql += "UPDATE mplt_title_shop SET price = " + price + " WHERE id = " + id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + return true; + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("设置称号商店价格失败", e, sql); + } + return false; + } + + public Integer getDays() { + return days; + } + + public boolean setDays(int days) { + String sql = ""; + sql += "UPDATE mplt_title_shop SET days = " + days + " WHERE id = " + id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + return true; + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("设置称号商店天数失败", e, sql); + } + return false; + } + + public Integer getAmount() { + return amount; + } + + public boolean setAmount(int amount) { + String sql = ""; + sql += "UPDATE mplt_title_shop SET amount = " + amount + " WHERE id = " + id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + return true; + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("设置称号商店数量失败", e, sql); + } + return false; + } + + public Integer getSaleEndAtY() { + return sale_end_at_y; + } + + public boolean setSaleEndAtY(int sale_end_at_y) { + String sql = ""; + sql += "UPDATE mplt_title_shop SET sale_end_at_y = " + sale_end_at_y + " WHERE id = " + id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + return true; + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("设置称号商店销售结束年份失败", e, sql); + } + return false; + } + + public Integer getSaleEndAtM() { + return sale_end_at_m; + } + + public boolean setSaleEndAtM(int sale_end_at_m) { + String sql = ""; + sql += "UPDATE mplt_title_shop SET sale_end_at_m = " + sale_end_at_m + " WHERE id = " + id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + return true; + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("设置称号商店销售结束月份失败", e, sql); + } + return false; + } + + public Integer getSaleEndAtD() { + return sale_end_at_d; + } + + public boolean setSaleEndAtD(int sale_end_at_d) { + String sql = ""; + sql += "UPDATE mplt_title_shop SET sale_end_at_d = " + sale_end_at_d + " WHERE id = " + id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + return true; + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("设置称号商店销售结束日期失败", e, sql); + } + return false; + } + + public boolean setSaleEndAt(int y, int m, int d) { + String sql = ""; + sql += "UPDATE mplt_title_shop SET sale_end_at_y = " + y + ", sale_end_at_m = " + m + ", sale_end_at_d = " + d + " WHERE id = " + id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + return true; + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("设置称号商店销售结束时间失败", e, sql); + } + return false; + } + + 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 + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + if (rs.next()) { + return getTitleShop(rs); + } + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("获取称号商店信息失败", e, sql); + } + return null; + } + + public static List<TitleShopDTO> getAll() { + String sql = ""; + sql += "SELECT id, title_id, price, days, amount, sale_end_at FROM mplt_title_shop;"; + List<TitleShopDTO> titleShops = new ArrayList<>(); + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + while (rs != null && rs.next()) { + TitleShopDTO titleShop = getTitleShop(rs); + titleShops.add(titleShop); + } + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("获取称号商店列表失败", e, sql); + } + return titleShops; + } + + private static TitleShopDTO getTitleShop(ResultSet rs) throws Exception { + TitleShopDTO titleShop = new TitleShopDTO(); + titleShop.id = rs.getInt("id"); + titleShop.title = TitleDTO.get(rs.getInt("title_id")); + titleShop.price = rs.getInt("price"); + titleShop.days = rs.getInt("days"); + titleShop.amount = rs.getInt("amount"); + titleShop.sale_end_at_y = rs.getInt("sale_end_at_y"); + titleShop.sale_end_at_m = rs.getInt("sale_end_at_m"); + titleShop.sale_end_at_d = rs.getInt("sale_end_at_d"); + return titleShop; + } + + public static TitleShopDTO create(TitleDTO title) { + String sql = ""; + sql += "INSERT INTO mplt_title_shop (title_id, price, days, amount, sale_end_at_y, sale_end_at_m, sale_end_at_d) " + + "VALUES (" + title.getId() + ", 0, -1, 0, -1, -1, -1) " + + "RETURNING " + + "id, title_id, price, days, amount, sale_end_at_y, sale_end_at_m, sale_end_at_d;"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + if (rs.next()) { + return getTitleShop(rs); + } + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("创建称号商店失败", e, sql); + } + return null; + } + + public boolean delete() { + String sql = ""; + sql += "DELETE FROM mplt_title_shop WHERE id = " + id + ";"; + try (ResultSet rs = MiniPlayerTitle.database.query(sql)) { + return true; + } catch (Exception e) { + MiniPlayerTitle.database.handleDatabaseError("删除称号商店失败", e, sql); + } + return false; + } + +} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/AllTitles.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/AllTitles.java new file mode 100644 index 0000000..5be372a --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/AllTitles.java @@ -0,0 +1,40 @@ +package cn.lunadeer.miniplayertitle.tuis; + +import cn.lunadeer.minecraftpluginutils.stui.ListView; +import cn.lunadeer.minecraftpluginutils.stui.components.Button; +import cn.lunadeer.minecraftpluginutils.stui.components.Line; +import cn.lunadeer.miniplayertitle.dtos.TitleDTO; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; + +import static cn.lunadeer.miniplayertitle.tuis.Apis.getLastArgsPage; +import static cn.lunadeer.miniplayertitle.tuis.Apis.playerOnly; + +public class AllTitles { + public static void show(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + int page = getLastArgsPage(args); + List<TitleDTO> titles = TitleDTO.getAll(); + + ListView view = ListView.create(10, "/mplt all_titles"); + view.title("所有称号"); + view.navigator(Line.create() + .append(Button.create("主菜单").setExecuteCommand("/mplt menu").build()) + .append("所有称号")); + + for (TitleDTO title : titles) { + Line line = Line.create() + .append(title.getId().toString()) + .append(title.getTitleColored()); + if (player.isOp()) { + line.append(Button.createRed("删除").setExecuteCommand("/mplt delete_title " + title.getId() + " " + page).build()); + line.append(Button.createGreen("创建商品").setExecuteCommand("/mplt create_sale " + title.getId()).build()); + } + view.add(line); + } + view.showOn(player, page); + } +} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/Apis.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/Apis.java new file mode 100644 index 0000000..d7fa3bb --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/Apis.java @@ -0,0 +1,36 @@ +package cn.lunadeer.miniplayertitle.tuis; + +import cn.lunadeer.miniplayertitle.MiniPlayerTitle; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class Apis { + public static Player playerOnly(CommandSender sender) { + if (!(sender instanceof Player)) { + MiniPlayerTitle.notification.error(sender, "该命令只能由玩家执行"); + return null; + } + return (Player) sender; + } + + public static int getLastArgsPage(String[] args) { + if (args.length == 0) return 1; + int page = 1; + try { + page = Integer.parseInt(args[args.length - 1]); + } catch (Exception ignored) { + } + return page; + } + + public static int getArgPage(String[] args, int pos) { + int page = 1; + if (args.length > pos - 1) { + try { + page = Integer.parseInt(args[pos - 1]); + } catch (Exception ignored) { + } + } + return page; + } +} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/CustomInfo.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/CustomInfo.java new file mode 100644 index 0000000..2fa7458 --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/CustomInfo.java @@ -0,0 +1,55 @@ +package cn.lunadeer.miniplayertitle.tuis; + +import cn.lunadeer.minecraftpluginutils.stui.ListView; +import cn.lunadeer.minecraftpluginutils.stui.components.Button; +import cn.lunadeer.minecraftpluginutils.stui.components.Line; +import cn.lunadeer.miniplayertitle.MiniPlayerTitle; +import cn.lunadeer.miniplayertitle.dtos.PlayerInfoDTO; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.miniplayertitle.tuis.Apis.getLastArgsPage; +import static cn.lunadeer.miniplayertitle.tuis.Apis.playerOnly; + +public class CustomInfo { + public static void show(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + int page = getLastArgsPage(args); + PlayerInfoDTO playerInfo = PlayerInfoDTO.get(player.getUniqueId()); + if (playerInfo == null) { + return; + } + + ListView view = ListView.create(10, "/mplt custom_info"); + view.title("自定义称号帮助"); + view.navigator(Line.create() + .append(Button.create("主菜单").setExecuteCommand("/mplt menu").build()) + .append("自定义称号")); + + Line line_1 = Line.create() + .append("称号币余额:").append(playerInfo.getCoin().toString()); + Line line_2 = Line.create() + .append("自定义称号状态:") + .append(MiniPlayerTitle.config.isEnableCustom() ? "开启" : "关闭"); + Line line_3 = Line.create() + .append("自定义称号花费:").append(MiniPlayerTitle.config.getCustomCost().toString()); + Line line_4 = Line.create() + .append("自定义称号最大长度(不含颜色代码):").append(MiniPlayerTitle.config.getMaxLength().toString()); + Line line_5 = Line.create() + .append("自定义方法:") + .append("在聊天框输入 /mplt custom <称号>"); + Line line_6 = Line.create() + .append("可以使用 Minecraft渐变颜色生成器 来生成具有渐变效果的称号") + .append(Button.create("点击在浏览器中打开生成器").setOpenURL("https://ssl.lunadeer.cn:14440/").build()); + + view.add(line_1); + view.add(line_2); + view.add(line_3); + view.add(line_4); + view.add(line_5); + view.add(line_6); + + view.showOn(player, page); + } +} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/Menu.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/Menu.java new file mode 100644 index 0000000..759f32a --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/Menu.java @@ -0,0 +1,50 @@ +package cn.lunadeer.miniplayertitle.tuis; + +import cn.lunadeer.minecraftpluginutils.stui.ListView; +import cn.lunadeer.minecraftpluginutils.stui.components.Button; +import cn.lunadeer.minecraftpluginutils.stui.components.Line; +import cn.lunadeer.miniplayertitle.MiniPlayerTitle; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.miniplayertitle.tuis.Apis.getLastArgsPage; +import static cn.lunadeer.miniplayertitle.tuis.Apis.playerOnly; + +public class Menu { + public static void show(CommandSender sender, String[] args) { + int page = getLastArgsPage(args); + + Player player = playerOnly(sender); + if (player == null) return; + Line backpack = Line.create() + .append(Button.create("称号背包").setExecuteCommand("/mplt my_titles").build()).append("查看你拥有的称号"); + Line shop = Line.create() + .append(Button.create("称号商店").setExecuteCommand("/mplt shop").build()).append("购买在售称号"); + Line custom = Line.create() + .append(Button.create("自定义称号").setExecuteCommand("/mplt custom_info").build()).append("查看如何自定义称号"); + Line manual = Line.create() + .append(Button.create("帮助文档").setOpenURL("https://ssl.lunadeer.cn:14448/doc/2/").build()).append("在浏览器打开帮助文档"); + + ListView view = ListView.create(10, "/mplt"); + view.title("称号系统") + .navigator(Line.create().append("主菜单")) + .add(backpack) + .add(shop) + .add(manual); + + if (MiniPlayerTitle.config.isEnableCustom()) { + view.add(custom); + } + + Line all = Line.create() + .append(Button.create("所有称号").setExecuteCommand("/mplt all_titles").build()).append("查看所有称号"); + + if (player.isOp()) { + view.add(Line.create().append("")); + view.add(Line.create().append("---以下选项仅OP可见---")); + view.add(all); + } + + view.showOn(player, page); + } +} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/MyTitles.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/MyTitles.java new file mode 100644 index 0000000..1497ada --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/MyTitles.java @@ -0,0 +1,16 @@ +package cn.lunadeer.miniplayertitle.tuis; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.miniplayertitle.tuis.Apis.getLastArgsPage; +import static cn.lunadeer.miniplayertitle.tuis.Apis.playerOnly; + +public class MyTitles { + public static void show(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + int page = getLastArgsPage(args); + // todo + } +} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/SaleInfo.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/SaleInfo.java new file mode 100644 index 0000000..e0bca8e --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/SaleInfo.java @@ -0,0 +1,126 @@ +package cn.lunadeer.miniplayertitle.tuis; + +import cn.lunadeer.minecraftpluginutils.stui.ListView; +import cn.lunadeer.minecraftpluginutils.stui.components.Button; +import cn.lunadeer.minecraftpluginutils.stui.components.Line; +import cn.lunadeer.minecraftpluginutils.stui.components.NumChanger; +import cn.lunadeer.miniplayertitle.MiniPlayerTitle; +import cn.lunadeer.miniplayertitle.dtos.TitleDTO; +import cn.lunadeer.miniplayertitle.dtos.TitleShopDTO; +import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.time.LocalDateTime; + +import static cn.lunadeer.miniplayertitle.tuis.Apis.*; + +public class SaleInfo { + public static void show(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + int page = getArgPage(args, 3); + TitleShopDTO titleShop = TitleShopDTO.get(Integer.valueOf(args[1])); + if (titleShop == null) { + MiniPlayerTitle.notification.error(player, "获取详情时出现错误"); + return; + } + TitleDTO title = titleShop.getTitle(); + if (title == null) { + MiniPlayerTitle.notification.error(player, "获取详情时出现错误"); + return; + } + int now_year = LocalDateTime.now().getYear(); + int now_month = LocalDateTime.now().getMonthValue(); + int now_day = LocalDateTime.now().getDayOfMonth(); + ListView view = ListView.create(10, "/mplt sale_info " + args[1]); + view.title("销售详情"); + view.navigator(Line.create() + .append(Button.create("主菜单").setExecuteCommand("/mplt menu").build()) + .append(Button.create("称号商店").setExecuteCommand("/mplt shop").build()) + .append("销售详情")); + view.add(Line.create().append("内容: ").append(titleShop.getTitle().getTitleColored())); + view.add(Line.create().append("描述: ").append(titleShop.getTitle().getDescription())); + + Line price = Line.create().append("价格: "); + if (titleShop.getPrice() <= 0) { + price.append("免费"); + if (player.isOp()) { + price.append(Button.create("设置价格").setExecuteCommand("/mplt set_sale price " + titleShop.getId() + " 100 " + page).build()); + } + } else { + if (player.isOp()) { + price.append(NumChanger.create(titleShop.getPrice(), "/mplt set_sale price " + titleShop.getId()).setPageNumber(page).build()); + price.append(Button.create("设置为免费").setExecuteCommand("/mplt set_sale price " + titleShop.getId() + " 0 " + page).build()); + } else { + price.append(titleShop.getPrice().toString()); + } + } + view.add(price); + + Line day = Line.create().append("购买天数: "); + if (titleShop.getDays() <= 0) { + day.append("永久"); + if (player.isOp()) { + day.append(Button.create("转为限时").setExecuteCommand("/mplt set_sale days " + titleShop.getId() + " 7 " + page).build()); + } + } else { + if (player.isOp()) { + day.append(NumChanger.create(titleShop.getDays(), "/mplt set_sale days " + titleShop.getId()).setPageNumber(page).build()); + day.append(Button.create("转为永久").setExecuteCommand("/mplt set_sale days " + titleShop.getId() + " -1 " + page).build()); + } else { + day.append(titleShop.getDays().toString()); + } + } + view.add(day); + + Line amount = Line.create().append("剩余数量: "); + if (titleShop.getAmount() == -1) { + amount.append("无限"); + if (player.isOp()) { + amount.append(Button.create("转为限量").setExecuteCommand("/mplt set_sale amount " + titleShop.getId() + " 0 " + page).build()); + } + } else { + + if (player.isOp()) { + amount.append(NumChanger.create(titleShop.getAmount(), "/mplt set_sale amount " + titleShop.getId()).setPageNumber(page).build()); + amount.append(Button.create("转为无限").setExecuteCommand("/mplt set_sale amount " + titleShop.getId() + " -1 " + page).build()); + } else { + amount.append(titleShop.getAmount().toString()); + } + } + view.add(amount); + + Line end_at = Line.create().append("售卖结束时间: "); + if (titleShop.getSaleEndAtY() == -1 || titleShop.getSaleEndAtM() == -1 || titleShop.getSaleEndAtD() == -1) { + end_at.append("常驻"); + if (player.isOp()) { + end_at.append(Button.create("转为限时").setExecuteCommand("/mplt set_sale end_at " + titleShop.getId() + " " + now_year + ":" + now_month + ":" + now_day + " " + page).build()); + } + } else { + if (player.isOp()) { + end_at.append(NumChanger.create(titleShop.getSaleEndAtY(), "/mplt set_sale end_at_y " + titleShop.getId()).setPageNumber(page).build().append(Component.text("年"))); + end_at.append(NumChanger.create(titleShop.getSaleEndAtM(), "/mplt set_sale end_at_m " + titleShop.getId()).setPageNumber(page).build().append(Component.text("月"))); + end_at.append(NumChanger.create(titleShop.getSaleEndAtD(), "/mplt set_sale end_at_d " + titleShop.getId()).setPageNumber(page).build().append(Component.text("日"))); + end_at.append(Button.create("转为常驻").setExecuteCommand("/mplt set_sale end_at " + titleShop.getId() + " -1:-1:-1 " + page).build()); + } else { + end_at.append(titleShop.getSaleEndAtY() + "年" + titleShop.getSaleEndAtM() + "月" + titleShop.getSaleEndAtD() + "日"); + } + } + view.add(end_at); + + Line operate = Line.create().append("操作: "); + if (titleShop.getSaleEndAtY() != -1 && titleShop.getSaleEndAtM() != -1 && titleShop.getSaleEndAtD() != -1 + && (now_year > titleShop.getSaleEndAtY() || (now_year == titleShop.getSaleEndAtY() && now_month > titleShop.getSaleEndAtM()) || (now_year == titleShop.getSaleEndAtY() && now_month == titleShop.getSaleEndAtM() && now_day > titleShop.getSaleEndAtD()))) { + operate.append(Button.createRed("已过期").build()); + } else if (titleShop.getAmount() == 0) { + operate.append(Button.createRed("已售罄").build()); + } else { + operate.append(Button.createGreen("购买").setExecuteCommand("/mplt buy_title " + args[1]).build()); + } + if (player.isOp()) { + operate.append(Button.create("删除").setExecuteCommand("/mplt delete_sale " + args[1] + " " + page).build()); + } + view.showOn(player, page); + } +} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/Shop.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/Shop.java new file mode 100644 index 0000000..f95c438 --- /dev/null +++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/Shop.java @@ -0,0 +1,45 @@ +package cn.lunadeer.miniplayertitle.tuis; + +import cn.lunadeer.minecraftpluginutils.stui.ListView; +import cn.lunadeer.minecraftpluginutils.stui.components.Button; +import cn.lunadeer.minecraftpluginutils.stui.components.Line; +import cn.lunadeer.miniplayertitle.MiniPlayerTitle; +import cn.lunadeer.miniplayertitle.dtos.TitleDTO; +import cn.lunadeer.miniplayertitle.dtos.TitleShopDTO; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; + +import static cn.lunadeer.miniplayertitle.tuis.Apis.getLastArgsPage; +import static cn.lunadeer.miniplayertitle.tuis.Apis.playerOnly; + +public class Shop { + public static void show(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + int page = getLastArgsPage(args); + List<TitleShopDTO> titles = TitleShopDTO.getAll(); + + ListView view = ListView.create(10, "/mplt shop"); + view.title("称号商店"); + view.navigator(Line.create() + .append(Button.create("主菜单").setExecuteCommand("/mplt menu").build()) + .append("称号商店")); + + for (TitleShopDTO title : titles) { + if (title == null) { + continue; + } + if (title.getTitle().getId() == -1) { + continue; + } + Line line = Line.create() + .append(title.getTitle().getTitleColored()) + .append(Button.createGreen("详情").setExecuteCommand("/mplt sale_info " + title.getId()).build()); + view.add(line); + } + + view.showOn(player, page); + } +} diff --git a/src/main/java/cn/lunadeer/miniplayertitle/utils/ConfigManager.java b/src/main/java/cn/lunadeer/miniplayertitle/utils/ConfigManager.java index abda3f5..f95486d 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/utils/ConfigManager.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/utils/ConfigManager.java @@ -119,15 +119,9 @@ public class ConfigManager { return _max_length; } - public void enableCustom(){ + public void setCustom(boolean enable) { _enable_custom = true; - _file.set("CustomCost.Enabled", true); - _plugin.saveConfig(); - } - - public void disableCustom(){ - _enable_custom = false; - _file.set("CustomCost.Enabled", false); + _file.set("CustomCost.Enabled", enable); _plugin.saveConfig(); } diff --git a/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java b/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java index 629b8d6..4240c62 100644 --- a/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java @@ -75,11 +75,38 @@ public class DatabaseTables { MiniPlayerTitle.database.deleteColumnIfExists("mplt_title", "created_at"); MiniPlayerTitle.database.deleteColumnIfExists("mplt_title", "updated_at"); + MiniPlayerTitle.database.deleteColumnIfExists("mplt_title", "enabled"); + MiniPlayerTitle.database.deleteColumnIfExists("mplt_title_shop", "created_at"); MiniPlayerTitle.database.deleteColumnIfExists("mplt_title_shop", "updated_at"); + MiniPlayerTitle.database.deleteColumnIfExists("mplt_player_info", "created_at"); MiniPlayerTitle.database.deleteColumnIfExists("mplt_player_info", "updated_at"); + MiniPlayerTitle.database.deleteColumnIfExists("mplt_player_title", "created_at"); MiniPlayerTitle.database.deleteColumnIfExists("mplt_player_title", "updated_at"); + + 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); + 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); + MiniPlayerTitle.database.deleteColumnIfExists("mplt_player_title", "expire_at"); } }