mirror of
https://github.com/carm-outsource/TimeReward.git
synced 2024-09-19 19:25:49 +00:00
完成用户数据读取与保存
This commit is contained in:
parent
e17ecd68ea
commit
8f15e30d98
1
pom.xml
1
pom.xml
@ -73,7 +73,6 @@
|
|||||||
<artifactId>easyplugin-main</artifactId>
|
<artifactId>easyplugin-main</artifactId>
|
||||||
<version>${easyplugin.version}</version>
|
<version>${easyplugin.version}</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
|
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -3,7 +3,12 @@ package cc.carm.plugin.timereward;
|
|||||||
import cc.carm.lib.easyplugin.EasyPlugin;
|
import cc.carm.lib.easyplugin.EasyPlugin;
|
||||||
import cc.carm.lib.easyplugin.i18n.EasyPluginMessageProvider;
|
import cc.carm.lib.easyplugin.i18n.EasyPluginMessageProvider;
|
||||||
import cc.carm.plugin.timereward.configuration.PluginConfig;
|
import cc.carm.plugin.timereward.configuration.PluginConfig;
|
||||||
|
import cc.carm.plugin.timereward.database.DataManager;
|
||||||
|
import cc.carm.plugin.timereward.listener.UserListener;
|
||||||
import cc.carm.plugin.timereward.manager.ConfigManager;
|
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;
|
||||||
|
|
||||||
public class Main extends EasyPlugin {
|
public class Main extends EasyPlugin {
|
||||||
private static Main instance;
|
private static Main instance;
|
||||||
@ -13,20 +18,40 @@ public class Main extends EasyPlugin {
|
|||||||
instance = this;
|
instance = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static ConfigManager configManager;
|
protected DataManager dataManager;
|
||||||
|
protected ConfigManager configManager;
|
||||||
|
protected UserManager userManager;
|
||||||
|
protected RewardManager rewardManager;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean initialize() {
|
public boolean initialize() {
|
||||||
log("加载插件配置文件...");
|
log("加载插件配置文件...");
|
||||||
Main.configManager = new ConfigManager();
|
this.configManager = new ConfigManager();
|
||||||
if (!Main.configManager.initConfig()) {
|
if (!this.configManager.initConfig()) {
|
||||||
error("插件配置文件初始化失败,请检查文件权限。");
|
error("插件配置文件初始化失败,请检查文件权限。");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
log("加载玩家管理器...");
|
info("初始化数据管理器...");
|
||||||
|
this.dataManager = new DataManager();
|
||||||
|
if (!dataManager.initialize()) {
|
||||||
|
severe("初始化数据库失败,请检查配置文件。");
|
||||||
|
dataManager.shutdown();
|
||||||
|
return false; // 初始化失败,不再继续加载
|
||||||
|
}
|
||||||
|
|
||||||
|
log("加载用户管理器...");
|
||||||
|
this.userManager = new UserManager();
|
||||||
|
if (Bukkit.getOnlinePlayers().size() > 0) {
|
||||||
|
log(" 加载当前在线用户数据...");
|
||||||
|
this.userManager.loadAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
log("加载奖励管理器...");
|
||||||
|
this.rewardManager = new RewardManager();
|
||||||
|
|
||||||
log("注册监听器...");
|
log("注册监听器...");
|
||||||
|
regListener(new UserListener());
|
||||||
|
|
||||||
log("注册指令...");
|
log("注册指令...");
|
||||||
|
|
||||||
@ -36,6 +61,15 @@ public class Main extends EasyPlugin {
|
|||||||
@Override
|
@Override
|
||||||
protected void shutdown() {
|
protected void shutdown() {
|
||||||
|
|
||||||
|
info("卸载监听器...");
|
||||||
|
Bukkit.getServicesManager().unregisterAll(this);
|
||||||
|
|
||||||
|
info("保存用户数据...");
|
||||||
|
this.userManager.unloadAll(true);
|
||||||
|
|
||||||
|
info("结束数据库进程...");
|
||||||
|
getDataManager().shutdown();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -59,4 +93,8 @@ public class Main extends EasyPlugin {
|
|||||||
getInstance().debug(messages);
|
getInstance().debug(messages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static DataManager getDataManager() {
|
||||||
|
return getInstance().dataManager;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,4 +1,22 @@
|
|||||||
package cc.carm.plugin.timereward;
|
package cc.carm.plugin.timereward;
|
||||||
|
|
||||||
|
import cc.carm.plugin.timereward.manager.ConfigManager;
|
||||||
|
import cc.carm.plugin.timereward.manager.RewardManager;
|
||||||
|
import cc.carm.plugin.timereward.manager.UserManager;
|
||||||
|
|
||||||
public class TimeRewardAPI {
|
public class TimeRewardAPI {
|
||||||
|
|
||||||
|
public static UserManager getUserManager() {
|
||||||
|
return Main.getInstance().userManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ConfigManager getConfigManager() {
|
||||||
|
return Main.getInstance().configManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RewardManager getRewardManager(){
|
||||||
|
return Main.getInstance().rewardManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package cc.carm.plugin.timereward.configuration;
|
package cc.carm.plugin.timereward.configuration;
|
||||||
|
|
||||||
import cc.carm.lib.easyplugin.configuration.impl.ConfigSound;
|
|
||||||
import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
|
import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
|
||||||
import org.bukkit.Sound;
|
|
||||||
|
|
||||||
public class PluginConfig {
|
public class PluginConfig {
|
||||||
|
|
||||||
public static final ConfigValue<Boolean> DEBUG = new ConfigValue<>(
|
public static final ConfigValue<Boolean> DEBUG = new ConfigValue<>(
|
||||||
"debug", Boolean.class, false
|
"debug", Boolean.class, false
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,10 @@ import cc.carm.lib.easyplugin.configuration.language.MessagesRoot;
|
|||||||
|
|
||||||
public class PluginMessages extends MessagesRoot {
|
public class PluginMessages extends MessagesRoot {
|
||||||
|
|
||||||
public static final EasyMessageList NOT_ONLINE = new EasyMessageList(
|
public static final EasyMessageList NOT_ONLINE = EasyMessageList.builder()
|
||||||
new String[]{"&7玩家 &c%(player) &7并不在线。"},
|
.contents("&7玩家 &c%(player) &7并不在线。")
|
||||||
new String[]{"%(player)"}
|
.params("player")
|
||||||
);
|
.build();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
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;
|
||||||
|
}
|
@ -0,0 +1,90 @@
|
|||||||
|
package cc.carm.plugin.timereward.data;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户奖励数据,用于存储用户的奖励的领取情况。
|
||||||
|
*/
|
||||||
|
public class TimeRewardUser {
|
||||||
|
|
||||||
|
UUID userUUID;
|
||||||
|
|
||||||
|
Set<@NotNull String> claimedRewards; //记录已领取的奖励ID
|
||||||
|
|
||||||
|
long storedSeconds; //记录已经游玩的时间
|
||||||
|
long joinMillis; // 记录本次加入的时间
|
||||||
|
|
||||||
|
public TimeRewardUser(UUID userUUID) {
|
||||||
|
this(userUUID, new LinkedHashSet<>(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TimeRewardUser(UUID userUUID, Set<@NotNull String> claimedRewards,
|
||||||
|
long storedSeconds) {
|
||||||
|
this(userUUID, claimedRewards, storedSeconds, System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public TimeRewardUser(UUID userUUID, Set<@NotNull String> claimedRewards,
|
||||||
|
long storedSeconds, long joinMillis) {
|
||||||
|
this.userUUID = userUUID;
|
||||||
|
this.claimedRewards = claimedRewards;
|
||||||
|
this.storedSeconds = storedSeconds;
|
||||||
|
this.joinMillis = joinMillis;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getUserUUID() {
|
||||||
|
return userUUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getStoredSeconds() {
|
||||||
|
return storedSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 得到本次加入游戏的时间
|
||||||
|
*
|
||||||
|
* @return 本次加入游戏时间
|
||||||
|
*/
|
||||||
|
public long getJoinMillis() {
|
||||||
|
return joinMillis;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取玩家本次加入服务器的时间 ,即为 当前时间-加入时间。
|
||||||
|
*
|
||||||
|
* @return 玩家本次加入服务器的时间
|
||||||
|
*/
|
||||||
|
public long getCurrentSeconds() {
|
||||||
|
return TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - getJoinMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 玩家在数据库中已经游玩的时间 + (当前时间-加入时间)
|
||||||
|
*
|
||||||
|
* @return 之前游玩的世界与本次游玩时间之和
|
||||||
|
*/
|
||||||
|
public long getAllSeconds() {
|
||||||
|
return getStoredSeconds() + getCurrentSeconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getClaimedRewards() {
|
||||||
|
return claimedRewards;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isClaimed(@NotNull String rewardId) {
|
||||||
|
return this.claimedRewards.contains(rewardId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean claimReward(@NotNull String rewardId) {
|
||||||
|
if (isClaimed(rewardId)) return false; // 已经领取过了
|
||||||
|
this.claimedRewards.add(rewardId);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
package cc.carm.plugin.timereward.database;
|
||||||
|
|
||||||
|
import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
|
||||||
|
|
||||||
|
public class DBConfiguration {
|
||||||
|
|
||||||
|
protected static final ConfigValue<String> DRIVER_NAME = new ConfigValue<>(
|
||||||
|
"storage.mysql.driver", String.class,
|
||||||
|
"com.mysql.cj.jdbc.Driver"
|
||||||
|
);
|
||||||
|
|
||||||
|
protected static final ConfigValue<String> HOST = new ConfigValue<>(
|
||||||
|
"storage.mysql.host", String.class,
|
||||||
|
"127.0.0.1"
|
||||||
|
);
|
||||||
|
|
||||||
|
protected static final ConfigValue<Integer> PORT = new ConfigValue<>(
|
||||||
|
"storage.mysql.port", Integer.class,
|
||||||
|
3306
|
||||||
|
);
|
||||||
|
|
||||||
|
protected static final ConfigValue<String> DATABASE = new ConfigValue<>(
|
||||||
|
"storage.mysql.database", String.class,
|
||||||
|
"minecraft"
|
||||||
|
);
|
||||||
|
|
||||||
|
protected static final ConfigValue<String> USERNAME = new ConfigValue<>(
|
||||||
|
"storage.mysql.username", String.class,
|
||||||
|
"root"
|
||||||
|
);
|
||||||
|
|
||||||
|
protected static final ConfigValue<String> PASSWORD = new ConfigValue<>(
|
||||||
|
"storage.mysql.password", String.class,
|
||||||
|
"password"
|
||||||
|
);
|
||||||
|
|
||||||
|
protected static final ConfigValue<String> ADDITIONAL = new ConfigValue<>(
|
||||||
|
"storage.mysql.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()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
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<String> 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<String> TABLE_NAME = new ConfigValue<>(
|
||||||
|
"database.tables.claimed", String.class,
|
||||||
|
"tr_user_claimed"
|
||||||
|
);
|
||||||
|
|
||||||
|
protected static final String[] TABLE_COLUMNS = new String[]{
|
||||||
|
"`id` INT NOT NULL UNSIGNED 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 '最后更新时间'"
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,117 @@
|
|||||||
|
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 me.clip.placeholderapi.libs.gson.Gson;
|
||||||
|
import me.clip.placeholderapi.libs.gson.JsonElement;
|
||||||
|
import me.clip.placeholderapi.libs.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();
|
||||||
|
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<String> 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 = JsonParser.parseString(json);
|
||||||
|
if (!element.isJsonArray()) return new LinkedHashSet<>();
|
||||||
|
Set<String> ids = new LinkedHashSet<>();
|
||||||
|
for (JsonElement e : element.getAsJsonArray()) {
|
||||||
|
ids.add(e.getAsString());
|
||||||
|
}
|
||||||
|
return ids;
|
||||||
|
}, new LinkedHashSet<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void saveClaimedData(@NotNull UUID userUUID, @Nullable Set<String> 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
package cc.carm.plugin.timereward.listener;
|
||||||
|
|
||||||
|
import cc.carm.plugin.timereward.TimeRewardAPI;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
|
||||||
|
public class UserListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onJoin(PlayerJoinEvent event) {
|
||||||
|
TimeRewardAPI.getUserManager().loadData(event.getPlayer().getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onQuit(PlayerQuitEvent event) {
|
||||||
|
TimeRewardAPI.getUserManager().unloadData(event.getPlayer().getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
package cc.carm.plugin.timereward.manager;
|
||||||
|
|
||||||
|
public class RewardManager {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
134
src/main/java/cc/carm/plugin/timereward/manager/UserManager.java
Normal file
134
src/main/java/cc/carm/plugin/timereward/manager/UserManager.java
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
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 org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
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<UUID, TimeRewardUser> userDataMap;
|
||||||
|
|
||||||
|
public UserManager() {
|
||||||
|
this.userDataMap = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public TimeRewardUser readData(UUID userUUID) {
|
||||||
|
try {
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
DataManager storage = Main.getDataManager();
|
||||||
|
|
||||||
|
Long playTime = storage.getPlayTime(userUUID);
|
||||||
|
Set<String> claimedRewards = storage.getClaimedData(userUUID);
|
||||||
|
|
||||||
|
if (playTime == null && claimedRewards.isEmpty()) {
|
||||||
|
Main.debugging("当前还不存在玩家 " + userUUID + " 的数据,视作新档。");
|
||||||
|
return new TimeRewardUser(userUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
Main.debugging("读取 " + userUUID + " 的用户数据完成, 耗时 " + (System.currentTimeMillis() - start) + "ms。");
|
||||||
|
return new TimeRewardUser(userUUID, claimedRewards, playTime == null ? 0L : playTime);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Main.severe("无法正常读取玩家数据,玩家操作将不会被保存,请检查数据配置!");
|
||||||
|
Main.severe("Could not load user's data, please check the data configuration!");
|
||||||
|
e.printStackTrace();
|
||||||
|
return new TimeRewardUser(userUUID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveData(TimeRewardUser user) {
|
||||||
|
try {
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
DataManager dataManager = Main.getDataManager();
|
||||||
|
|
||||||
|
Main.debugging("正在保存 " + user.getUserUUID() + " 的用户数据...");
|
||||||
|
dataManager.saveClaimedData(user.getUserUUID(), user.getClaimedRewards());
|
||||||
|
dataManager.savePlayTime(user.getUserUUID(), user.getAllSeconds());
|
||||||
|
Main.debugging("保存 " + user.getUserUUID() + " 的用户数据完成,耗时 " + (System.currentTimeMillis() - start) + "ms。");
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
Main.severe("无法正常保存玩家数据,请检查数据配置!");
|
||||||
|
Main.severe("Could not save user's data, please check the data configuration!");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadData(UUID userUUID) {
|
||||||
|
getUsersMap().put(userUUID, readData(userUUID));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unloadData(UUID userUUID) {
|
||||||
|
unloadData(userUUID, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unloadData(UUID userUUID, boolean save) {
|
||||||
|
TimeRewardUser data = getData(userUUID);
|
||||||
|
if (data == null) return;
|
||||||
|
if (save) saveData(data);
|
||||||
|
getUsersMap().remove(userUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadAll() {
|
||||||
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
|
if (getUsersMap().containsKey(player.getUniqueId())) continue;
|
||||||
|
loadData(player.getUniqueId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveAll() {
|
||||||
|
getUsersMap().values().forEach(this::saveData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unloadAll(boolean save) {
|
||||||
|
if (save) saveAll();
|
||||||
|
getUsersMap().clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public TimeRewardUser getData(UUID userUUID) {
|
||||||
|
return getUsersMap().get(userUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public TimeRewardUser getData(Player player) {
|
||||||
|
return getUsersMap().get(player.getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void editData(@NotNull UUID uuid, @NotNull DataTaskRunner task) {
|
||||||
|
TimeRewardUser user = getData(uuid);
|
||||||
|
if (user == null) user = readData(uuid); // 不在线则加载数据
|
||||||
|
try {
|
||||||
|
task.run(user, Main.getDataManager());
|
||||||
|
} catch (Exception exception) {
|
||||||
|
Main.severe("无法正常更改玩家数据,请检查数据配置!");
|
||||||
|
Main.severe("Could not edit user's data, please check the data configuration!");
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void editDataAsync(@NotNull UUID uuid, @NotNull DataTaskRunner task) {
|
||||||
|
Main.getInstance().getScheduler().runAsync(() -> editData(uuid, task));
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Unmodifiable
|
||||||
|
public Map<UUID, TimeRewardUser> listUsers() {
|
||||||
|
return new HashMap<>(getUsersMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected @NotNull HashMap<UUID, TimeRewardUser> getUsersMap() {
|
||||||
|
return userDataMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,3 +4,20 @@
|
|||||||
version: ${project.version}
|
version: ${project.version}
|
||||||
|
|
||||||
debug: false
|
debug: false
|
||||||
|
|
||||||
|
|
||||||
|
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" # 用于记录用户在线时间的表
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user