From 45346b093a723b001edaf6f44398be01bfc367ca Mon Sep 17 00:00:00 2001
From: Yurinann <1713574450@qq.com>
Date: Wed, 22 Feb 2023 19:26:25 +0800
Subject: [PATCH] =?UTF-8?q?refactor(update):=20=E9=80=82=E9=85=8D=E6=9C=80?=
=?UTF-8?q?=E6=96=B0=E4=BE=9D=E8=B5=96=E7=89=88=E6=9C=AC=20(#5)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* refactor(update): 适配最新依赖版本
* feat(update): 更新 README,添加更多自定义语言文本。
---
README.md | 64 ++++---
pom.xml | 162 ++++++++++--------
.../java/cc/carm/plugin/timereward/Main.java | 119 ++++++-------
.../carm/plugin/timereward/TimeRewardAPI.java | 6 -
.../timereward/command/TimeRewardCommand.java | 47 ++---
.../plugin/timereward/conf/PluginConfig.java | 81 +++++++++
.../timereward/conf/PluginMessages.java | 126 ++++++++++++++
.../configuration/PluginConfig.java | 30 ----
.../configuration/PluginMessages.java | 64 -------
.../timereward/data/DataTaskRunner.java | 8 -
.../timereward/database/DBConfiguration.java | 49 ------
.../plugin/timereward/database/DBTables.java | 45 -----
.../timereward/database/DataManager.java | 117 -------------
.../timereward/hooker/GHUpdateChecker.java | 34 ----
.../timereward/hooker/PAPIExpansion.java | 6 +-
.../timereward/listener/UserListener.java | 4 +-
.../timereward/manager/ConfigManager.java | 49 ------
.../timereward/manager/RewardManager.java | 58 ++++---
.../timereward/manager/UserManager.java | 92 +++++-----
.../{data => storage}/RewardContents.java | 4 +-
.../UserData.java} | 33 ++--
.../storage/database/DatabaseConfig.java | 37 ++++
.../storage/database/DatabaseTables.java | 74 ++++++++
.../storage/database/MySQLStorage.java | 119 +++++++++++++
.../timereward/util/DataTaskRunner.java | 8 +
.../timereward/util/JarResourceUtils.java | 106 ------------
src/main/resources/PLUGIN_INFO | 11 +-
src/main/resources/config.yml | 57 ------
src/main/resources/messages.yml | 5 -
src/main/resources/plugin.yml | 20 +--
30 files changed, 766 insertions(+), 869 deletions(-)
create mode 100644 src/main/java/cc/carm/plugin/timereward/conf/PluginConfig.java
create mode 100644 src/main/java/cc/carm/plugin/timereward/conf/PluginMessages.java
delete mode 100644 src/main/java/cc/carm/plugin/timereward/configuration/PluginConfig.java
delete mode 100644 src/main/java/cc/carm/plugin/timereward/configuration/PluginMessages.java
delete mode 100644 src/main/java/cc/carm/plugin/timereward/data/DataTaskRunner.java
delete mode 100644 src/main/java/cc/carm/plugin/timereward/database/DBConfiguration.java
delete mode 100644 src/main/java/cc/carm/plugin/timereward/database/DBTables.java
delete mode 100644 src/main/java/cc/carm/plugin/timereward/database/DataManager.java
delete mode 100644 src/main/java/cc/carm/plugin/timereward/hooker/GHUpdateChecker.java
delete mode 100644 src/main/java/cc/carm/plugin/timereward/manager/ConfigManager.java
rename src/main/java/cc/carm/plugin/timereward/{data => storage}/RewardContents.java (93%)
rename src/main/java/cc/carm/plugin/timereward/{data/TimeRewardUser.java => storage/UserData.java} (68%)
create mode 100644 src/main/java/cc/carm/plugin/timereward/storage/database/DatabaseConfig.java
create mode 100644 src/main/java/cc/carm/plugin/timereward/storage/database/DatabaseTables.java
create mode 100644 src/main/java/cc/carm/plugin/timereward/storage/database/MySQLStorage.java
create mode 100644 src/main/java/cc/carm/plugin/timereward/util/DataTaskRunner.java
delete mode 100644 src/main/java/cc/carm/plugin/timereward/util/JarResourceUtils.java
delete mode 100644 src/main/resources/config.yml
delete mode 100644 src/main/resources/messages.yml
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
-[](https://github.com/CarmJos/TimeReward/actions/workflows/maven.yml)
-
+
+[](https://github.com/carm-outsource/TimeReward/releases)
+[](https://github.com/CarmJos/TimeReward/actions/workflows/maven.yml)
+

使用数据库存储的在线时长自动领奖插件,通过指令发放奖励,基于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),详见代码源文件,将在首次启动时生成配置。
+
## 使用统计
[](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://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