From d7e477dd3f58f5184ccf3358a4bf141f38281c73 Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Fri, 4 Aug 2023 19:33:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=97=A5=E5=BF=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- currency-plugin/build.gradle | 7 +- .../cn/hamster3/currency/HamsterCurrency.java | 2 +- .../cn/hamster3/currency/api/CurrencyAPI.java | 10 ++- .../command/currency/CurrencyGiveCommand.java | 5 +- .../command/currency/CurrencyPayCommand.java | 15 +++-- .../command/currency/CurrencySeeCommand.java | 64 +++++++++++-------- .../command/currency/CurrencySetCommand.java | 2 + .../command/currency/CurrencyTakeCommand.java | 6 +- .../command/vault/VaultGiveCommand.java | 6 +- .../command/vault/VaultPayCommand.java | 10 ++- .../command/vault/VaultSetCommand.java | 2 + .../command/vault/VaultTakeCommand.java | 5 +- .../currency/core/FileDataManager.java | 5 ++ .../hamster3/currency/core/FileManager.java | 3 +- .../hamster3/currency/core/IDataManager.java | 3 + .../currency/core/SQLDataManager.java | 35 ++++++++-- .../hamster3/currency/data/CurrencyLog.java | 59 +++++++++++++++++ .../cn/hamster3/currency/data/PlayerData.java | 2 +- .../currency/hook/VaultEconomyHook.java | 11 +++- 19 files changed, 193 insertions(+), 59 deletions(-) create mode 100644 currency-plugin/src/main/java/cn/hamster3/currency/data/CurrencyLog.java diff --git a/currency-plugin/build.gradle b/currency-plugin/build.gradle index 734f7ba..353969c 100644 --- a/currency-plugin/build.gradle +++ b/currency-plugin/build.gradle @@ -1,10 +1,11 @@ +//file:noinspection VulnerableLibrariesLocal plugins { id 'java' id 'maven-publish' } group 'cn.hamster3' -version '2.0.12-SNAPSHOT' +version '2.1.0' repositories { maven { @@ -42,7 +43,7 @@ jar { destinationDir(rootProject.buildDir) } -tasks.withType(JavaCompile) { +tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' options.compilerArgs << "-Xlint:unchecked" } @@ -62,7 +63,7 @@ javadoc { publishing { publications { - mavenJava(MavenPublication) { + create("mavenJava", MavenPublication.class) { artifactId = "HamsterCurrency" artifact jar artifact sourcesJar diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/HamsterCurrency.java b/currency-plugin/src/main/java/cn/hamster3/currency/HamsterCurrency.java index 746389d..e345c59 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/HamsterCurrency.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/HamsterCurrency.java @@ -38,8 +38,8 @@ public final class HamsterCurrency extends JavaPlugin { @Override public void onLoad() { - FileManager.reload(this); logUtils = new LogUtils(this); + FileManager.reload(this); logUtils.infoDividingLine(); if (FileManager.isUseBC()) { logUtils.info("使用多服务器模式..."); diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/api/CurrencyAPI.java b/currency-plugin/src/main/java/cn/hamster3/currency/api/CurrencyAPI.java index 7fe6c42..71193b3 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/api/CurrencyAPI.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/api/CurrencyAPI.java @@ -1,6 +1,7 @@ package cn.hamster3.currency.api; import cn.hamster3.currency.core.IDataManager; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; import org.black_ixx.playerpoints.PlayerPoints; @@ -42,6 +43,7 @@ public abstract class CurrencyAPI { } data.setPlayerCurrency(currencyID, amount); dataManager.savePlayerData(data); + dataManager.insertLog(new CurrencyLog(uuid, currencyID, "set", amount, amount)); } public static void addPlayerCurrency(UUID uuid, String currencyID, double amount) { @@ -53,8 +55,10 @@ public abstract class CurrencyAPI { if (data == null) { return; } - data.setPlayerCurrency(currencyID, data.getPlayerCurrency(currencyID) + amount); + double balance = data.getPlayerCurrency(currencyID) + amount; + data.setPlayerCurrency(currencyID, balance); dataManager.savePlayerData(data); + dataManager.insertLog(new CurrencyLog(uuid, currencyID, "add", amount, balance)); } public static void takePlayerCurrency(UUID uuid, String currencyID, double amount) { @@ -66,8 +70,10 @@ public abstract class CurrencyAPI { if (data == null) { return; } - data.setPlayerCurrency(currencyID, data.getPlayerCurrency(currencyID) - amount); + double balance = data.getPlayerCurrency(currencyID) - amount; + data.setPlayerCurrency(currencyID, balance); dataManager.savePlayerData(data); + dataManager.insertLog(new CurrencyLog(uuid, currencyID, "take", amount, balance)); } public static boolean hasPlayerCurrency(UUID uuid, String currencyID, double amount) { diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyGiveCommand.java b/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyGiveCommand.java index b6ca325..67a198d 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyGiveCommand.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyGiveCommand.java @@ -1,6 +1,7 @@ package cn.hamster3.currency.command.currency; import cn.hamster3.currency.core.IDataManager; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; @@ -16,7 +17,9 @@ public class CurrencyGiveCommand extends CurrencyAdminSetCommand { @Override protected void doSet(PlayerData data, CurrencyType type, double amount) { - data.setPlayerCurrency(type.getId(), data.getPlayerCurrency(type.getId()) + amount); + double balance = data.getPlayerCurrency(type.getId()) + amount; + data.setPlayerCurrency(type.getId(), balance); + dataManager.insertLog(new CurrencyLog(data.getUuid(), type.getId(), "add", amount, balance)); } } diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyPayCommand.java b/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyPayCommand.java index d311577..c321ba6 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyPayCommand.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyPayCommand.java @@ -5,6 +5,7 @@ import cn.hamster3.api.command.CommandExecutor; import cn.hamster3.currency.core.FileManager; import cn.hamster3.currency.core.IDataManager; import cn.hamster3.currency.core.Message; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; import cn.hamster3.service.bukkit.api.ServiceMessageAPI; @@ -25,11 +26,7 @@ public class CurrencyPayCommand extends CommandExecutor { "向其他玩家转账", "currency.pay", Message.notHasPermission.toString(), - new String[]{ - "玩家", - "货币类型", - "数额" - } + new String[]{"玩家", "货币类型", "数额"} ); this.dataManager = dataManager; } @@ -88,10 +85,14 @@ public class CurrencyPayCommand extends CommandExecutor { ); return true; } - fromData.setPlayerCurrency(type.getId(), fromData.getPlayerCurrency(type.getId()) - amount); - toData.setPlayerCurrency(type.getId(), toData.getPlayerCurrency(type.getId()) + amount); + double fromBalance = fromData.getPlayerCurrency(type.getId()) - amount; + fromData.setPlayerCurrency(type.getId(), fromBalance); + double toBalance = toData.getPlayerCurrency(type.getId()) + amount; + toData.setPlayerCurrency(type.getId(), toBalance); dataManager.savePlayerData(fromData); dataManager.savePlayerData(toData); + dataManager.insertLog(new CurrencyLog(fromData.getUuid(), type.getId(), "payOut", amount, fromBalance)); + dataManager.insertLog(new CurrencyLog(toData.getUuid(), type.getId(), "payIn", amount, toBalance)); sender.sendMessage( Message.paySuccess.toString() .replace("%player%", toData.getPlayerName()) diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencySeeCommand.java b/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencySeeCommand.java index 622a1b2..7acab07 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencySeeCommand.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencySeeCommand.java @@ -10,6 +10,7 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -22,10 +23,7 @@ public class CurrencySeeCommand extends CommandExecutor { "查看玩家的货币余额", "currency.see", Message.notHasPermission.toString(), - new String[]{ - "货币类型", - "玩家" - } + new String[]{"玩家", "货币类型"} ); this.dataManager = dataManager; } @@ -38,17 +36,8 @@ public class CurrencySeeCommand extends CommandExecutor { @Override @SuppressWarnings("DuplicatedCode") public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (args.length < 2) { - sender.sendMessage(Message.notInputCurrencyType.toString()); - return true; - } - CurrencyType type = dataManager.getCurrencyType(args[1]); - if (type == null) { - sender.sendMessage(Message.currencyTypeNotFound.toString()); - return true; - } PlayerData data; - if (args.length < 3) { + if (args.length < 2) { if (!(sender instanceof Player)) { sender.sendMessage(Message.notInputPlayerName.toString()); return true; @@ -60,30 +49,51 @@ public class CurrencySeeCommand extends CommandExecutor { sender.sendMessage(Message.notHasPermission.toString()); return true; } - data = dataManager.getPlayerData(args[2]); - if (data == null) { - sender.sendMessage(Message.playerNotFound.toString()); + data = dataManager.getPlayerData(args[1]); + } + CurrencyType type = null; + if (args.length >= 3) { + type = dataManager.getCurrencyType(args[2]); + if (type == null) { + sender.sendMessage(Message.currencyTypeNotFound.toString()); return true; } } - sender.sendMessage( - Message.seeCurrency.toString() - .replace("%player%", data.getPlayerName()) - .replace("%type%", type.getId()) - .replace("%amount%", String.format("%.2f", data.getPlayerCurrency(type.getId()))) - ); + if (data == null) { + sender.sendMessage(Message.playerNotFound.toString()); + return true; + } + if (type == null) { + for (CurrencyType currencyType : dataManager.getCurrencyTypes()) { + String typeId = currencyType.getId(); + sender.sendMessage( + Message.seeCurrency.toString() + .replace("%player%", data.getPlayerName()) + .replace("%type%", typeId) + .replace("%amount%", String.format("%.2f", data.getPlayerCurrency(typeId))) + ); + } + } else { + String typeId = type.getId(); + sender.sendMessage( + Message.seeCurrency.toString() + .replace("%player%", data.getPlayerName()) + .replace("%type%", typeId) + .replace("%amount%", String.format("%.2f", data.getPlayerCurrency(typeId))) + ); + } return true; } @Override public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { if (args.length == 2) { - List types = dataManager.getCurrencyTypes().stream().map(CurrencyType::getId).collect(Collectors.toList()); - return HamsterAPI.startWith(types, args[1]); + return HamsterAPI.getOnlinePlayersName(args[1]); } if (args.length == 3) { - return HamsterAPI.getOnlinePlayersName(args[2]); + List types = dataManager.getCurrencyTypes().stream().map(CurrencyType::getId).collect(Collectors.toList()); + return HamsterAPI.startWith(types, args[2]); } - return null; + return Collections.emptyList(); } } diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencySetCommand.java b/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencySetCommand.java index ccc7c95..c4bfe5d 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencySetCommand.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencySetCommand.java @@ -1,6 +1,7 @@ package cn.hamster3.currency.command.currency; import cn.hamster3.currency.core.IDataManager; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; @@ -17,6 +18,7 @@ public class CurrencySetCommand extends CurrencyAdminSetCommand { @Override protected void doSet(PlayerData data, CurrencyType type, double amount) { data.setPlayerCurrency(type.getId(), amount); + dataManager.insertLog(new CurrencyLog(data.getUuid(), type.getId(), "set", amount, amount)); } } diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyTakeCommand.java b/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyTakeCommand.java index 263818d..2622c56 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyTakeCommand.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/command/currency/CurrencyTakeCommand.java @@ -1,6 +1,7 @@ package cn.hamster3.currency.command.currency; import cn.hamster3.currency.core.IDataManager; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; @@ -16,7 +17,8 @@ public class CurrencyTakeCommand extends CurrencyAdminSetCommand { @Override protected void doSet(PlayerData data, CurrencyType type, double amount) { - data.setPlayerCurrency(type.getId(), data.getPlayerCurrency(type.getId()) - amount); + double balance = data.getPlayerCurrency(type.getId()) - amount; + data.setPlayerCurrency(type.getId(), balance); + dataManager.insertLog(new CurrencyLog(data.getUuid(), type.getId(), "take", amount, balance)); } - } diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultGiveCommand.java b/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultGiveCommand.java index b67586a..9f5831e 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultGiveCommand.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultGiveCommand.java @@ -1,6 +1,7 @@ package cn.hamster3.currency.command.vault; import cn.hamster3.currency.core.IDataManager; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; @@ -16,7 +17,8 @@ public class VaultGiveCommand extends VaultAdminSetCommand { @Override public void doSet(PlayerData data, CurrencyType type, double amount) { - data.setPlayerCurrency(type.getId(), data.getPlayerCurrency(type.getId()) + amount); - + double balance = data.getPlayerCurrency(type.getId()) + amount; + data.setPlayerCurrency(type.getId(), balance); + dataManager.insertLog(new CurrencyLog(data.getUuid(), type.getId(), "add", amount, balance)); } } diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultPayCommand.java b/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultPayCommand.java index 64dea14..9231f3c 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultPayCommand.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultPayCommand.java @@ -5,6 +5,7 @@ import cn.hamster3.api.command.CommandManager; import cn.hamster3.currency.core.FileManager; import cn.hamster3.currency.core.IDataManager; import cn.hamster3.currency.core.Message; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; import cn.hamster3.service.bukkit.api.ServiceMessageAPI; @@ -88,11 +89,14 @@ public class VaultPayCommand extends CommandManager { ); return true; } - - fromData.setPlayerCurrency(type.getId(), fromData.getPlayerCurrency(type.getId()) - amount); - toData.setPlayerCurrency(type.getId(), toData.getPlayerCurrency(type.getId()) + amount); + double fromBalance = fromData.getPlayerCurrency(type.getId()) - amount; + fromData.setPlayerCurrency(type.getId(), fromBalance); + double toBalance = toData.getPlayerCurrency(type.getId()) + amount; + toData.setPlayerCurrency(type.getId(), toBalance); dataManager.savePlayerData(fromData); dataManager.savePlayerData(toData); + dataManager.insertLog(new CurrencyLog(fromData.getUuid(), type.getId(), "payOut", amount, fromBalance)); + dataManager.insertLog(new CurrencyLog(toData.getUuid(), type.getId(), "payIn", amount, toBalance)); sender.sendMessage( Message.paySuccess.toString() .replace("%player%", toData.getPlayerName()) diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultSetCommand.java b/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultSetCommand.java index cde8028..0f6bdb1 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultSetCommand.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultSetCommand.java @@ -1,6 +1,7 @@ package cn.hamster3.currency.command.vault; import cn.hamster3.currency.core.IDataManager; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; @@ -17,5 +18,6 @@ public class VaultSetCommand extends VaultAdminSetCommand { @Override public void doSet(PlayerData data, CurrencyType type, double amount) { data.setPlayerCurrency(type.getId(), amount); + dataManager.insertLog(new CurrencyLog(data.getUuid(), type.getId(), "set", amount, amount)); } } diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultTakeCommand.java b/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultTakeCommand.java index 2eb0891..2abaecb 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultTakeCommand.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/command/vault/VaultTakeCommand.java @@ -1,6 +1,7 @@ package cn.hamster3.currency.command.vault; import cn.hamster3.currency.core.IDataManager; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; @@ -16,6 +17,8 @@ public class VaultTakeCommand extends VaultAdminSetCommand { @Override public void doSet(PlayerData data, CurrencyType type, double amount) { - data.setPlayerCurrency(type.getId(), data.getPlayerCurrency(type.getId()) - amount); + double balance = data.getPlayerCurrency(type.getId()) - amount; + data.setPlayerCurrency(type.getId(), balance); + dataManager.insertLog(new CurrencyLog(data.getUuid(), type.getId(), "take", amount, balance)); } } diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/core/FileDataManager.java b/currency-plugin/src/main/java/cn/hamster3/currency/core/FileDataManager.java index 7a855d3..ccb1e47 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/core/FileDataManager.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/core/FileDataManager.java @@ -1,6 +1,7 @@ package cn.hamster3.currency.core; import cn.hamster3.currency.HamsterCurrency; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; import org.bukkit.configuration.ConfigurationSection; @@ -109,6 +110,10 @@ public class FileDataManager implements IDataManager { // 所以这里什么都不做 } + @Override + public void insertLog(CurrencyLog log) { + } + @Override public PlayerData getPlayerData(UUID uuid) { synchronized (playerData) { diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/core/FileManager.java b/currency-plugin/src/main/java/cn/hamster3/currency/core/FileManager.java index 14e2261..693ac6f 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/core/FileManager.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/core/FileManager.java @@ -37,8 +37,7 @@ public abstract class FileManager { try { Message.valueOf(key).setMessage(HamsterAPI.replaceColorCode(messagesConfig.getString(key))); } catch (IllegalArgumentException e) { - HamsterCurrency.getLogUtils().warning("初始化消息设置 %s 时发生了一个异常: ", key); - e.printStackTrace(); + HamsterCurrency.getLogUtils().error(e, "初始化消息设置 %s 时发生了一个异常: ", key); } } } diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/core/IDataManager.java b/currency-plugin/src/main/java/cn/hamster3/currency/core/IDataManager.java index e3513b2..444df87 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/core/IDataManager.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/core/IDataManager.java @@ -1,5 +1,6 @@ package cn.hamster3.currency.core; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; @@ -42,6 +43,8 @@ public interface IDataManager { */ void savePlayerData(PlayerData data); + void insertLog(CurrencyLog log); + PlayerData getPlayerData(UUID uuid); PlayerData getPlayerData(String name); diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/core/SQLDataManager.java b/currency-plugin/src/main/java/cn/hamster3/currency/core/SQLDataManager.java index 3e09139..e2d1cab 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/core/SQLDataManager.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/core/SQLDataManager.java @@ -1,6 +1,7 @@ package cn.hamster3.currency.core; import cn.hamster3.currency.HamsterCurrency; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.CurrencyType; import cn.hamster3.currency.data.PlayerData; import cn.hamster3.service.bukkit.api.ServiceMessageAPI; @@ -14,10 +15,7 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import java.nio.charset.StandardCharsets; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; +import java.sql.*; import java.util.*; import static cn.hamster3.currency.HamsterCurrency.getLogUtils; @@ -57,6 +55,15 @@ public class SQLDataManager implements IDataManager { "uuid VARCHAR(36) PRIMARY KEY," + "data TEXT" + ") CHARACTER SET = utf8mb4;"); + statement.execute("CREATE TABLE IF NOT EXISTS " + database + ".hamster_currency_logs(" + + "uuid VARCHAR(36) NOT NULL," + + "type VARCHAR(36) NOT NULL," + + "action VARCHAR(36) NOT NULL," + + "amount DOUBLE NOT NULL," + + "balance DOUBLE NOT NULL," + + "time DATETIME NOT NULL DEFAULT NOW()," + + "INDEX idx_uuid(uuid)" + + ") CHARACTER SET = utf8mb4;"); statement.execute("CREATE TABLE IF NOT EXISTS " + database + ".hamster_currency_settings(" + "title VARCHAR(64) PRIMARY KEY," + "data TEXT" + @@ -295,6 +302,26 @@ public class SQLDataManager implements IDataManager { }); } + @Override + public void insertLog(CurrencyLog log) { + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + try (Connection connection = dataSource.getConnection()) { + try (PreparedStatement statement = connection.prepareStatement( + "INSERT INTO " + database + ".hamster_currency_logs VALUES(?, ?, ?, ?, ?, DEFAULT);" + )) { + statement.setString(1, log.getUuid().toString()); + statement.setString(2, log.getType()); + statement.setString(3, log.getAction()); + statement.setDouble(4, log.getAmount()); + statement.setDouble(5, log.getBalance()); + statement.executeUpdate(); + } + } catch (SQLException e) { + getLogUtils().error(e); + } + }); + } + @Override public PlayerData getPlayerData(UUID uuid) { synchronized (playerData) { diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/data/CurrencyLog.java b/currency-plugin/src/main/java/cn/hamster3/currency/data/CurrencyLog.java new file mode 100644 index 0000000..3a15bfa --- /dev/null +++ b/currency-plugin/src/main/java/cn/hamster3/currency/data/CurrencyLog.java @@ -0,0 +1,59 @@ +package cn.hamster3.currency.data; + +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public class CurrencyLog { + @NotNull + private final UUID uuid; + /** + * 货币类型 + */ + @NotNull + private final String type; + /** + * 执行的操作 + */ + @NotNull + private final String action; + /** + * 执行操作的数额 + */ + private final double amount; + /** + * 执行操作后的余额 + */ + private final double balance; + + public CurrencyLog(@NotNull UUID uuid, @NotNull String type, @NotNull String action, double amount, double balance) { + this.uuid = uuid; + this.type = type; + this.action = action; + this.amount = amount; + this.balance = balance; + } + + @NotNull + public UUID getUuid() { + return uuid; + } + + @NotNull + public String getType() { + return type; + } + + @NotNull + public String getAction() { + return action; + } + + public double getAmount() { + return amount; + } + + public double getBalance() { + return balance; + } +} diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/data/PlayerData.java b/currency-plugin/src/main/java/cn/hamster3/currency/data/PlayerData.java index 6c556da..c98afa5 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/data/PlayerData.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/data/PlayerData.java @@ -33,7 +33,7 @@ public class PlayerData { uuid = UUID.fromString(object.get("uuid").getAsString()); if (object.has("playerName")) { playerName = object.get("playerName").getAsString(); - }else { + } else { playerName = ServiceInfoAPI.getPlayerInfo(uuid).getPlayerName(); } diff --git a/currency-plugin/src/main/java/cn/hamster3/currency/hook/VaultEconomyHook.java b/currency-plugin/src/main/java/cn/hamster3/currency/hook/VaultEconomyHook.java index 2fa10c6..aa84914 100644 --- a/currency-plugin/src/main/java/cn/hamster3/currency/hook/VaultEconomyHook.java +++ b/currency-plugin/src/main/java/cn/hamster3/currency/hook/VaultEconomyHook.java @@ -3,6 +3,7 @@ package cn.hamster3.currency.hook; import cn.hamster3.currency.core.FileManager; import cn.hamster3.currency.core.IDataManager; import cn.hamster3.currency.core.Message; +import cn.hamster3.currency.data.CurrencyLog; import cn.hamster3.currency.data.PlayerData; import net.milkbowl.vault.economy.AbstractEconomy; import net.milkbowl.vault.economy.EconomyResponse; @@ -30,11 +31,13 @@ public class VaultEconomyHook extends AbstractEconomy { return new EconomyResponse(amount, 0, EconomyResponse.ResponseType.FAILURE, "玩家账户不存在"); } String type = FileManager.getVaultCurrencyType(); - if (data.getPlayerCurrency(type) > 0 && data.getPlayerCurrency(type) + amount < 0) { + double balance = data.getPlayerCurrency(type) + amount; + if (data.getPlayerCurrency(type) > 0 && balance < 0) { return new EconomyResponse(amount, 0, EconomyResponse.ResponseType.FAILURE, "玩家金额超出上限"); } - data.setPlayerCurrency(type, data.getPlayerCurrency(type) + amount); + data.setPlayerCurrency(type, balance); dataManager.savePlayerData(data); + dataManager.insertLog(new CurrencyLog(data.getUuid(), type, "add", amount, balance)); return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, ""); } @@ -46,8 +49,10 @@ public class VaultEconomyHook extends AbstractEconomy { if (data.getPlayerCurrency(type) < amount) { return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.FAILURE, "余额不足"); } - data.setPlayerCurrency(type, data.getPlayerCurrency(type) - amount); + double balance = data.getPlayerCurrency(type) - amount; + data.setPlayerCurrency(type, balance); dataManager.savePlayerData(data); + dataManager.insertLog(new CurrencyLog(data.getUuid(), type, "take", amount, balance)); return new EconomyResponse(amount, data.getPlayerCurrency(type), EconomyResponse.ResponseType.SUCCESS, "扣款成功"); }