mirror of
https://github.com/CarmJos/UltraDepository.git
synced 2024-09-19 11:45:47 +00:00
提供JSON存储格式
This commit is contained in:
parent
8766b3a45e
commit
e01aa6207e
2
.examples/userdata/database.sql
Normal file
2
.examples/userdata/database.sql
Normal 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');
|
@ -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}}}}
|
@ -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()) {
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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"
|
@ -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)
|
||||
# 使用绝对路径时请注意权限问题
|
||||
|
@ -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<String, Map<String, Map<String, Integer>>> 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 {
|
||||
|
Loading…
Reference in New Issue
Block a user