diff --git a/README.md b/README.md index e57e093..8b7e700 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,22 @@ ```text - _____ _ ______ _ -|_ _(_) | ___ \ | | - | | _ _ __ ___ ___| |_/ /_____ ____ _ _ __ __| | - | | | | '_ ` _ \ / _ \ // _ \ \ /\ / / _` | '__/ _` | - | | | | | | | | | __/ |\ \ __/\ V V / (_| | | | (_| | - \_/ |_|_| |_| |_|\___\_| \_\___| \_/\_/ \__,_|_| \__,_| + _______ ____ __ + /_ __(_)___ ___ ___ / __ \___ _ ______ __________/ / + / / / / __ `__ \/ _ \/ /_/ / _ \ | /| / / __ `/ ___/ __ / + / / / / / / / / / __/ _, _/ __/ |/ |/ / /_/ / / / /_/ / +/_/ /_/_/ /_/ /_/\___/_/ |_|\___/|__/|__/\__,_/_/ \__,_/ ``` # TimeReward -[![workflow](https://github.com/CarmJos/TimeReward/actions/workflows/maven.yml/badge.svg?branch=master)](https://github.com/CarmJos/TimeReward/actions/workflows/maven.yml) -![Support](https://img.shields.io/badge/Minecraft-Java%201.12--Latest-yellow) +![CodeSize](https://img.shields.io/github/languages/code-size/carm-outsource/TimeReward) +[![Download](https://img.shields.io/github/downloads/carm-outsource/TimeReward/total)](https://github.com/carm-outsource/TimeReward/releases) +[![Java CI with Maven](https://github.com/CarmJos/TimeReward/actions/workflows/maven.yml/badge.svg?branch=master)](https://github.com/CarmJos/TimeReward/actions/workflows/maven.yml) +![Support](https://img.shields.io/badge/Minecraft-Java%201.8--Latest-yellow) ![](https://visitor-badge.glitch.me/badge?page_id=TimeReward.readme) 使用数据库存储的在线时长自动领奖插件,通过指令发放奖励,基于EasyPlugin实现。 -## 插件功能 +## 功能 - 基于数据库存储的用户在线时长统计。 - **高效算法。** 在线时间不受服务器卡顿(如果有)影响。 @@ -24,18 +25,22 @@ - **轻量插件。** 适合小型服务器使用,配置简单方便。 - **规范开发。** 插件架构符合开发规范,适合新手开发者学习。 -## 插件依赖 +## [依赖](https://github.com/CarmJos/TimeReward/network/dependencies) -- **[必须]** 插件本体基于 [Spigot-API](https://hub.spigotmc.org/stash/projects/SPIGOT) 、 [BukkitAPI](http://bukkit.org/) 实现。 +- **[必须]** 插件本体基于 [Spigot-API](https://hub.spigotmc.org/stash/projects/SPIGOT) 、[BukkitAPI](http://bukkit.org/) 实现。 - **[自带]** 插件功能基于 [EasyPlugin](https://github.com/CarmJos/EasyPlugin) 实现。 - **[自带]** 数据功能基于 [EasySQL](https://github.com/CarmJos/EasySQL) 实现。 -- **[推荐]** 消息变量基于 [PlaceholderAPI](https://www.spigotmc.org/resources/6245/) 实现。 +- **[自带]** 消息格式基于 [MineDown](https://github.com/Phoenix616/MineDown) 实现。 + - 所有 messages.yml 均支持 MineDown 语法。 +- **[推荐]** 变量部分基于 [PlaceholderAPI](https://www.spigotmc.org/resources/6245/) 实现。 -详细依赖列表可见 [Dependencies](https://github.com/CarmJos/timereward/network/dependencies) 。 +详细依赖列表可见 [Dependencies](https://github.com/CarmJos/TimeReward/network/dependencies) 。 -## 插件指令 +## [指令](src/main/resources/plugin.yml) -指令主指令为 `/TimeReward` +以下指令的主指令为 `/TimeReward` 或 `/tr`。 + +- 必须参数 `<参数>` ```text # reload @@ -55,16 +60,11 @@ - 测试执行奖励配置的指令。 ``` -## 插件权限 +## 变量 (PlaceholderAPI) -```text +安装 PlaceholderAPI 后,可以输入 /papi info TimeReward 查看相关变量。 -# TimeReward.admin -- 在线时间奖励的管理权限。 - -``` - -## 插件变量 +变量如下: ```text # %TimeReward_time% @@ -77,30 +77,28 @@ - 得到玩家是否已经领取了某个奖励。 - * 也可以代表玩家是否可以领取某个奖励 - * 因为一旦可以领取就会自动领取,变为已领取状态 - ``` ## 配置文件 -### 插件配置文件 ([config.yml](src/main/resources/config.yml)) - -详见源文件。 - -### 消息配置文件 ([messages.yml](src/main/java/cc/carm/plugin/timereward/configuration/PluginMessages.java)) +### 插件配置文件 ([config.yml](src/main/java/cc/carm/plugin/timereward/conf/PluginConfig.java)) 详见代码源文件,将在首次启动时生成配置。 +### 消息配置文件 ([messages.yml](src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java)) + +支持 [MineDown 语法](https://wiki.phoenix616.dev/library:minedown:syntax),详见代码源文件,将在首次启动时生成配置。 + ## 使用统计 [![bStats](https://bstats.org/signatures/bukkit/TimeReward.svg)](https://bstats.org/plugin/bukkit/TimeReward/14505) ## 支持与捐赠 -若您觉得本插件做的不错,您可以捐赠支持我! +若您觉得本插件做的不错,您可以捐赠支持我,感谢您成为开源项目的支持者! -感谢您成为开源项目的支持者! - - +Many thanks to Jetbrains for kindly providing a license for me to work on this and other open-source projects. +[![](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](https://www.jetbrains.com/?from=https://github.com/CarmJos/UserPrefix) ## 开源协议 本项目源码采用 [GNU General Public License v3.0](https://opensource.org/licenses/GPL-3.0) 开源协议。 diff --git a/pom.xml b/pom.xml index 052a594..0e5907a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,20 +5,23 @@ 4.0.0 - 8 - ${java.version} - ${java.version} - 1.3.9 - 0.3.8 + 8 + ${project.jdk.version} + ${project.jdk.version} + UTF-8 + UTF-8 + + 1.5.2 + 0.4.6 + 2.3.3 cc.carm.plugin timereward 1.3.0 - jar TimeReward - 区域保护插件,将不符合条件的玩家弹出区域,基于EasyPlugin实现。 + 在线时长自动领奖插件,通过指令发放奖励,基于EasyPlugin实现。 https://github.com/CarmJos/TimeReward @@ -31,10 +34,6 @@ https://github.com/CarmJos/TimeReward/actions/workflows/maven.yml - - https://github.com/CarmJos/TimeReward/releases - - CarmJos @@ -45,15 +44,20 @@ - + + carm-repo + Carm's Repo + https://repo.carm.cc/repository/maven-public/ + + github GitHub Packages - https://maven.pkg.github.com/CarmJos/* + https://maven.pkg.github.com/CarmJos/${project.name} - central + maven-central https://repo1.maven.org/maven2/ @@ -61,45 +65,62 @@ nexus https://mvn.lumine.io/repository/maven-public/ - - - carm-repo - Carm's Repo - https://repo.carm.cc/repository/maven-public/ - - + + + https://github.com/CarmJos/TimeReward/releases + + github + GitHub Packages + https://maven.pkg.github.com/CarmJos/${project.name} + + - cc.carm.lib - easysql-beecp - ${easysql.version} + mineconfiguration-bukkit + ${deps.mineconfig.version} compile true - + cc.carm.lib easyplugin-main - ${easyplugin.version} + ${deps.easyplugin.version} compile true - + cc.carm.lib - easyplugin-configuration - ${easyplugin.version} + easyplugin-command + ${deps.easyplugin.version} compile true - + cc.carm.lib - githubreleases4j - 1.3.1 + easyplugin-githubchecker + ${deps.easyplugin.version} + compile + true + + + + cc.carm.lib + easysql-beecp + ${deps.easysql.version} + compile + true + + + + de.themoep + minedown + 1.7.1-SNAPSHOT compile true @@ -111,8 +132,7 @@ compile true - - + org.spigotmc spigot-api @@ -120,21 +140,13 @@ provided - - org.spigotmc - spigot - 1.12.2-R0.1-SNAPSHOT - provided - - me.clip placeholderapi - 2.10.9 + 2.11.2 provided - junit junit @@ -145,14 +157,15 @@ org.jetbrains annotations - 23.0.0 + 24.0.0 provided - + clean package + org.apache.maven.plugins @@ -177,30 +190,25 @@ - - org.apache.maven.plugins - maven-surefire-plugin - 2.22.1 - - false - - + org.apache.maven.plugins maven-compiler-plugin - 3.8.1 + 3.10.0 - ${java.version} - ${java.version} + ${project.jdk.version} + ${project.jdk.version} UTF-8 -parameters + org.apache.maven.plugins maven-jar-plugin 3.2.0 + org.apache.maven.plugins maven-source-plugin @@ -214,30 +222,41 @@ + org.apache.maven.plugins maven-shade-plugin - 3.2.3 + 3.2.4 package shade - - false - ${project.name}-${project.version} - ${project.basedir}/asset - true + ${project.basedir}/asset/ + false + + + *:* + + META-INF/MANIFEST.MF + META-INF/*.txt + + + cc.carm.lib cc.carm.plugin.timereward.lib + + de.themoep.minedown + cc.carm.plugin.moeteleport.lib.minedown + org.bstats cc.carm.plugin.timereward.lib.bstats @@ -247,18 +266,19 @@ cc.carm.plugin.timereward.lib.json - - - *:* - - META-INF/MANIFEST.MF - META-INF/*.txt - - - + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.1 + + false + src/main/resources diff --git a/src/main/java/cc/carm/plugin/timereward/Main.java b/src/main/java/cc/carm/plugin/timereward/Main.java index d2c1e13..40b7c24 100644 --- a/src/main/java/cc/carm/plugin/timereward/Main.java +++ b/src/main/java/cc/carm/plugin/timereward/Main.java @@ -1,88 +1,89 @@ package cc.carm.plugin.timereward; +import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.easyplugin.EasyPlugin; -import cc.carm.lib.easyplugin.i18n.EasyPluginMessageProvider; +import cc.carm.lib.easyplugin.updatechecker.GHUpdateChecker; import cc.carm.lib.easyplugin.utils.MessageUtils; +import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration; import cc.carm.plugin.timereward.command.TimeRewardCommand; -import cc.carm.plugin.timereward.configuration.PluginConfig; -import cc.carm.plugin.timereward.database.DataManager; -import cc.carm.plugin.timereward.hooker.GHUpdateChecker; +import cc.carm.plugin.timereward.conf.PluginConfig; +import cc.carm.plugin.timereward.conf.PluginMessages; +import cc.carm.plugin.timereward.storage.database.MySQLStorage; import cc.carm.plugin.timereward.hooker.PAPIExpansion; import cc.carm.plugin.timereward.listener.UserListener; -import cc.carm.plugin.timereward.manager.ConfigManager; import cc.carm.plugin.timereward.manager.RewardManager; import cc.carm.plugin.timereward.manager.UserManager; -import cc.carm.plugin.timereward.util.JarResourceUtils; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; public class Main extends EasyPlugin { private static Main instance; - public Main() { - super(new EasyPluginMessageProvider.zh_CN()); - instance = this; - } + protected ConfigurationProvider configProvider; + protected ConfigurationProvider messageProvider; - private GHUpdateChecker checker; - - protected DataManager dataManager; - protected ConfigManager configManager; + protected MySQLStorage mySQLStorage; protected UserManager userManager; protected RewardManager rewardManager; - @Override - public boolean initialize() { - log("加载插件配置文件..."); - this.configManager = new ConfigManager(); - if (!this.configManager.initConfig()) { - error("插件配置文件初始化失败,请检查文件权限。"); - return false; - } + public Main() { + instance = this; + } - info("初始化数据管理器..."); - this.dataManager = new DataManager(); - if (!dataManager.initialize()) { - severe("初始化数据库失败,请检查配置文件。"); - dataManager.shutdown(); + @Override + protected void load() { + log("加载插件配置文件..."); + this.configProvider = MineConfiguration.from(this, "config.yml"); + this.configProvider.initialize(PluginConfig.class); + + this.messageProvider = MineConfiguration.from(this, "messages.yml"); + this.messageProvider.initialize(PluginMessages.class); + } + + @Override + protected boolean initialize() { + log("初始化数据管理器..."); + this.mySQLStorage = new MySQLStorage(); + try { + mySQLStorage.initialize(); + } catch (Exception e) { + severe("初始化存储失败,请检查配置文件。"); + setEnabled(false); return false; // 初始化失败,不再继续加载 } log("加载用户管理器..."); this.userManager = new UserManager(); if (Bukkit.getOnlinePlayers().size() > 0) { - log(" 加载当前在线用户数据..."); + log("加载现有用户数据..."); this.userManager.loadAll(); } log("加载奖励管理器..."); - this.rewardManager = new RewardManager(); - log(" 加载了 " + this.rewardManager.listRewards().size() + " 个奖励配置"); - this.rewardManager.initialize(); + this.rewardManager = new RewardManager(this); + log("加载了 " + this.rewardManager.listRewards().size() + " 个奖励配置。"); log("注册监听器..."); - regListener(new UserListener()); + registerListener(new UserListener()); log("注册指令..."); registerCommand("TimeReward", new TimeRewardCommand()); - if (MessageUtils.hasPlaceholderAPI()) { log("注册变量..."); new PAPIExpansion(this).register(); } else { - log("检测到未安装PlaceholderAPI,跳过变量注册。"); + log("未安装PlaceholderAPI,跳过变量注册..."); } - if (PluginConfig.METRICS.get()) { + if (PluginConfig.METRICS.getNotNull()) { info("启用统计数据..."); - Metrics metrics = new Metrics(this, 14505); + new Metrics(this, 14505); } - if (PluginConfig.CHECK_UPDATE.get()) { + if (PluginConfig.CHECK_UPDATE.getNotNull()) { info("开始检查更新..."); - this.checker = new GHUpdateChecker("CarmJos", "TimeReward"); - getScheduler().runAsync(() -> this.checker.checkUpdate(Main.this.getDescription().getVersion())); + getScheduler().runAsync(GHUpdateChecker.runner(this)); } else { info("已禁用检查更新,跳过。"); } @@ -92,34 +93,22 @@ public class Main extends EasyPlugin { @Override protected void shutdown() { - - info("终止发奖励进程..."); + info("终止奖励发放进程..."); this.rewardManager.shutdown(); - info("卸载监听器..."); - Bukkit.getServicesManager().unregisterAll(this); - info("保存用户数据..."); this.userManager.unloadAll(true); - info("结束数据库进程..."); - getDataManager().shutdown(); + info("终止数据库进程..."); + getStorage().shutdown(); + info("卸载监听器..."); + Bukkit.getServicesManager().unregisterAll(this); } @Override public boolean isDebugging() { - return PluginConfig.DEBUG.get(); - } - - @Override - public void outputInfo() { - String[] pluginInfo = JarResourceUtils.readResource(this.getResource("PLUGIN_INFO")); - if (pluginInfo != null) Main.info(pluginInfo); - } - - public static Main getInstance() { - return instance; + return PluginConfig.DEBUG.getNotNull(); } public static void info(String... messages) { @@ -134,8 +123,20 @@ public class Main extends EasyPlugin { getInstance().debug(messages); } - public static DataManager getDataManager() { - return getInstance().dataManager; + public static Main getInstance() { + return instance; + } + + public static MySQLStorage getStorage() { + return getInstance().mySQLStorage; + } + + public ConfigurationProvider getConfigProvider() { + return configProvider; + } + + public ConfigurationProvider getMessageProvider() { + return messageProvider; } } \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/timereward/TimeRewardAPI.java b/src/main/java/cc/carm/plugin/timereward/TimeRewardAPI.java index 278e7a9..2668fe5 100644 --- a/src/main/java/cc/carm/plugin/timereward/TimeRewardAPI.java +++ b/src/main/java/cc/carm/plugin/timereward/TimeRewardAPI.java @@ -2,7 +2,6 @@ package cc.carm.plugin.timereward; import cc.carm.lib.easyplugin.utils.ColorParser; import cc.carm.lib.easyplugin.utils.MessageUtils; -import cc.carm.plugin.timereward.manager.ConfigManager; import cc.carm.plugin.timereward.manager.RewardManager; import cc.carm.plugin.timereward.manager.UserManager; import org.bukkit.Bukkit; @@ -16,10 +15,6 @@ public class TimeRewardAPI { return Main.getInstance().userManager; } - public static ConfigManager getConfigManager() { - return Main.getInstance().configManager; - } - public static RewardManager getRewardManager() { return Main.getInstance().rewardManager; } @@ -39,5 +34,4 @@ public class TimeRewardAPI { return MessageUtils.setPlaceholders(player, ColorParser.parse(command)); } - } diff --git a/src/main/java/cc/carm/plugin/timereward/command/TimeRewardCommand.java b/src/main/java/cc/carm/plugin/timereward/command/TimeRewardCommand.java index de6eb4e..644a9c3 100644 --- a/src/main/java/cc/carm/plugin/timereward/command/TimeRewardCommand.java +++ b/src/main/java/cc/carm/plugin/timereward/command/TimeRewardCommand.java @@ -1,9 +1,10 @@ package cc.carm.plugin.timereward.command; +import cc.carm.plugin.timereward.Main; import cc.carm.plugin.timereward.TimeRewardAPI; -import cc.carm.plugin.timereward.configuration.PluginMessages; -import cc.carm.plugin.timereward.data.RewardContents; -import cc.carm.plugin.timereward.data.TimeRewardUser; +import cc.carm.plugin.timereward.conf.PluginMessages; +import cc.carm.plugin.timereward.storage.RewardContents; +import cc.carm.plugin.timereward.storage.UserData; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -27,42 +28,48 @@ public class TimeRewardCommand implements CommandExecutor, TabCompleter { return true; } - @Override - public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { if (args.length < 1) return help(sender); String aim = args[0]; if (aim.equalsIgnoreCase("reload")) { - sender.sendMessage("§7正在重载配置文件..."); + long s1 = System.currentTimeMillis(); + PluginMessages.RELOAD.START.send(sender); + try { - TimeRewardAPI.getConfigManager().reload(); - sender.sendMessage("§a配置文件重载完成!"); + Main.getInstance().getConfigProvider().reload(); + Main.getInstance().getMessageProvider().reload(); + + PluginMessages.RELOAD.COMPLETE.send(sender, System.currentTimeMillis() - s1); } catch (Exception e) { - sender.sendMessage("§c配置文件重载失败,错误信息:" + e.getMessage() + " (详见后台"); + PluginMessages.RELOAD.ERROR.send(sender); e.printStackTrace(); } + return true; - } else if (aim.equalsIgnoreCase("list")) { + } else if (aim.equalsIgnoreCase("listUserData")) { Collection awards = TimeRewardAPI.getRewardManager().listRewards().values(); - PluginMessages.List.HEADER.send(sender, awards.size()); + PluginMessages.LIST.HEADER.send(sender, awards.size()); + for (RewardContents reward : awards) { if (reward.getPermission() != null) { - PluginMessages.List.OBJECT_PERM.send(sender, + PluginMessages.LIST.OBJECT_PERM.send(sender, reward.getRewardID(), reward.getDisplayName(), reward.getTime(), reward.getPermission() ); } else { - PluginMessages.List.OBJECT.send(sender, + PluginMessages.LIST.OBJECT.send(sender, reward.getRewardID(), reward.getDisplayName(), reward.getTime() ); } } + return true; } else if (aim.equalsIgnoreCase("test")) { if (args.length < 2) return help(sender); if (!(sender instanceof Player)) { - sender.sendMessage("§c您不是玩家,无法使用此命令!"); + PluginMessages.NOT_PLAYER.send(sender); return true; } @@ -85,7 +92,7 @@ public class TimeRewardCommand implements CommandExecutor, TabCompleter { return true; } - TimeRewardUser user = TimeRewardAPI.getUserManager().get(player); + UserData user = TimeRewardAPI.getUserManager().getData(player); PluginMessages.USER_INFO.send(sender, player.getName(), user.getAllSeconds(), user.getClaimedRewards().size(), String.join("&8, &f", user.getClaimedRewards()) @@ -97,11 +104,8 @@ public class TimeRewardCommand implements CommandExecutor, TabCompleter { return help(sender); } - @Nullable @Override - public List onTabComplete( - @NotNull CommandSender sender, @NotNull Command command, - @NotNull String alias, @NotNull String[] args) { + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { List allCompletes = new ArrayList<>(); // 玩家指令部分 if (sender.hasPermission("TimeReward.admin")) { @@ -109,7 +113,7 @@ public class TimeRewardCommand implements CommandExecutor, TabCompleter { case 1: { allCompletes.add("reload"); allCompletes.add("user"); - allCompletes.add("list"); + allCompletes.add("listUserData"); if (sender instanceof Player) allCompletes.add("test"); break; @@ -123,6 +127,9 @@ public class TimeRewardCommand implements CommandExecutor, TabCompleter { } break; } + default: { + break; + } } } diff --git a/src/main/java/cc/carm/plugin/timereward/conf/PluginConfig.java b/src/main/java/cc/carm/plugin/timereward/conf/PluginConfig.java new file mode 100644 index 0000000..029e770 --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/conf/PluginConfig.java @@ -0,0 +1,81 @@ +package cc.carm.plugin.timereward.conf; + +import cc.carm.lib.configuration.core.ConfigurationRoot; +import cc.carm.lib.configuration.core.annotation.HeaderComment; +import cc.carm.lib.configuration.core.util.MapFactory; +import cc.carm.lib.configuration.core.value.ConfigValue; +import cc.carm.lib.configuration.core.value.type.ConfiguredList; +import cc.carm.lib.configuration.core.value.type.ConfiguredMap; +import cc.carm.lib.configuration.core.value.type.ConfiguredSection; +import cc.carm.lib.configuration.core.value.type.ConfiguredValue; +import cc.carm.plugin.timereward.Main; +import cc.carm.plugin.timereward.TimeRewardAPI; +import cc.carm.plugin.timereward.storage.RewardContents; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +public class PluginConfig extends ConfigurationRoot { + + public static final ConfigValue DEBUG = ConfiguredValue.of(Boolean.class, false); + + @HeaderComment({ + "统计数据设定", + "该选项用于帮助开发者统计插件版本与使用情况,且绝不会影响性能与使用体验。", + "当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。" + }) + public static final ConfigValue METRICS = ConfiguredValue.of(Boolean.class, true); + + @HeaderComment({ + "检查更新设定", + "该选项用于插件判断是否要检查更新,若您不希望插件检查更新并提示您,可以选择关闭。", + "检查更新为异步操作,绝不会影响性能与使用体验。" + }) + public static final ConfigValue CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true); + + @HeaderComment("数据存储相关设定") + public static final class STORAGE extends ConfigurationRoot { + } + + @HeaderComment("奖励相关设定") + public static final class REWARDS extends ConfigurationRoot { + + @HeaderComment({ + "配置键名即奖励ID,支持英文、数字与下划线。", + "确定后请不要更改,因为该键值用于存储玩家是否领取的数据", + "如果更改,原先领取过该奖励的玩家将会自动再领取一次!" + }) + public static final class EXAMPLE extends ConfigurationRoot { + + @HeaderComment({ + "奖励的显示名称,可以是任意字符串", + "可以在 commands 中使用 %(name) 来获取该奖励的名称", + "也可以使用变量 %TimeReward_reward_<奖励ID>% 来获取对应奖励的名称" + }) + public static final ConfigValue NAME = ConfiguredValue.of(String.class, "&f[初级奖励] &e总在线时长 2小时"); + + @HeaderComment("该奖励自动领取需要的在线时长,单位为秒") + public static final ConfigValue TIME = ConfiguredValue.of(Integer.class, 7200); + + @HeaderComment({ + "该奖励领取权限,可以不设置。", + "若为空则所有人都可以领取;若不为空,则需要拥有该权限的玩家才能领取。" + }) + public static final ConfigValue PERMISSION = ConfiguredValue.of(String.class, "TimeReward.vip"); + + @HeaderComment({ + "领取奖励时后台执行的指令", + "支持PlaceholderAPI变量,指令中可以使用 %(name) 来获取该奖励的名称。" + }) + public static final ConfiguredList COMMANDS = ConfiguredList.builder(String.class) + .fromString() + .defaults("say &f恭喜 &b%player_name% &f领取了奖励 &r%(name) &f!") + .build(); + + } + + } + +} diff --git a/src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java b/src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java new file mode 100644 index 0000000..b2be171 --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java @@ -0,0 +1,126 @@ +package cc.carm.plugin.timereward.conf; + +import cc.carm.lib.configuration.core.ConfigurationRoot; +import cc.carm.lib.configuration.core.annotation.HeaderComment; +import cc.carm.lib.easyplugin.utils.ColorParser; +import cc.carm.lib.mineconfiguration.bukkit.builder.message.CraftMessageListBuilder; +import cc.carm.lib.mineconfiguration.bukkit.builder.message.CraftMessageValueBuilder; +import cc.carm.lib.mineconfiguration.bukkit.builder.title.TitleConfigBuilder; +import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessage; +import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessageList; +import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredTitle; +import de.themoep.minedown.MineDown; +import me.clip.placeholderapi.PlaceholderAPI; +import net.md_5.bungee.api.chat.BaseComponent; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.function.BiFunction; + + +@HeaderComment({ + "TimeReward 在线奖励插件的消息配置文件", + "如特定的消息不需要任何提示,可直接留下单行空内容消息。", + "支持 支持 &+颜色代码(原版颜色)、§(#XXXXXX)(RGB颜色) 与 &<#XXXXXX>(前后标注RGB颜色渐变)。", + " " +}) +public class PluginMessages extends ConfigurationRoot { + + public static @NotNull CraftMessageListBuilder list() { + return ConfiguredMessageList.create(getParser()) + .whenSend((sender, message) -> message.forEach(m -> sender.spigot().sendMessage(m))); + } + + public static @NotNull CraftMessageValueBuilder value() { + return ConfiguredMessage.create(getParser()) + .whenSend((sender, message) -> sender.spigot().sendMessage(message)); + } + + public static @NotNull TitleConfigBuilder title() { + return ConfiguredTitle.create().whenSend((player, in, stay, out, line1, line2) -> player.sendTitle(line1, line2, in, stay, out)); + } + + public static @NotNull BiFunction getParser() { + return (sender, message) -> { + if (sender instanceof Player) message = PlaceholderAPI.setPlaceholders((Player) sender, message); + return MineDown.parse(ColorParser.parse(message)); + }; + } + + public static final ConfiguredMessageList NO_PERMISSION = list().defaults( + "&c&l抱歉!&f但您没有足够的权限使用该指令。" + ).build(); + + public static final ConfiguredMessageList NOT_PLAYER = list().defaults( + "&f该指令请以玩家身份执行。" + ).build(); + + public static final ConfiguredMessageList NOT_ONLINE = list().defaults( + "&f玩家 &e%(player) &f并不在线。" + ).params("player").build(); + + public static final ConfiguredMessageList NOT_EXISTS = list().defaults( + "&f奖励 &e%(award) &f并不存在。" + ).params("award").build(); + + public static final ConfiguredMessageList USER_INFO = list().defaults( + "&f玩家 &6%(player) &f已在线&e%(time)&f秒,共领取了 &e%(amount)&f 次奖励。", + "&7已领取的奖励列表如下:&r%(rewards) &7。" + ).params("player", "time", "amount", "rewards").build(); + + public static final ConfiguredMessageList COMMAND_LIST = list().defaults( + "&f正在执行奖励 %(award) 的指令列表..." + ).params("award").build(); + + public static final ConfiguredMessageList COMMAND_USAGE = list().defaults( + "&6&l在线奖励 &f指令帮助", + "&8#&f reload", + "&8-&7 重载插件配置文件。", + "&8#&f user &6<玩家>", + "&8-&7 查看用户的在线时长信息与奖励领取情况。", + "&8#&f listUserData", + "&8-&7 列出所有奖励与条件。", + "&8#&f test &6<奖励ID>", + "&8-&7 测试执行奖励配置的指令。" + ).build(); + + + public static class LIST extends ConfigurationRoot { + + public static final ConfiguredMessageList HEADER = list().defaults( + "&6&l在线奖励 &f奖励列表 &7(共%(amount)个)" + ).params("amount").build(); + + public static final ConfiguredMessageList OBJECT = list().defaults( + "&8# &f%(id)", + "&8- &7奖励名称 &f%(name)", + "&8- &7领取时间 &f&e%(time)&f秒" + ).params("id", "name", "time").build(); + + public static final ConfiguredMessageList OBJECT_PERM = list().defaults( + "&8# &f%(id)", + "&8- &7奖励名称 &f%(name)", + "&8- &7领取时间 &f&e%(time)&f秒", + "&8- &7需要权限 &f%(permission)" + ).params("id", "name", "time", "permission").build(); + + } + + public static class RELOAD extends ConfigurationRoot { + + public static final ConfiguredMessageList START = list().defaults( + "&f正在重载配置文件..." + ).build(); + + public static final ConfiguredMessageList ERROR = list().defaults( + "&f配置文件&c重载失败!&f详细原因详见后台输出。" + ).build(); + + public static final ConfiguredMessageList COMPLETE = list().defaults( + "&f配置文件重载完成,共耗时 &d%(time)&fms 。" + ).params("time").build(); + + } + +} diff --git a/src/main/java/cc/carm/plugin/timereward/configuration/PluginConfig.java b/src/main/java/cc/carm/plugin/timereward/configuration/PluginConfig.java deleted file mode 100644 index e259899..0000000 --- a/src/main/java/cc/carm/plugin/timereward/configuration/PluginConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package cc.carm.plugin.timereward.configuration; - -import cc.carm.lib.easyplugin.configuration.cast.ConfigSectionCast; -import cc.carm.lib.easyplugin.configuration.values.ConfigValue; -import cc.carm.plugin.timereward.TimeRewardAPI; -import cc.carm.plugin.timereward.data.RewardContents; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class PluginConfig { - - public static final ConfigValue DEBUG = new ConfigValue<>( - "debug", Boolean.class, false - ); - - public static final ConfigValue METRICS = new ConfigValue<>( - "metrics", Boolean.class, true - ); - - public static final ConfigValue CHECK_UPDATE = new ConfigValue<>( - "check-update", Boolean.class, true - ); - - public static final ConfigSectionCast> REWARDS = new ConfigSectionCast<>( - "rewards", TimeRewardAPI.getRewardManager()::readRewards, new LinkedHashMap<>() - ); - - -} diff --git a/src/main/java/cc/carm/plugin/timereward/configuration/PluginMessages.java b/src/main/java/cc/carm/plugin/timereward/configuration/PluginMessages.java deleted file mode 100644 index 300c53a..0000000 --- a/src/main/java/cc/carm/plugin/timereward/configuration/PluginMessages.java +++ /dev/null @@ -1,64 +0,0 @@ -package cc.carm.plugin.timereward.configuration; - -import cc.carm.lib.easyplugin.configuration.language.EasyMessageList; -import cc.carm.lib.easyplugin.configuration.language.MessagesRoot; - - -public class PluginMessages extends MessagesRoot { - - public static final EasyMessageList COMMAND_USAGE = new EasyMessageList( - "&6&l在线奖励 &f后台指令帮助", - "&8#&f reload", - "&8-&7 重载插件配置文件。", - "&8#&f user &6<玩家>", - "&8-&7 查看用户的在线时长信息与奖励领取情况。", - "&8#&f list", - "&8-&7 列出所有奖励与条件。", - "&8#&f test &6<奖励ID>", - "&8-&7 测试执行奖励配置的指令。" - ); - - - public static class List { - - public static final EasyMessageList HEADER = EasyMessageList.builder() - .contents("&6&l在线奖励 &f奖励列表 &7(共%(amount)个)") - .params("amount").build(); - - public static final EasyMessageList OBJECT = EasyMessageList.builder() - .contents( - "&8# &f%(id)", - "&8- &7奖励名称 &f%(name)", - "&8- &7领取时间 &f&e%(time)&f秒" - ).params("id", "name", "time").build(); - - public static final EasyMessageList OBJECT_PERM = EasyMessageList.builder() - .contents( - "&8# &f%(id)", - "&8- &7奖励名称 &f%(name)", - "&8- &7领取时间 &f&e%(time)&f秒", - "&8- &7需要权限 &f%(permission)" - ).params("id", "name", "time", "permission").build(); - } - - public static final EasyMessageList USER_INFO = EasyMessageList.builder() - .contents( - "&f玩家 &6%(player) &f已在线&e%(time)&f秒,共领取了 &e%(amount)&f 次奖励。", - "&7已领取的奖励列表如下:&r%(rewards) &7。" - ).params("player", "time", "amount", "rewards").build(); - - public static final EasyMessageList COMMAND_LIST = EasyMessageList.builder() - .contents("&f正在执行奖励 %(award) 的指令列表...") - .params("award") - .build(); - - public static final EasyMessageList NOT_ONLINE = EasyMessageList.builder() - .contents("&f玩家 &e%(player) &f并不在线。") - .params("player") - .build(); - public static final EasyMessageList NOT_EXISTS = EasyMessageList.builder() - .contents("&f奖励 &e%(award) &f并不存在。") - .params("award") - .build(); - -} diff --git a/src/main/java/cc/carm/plugin/timereward/data/DataTaskRunner.java b/src/main/java/cc/carm/plugin/timereward/data/DataTaskRunner.java deleted file mode 100644 index 58cea80..0000000 --- a/src/main/java/cc/carm/plugin/timereward/data/DataTaskRunner.java +++ /dev/null @@ -1,8 +0,0 @@ -package cc.carm.plugin.timereward.data; - -import cc.carm.plugin.timereward.database.DataManager; - -@FunctionalInterface -public interface DataTaskRunner { - void run(TimeRewardUser user, DataManager dataManager) throws Exception; -} diff --git a/src/main/java/cc/carm/plugin/timereward/database/DBConfiguration.java b/src/main/java/cc/carm/plugin/timereward/database/DBConfiguration.java deleted file mode 100644 index 60b7acc..0000000 --- a/src/main/java/cc/carm/plugin/timereward/database/DBConfiguration.java +++ /dev/null @@ -1,49 +0,0 @@ -package cc.carm.plugin.timereward.database; - -import cc.carm.lib.easyplugin.configuration.values.ConfigValue; - -public class DBConfiguration { - - protected static final ConfigValue DRIVER_NAME = new ConfigValue<>( - "database.driver", String.class, - "com.mysql.cj.jdbc.Driver" - ); - - protected static final ConfigValue HOST = new ConfigValue<>( - "database.host", String.class, - "127.0.0.1" - ); - - protected static final ConfigValue PORT = new ConfigValue<>( - "database.port", Integer.class, - 3306 - ); - - protected static final ConfigValue DATABASE = new ConfigValue<>( - "database.database", String.class, - "minecraft" - ); - - protected static final ConfigValue USERNAME = new ConfigValue<>( - "database.username", String.class, - "root" - ); - - protected static final ConfigValue PASSWORD = new ConfigValue<>( - "database.password", String.class, - "password" - ); - - protected static final ConfigValue ADDITIONAL = new ConfigValue<>( - "database.additional", String.class, - "?useSSL=false" - ); - - protected static String buildJDBC() { - return String.format("jdbc:mysql://%s:%s/%s%s", - HOST.get(), PORT.get(), DATABASE.get(), ADDITIONAL.get() - ); - } - - -} diff --git a/src/main/java/cc/carm/plugin/timereward/database/DBTables.java b/src/main/java/cc/carm/plugin/timereward/database/DBTables.java deleted file mode 100644 index 52982b4..0000000 --- a/src/main/java/cc/carm/plugin/timereward/database/DBTables.java +++ /dev/null @@ -1,45 +0,0 @@ -package cc.carm.plugin.timereward.database; - -import cc.carm.lib.easyplugin.configuration.values.ConfigValue; - -public class DBTables { - - protected static class UserOnlineTime { - - protected static final ConfigValue TABLE_NAME = new ConfigValue<>( - "database.tables.time", String.class, - "tr_user_times" - ); - - protected static final String[] TABLE_COLUMNS = new String[]{ - "`uuid` VARCHAR(36) NOT NULL PRIMARY KEY COMMENT '用户UUID'", // 用户的UUID - "`time` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户在线秒数'",// 用户在线时间(秒) - "`update` DATETIME NOT NULL " + - "DEFAULT CURRENT_TIMESTAMP " + - "ON UPDATE CURRENT_TIMESTAMP " + - " COMMENT '最后更新时间'" - }; - - } - - protected static class UserClaimedReward { - - protected static final ConfigValue TABLE_NAME = new ConfigValue<>( - "database.tables.claimed", String.class, - "tr_user_claimed" - ); - - protected static final String[] TABLE_COLUMNS = new String[]{ - "`id` INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY", // 排序键 - "`uuid` VARCHAR(36) NOT NULL PRIMARY KEY COMMENT '用户UUID'", // 用户的UUID 主键 - "`value` MEDIUMTEXT", // 已领取的奖励ID - "`update` DATETIME NOT NULL " + - "DEFAULT CURRENT_TIMESTAMP " + - "ON UPDATE CURRENT_TIMESTAMP " + - " COMMENT '最后更新时间'" - }; - - } - - -} diff --git a/src/main/java/cc/carm/plugin/timereward/database/DataManager.java b/src/main/java/cc/carm/plugin/timereward/database/DataManager.java deleted file mode 100644 index b54c3d6..0000000 --- a/src/main/java/cc/carm/plugin/timereward/database/DataManager.java +++ /dev/null @@ -1,117 +0,0 @@ -package cc.carm.plugin.timereward.database; - -import cc.carm.lib.easysql.EasySQL; -import cc.carm.lib.easysql.api.SQLManager; -import cc.carm.plugin.timereward.Main; -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.UUID; - -public class DataManager { - protected static final Gson GSON = new Gson(); - protected static final JsonParser PARSER = new JsonParser(); - private SQLManager sqlManager; - - public boolean initialize() { - try { - Main.info(" 尝试连接到数据库..."); - this.sqlManager = EasySQL.createManager( - DBConfiguration.DRIVER_NAME.get(), DBConfiguration.buildJDBC(), - DBConfiguration.USERNAME.get(), DBConfiguration.PASSWORD.get() - ); -// this.sqlManager.setDebugMode(() -> Main.getInstance().isDebugging()); - } catch (Exception exception) { - Main.severe("无法连接到数据库,请检查配置文件。"); - exception.printStackTrace(); - return false; - } - - try { - Main.info(" 创建插件所需表..."); - getSQLManager().createTable(DBTables.UserOnlineTime.TABLE_NAME.get()) - .setColumns(DBTables.UserOnlineTime.TABLE_COLUMNS) - .build().execute(); - - getSQLManager().createTable(DBTables.UserClaimedReward.TABLE_NAME.get()) - .setColumns(DBTables.UserClaimedReward.TABLE_COLUMNS) - .build().execute(); - - } catch (SQLException exception) { - Main.severe("无法创建插件所需的表,请检查数据库权限。"); - exception.printStackTrace(); - return false; - } - - return true; - } - - public void shutdown() { - Main.info(" 关闭数据库连接..."); - EasySQL.shutdownManager(getSQLManager()); - this.sqlManager = null; - } - - public SQLManager getSQLManager() { - return sqlManager; - } - - public @Nullable Long getPlayTime(@NotNull UUID userUUID) throws SQLException { - return getSQLManager().createQuery().inTable(DBTables.UserOnlineTime.TABLE_NAME.get()) - .selectColumns("uuid", "time") - .addCondition("uuid", userUUID.toString()) - .setLimit(1).build().executeFunction(query -> { - ResultSet resultSet = query.getResultSet(); - return resultSet.next() ? resultSet.getLong("time") : 0L; - }); - } - - public @NotNull Set getClaimedData(@NotNull UUID userUUID) throws SQLException { - return getSQLManager().createQuery().inTable(DBTables.UserClaimedReward.TABLE_NAME.get()) - .selectColumns("uuid", "value") - .addCondition("uuid", userUUID.toString()) - .setLimit(1).build().executeFunction(query -> { - ResultSet resultSet = query.getResultSet(); - if (!resultSet.next()) return new LinkedHashSet<>(); - String json = resultSet.getString("value"); - if (json == null) return new LinkedHashSet<>(); - JsonElement element = PARSER.parse(json); - if (!element.isJsonArray()) return new LinkedHashSet<>(); - Set ids = new LinkedHashSet<>(); - for (JsonElement e : element.getAsJsonArray()) { - ids.add(e.getAsString()); - } - return ids; - }, new LinkedHashSet<>()); - } - - - public void saveClaimedData(@NotNull UUID userUUID, @Nullable Set claimedRewards) throws SQLException { - if (claimedRewards == null) { - getSQLManager().createDelete(DBTables.UserClaimedReward.TABLE_NAME.get()) - .addCondition("uuid", userUUID.toString()) - .setLimit(1).build().execute(); - } else { - getSQLManager().createReplace(DBTables.UserClaimedReward.TABLE_NAME.get()) - .setColumnNames("uuid", "value") - .setParams(userUUID.toString(), GSON.toJson(claimedRewards)) - .execute(); - } - } - - public void savePlayTime(@NotNull UUID userUUID, long time) throws SQLException { - getSQLManager().createReplace(DBTables.UserOnlineTime.TABLE_NAME.get()) - .setColumnNames("uuid", "time").setParams(userUUID.toString(), time) - .execute(); - } - - -} - diff --git a/src/main/java/cc/carm/plugin/timereward/hooker/GHUpdateChecker.java b/src/main/java/cc/carm/plugin/timereward/hooker/GHUpdateChecker.java deleted file mode 100644 index dbc2931..0000000 --- a/src/main/java/cc/carm/plugin/timereward/hooker/GHUpdateChecker.java +++ /dev/null @@ -1,34 +0,0 @@ -package cc.carm.plugin.timereward.hooker; - -import cc.carm.lib.githubreleases4j.GithubReleases4J; -import cc.carm.plugin.timereward.Main; - -public class GHUpdateChecker { - - private final String owner; - private final String repo; - - public GHUpdateChecker(String owner, String repo) { - this.owner = owner; - this.repo = repo; - } - - public void checkUpdate(String currentVersion) { - Integer behindVersions = GithubReleases4J.getVersionBehind(owner, repo, currentVersion); - String downloadURL = GithubReleases4J.getReleasesURL(owner, repo); - if (behindVersions == null) { - Main.severe("检查更新失败,请您定期查看插件是否更新,避免安全问题。"); - Main.severe("下载地址 " + downloadURL); - } else if (behindVersions == 0) { - Main.info("检查完成,当前已是最新版本。"); - } else if (behindVersions > 0) { - Main.info("发现新版本! 目前已落后 " + behindVersions + " 个版本。"); - Main.info("最新版下载地址 " + downloadURL); - } else { - Main.severe("检查更新失败! 当前版本未知,请您使用原生版本以避免安全问题。"); - Main.severe("最新版下载地址 " + downloadURL); - } - } - - -} diff --git a/src/main/java/cc/carm/plugin/timereward/hooker/PAPIExpansion.java b/src/main/java/cc/carm/plugin/timereward/hooker/PAPIExpansion.java index 7816c5d..d7cbb56 100644 --- a/src/main/java/cc/carm/plugin/timereward/hooker/PAPIExpansion.java +++ b/src/main/java/cc/carm/plugin/timereward/hooker/PAPIExpansion.java @@ -1,8 +1,8 @@ package cc.carm.plugin.timereward.hooker; import cc.carm.plugin.timereward.TimeRewardAPI; -import cc.carm.plugin.timereward.data.RewardContents; -import cc.carm.plugin.timereward.data.TimeRewardUser; +import cc.carm.plugin.timereward.storage.RewardContents; +import cc.carm.plugin.timereward.storage.UserData; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -59,7 +59,7 @@ public class PAPIExpansion extends PlaceholderExpansion { return "Error Params"; } - TimeRewardUser user = TimeRewardAPI.getUserManager().get(player); + UserData user = TimeRewardAPI.getUserManager().getData(player); switch (args[0].toLowerCase()) { case "time": { diff --git a/src/main/java/cc/carm/plugin/timereward/listener/UserListener.java b/src/main/java/cc/carm/plugin/timereward/listener/UserListener.java index c2dcc5d..3330e2e 100644 --- a/src/main/java/cc/carm/plugin/timereward/listener/UserListener.java +++ b/src/main/java/cc/carm/plugin/timereward/listener/UserListener.java @@ -11,12 +11,12 @@ public class UserListener implements Listener { @EventHandler public void onJoin(PlayerJoinEvent event) { - Main.getInstance().getScheduler().runAsync(() -> TimeRewardAPI.getUserManager().load(event.getPlayer().getUniqueId())); + Main.getInstance().getScheduler().runAsync(() -> TimeRewardAPI.getUserManager().loadData(event.getPlayer().getUniqueId())); } @EventHandler public void onQuit(PlayerQuitEvent event) { - Main.getInstance().getScheduler().runAsync(() -> TimeRewardAPI.getUserManager().unload(event.getPlayer().getUniqueId())); + Main.getInstance().getScheduler().runAsync(() -> TimeRewardAPI.getUserManager().unloadData(event.getPlayer().getUniqueId())); } } diff --git a/src/main/java/cc/carm/plugin/timereward/manager/ConfigManager.java b/src/main/java/cc/carm/plugin/timereward/manager/ConfigManager.java deleted file mode 100644 index 9e2b361..0000000 --- a/src/main/java/cc/carm/plugin/timereward/manager/ConfigManager.java +++ /dev/null @@ -1,49 +0,0 @@ -package cc.carm.plugin.timereward.manager; - - -import cc.carm.lib.easyplugin.configuration.file.FileConfig; -import cc.carm.lib.easyplugin.configuration.language.MessagesConfig; -import cc.carm.lib.easyplugin.configuration.language.MessagesInitializer; -import cc.carm.plugin.timereward.Main; -import cc.carm.plugin.timereward.configuration.PluginMessages; - -public class ConfigManager { - - private FileConfig pluginConfiguration; - private MessagesConfig messageConfiguration; - - public boolean initConfig() { - try { - pluginConfiguration = new FileConfig(Main.getInstance(), "config.yml"); - messageConfiguration = new MessagesConfig(Main.getInstance(), "messages.yml"); - - FileConfig.pluginConfiguration = () -> pluginConfiguration; - FileConfig.messageConfiguration = () -> messageConfiguration; - - MessagesInitializer.initialize(messageConfiguration, PluginMessages.class); - - return true; - } catch (Exception ex) { - return false; - } - } - - public FileConfig getPluginConfig() { - return FileConfig.pluginConfiguration.get(); - } - - public FileConfig getMessageConfig() { - return FileConfig.messageConfiguration.get(); - } - - public void reload() throws Exception { - getPluginConfig().reload(); - getMessageConfig().reload(); - } - - public void saveConfig() throws Exception { - getPluginConfig().save(); - getMessageConfig().save(); - } - -} diff --git a/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java b/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java index 345cb4d..2b2c4fb 100644 --- a/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java +++ b/src/main/java/cc/carm/plugin/timereward/manager/RewardManager.java @@ -3,26 +3,31 @@ package cc.carm.plugin.timereward.manager; import cc.carm.lib.easyplugin.utils.MessageUtils; import cc.carm.plugin.timereward.Main; import cc.carm.plugin.timereward.TimeRewardAPI; -import cc.carm.plugin.timereward.configuration.PluginConfig; -import cc.carm.plugin.timereward.data.RewardContents; -import cc.carm.plugin.timereward.data.TimeRewardUser; +import cc.carm.plugin.timereward.storage.RewardContents; +import cc.carm.plugin.timereward.storage.UserData; +import com.google.common.collect.ImmutableMap; import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; public class RewardManager { - private BukkitRunnable rewardChecker; + protected final Map rewards = new ConcurrentHashMap<>(); + protected BukkitRunnable runnable; - public void initialize() { - this.rewardChecker = new BukkitRunnable() { + public RewardManager(Main main) { + this.runnable = new BukkitRunnable() { @Override public void run() { if (Bukkit.getOnlinePlayers().isEmpty()) return; @@ -31,25 +36,23 @@ public class RewardManager { List unclaimedRewards = getUnclaimedRewards(player); if (unclaimedRewards.isEmpty()) continue; - Main.getInstance().getScheduler().run(() -> unclaimedRewards.forEach( + main.getScheduler().run(() -> unclaimedRewards.forEach( // 在同步进程中为玩家发放奖励 unclaimedReward -> claimReward(player, unclaimedReward, false) )); } - } }; - - this.rewardChecker.runTaskTimerAsynchronously(Main.getInstance(), 100L, 20L); + this.runnable.runTaskTimerAsynchronously(main, 100L, 20L); } public void shutdown() { - this.rewardChecker.cancel(); - this.rewardChecker = null; + this.runnable.cancel(); + this.runnable = null; } - public HashMap readRewards(@NotNull ConfigurationSection section) { - HashMap rewards = new HashMap<>(); + public Map readRewards(@NotNull ConfigurationSection section) { + Map rewards = new HashMap<>(); for (String rewardID : section.getKeys(false)) { ConfigurationSection rewardSection = section.getConfigurationSection(rewardID); if (rewardSection == null) continue; @@ -69,20 +72,22 @@ public class RewardManager { return rewards; } + @Unmodifiable + public Map getRewardsMap() { + return Collections.unmodifiableMap(rewards); + } + + public @Nullable RewardContents getReward(String rewardID) { + return rewards.get(rewardID); + } + public Map listRewards() { - return new HashMap<>(getRewardsMap()); + return ImmutableMap.copyOf(getRewardsMap()); } - public RewardContents getReward(String rewardID) { - return getRewardsMap().get(rewardID); - } - - protected HashMap getRewardsMap() { - return PluginConfig.REWARDS.getOptional().orElse(new HashMap<>()); - } - - public List getUnclaimedRewards(Player player) { - TimeRewardUser user = TimeRewardAPI.getUserManager().get(player); + @Unmodifiable + public @NotNull List getUnclaimedRewards(@NotNull Player player) { + UserData user = TimeRewardAPI.getUserManager().getData(player); return listRewards().values().stream() .filter(reward -> reward.isTimeEnough(user.getAllSeconds())) // 时间足够 .filter(reward -> !user.isClaimed(reward.getRewardID())) // 未曾领取 @@ -91,7 +96,7 @@ public class RewardManager { } public boolean claimReward(Player player, RewardContents reward, boolean check) { - TimeRewardUser user = TimeRewardAPI.getUserManager().get(player); + UserData user = TimeRewardAPI.getUserManager().getData(player); if (check && user.isClaimed(reward.getRewardID())) return false; if (check && !reward.isTimeEnough(user.getAllSeconds())) return false; if (check && !reward.checkPermission(player)) return false; @@ -113,5 +118,4 @@ public class RewardManager { return claimReward(player, reward, true); } - } \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java b/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java index fdb7c2c..31226d8 100644 --- a/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/timereward/manager/UserManager.java @@ -1,9 +1,10 @@ package cc.carm.plugin.timereward.manager; import cc.carm.plugin.timereward.Main; -import cc.carm.plugin.timereward.data.DataTaskRunner; -import cc.carm.plugin.timereward.data.TimeRewardUser; -import cc.carm.plugin.timereward.database.DataManager; +import cc.carm.plugin.timereward.util.DataTaskRunner; +import cc.carm.plugin.timereward.storage.UserData; +import cc.carm.plugin.timereward.storage.database.MySQLStorage; +import com.google.common.collect.ImmutableMap; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -12,122 +13,119 @@ import org.jetbrains.annotations.Unmodifiable; import java.util.HashMap; import java.util.Map; -import java.util.Set; import java.util.UUID; public class UserManager { - private final HashMap userDataMap; + private final HashMap userDataMap; public UserManager() { this.userDataMap = new HashMap<>(); } @NotNull - public TimeRewardUser read(UUID userUUID) { + public UserData readData(UUID userUUID) { try { long start = System.currentTimeMillis(); - DataManager storage = Main.getDataManager(); + MySQLStorage storage = Main.getStorage(); - Long playTime = storage.getPlayTime(userUUID); - Set claimedRewards = storage.getClaimedData(userUUID); + UserData data = storage.loadData(userUUID); - if (playTime == null && claimedRewards.isEmpty()) { + if (data == null) { Main.debugging("当前还不存在玩家 " + userUUID + " 的数据,视作新档。"); - return new TimeRewardUser(userUUID); + return new UserData(userUUID); } Main.debugging("读取 " + userUUID + " 的用户数据完成, 耗时 " + (System.currentTimeMillis() - start) + "ms。"); - return new TimeRewardUser(userUUID, claimedRewards, playTime == null ? 0L : playTime); + + return data; } catch (Exception e) { Main.severe("无法正常读取玩家数据,玩家操作将不会被保存,请检查数据配置!"); - Main.severe("Could not load user's data, please check the data configuration!"); + Main.severe("Could not loadData user's data, please check the data conf!"); e.printStackTrace(); - return new TimeRewardUser(userUUID); + return new UserData(userUUID); } } - public void save(TimeRewardUser user) { + public void saveData(UserData data) { try { long start = System.currentTimeMillis(); - DataManager dataManager = Main.getDataManager(); + MySQLStorage storage = Main.getStorage(); - Main.debugging("正在保存 " + user.getUserUUID() + " 的用户数据..."); - dataManager.saveClaimedData(user.getUserUUID(), user.getClaimedRewards()); - dataManager.savePlayTime(user.getUserUUID(), user.getAllSeconds()); - Main.debugging("保存 " + user.getUserUUID() + " 的用户数据完成,耗时 " + (System.currentTimeMillis() - start) + "ms。"); + Main.debugging("正在保存 " + data.getUserUUID() + " 的用户数据..."); + storage.saveClaimedData(data.getUserUUID(), data.getClaimedRewards()); + storage.savePlayTime(data.getUserUUID(), data.getAllSeconds()); + Main.debugging("保存 " + data.getUserUUID() + " 的用户数据完成,耗时 " + (System.currentTimeMillis() - start) + "ms。"); } catch (Exception e) { Main.severe("无法正常保存玩家数据,请检查数据配置!"); - Main.severe("Could not save user's data, please check the data configuration!"); + Main.severe("Could not saveData user's data, please check the data conf!"); e.printStackTrace(); } } - public void load(UUID userUUID) { - getUsersMap().put(userUUID, read(userUUID)); + public void loadData(UUID userUUID) { + getUserDataMap().put(userUUID, readData(userUUID)); } - public void unload(UUID userUUID) { - unload(userUUID, true); + public void unloadData(UUID userUUID) { + unloadData(userUUID, true); } - public void unload(UUID userUUID, boolean save) { - TimeRewardUser data = get(userUUID); + public void unloadData(UUID userUUID, boolean save) { + UserData data = getData(userUUID); if (data == null) return; - if (save) save(data); - getUsersMap().remove(userUUID); + if (save) saveData(data); + getUserDataMap().remove(userUUID); } public void loadAll() { for (Player player : Bukkit.getOnlinePlayers()) { - if (getUsersMap().containsKey(player.getUniqueId())) continue; - load(player.getUniqueId()); + if (getUserDataMap().containsKey(player.getUniqueId())) continue; + loadData(player.getUniqueId()); } } public void saveAll() { - getUsersMap().values().forEach(this::save); + getUserDataMap().values().forEach(this::saveData); } public void unloadAll(boolean save) { if (save) saveAll(); - getUsersMap().clear(); + getUserDataMap().clear(); } @Nullable - public TimeRewardUser get(UUID userUUID) { - return getUsersMap().get(userUUID); + public UserData getData(UUID userUUID) { + return getUserDataMap().get(userUUID); } @NotNull - public TimeRewardUser get(Player player) { - return getUsersMap().get(player.getUniqueId()); + public UserData getData(Player player) { + return getUserDataMap().get(player.getUniqueId()); } - public void editData(@NotNull UUID uuid, @NotNull DataTaskRunner task) { - TimeRewardUser user = get(uuid); - if (user == null) user = read(uuid); // 不在线则加载数据 + public void editData(@NotNull DataTaskRunner task) { try { - task.run(user, Main.getDataManager()); + task.run(Main.getStorage()); } catch (Exception exception) { Main.severe("无法正常更改玩家数据,请检查数据配置!"); - Main.severe("Could not edit user's data, please check the data configuration!"); + Main.severe("Could not edit user's data, please check the data conf!"); exception.printStackTrace(); } } - public void editDataAsync(@NotNull UUID uuid, @NotNull DataTaskRunner task) { - Main.getInstance().getScheduler().runAsync(() -> editData(uuid, task)); + public void editDataAsync(@NotNull DataTaskRunner task) { + Main.getInstance().getScheduler().runAsync(() -> editData(task)); } @NotNull @Unmodifiable - public Map list() { - return new HashMap<>(getUsersMap()); + public Map listUserData() { + return ImmutableMap.copyOf(getUserDataMap()); } - protected @NotNull HashMap getUsersMap() { + protected @NotNull HashMap getUserDataMap() { return userDataMap; } diff --git a/src/main/java/cc/carm/plugin/timereward/data/RewardContents.java b/src/main/java/cc/carm/plugin/timereward/storage/RewardContents.java similarity index 93% rename from src/main/java/cc/carm/plugin/timereward/data/RewardContents.java rename to src/main/java/cc/carm/plugin/timereward/storage/RewardContents.java index cce0d65..f3e6887 100644 --- a/src/main/java/cc/carm/plugin/timereward/data/RewardContents.java +++ b/src/main/java/cc/carm/plugin/timereward/storage/RewardContents.java @@ -1,4 +1,4 @@ -package cc.carm.plugin.timereward.data; +package cc.carm.plugin.timereward.storage; import cc.carm.lib.easyplugin.utils.ColorParser; import org.bukkit.entity.Player; @@ -41,7 +41,7 @@ public class RewardContents { } public @NotNull String getDisplayName() { - return ColorParser.parseColor(getName() == null ? getRewardID() : getName()); + return ColorParser.parse(getName() == null ? getRewardID() : getName()); } public @Nullable String getPermission() { diff --git a/src/main/java/cc/carm/plugin/timereward/data/TimeRewardUser.java b/src/main/java/cc/carm/plugin/timereward/storage/UserData.java similarity index 68% rename from src/main/java/cc/carm/plugin/timereward/data/TimeRewardUser.java rename to src/main/java/cc/carm/plugin/timereward/storage/UserData.java index 80a61f8..360d789 100644 --- a/src/main/java/cc/carm/plugin/timereward/data/TimeRewardUser.java +++ b/src/main/java/cc/carm/plugin/timereward/storage/UserData.java @@ -1,4 +1,4 @@ -package cc.carm.plugin.timereward.data; +package cc.carm.plugin.timereward.storage; import org.jetbrains.annotations.NotNull; @@ -10,33 +10,31 @@ import java.util.concurrent.TimeUnit; /** * 用户奖励数据,用于存储用户的奖励的领取情况。 */ -public class TimeRewardUser { +public class UserData { - UUID userUUID; + protected final @NotNull UUID userUUID; + private final Set<@NotNull String> claimedRewards; // 记录已领取的奖励ID + private final long storedSeconds; // 记录已经游玩的时间 + private final long joinMillis; // 记录本次加入的时间 - Set<@NotNull String> claimedRewards; //记录已领取的奖励ID - - long storedSeconds; //记录已经游玩的时间 - long joinMillis; // 记录本次加入的时间 - - public TimeRewardUser(UUID userUUID) { - this(userUUID, new LinkedHashSet<>(), 0); + public UserData(@NotNull UUID userUUID) { + this(userUUID, 0, new LinkedHashSet<>()); } - public TimeRewardUser(UUID userUUID, Set<@NotNull String> claimedRewards, - long storedSeconds) { - this(userUUID, claimedRewards, storedSeconds, System.currentTimeMillis()); + public UserData(@NotNull UUID userUUID, long storedSeconds, + Set<@NotNull String> claimedRewards) { + this(userUUID, storedSeconds, claimedRewards, System.currentTimeMillis()); } - public TimeRewardUser(UUID userUUID, Set<@NotNull String> claimedRewards, - long storedSeconds, long joinMillis) { + public UserData(@NotNull UUID userUUID, long storedSeconds, + Set<@NotNull String> claimedRewards, long joinMillis) { this.userUUID = userUUID; - this.claimedRewards = claimedRewards; this.storedSeconds = storedSeconds; + this.claimedRewards = claimedRewards; this.joinMillis = joinMillis; } - public UUID getUserUUID() { + public @NotNull UUID getUserUUID() { return userUUID; } @@ -53,7 +51,6 @@ public class TimeRewardUser { return joinMillis; } - /** * 获取玩家本次加入服务器的时间 ,即为 当前时间-加入时间。 * diff --git a/src/main/java/cc/carm/plugin/timereward/storage/database/DatabaseConfig.java b/src/main/java/cc/carm/plugin/timereward/storage/database/DatabaseConfig.java new file mode 100644 index 0000000..4df6a54 --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/storage/database/DatabaseConfig.java @@ -0,0 +1,37 @@ +package cc.carm.plugin.timereward.storage.database; + +import cc.carm.lib.configuration.core.ConfigurationRoot; +import cc.carm.lib.configuration.core.annotation.ConfigPath; +import cc.carm.lib.configuration.core.annotation.HeaderComment; +import cc.carm.lib.configuration.core.value.ConfigValue; +import cc.carm.lib.configuration.core.value.type.ConfiguredValue; + +@HeaderComment("数据库相关设定") +@ConfigPath("storage.database") +public class DatabaseConfig extends ConfigurationRoot { + + @ConfigPath("driver") + protected static final ConfigValue DRIVER_NAME = ConfiguredValue.of( + String.class, "com.mysql.jdbc.Driver" + ); + + protected static final ConfigValue HOST = ConfiguredValue.of(String.class, "127.0.0.1"); + protected static final ConfigValue PORT = ConfiguredValue.of(Integer.class, 3306); + protected static final ConfigValue DATABASE = ConfiguredValue.of(String.class, "minecraft"); + protected static final ConfigValue USERNAME = ConfiguredValue.of(String.class, "root"); + protected static final ConfigValue PASSWORD = ConfiguredValue.of(String.class, "password"); + protected static final ConfigValue EXTRA = ConfiguredValue.of(String.class, "?useSSL=false"); + + @HeaderComment("插件相关表的名称") + public static final class TABLES extends ConfigurationRoot { + public static final ConfigValue USER_TIMES = ConfiguredValue.of(String.class, "tr_user_times"); + public static final ConfigValue USER_CLAIMED = ConfiguredValue.of(String.class, "tr_user_claimed"); + } + + protected static String buildJDBC() { + return String.format("jdbc:mysql://%s:%s/%s%s", + HOST.getNotNull(), PORT.getNotNull(), DATABASE.getNotNull(), EXTRA.getNotNull() + ); + } + +} diff --git a/src/main/java/cc/carm/plugin/timereward/storage/database/DatabaseTables.java b/src/main/java/cc/carm/plugin/timereward/storage/database/DatabaseTables.java new file mode 100644 index 0000000..2056534 --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/storage/database/DatabaseTables.java @@ -0,0 +1,74 @@ +package cc.carm.plugin.timereward.storage.database; + +import cc.carm.lib.configuration.core.value.ConfigValue; +import cc.carm.lib.easysql.api.SQLManager; +import cc.carm.lib.easysql.api.SQLTable; +import cc.carm.lib.easysql.api.builder.TableCreateBuilder; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.sql.SQLException; +import java.util.function.Consumer; + +public enum DatabaseTables implements SQLTable { + + /** + * 用于记录用户在线时间的表 + */ + USER_TIMES(DatabaseConfig.TABLES.USER_TIMES, (table) -> { + table.addColumn("uuid", "CHAR(36) NOT NULL PRIMARY KEY"); // 用户的UUID + + table.addColumn("time", "INT UNSIGNED NOT NULL DEFAULT 0"); // 用户在线时间(秒) + + table.addColumn("update", + "DATETIME NOT NULL " + + "DEFAULT CURRENT_TIMESTAMP " + + "ON UPDATE CURRENT_TIMESTAMP" + ); + }), + + /** + * 用于记录用户奖励领取情况的表 + */ + USER_CLAIMED(DatabaseConfig.TABLES.USER_CLAIMED, (table) -> { + table.addAutoIncrementColumn("id", false, true); // 排序键 + table.addColumn("uuid", "CHAR(36) NOT NULL PRIMARY KEY"); // 用户的UUID 主键 + + table.addColumn("value", "MEDIUMTEXT"); // 已领取的奖励ID + + table.addColumn("update", + "DATETIME NOT NULL " + + "DEFAULT CURRENT_TIMESTAMP " + + "ON UPDATE CURRENT_TIMESTAMP" + ); + }); + + private final Consumer builder; + private final ConfigValue name; + private @Nullable SQLManager manager; + + DatabaseTables(ConfigValue name, + Consumer builder) { + this.name = name; + this.builder = builder; + } + + @Override + public @Nullable SQLManager getSQLManager() { + return this.manager; + } + + @Override + public @NotNull String getTableName() { + return this.name.getNotNull(); + } + + @Override + public boolean create(SQLManager sqlManager) throws SQLException { + if (this.manager == null) this.manager = sqlManager; + + TableCreateBuilder tableBuilder = sqlManager.createTable(getTableName()); + if (builder != null) builder.accept(tableBuilder); + return tableBuilder.build().executeFunction(l -> l > 0, false); + } +} diff --git a/src/main/java/cc/carm/plugin/timereward/storage/database/MySQLStorage.java b/src/main/java/cc/carm/plugin/timereward/storage/database/MySQLStorage.java new file mode 100644 index 0000000..8a869d1 --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/storage/database/MySQLStorage.java @@ -0,0 +1,119 @@ +package cc.carm.plugin.timereward.storage.database; + +import cc.carm.lib.easysql.EasySQL; +import cc.carm.lib.easysql.api.SQLManager; +import cc.carm.plugin.timereward.Main; +import cc.carm.plugin.timereward.storage.UserData; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.UUID; + +public class MySQLStorage { + protected static final Gson GSON = new Gson(); + protected static final JsonParser PARSER = new JsonParser(); + private SQLManager sqlManager; + + public void initialize() throws Exception { + Main.info("加载数据库配置..."); + Main.getInstance().getConfigProvider().initialize(DatabaseConfig.class); + + try { + Main.info("尝试连接到数据库..."); + this.sqlManager = EasySQL.createManager( + DatabaseConfig.DRIVER_NAME.getNotNull(), DatabaseConfig.buildJDBC(), + DatabaseConfig.USERNAME.getNotNull(), DatabaseConfig.PASSWORD.getNotNull() + ); + this.sqlManager.setDebugMode(() -> Main.getInstance().isDebugging()); + } catch (Exception exception) { + throw new Exception("无法连接到数据库,请检查配置文件。", exception); + } + + try { + Main.info("创建插件所需表..."); + for (DatabaseTables value : DatabaseTables.values()) { + value.create(this.sqlManager); + } + } catch (SQLException exception) { + throw new Exception("无法创建插件所需的表,请检查数据库权限。", exception); + } + } + + public void shutdown() { + Main.info("关闭数据库连接..."); + EasySQL.shutdownManager(getSQLManager()); + this.sqlManager = null; + } + + public SQLManager getSQLManager() { + return sqlManager; + } + + public @Nullable UserData loadData(@NotNull UUID uuid) throws Exception { + Long playTime = loadPlayTime(uuid); + Set claimedData = loadClaimedData(uuid); + return new UserData(uuid, playTime, claimedData); + } + + @Nullable + public Long loadPlayTime(@NotNull UUID uuid) throws Exception { + return DatabaseTables.USER_TIMES.createQuery() + .selectColumns("uuid", "time") + .addCondition("uuid", uuid).setLimit(1).build() + .executeFunction((query) -> { + ResultSet resultSet = query.getResultSet(); + if (resultSet == null || !resultSet.next()) return 0L; + return resultSet.getLong("time"); + }); + } + + @NotNull + public Set loadClaimedData(@NotNull UUID uuid) throws Exception { + return DatabaseTables.USER_CLAIMED.createQuery() + .selectColumns("uuid", "value") + .addCondition("uuid", uuid).setLimit(1).build() + .executeFunction((query) -> { + ResultSet resultSet = query.getResultSet(); + if (!resultSet.next()) return new LinkedHashSet<>(); + String json = resultSet.getString("value"); + if (json == null) return new LinkedHashSet<>(); + JsonElement element = PARSER.parse(json); + if (!element.isJsonArray()) return new LinkedHashSet<>(); + Set ids = new LinkedHashSet<>(); + for (JsonElement e : element.getAsJsonArray()) { + ids.add(e.getAsString()); + } + return ids; + }, new LinkedHashSet<>()); + } + + public void saveClaimedData(@NotNull UUID uuid, @Nullable Set claimedRewards) throws Exception { + if (claimedRewards != null) { + DatabaseTables.USER_CLAIMED.createReplace() + .setColumnNames("uuid", "value") + .setParams(uuid.toString(), GSON.toJson(claimedRewards)) + .execute(); + } else { + DatabaseTables.USER_CLAIMED.createDelete() + .addCondition("uuid", uuid).setLimit(1) + .build() + .execute(); + } + } + + public void savePlayTime(@NotNull UUID uuid, long time) throws Exception { + DatabaseTables.USER_TIMES.createReplace() + .setColumnNames("uuid", "time") + .setParams(uuid.toString(), time) + .execute(); + } + +} + diff --git a/src/main/java/cc/carm/plugin/timereward/util/DataTaskRunner.java b/src/main/java/cc/carm/plugin/timereward/util/DataTaskRunner.java new file mode 100644 index 0000000..ea24ed3 --- /dev/null +++ b/src/main/java/cc/carm/plugin/timereward/util/DataTaskRunner.java @@ -0,0 +1,8 @@ +package cc.carm.plugin.timereward.util; + +import cc.carm.plugin.timereward.storage.database.MySQLStorage; + +@FunctionalInterface +public interface DataTaskRunner { + void run(MySQLStorage mySQLStorage) throws Exception; +} diff --git a/src/main/java/cc/carm/plugin/timereward/util/JarResourceUtils.java b/src/main/java/cc/carm/plugin/timereward/util/JarResourceUtils.java deleted file mode 100644 index f4fbcea..0000000 --- a/src/main/java/cc/carm/plugin/timereward/util/JarResourceUtils.java +++ /dev/null @@ -1,106 +0,0 @@ -package cc.carm.plugin.timereward.util; - -import org.jetbrains.annotations.Nullable; - -import java.io.*; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -@SuppressWarnings("ResultOfMethodCallIgnored") -public class JarResourceUtils { - public static final char JAR_SEPARATOR = '/'; - - public static @Nullable String[] readResource(@Nullable InputStream resourceStream) { - if (resourceStream == null) return null; - try (Scanner scanner = new Scanner(resourceStream, StandardCharsets.UTF_8.name())) { - List contents = new ArrayList<>(); - while (scanner.hasNextLine()) { - contents.add(scanner.nextLine()); - } - return contents.toArray(new String[0]); - } catch (Exception e) { - return null; - } - } - - public static void copyFolderFromJar(String folderName, File destFolder, CopyOption option) - throws IOException { - copyFolderFromJar(folderName, destFolder, option, null); - } - - public static void copyFolderFromJar(String folderName, File destFolder, - CopyOption option, PathTrimmer trimmer) throws IOException { - if (!destFolder.exists()) - destFolder.mkdirs(); - - byte[] buffer = new byte[1024]; - - File fullPath; - String path = JarResourceUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath(); - if (trimmer != null) - path = trimmer.trim(path); - try { - if (!path.startsWith("file")) - path = "file://" + path; - - fullPath = new File(new URI(path)); - } catch (URISyntaxException e) { - e.printStackTrace(); - return; - } - - ZipInputStream zis = new ZipInputStream(new FileInputStream(fullPath)); - - ZipEntry entry; - while ((entry = zis.getNextEntry()) != null) { - if (!entry.getName().startsWith(folderName + JAR_SEPARATOR)) - continue; - - String fileName = entry.getName(); - - if (fileName.charAt(fileName.length() - 1) == JAR_SEPARATOR) { - File file = new File(destFolder + File.separator + fileName); - if (file.isFile()) { - file.delete(); - } - file.mkdirs(); - continue; - } - - File file = new File(destFolder + File.separator + fileName); - if (option == CopyOption.COPY_IF_NOT_EXIST && file.exists()) - continue; - - if (!file.getParentFile().exists()) - file.getParentFile().mkdirs(); - - if (!file.exists()) - file.createNewFile(); - FileOutputStream fos = new FileOutputStream(file); - - int len; - while ((len = zis.read(buffer)) > 0) { - fos.write(buffer, 0, len); - } - fos.close(); - } - - zis.closeEntry(); - zis.close(); - } - - public enum CopyOption { - COPY_IF_NOT_EXIST, REPLACE_IF_EXIST - } - - @FunctionalInterface - public interface PathTrimmer { - String trim(String original); - } -} \ No newline at end of file diff --git a/src/main/resources/PLUGIN_INFO b/src/main/resources/PLUGIN_INFO index ca7d86a..2941fa7 100644 --- a/src/main/resources/PLUGIN_INFO +++ b/src/main/resources/PLUGIN_INFO @@ -1,6 +1,5 @@ -&e _____ _ &6______ _ -&e|_ _(_) &6| ___ \ | | -&e | | _ _ __ ___ ___&6| |_/ /_____ ____ _ _ __ __| | -&e | | | | '_ ` _ \ / _ \&6 // _ \ \ /\ / / _` | '__/ _` | -&e | | | | | | | | | __/&6 |\ \ __/\ V V / (_| | | | (_| | -&e \_/ |_|_| |_| |_|\___\&6_| \_\___| \_/\_/ \__,_|_| \__,_| \ No newline at end of file +&e _______ &6 ____ __ +&e /_ __(_)___ ___ ___ &6 / __ \___ _ ______ __________/ / +&e / / / / __ `__ \/ _ \&6/ /_/ / _ \ | /| / / __ `/ ___/ __ / +&e / / / / / / / / / __&6/ _, _/ __/ |/ |/ / /_/ / / / /_/ / +&e/_/ /_/_/ /_/ /_/\___/&6_/ |_|\___/|__/|__/\__,_/_/ \__,_/ \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml deleted file mode 100644 index fd0994e..0000000 --- a/src/main/resources/config.yml +++ /dev/null @@ -1,57 +0,0 @@ -# ${project.name} - ${project.description} -# 项目地址: ${project.url} -# 下载地址: ${project.distributionManagement.downloadUrl} -version: ${project.version} - -debug: false - -# 统计数据设定 -# 该选项用于帮助开发者统计插件版本与使用情况,且绝不会影响性能与使用体验。 -# 当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。 -metrics: true - -# 检查更新设定 -# 该选项用于插件判断是否要检查更新,若您不希望插件检查更新并提示您,可以选择关闭。 -# 检查更新为异步操作,绝不会影响性能与使用体验。 -check-update: true - - -database: - # 数据库驱动路径,默认为 MySQL - driver: "com.mysql.cj.jdbc.Driver" - # 数据库连接配置 - host: "127.0.0.1" - port: 3306 - database: "minecraft" - username: "username" - password: "password" - additional: "?useSSL=false" - # 插件相关表的名称 - tables: - claimed: "tr_user_claimed" # 用于记录用户奖励领取情况的表 - time: "tr_user_times" # 用于记录用户在线时间的表 - -# 奖励相关配置 -rewards: - - # 配置键名即奖励ID,支持英文、数字与下划线。 - # 确定后请不要更改,因为该键值用于存储玩家是否领取的数据 - # 如果更改,原先领取过该奖励的玩家将会自动再领取一次! - "example": - - # 奖励的显示名称,可以是任意字符串 - # 可以在commands 中使用 %(name) 来获取该奖励的名称 - # 也可以使用变量 %TimeReward_reward_<奖励ID>% 来获取对应奖励的名称 - name: "&f[初级奖励] &e总在线时长 2小时" - - # 该奖励自动领取需要的在线时长,单位为秒 - time: 7200 - - # 该奖励领取权限,可以不设置。 - # 若为空则所有人都可以领取;若不为空,则需要拥有该权限的玩家才能领取。 - permission: "servername.vip" - - # 领取奖励时后台执行的指令 - # 支持PlaceholderAPI变量,指令中可以使用 %(name) 来获取该奖励的名称 - commands: - - "say &f恭喜 &b%player_name% &f领取了奖励 &r%(name) &f! " \ No newline at end of file diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml deleted file mode 100644 index 5773569..0000000 --- a/src/main/resources/messages.yml +++ /dev/null @@ -1,5 +0,0 @@ -# ${project.name} - ${project.description} -# 项目地址: ${project.url} -# 下载地址: ${project.distributionManagement.downloadUrl} - -version: ${project.version} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index cbf7fdd..2c91fd6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,26 +1,24 @@ main: cc.carm.plugin.timereward.Main name: TimeReward - version: ${project.version} -description: ${project.description} +author: CarmJos website: ${project.url} +description: ${project.description} -authors: - - CarmJos +api-version: 1.13 softdepend: - PlaceholderAPI -api-version: 1.13 +permissions: + "TimeReward.admin": + description: "在线自动领奖的管理员权限。" + default: op commands: "TimeReward": permission: "TimeReward.admin" description: "在线自动领奖的基础指令。" usage: "/TimeReward help" - -permissions: - - "TimeReward.admin": - description: "在线自动领奖的管理员权限。" - default: op \ No newline at end of file + aliases: + - tr \ No newline at end of file