mirror of
https://github.com/CarmJos/UltraDepository.git
synced 2024-09-19 19:55:45 +00:00
完善以文件方式存储玩家数据的功能
This commit is contained in:
parent
2ab03912df
commit
d046aa931e
13
.examples/userdata/uuid.yml
Normal file
13
.examples/userdata/uuid.yml
Normal file
@ -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
|
2
pom.xml
2
pom.xml
@ -14,7 +14,7 @@
|
|||||||
<groupId>cc.carm.plugin</groupId>
|
<groupId>cc.carm.plugin</groupId>
|
||||||
<artifactId>ultradepository</artifactId>
|
<artifactId>ultradepository</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<version>1.0.1</version>
|
<version>1.1.0</version>
|
||||||
|
|
||||||
<name>UltraDepository</name>
|
<name>UltraDepository</name>
|
||||||
<description>超级仓库插件,支持设定不同物品的存储仓库。</description>
|
<description>超级仓库插件,支持设定不同物品的存储仓库。</description>
|
||||||
|
@ -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.Depository;
|
||||||
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
|
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
|
||||||
import cc.carm.plugin.ultradepository.storage.DataStorage;
|
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.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@ -118,12 +118,16 @@ public class UserData {
|
|||||||
|
|
||||||
|
|
||||||
public Date getDate() {
|
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() {
|
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.");
|
Main.debug("Date is not change, skip clear sold amount.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.date = DateUtil.getCurrentDate(); //更新日期
|
this.date = DateIntUtil.getCurrentDate(); //更新日期
|
||||||
Main.debug("Date changed, clear sold.");
|
Main.debug("Date changed, clear sold.");
|
||||||
getDepositories().values().stream()
|
getDepositories().values().stream()
|
||||||
.flatMap(value -> value.getContents().values().stream())
|
.flatMap(value -> value.getContents().values().stream())
|
||||||
|
@ -2,7 +2,7 @@ package cc.carm.plugin.ultradepository.manager;
|
|||||||
|
|
||||||
import cc.carm.plugin.ultradepository.Main;
|
import cc.carm.plugin.ultradepository.Main;
|
||||||
import cc.carm.plugin.ultradepository.data.UserData;
|
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.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@ -33,7 +33,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!");
|
||||||
return new UserData(userUUID, Main.getStorage(), new HashMap<>(), DateUtil.getCurrentDate());
|
return new UserData(userUUID, Main.getStorage(), new HashMap<>(), DateIntUtil.getCurrentDate());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,14 +1,22 @@
|
|||||||
package cc.carm.plugin.ultradepository.storage;
|
package cc.carm.plugin.ultradepository.storage;
|
||||||
|
|
||||||
import cc.carm.plugin.ultradepository.Main;
|
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.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.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 org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.sql.Date;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class FileStorage implements DataStorage {
|
public class FileStorage implements DataStorage {
|
||||||
@ -21,7 +29,12 @@ public class FileStorage implements DataStorage {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean initialize() {
|
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
|
@Override
|
||||||
@ -29,18 +42,90 @@ public class FileStorage implements DataStorage {
|
|||||||
// 似乎没什么需要做的?
|
// 似乎没什么需要做的?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public File getDataContainer() {
|
||||||
|
return dataContainer;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull UserData loadData(@NotNull UUID uuid) {
|
public @NotNull UserData loadData(@NotNull UUID uuid) {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
Main.debug("正通过 FileStorage 加载 " + uuid + " 的用户数据...");
|
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
|
@Override
|
||||||
public void saveUserData(@NotNull UserData data) {
|
public void saveUserData(@NotNull UserData data) throws IOException {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
Main.debug("正通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据...");
|
Main.debug("正通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据...");
|
||||||
|
|
||||||
|
YamlConfiguration userDataConfig = new YamlConfiguration();
|
||||||
|
userDataConfig.set("date", data.getDateInt());
|
||||||
|
|
||||||
|
Map<String, Map<String, Map<String, Integer>>> values = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
data.getDepositories().forEach((depositoryID, depositoryData) -> {
|
||||||
|
Map<String, Map<String, Integer>> depositoryDataMap = new LinkedHashMap<>();
|
||||||
|
depositoryData.getContents().forEach((itemType, itemData) -> {
|
||||||
|
Map<String, Integer> 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(
|
Main.debug(
|
||||||
"通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据完成," +
|
"通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据完成," +
|
||||||
"耗时 " + (System.currentTimeMillis() - start) + "ms。"
|
"耗时 " + (System.currentTimeMillis() - start) + "ms。"
|
||||||
|
@ -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.DepositoryData;
|
||||||
import cc.carm.plugin.ultradepository.data.DepositoryItemData;
|
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.DateUtil;
|
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.JsonObject;
|
||||||
@ -126,7 +126,7 @@ public class MySQLStorage implements DataStorage {
|
|||||||
if (resultSet != null && resultSet.next()) {
|
if (resultSet != null && resultSet.next()) {
|
||||||
String dataJSON = resultSet.getString("data");
|
String dataJSON = resultSet.getString("data");
|
||||||
Date date = resultSet.getDate("day");
|
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);
|
JsonElement dataElement = PARSER.parse(dataJSON);
|
||||||
if (dataElement.isJsonObject()) {
|
if (dataElement.isJsonObject()) {
|
||||||
@ -142,7 +142,7 @@ public class MySQLStorage implements DataStorage {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
Main.debug("当前库内不存在玩家 " + uuid + " 的数据,视作新档。");
|
Main.debug("当前库内不存在玩家 " + uuid + " 的数据,视作新档。");
|
||||||
return new UserData(uuid, this, new HashMap<>(), DateUtil.getCurrentDate());
|
return new UserData(uuid, this, new HashMap<>(), DateIntUtil.getCurrentDate());
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
throw new Exception(exception);
|
throw new Exception(exception);
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import java.sql.Date;
|
|||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
|
||||||
public class DateUtil {
|
public class DateIntUtil {
|
||||||
|
|
||||||
private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyyMMdd");
|
private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyyMMdd");
|
||||||
|
|
Loading…
Reference in New Issue
Block a user