1
mirror of https://github.com/CarmJos/UltraDepository.git synced 2024-09-19 19:55:45 +00:00

提供JSON存储格式

This commit is contained in:
Carm Jos 2022-01-03 21:55:02 +08:00
parent 8766b3a45e
commit e01aa6207e
9 changed files with 157 additions and 84 deletions

View File

@ -0,0 +1,2 @@
INSERT INTO `ub_data`(`uuid`, `data`, `day`)
VALUES ('<UUID>', '{"date":20220103,"depositories":{"miner":{"DIAMOND:0":{"sold":102,"amount":399}}}}', '20220103');

View File

@ -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
}
}
}
{"date":20220103,"depositories":{"miner":{"DIAMOND:0":{"sold":102,"amount":399}}}}

View File

@ -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()) {

View File

@ -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());
}
}

View File

@ -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<String> 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<String, JsonElement> 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<String, JsonElement> 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);
}
}

View File

@ -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<String> 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<String, JsonElement> 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);
}
}

View File

@ -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<String> FILE_PATH = new ConfigValue<>(
"storage.file-path", String.class, "data"

View File

@ -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)
# 使用绝对路径时请注意权限问题

View File

@ -1,4 +1,5 @@
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.util.*;
@ -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 {