mirror of
https://github.com/CarmJos/UltraDepository.git
synced 2024-09-19 19:55:45 +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 @@
|
|||||||
{
|
{"date":20220103,"depositories":{"miner":{"DIAMOND:0":{"sold":102,"amount":399}}}}
|
||||||
"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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,7 +10,8 @@ import cc.carm.plugin.ultradepository.manager.DepositoryManager;
|
|||||||
import cc.carm.plugin.ultradepository.manager.EconomyManager;
|
import cc.carm.plugin.ultradepository.manager.EconomyManager;
|
||||||
import cc.carm.plugin.ultradepository.manager.UserManager;
|
import cc.carm.plugin.ultradepository.manager.UserManager;
|
||||||
import cc.carm.plugin.ultradepository.storage.DataStorage;
|
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.storage.MySQLStorage;
|
||||||
import cc.carm.plugin.ultradepository.util.ColorParser;
|
import cc.carm.plugin.ultradepository.util.ColorParser;
|
||||||
import cc.carm.plugin.ultradepository.util.MessageUtil;
|
import cc.carm.plugin.ultradepository.util.MessageUtil;
|
||||||
@ -57,9 +58,12 @@ public class Main extends JavaPlugin {
|
|||||||
if (PluginConfig.STORAGE_METHOD.get().equalsIgnoreCase("mysql")) {
|
if (PluginConfig.STORAGE_METHOD.get().equalsIgnoreCase("mysql")) {
|
||||||
log(" 正在使用 MySQL 进行数据存储");
|
log(" 正在使用 MySQL 进行数据存储");
|
||||||
storage = new MySQLStorage();
|
storage = new MySQLStorage();
|
||||||
|
} else if (PluginConfig.STORAGE_METHOD.get().equalsIgnoreCase("json")) {
|
||||||
|
log(" 正在使用 JSON 进行数据存储");
|
||||||
|
storage = new JSONStorage();
|
||||||
} else {
|
} else {
|
||||||
log(" 正在使用 文件 进行数据存储");
|
log(" 正在使用 YAML 进行数据存储");
|
||||||
storage = new FileStorage();
|
storage = new YAMLStorage();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!storage.initialize()) {
|
if (!storage.initialize()) {
|
||||||
|
@ -47,6 +47,7 @@ public class UserManager {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Main.error("无法正常加载玩家数据,玩家操作将不会被保存,请检查数据配置!");
|
Main.error("无法正常加载玩家数据,玩家操作将不会被保存,请检查数据配置!");
|
||||||
Main.error("Could not load user's data, please check the data configuration!");
|
Main.error("Could not load user's data, please check the data configuration!");
|
||||||
|
e.printStackTrace();
|
||||||
return new UserData(userUUID, new HashMap<>(), DateIntUtil.getCurrentDate());
|
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.Main;
|
||||||
import cc.carm.plugin.ultradepository.configuration.PluginConfig;
|
import cc.carm.plugin.ultradepository.configuration.PluginConfig;
|
||||||
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
|
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.configuration.values.ConfigValue;
|
||||||
import cc.carm.plugin.ultradepository.data.DepositoryData;
|
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.data.UserData;
|
||||||
import cc.carm.plugin.ultradepository.util.DateIntUtil;
|
import cc.carm.plugin.ultradepository.util.DateIntUtil;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@ -27,7 +24,7 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class MySQLStorage implements DataStorage {
|
public class MySQLStorage extends JSONStorage {
|
||||||
|
|
||||||
private static final ConfigValue<String> DRIVER_NAME = new ConfigValue<>(
|
private static final ConfigValue<String> DRIVER_NAME = new ConfigValue<>(
|
||||||
"storage.mysql.driver", String.class, "com.mysql.jdbc.Driver"
|
"storage.mysql.driver", String.class, "com.mysql.jdbc.Driver"
|
||||||
@ -165,34 +162,4 @@ public class MySQLStorage implements DataStorage {
|
|||||||
.setLimit(1).build();
|
.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.HashMap;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class FileStorage implements DataStorage {
|
public class YAMLStorage implements DataStorage {
|
||||||
|
|
||||||
private static final ConfigValue<String> FILE_PATH = new ConfigValue<>(
|
private static final ConfigValue<String> FILE_PATH = new ConfigValue<>(
|
||||||
"storage.file-path", String.class, "data"
|
"storage.file-path", String.class, "data"
|
@ -15,10 +15,10 @@ metrics: true
|
|||||||
# 注意:存储配置不会通过重载指令生效,如有修改请重新启动服务器。
|
# 注意:存储配置不会通过重载指令生效,如有修改请重新启动服务器。
|
||||||
storage:
|
storage:
|
||||||
|
|
||||||
# 存储方式,可选 [ file | mysql ]
|
# 存储方式,可选 [ yaml | json | mysql(推荐) ]
|
||||||
method: file
|
method: yaml
|
||||||
|
|
||||||
# 选择 file 存储方式时的存储路径
|
# 选择 yaml/json 存储方式时的存储路径
|
||||||
# 默认为相对路径,相对于插件生成的配置文件夹下的路径
|
# 默认为相对路径,相对于插件生成的配置文件夹下的路径
|
||||||
# 支持绝对路径,如 “/var/data/ub/"(linux) 或 "D:\data\ub\"(windows)
|
# 支持绝对路径,如 “/var/data/ub/"(linux) 或 "D:\data\ub\"(windows)
|
||||||
# 使用绝对路径时请注意权限问题
|
# 使用绝对路径时请注意权限问题
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@ -39,9 +40,14 @@ public class GsonMapTest {
|
|||||||
|
|
||||||
System.out.println(values.size());
|
System.out.println(values.size());
|
||||||
|
|
||||||
|
|
||||||
String jsonValues = GSON.toJson(values);
|
String jsonValues = GSON.toJson(values);
|
||||||
System.out.println(jsonValues);
|
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 {
|
public interface Test {
|
||||||
|
Loading…
Reference in New Issue
Block a user