feat: 添加数据库日志功能

This commit is contained in:
2023-08-04 19:33:33 +08:00
parent 0cadbd2ca3
commit d7e477dd3f
19 changed files with 193 additions and 59 deletions

View File

@@ -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

View File

@@ -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("使用多服务器模式...");

View File

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

View File

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

View File

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

View File

@@ -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<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
if (args.length == 2) {
List<String> 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<String> types = dataManager.getCurrencyTypes().stream().map(CurrencyType::getId).collect(Collectors.toList());
return HamsterAPI.startWith(types, args[2]);
}
return null;
return Collections.emptyList();
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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, "扣款成功");
}