diff --git a/.examples/userdata/database.sql b/.examples/userdata/database.sql new file mode 100644 index 0000000..99a3575 --- /dev/null +++ b/.examples/userdata/database.sql @@ -0,0 +1,2 @@ +INSERT INTO `ub_data`(`uuid`, `data`, `day`) +VALUES ('', '{"date":20220103,"depositories":{"miner":{"DIAMOND:0":{"sold":102,"amount":399}}}}', '20220103'); \ No newline at end of file diff --git a/.examples/userdata/uuid.json b/.examples/userdata/uuid.json index 061df2c..4a605f3 100644 --- a/.examples/userdata/uuid.json +++ b/.examples/userdata/uuid.json @@ -1,41 +1 @@ -{ - "farmer": {}, - "hunter": { - "CHICKEN:0": { - "amount": 3 - }, - "FEATHER:0": { - "amount": 2 - } - }, - "miner": { - "COAL:0": { - "amount": 9, - "sold": 10 - }, - "LAPIS_LAZULI:0": { - "amount": 9 - }, - "REDSTONE:0": { - "sold": 129 - }, - "COBBLESTONE:0": { - "amount": 12 - }, - "CLAY_BALL:0": { - "amount": 112 - }, - "DIAMOND:0": { - "amount": 975, - "sold": 1500 - } - }, - "fishman": { - "COD:0": { - "amount": 3 - }, - "PUFFERFISH:0": { - "amount": 64 - } - } -} \ No newline at end of file +{"date":20220103,"depositories":{"miner":{"DIAMOND:0":{"sold":102,"amount":399}}}} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/ultradepository/Main.java b/src/main/java/cc/carm/plugin/ultradepository/Main.java index 5dc9b80..b327323 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/Main.java +++ b/src/main/java/cc/carm/plugin/ultradepository/Main.java @@ -10,7 +10,8 @@ import cc.carm.plugin.ultradepository.manager.DepositoryManager; import cc.carm.plugin.ultradepository.manager.EconomyManager; import cc.carm.plugin.ultradepository.manager.UserManager; import cc.carm.plugin.ultradepository.storage.DataStorage; -import cc.carm.plugin.ultradepository.storage.FileStorage; +import cc.carm.plugin.ultradepository.storage.YAMLStorage; +import cc.carm.plugin.ultradepository.storage.JSONStorage; import cc.carm.plugin.ultradepository.storage.MySQLStorage; import cc.carm.plugin.ultradepository.util.ColorParser; import cc.carm.plugin.ultradepository.util.MessageUtil; @@ -57,9 +58,12 @@ public class Main extends JavaPlugin { if (PluginConfig.STORAGE_METHOD.get().equalsIgnoreCase("mysql")) { log(" 正在使用 MySQL 进行数据存储"); storage = new MySQLStorage(); + } else if (PluginConfig.STORAGE_METHOD.get().equalsIgnoreCase("json")) { + log(" 正在使用 JSON 进行数据存储"); + storage = new JSONStorage(); } else { - log(" 正在使用 文件 进行数据存储"); - storage = new FileStorage(); + log(" 正在使用 YAML 进行数据存储"); + storage = new YAMLStorage(); } if (!storage.initialize()) { 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 d81103c..800534e 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/ultradepository/manager/UserManager.java @@ -47,6 +47,7 @@ public class UserManager { } catch (Exception e) { Main.error("无法正常加载玩家数据,玩家操作将不会被保存,请检查数据配置!"); Main.error("Could not load user's data, please check the data configuration!"); + e.printStackTrace(); return new UserData(userUUID, new HashMap<>(), DateIntUtil.getCurrentDate()); } } diff --git a/src/main/java/cc/carm/plugin/ultradepository/storage/JSONStorage.java b/src/main/java/cc/carm/plugin/ultradepository/storage/JSONStorage.java new file mode 100644 index 0000000..a2df498 --- /dev/null +++ b/src/main/java/cc/carm/plugin/ultradepository/storage/JSONStorage.java @@ -0,0 +1,133 @@ +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 com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class JSONStorage implements DataStorage { + + private static final ConfigValue FILE_PATH = new ConfigValue<>( + "storage.file-path", String.class, "data" + ); + + private File dataContainer; + + public static final Gson GSON = new Gson(); + public static final JsonParser PARSER = new JsonParser(); + + @Override + public boolean initialize() { + dataContainer = new File(Main.getInstance().getDataFolder(), FILE_PATH.get()); + if (!dataContainer.exists()) { + return dataContainer.mkdir(); + } else { + return dataContainer.isDirectory(); + } + } + + @Override + public void shutdown() { + // 似乎没什么需要做的? + } + + public File getDataContainer() { + return dataContainer; + } + + @Override + public @Nullable UserData loadData(@NotNull UUID uuid) throws Exception { + File userDataFile = new File(getDataContainer(), uuid + ".json"); + if (!userDataFile.exists()) { + Main.debug("当前文件夾内不存在玩家 " + uuid + " 的数据,视作新档。"); + return null; + } + + JsonElement dataElement = PARSER.parse(new FileReader(userDataFile)); + if (!dataElement.isJsonObject()) throw new NullPointerException(userDataFile.getName()); + JsonObject dataObject = dataElement.getAsJsonObject(); + + int dateInt = dataObject.get("date").getAsInt(); + JsonObject repositoriesObject = dataObject.getAsJsonObject("depositories"); + + UserData userData = new UserData(uuid, new HashMap<>(), dateInt); + + for (Map.Entry entry : repositoriesObject.entrySet()) { + Depository depository = Main.getDepositoryManager().getDepository(entry.getKey()); + if (depository == null) continue; + + DepositoryData contentsData = parseContentsData(depository, userData, entry.getValue()); + if (contentsData != null) userData.setDepository(contentsData); + + } + + return userData; + } + + @Override + public void saveUserData(@NotNull UserData data) throws Exception { + JsonObject dataObject = new JsonObject(); + dataObject.addProperty("date", data.getDateInt()); + dataObject.add("depositories", GSON.toJsonTree(data.serializeToMap())); + + FileWriter writer = new FileWriter(new File(getDataContainer(), data.getUserUUID() + ".json")); + writer.write(GSON.toJson(dataObject)); + writer.flush(); + writer.close(); + } + + protected DepositoryData parseContentsData(@NotNull Depository source, + @NotNull UserData owner, + @NotNull JsonElement contentsElement) { + return contentsElement.isJsonObject() ? parseContentsData(source, owner, contentsElement.getAsJsonObject()) : null; + } + + protected DepositoryData parseContentsData(@NotNull Depository source, + @NotNull UserData owner, + @NotNull JsonObject contentsObject) { + DepositoryData data = DepositoryData.emptyContents(source, owner); + for (Map.Entry entry : contentsObject.entrySet()) { + + DepositoryItem item = source.getItems().get(entry.getKey()); + if (item == null) continue; + + DepositoryItemData itemData = parseItemData(item, data, entry.getValue()); + if (itemData != null) data.getContents().put(item.getTypeID(), itemData); + + } + return data; + } + + protected DepositoryItemData parseItemData(@NotNull DepositoryItem source, + @NotNull DepositoryData owner, + @NotNull JsonElement itemElement) { + return itemElement.isJsonObject() ? parseItemData(source, owner, itemElement.getAsJsonObject()) : null; + } + + protected DepositoryItemData parseItemData(@NotNull DepositoryItem source, + @NotNull DepositoryData owner, + @NotNull JsonObject itemObject) { + int amount = itemObject.has("amount") ? itemObject.get("amount").getAsInt() : 0; + int sold = itemObject.has("sold") ? itemObject.get("sold").getAsInt() : 0; + if (amount == 0 && sold == 0) return null; + + return new DepositoryItemData(source, owner, amount, sold); + } + +} 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 6d74cd6..774d58c 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java +++ b/src/main/java/cc/carm/plugin/ultradepository/storage/MySQLStorage.java @@ -7,15 +7,12 @@ import cc.carm.lib.easysql.api.action.query.SQLQuery; import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.configuration.PluginConfig; 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.DateIntUtil; import com.google.gson.Gson; import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,7 +24,7 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; -public class MySQLStorage implements DataStorage { +public class MySQLStorage extends JSONStorage { private static final ConfigValue DRIVER_NAME = new ConfigValue<>( "storage.mysql.driver", String.class, "com.mysql.jdbc.Driver" @@ -165,34 +162,4 @@ public class MySQLStorage implements DataStorage { .setLimit(1).build(); } - private DepositoryData parseContentsData(Depository source, UserData owner, JsonElement contentsElement) { - return contentsElement.isJsonObject() ? parseContentsData(source, owner, contentsElement.getAsJsonObject()) : null; - } - - private DepositoryData parseContentsData(Depository source, UserData owner, JsonObject contentsObject) { - DepositoryData data = DepositoryData.emptyContents(source, owner); - for (Map.Entry entry : contentsObject.entrySet()) { - - DepositoryItem item = source.getItems().get(entry.getKey()); - if (item == null) continue; - - DepositoryItemData itemData = parseItemData(item, data, entry.getValue()); - if (itemData != null) data.getContents().put(item.getTypeID(), itemData); - - } - return data; - } - - private DepositoryItemData parseItemData(DepositoryItem source, DepositoryData owner, JsonElement itemElement) { - return itemElement.isJsonObject() ? parseItemData(source, owner, itemElement.getAsJsonObject()) : null; - } - - private DepositoryItemData parseItemData(DepositoryItem source, DepositoryData owner, JsonObject itemObject) { - int amount = itemObject.has("amount") ? itemObject.get("amount").getAsInt() : 0; - int sold = itemObject.has("sold") ? itemObject.get("sold").getAsInt() : 0; - if (amount == 0 && sold == 0) return null; - - return new DepositoryItemData(source, owner, amount, sold); - } - } diff --git a/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java b/src/main/java/cc/carm/plugin/ultradepository/storage/YAMLStorage.java similarity index 98% rename from src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java rename to src/main/java/cc/carm/plugin/ultradepository/storage/YAMLStorage.java index efa99cc..21bf667 100644 --- a/src/main/java/cc/carm/plugin/ultradepository/storage/FileStorage.java +++ b/src/main/java/cc/carm/plugin/ultradepository/storage/YAMLStorage.java @@ -18,7 +18,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.UUID; -public class FileStorage implements DataStorage { +public class YAMLStorage implements DataStorage { private static final ConfigValue FILE_PATH = new ConfigValue<>( "storage.file-path", String.class, "data" diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 4c7ead3..b288968 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -15,10 +15,10 @@ metrics: true # 注意:存储配置不会通过重载指令生效,如有修改请重新启动服务器。 storage: - # 存储方式,可选 [ file | mysql ] - method: file + # 存储方式,可选 [ yaml | json | mysql(推荐) ] + method: yaml - # 选择 file 存储方式时的存储路径 + # 选择 yaml/json 存储方式时的存储路径 # 默认为相对路径,相对于插件生成的配置文件夹下的路径 # 支持绝对路径,如 “/var/data/ub/"(linux) 或 "D:\data\ub\"(windows) # 使用绝对路径时请注意权限问题 diff --git a/src/test/java/GsonMapTest.java b/src/test/java/GsonMapTest.java index 99bc909..9f25f50 100644 --- a/src/test/java/GsonMapTest.java +++ b/src/test/java/GsonMapTest.java @@ -1,4 +1,5 @@ import com.google.gson.Gson; +import com.google.gson.JsonObject; import java.util.*; @@ -16,7 +17,7 @@ public class GsonMapTest { tests.add(new Test2()); tests.stream().map(test -> test.getClass().getSimpleName()).forEach(System.out::println); - + Map>> values = new LinkedHashMap<>(); @@ -39,9 +40,14 @@ public class GsonMapTest { System.out.println(values.size()); - String jsonValues = GSON.toJson(values); System.out.println(jsonValues); + + JsonObject dataObject = new JsonObject(); + dataObject.addProperty("date", 20201011); + dataObject.add("depositories", GSON.toJsonTree(values)); + + System.out.println(GSON.toJson(dataObject)); } public interface Test {