diff --git a/.examples/userdata/uuid.yml b/.examples/userdata/uuid.yml new file mode 100644 index 0000000..9b1ef9f --- /dev/null +++ b/.examples/userdata/uuid.yml @@ -0,0 +1,13 @@ +date: 20211111 # 用于判断售出数据的所在日期 + +depositories: + "miner": + "COAL:0": + amount: 1241 + sold: 100 + "FLINT:0": + amount: 1241 + "fishman": + "TROPICAL_FISH:0": + amount: 51 + sold: 4 diff --git a/pom.xml b/pom.xml index d77c395..96f9b06 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ cc.carm.plugin ultradepository jar - 1.0.1 + 1.1.0 UltraDepository 超级仓库插件,支持设定不同物品的存储仓库。 diff --git a/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java b/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java index 5bd98bc..8fc4cb8 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java +++ b/src/main/java/cc/carm/plugin/ultradepository/data/UserData.java @@ -4,7 +4,7 @@ import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.configuration.depository.Depository; import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem; import cc.carm.plugin.ultradepository.storage.DataStorage; -import cc.carm.plugin.ultradepository.util.DateUtil; +import cc.carm.plugin.ultradepository.util.DateIntUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -118,12 +118,16 @@ public class UserData { public Date getDate() { - return new Date(DateUtil.getDateMillis(this.date)); + return new Date(DateIntUtil.getDateMillis(getDateInt())); + } + + public int getDateInt() { + return this.date; } public boolean isCurrentDay() { - return this.date == DateUtil.getCurrentDate(); + return this.date == DateIntUtil.getCurrentDate(); } @@ -132,7 +136,7 @@ public class UserData { Main.debug("Date is not change, skip clear sold amount."); return; } - this.date = DateUtil.getCurrentDate(); //更新日期 + this.date = DateIntUtil.getCurrentDate(); //更新日期 Main.debug("Date changed, clear sold."); getDepositories().values().stream() .flatMap(value -> value.getContents().values().stream()) diff --git a/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java b/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java index 9db8341..71b063b 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java @@ -2,7 +2,7 @@ package cc.carm.plugin.ultradepository.manager; import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.data.UserData; -import cc.carm.plugin.ultradepository.util.DateUtil; +import cc.carm.plugin.ultradepository.util.DateIntUtil; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -33,7 +33,7 @@ public class UserManager { } catch (Exception e) { Main.error("无法正常加载玩家数据,玩家操作将不会被保存,请检查数据配置!"); Main.error("Could not load user's data, please check the data configuration!"); - return new UserData(userUUID, Main.getStorage(), new HashMap<>(), DateUtil.getCurrentDate()); + return new UserData(userUUID, Main.getStorage(), new HashMap<>(), DateIntUtil.getCurrentDate()); } } diff --git a/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java b/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java index 923d1dd..9e26b90 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java +++ b/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java @@ -1,14 +1,22 @@ package cc.carm.plugin.ultradepository.storage; import cc.carm.plugin.ultradepository.Main; +import cc.carm.plugin.ultradepository.configuration.depository.Depository; +import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem; import cc.carm.plugin.ultradepository.configuration.values.ConfigValue; +import cc.carm.plugin.ultradepository.data.DepositoryData; +import cc.carm.plugin.ultradepository.data.DepositoryItemData; import cc.carm.plugin.ultradepository.data.UserData; -import cc.carm.plugin.ultradepository.util.DateUtil; +import cc.carm.plugin.ultradepository.util.DateIntUtil; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; import java.io.File; -import java.sql.Date; +import java.io.IOException; import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.UUID; public class FileStorage implements DataStorage { @@ -21,7 +29,12 @@ public class FileStorage implements DataStorage { @Override public boolean initialize() { - return false; + dataContainer = new File(Main.getInstance().getDataFolder(), FILE_PATH.get()); + if (!dataContainer.exists()) { + return dataContainer.mkdir(); + } else { + return dataContainer.isDirectory(); + } } @Override @@ -29,18 +42,90 @@ public class FileStorage implements DataStorage { // 似乎没什么需要做的? } + public File getDataContainer() { + return dataContainer; + } + @Override public @NotNull UserData loadData(@NotNull UUID uuid) { long start = System.currentTimeMillis(); Main.debug("正通过 FileStorage 加载 " + uuid + " 的用户数据..."); - return new UserData(uuid, this, new HashMap<>(), DateUtil.getCurrentDate()); + File userDataFile = new File(getDataContainer(), uuid + ".yml"); + if (!userDataFile.exists()) { + Main.debug("当前文件夾内不存在玩家 " + uuid + " 的数据,视作新档。"); + return new UserData(uuid, this, new HashMap<>(), DateIntUtil.getCurrentDate()); + } + + YamlConfiguration userDataConfig = YamlConfiguration.loadConfiguration(userDataFile); + int dateInt = userDataConfig.getInt("date", DateIntUtil.getCurrentDate()); + UserData userData = new UserData(uuid, this, new HashMap<>(), dateInt); + + ConfigurationSection depositoriesSection = userDataConfig.getConfigurationSection("depositories"); + if (depositoriesSection != null) { + for (String depositoryID : depositoriesSection.getKeys(false)) { + + Depository depository = Main.getDepositoryManager().getDepository(depositoryID); + if (depository == null) continue; + + ConfigurationSection depositorySection = depositoriesSection.getConfigurationSection(depositoryID); + if (depositorySection == null) continue; + + DepositoryData depositoryData = DepositoryData.emptyContents(depository, userData); + + for (String itemTypeID : depositorySection.getKeys(false)) { + DepositoryItem item = depository.getItems().get(itemTypeID); + if (item == null) continue; + + ConfigurationSection itemSection = depositorySection.getConfigurationSection(itemTypeID); + if (itemSection == null) continue; + + depositoryData.getContents().put(item.getTypeID(), new DepositoryItemData( + item, depositoryData, + itemSection.getInt("amount", 0), + itemSection.getInt("sold", 0) + )); + + } + + if (!depositoryData.getContents().isEmpty()) userData.setDepository(depositoryData); + } + } + Main.debug("通过 FileStorage 加载 " + uuid + " 的用户数据完成," + + "耗时 " + (System.currentTimeMillis() - start) + "ms。"); + + return userData; } @Override - public void saveUserData(@NotNull UserData data) { + public void saveUserData(@NotNull UserData data) throws IOException { long start = System.currentTimeMillis(); Main.debug("正通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据..."); + YamlConfiguration userDataConfig = new YamlConfiguration(); + userDataConfig.set("date", data.getDateInt()); + + Map>> values = new LinkedHashMap<>(); + + data.getDepositories().forEach((depositoryID, depositoryData) -> { + Map> depositoryDataMap = new LinkedHashMap<>(); + depositoryData.getContents().forEach((itemType, itemData) -> { + Map itemDataMap = new HashMap<>(); + if (itemData.getAmount() > 0) itemDataMap.put("amount", itemData.getAmount()); + if (itemData.getSold() > 0) itemDataMap.put("sold", itemData.getSold()); + if (!itemDataMap.isEmpty()) depositoryDataMap.put(itemType, itemDataMap); + }); + if (!depositoryDataMap.isEmpty()) values.put(depositoryID, depositoryDataMap); + }); + + try { + userDataConfig.createSection("depositories", values); + userDataConfig.save(new File(getDataContainer(), data.getUserUUID() + ".yml")); + } catch (IOException ioException) { + Main.error("在保存玩家 #" + data.getUserUUID() + " 的数据时出现异常。"); + Main.error("Error occurred when saving #" + data.getUserUUID() + " data."); + throw ioException; + } + Main.debug( "通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据完成," + "耗时 " + (System.currentTimeMillis() - start) + "ms。" diff --git a/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java b/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java index 7ac039b..e8be85c 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java +++ b/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java @@ -12,7 +12,7 @@ import cc.carm.plugin.ultradepository.configuration.values.ConfigValue; import cc.carm.plugin.ultradepository.data.DepositoryData; import cc.carm.plugin.ultradepository.data.DepositoryItemData; import cc.carm.plugin.ultradepository.data.UserData; -import cc.carm.plugin.ultradepository.util.DateUtil; +import cc.carm.plugin.ultradepository.util.DateIntUtil; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -126,7 +126,7 @@ public class MySQLStorage implements DataStorage { if (resultSet != null && resultSet.next()) { String dataJSON = resultSet.getString("data"); Date date = resultSet.getDate("day"); - UserData data = new UserData(uuid, this, new HashMap<>(), DateUtil.getDateInt(date)); + UserData data = new UserData(uuid, this, new HashMap<>(), DateIntUtil.getDateInt(date)); JsonElement dataElement = PARSER.parse(dataJSON); if (dataElement.isJsonObject()) { @@ -142,7 +142,7 @@ public class MySQLStorage implements DataStorage { return data; } Main.debug("当前库内不存在玩家 " + uuid + " 的数据,视作新档。"); - return new UserData(uuid, this, new HashMap<>(), DateUtil.getCurrentDate()); + return new UserData(uuid, this, new HashMap<>(), DateIntUtil.getCurrentDate()); } catch (Exception exception) { throw new Exception(exception); } diff --git a/src/main/java/cc/carm/plugin/ultradepository/util/DateUtil.java b/src/main/java/cc/carm/plugin/ultradepository/util/DateIntUtil.java similarity index 96% rename from src/main/java/cc/carm/plugin/ultradepository/util/DateUtil.java rename to src/main/java/cc/carm/plugin/ultradepository/util/DateIntUtil.java index 067603c..3c79ba6 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/util/DateUtil.java +++ b/src/main/java/cc/carm/plugin/ultradepository/util/DateIntUtil.java @@ -4,7 +4,7 @@ import java.sql.Date; import java.text.ParseException; import java.text.SimpleDateFormat; -public class DateUtil { +public class DateIntUtil { private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyyMMdd");