From 3b05d9e8547f7f9659e47ddd7f2015ec01b3db2b Mon Sep 17 00:00:00 2001 From: Mcayear Date: Wed, 2 Oct 2024 11:46:45 +0800 Subject: [PATCH 1/6] change: new version config.yml --- .../me/onebone/economyapi/EconomyAPI.java | 10 ++- .../economyapi/config/EconomyAPIConfig.java | 83 +++++++++++++++++++ src/main/resources/config.yml | 22 ++++- 3 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java diff --git a/src/main/java/me/onebone/economyapi/EconomyAPI.java b/src/main/java/me/onebone/economyapi/EconomyAPI.java index 485f6da..dc66b6c 100644 --- a/src/main/java/me/onebone/economyapi/EconomyAPI.java +++ b/src/main/java/me/onebone/economyapi/EconomyAPI.java @@ -21,7 +21,6 @@ import cn.nukkit.IPlayer; import cn.nukkit.Player; import cn.nukkit.Server; -import cn.nukkit.command.CommandSender; import cn.nukkit.event.EventHandler; import cn.nukkit.event.Listener; import cn.nukkit.event.player.PlayerJoinEvent; @@ -29,9 +28,8 @@ import cn.nukkit.lang.PluginI18n; import cn.nukkit.lang.PluginI18nManager; import cn.nukkit.plugin.PluginBase; -import cn.nukkit.utils.TextFormat; -import cn.nukkit.utils.Utils; import me.onebone.economyapi.command.*; +import me.onebone.economyapi.config.EconomyAPIConfig; import me.onebone.economyapi.event.account.CreateAccountEvent; import me.onebone.economyapi.event.money.AddMoneyEvent; import me.onebone.economyapi.event.money.ReduceMoneyEvent; @@ -53,6 +51,7 @@ public class EconomyAPI extends PluginBase implements Listener { public static final int RET_NOT_FOUND = -1; public static final int RET_INVALID = 0; public static final int RET_SUCCESS = 1; + public static EconomyAPIConfig MAIN_CONFIG; public static final DecimalFormat MONEY_FORMAT = new DecimalFormat(); private static EconomyAPI instance; private static PluginI18n i18n; @@ -376,6 +375,7 @@ public void saveAll() { } } + @Override public void onLoad() { instance = this; // 注册插件的 i18n @@ -390,8 +390,9 @@ public void onLoad() { } } + @Override public void onEnable() { - this.saveDefaultConfig(); + MAIN_CONFIG = new EconomyAPIConfig(); boolean success = this.initialize(); @@ -406,6 +407,7 @@ public void onJoin(PlayerJoinEvent event) { this.createAccount(event.getPlayer()); } + @Override public void onDisable() { this.saveAll(); } diff --git a/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java b/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java new file mode 100644 index 0000000..7aa0926 --- /dev/null +++ b/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java @@ -0,0 +1,83 @@ +package me.onebone.economyapi.config; + +import cn.nukkit.utils.Config; +import cn.nukkit.utils.ConfigSection; +import me.onebone.economyapi.EconomyAPI; +import java.util.HashMap; +import java.util.Map; + +public class EconomyAPIConfig { + private final Config config; + private final Map currencies = new HashMap<>(); + private final String defaultCurrency; + + public EconomyAPIConfig() { + // 保存默认配置文件 + EconomyAPI.getInstance().saveDefaultConfig(); + config = EconomyAPI.getInstance().getConfig(); + + // 读取多货币配置 + loadCurrencies(); + + // 读取默认货币 + defaultCurrency = config.getString("data.default-currency", "USD"); + } + + // 读取货币配置 + private void loadCurrencies() { + if (config.exists("currencies")) { + ConfigSection currencySection = config.getSection("currencies"); + for (String currencyName : currencySection.getKeys(false)) { + ConfigSection section = currencySection.getSection(currencyName); + String monetaryUnit = section.getString("monetary-unit", "$"); + double defaultAmount = section.getDouble("default", 1000.0); + double maxAmount = section.getDouble("max", 9999999999.0); + int exchangeRate = section.getInt("exchange-rate", 10000); // 默认USD为基准汇率 + + // 将货币添加到货币列表 + currencies.put(currencyName, new Currency(monetaryUnit, defaultAmount, maxAmount, exchangeRate)); + } + } + } + + // 获取默认货币 + public Currency getDefaultCurrency() { + return currencies.get(defaultCurrency); + } + + // 获取特定货币的信息 + public Currency getCurrency(String name) { + return currencies.get(name); + } + + // 货币类,存储每种货币的属性 + public static class Currency { + private final String monetaryUnit; + private final double defaultAmount; + private final double maxAmount; + private final int exchangeRate; + + public Currency(String monetaryUnit, double defaultAmount, double maxAmount, int exchangeRate) { + this.monetaryUnit = monetaryUnit; + this.defaultAmount = defaultAmount; + this.maxAmount = maxAmount; + this.exchangeRate = exchangeRate; + } + + public String getMonetaryUnit() { + return monetaryUnit; + } + + public double getDefaultAmount() { + return defaultAmount; + } + + public double getMaxAmount() { + return maxAmount; + } + + public int getExchangeRate() { + return exchangeRate; + } + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index cc33830..e070794 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,7 +1,21 @@ -money: - monetary-unit: "$" - default: 1000.0 - max: 9999999999.0 +version: 2 +currencies: + USD: + monetary-unit: "$" + default: 1000.0 + max: 9999999999.0 + exchange-rate: 10000 # 基准货币 USD, 汇率为 10000 + EUR: + monetary-unit: "€" + default: 500.0 + max: 5000000000.0 + exchange-rate: 11100 # 1 EUR = 1.11 USD + GBP: + monetary-unit: "£" + default: 200.0 + max: 3000000000.0 + exchange-rate: 13300 # 1 GBP = 1.33 USD data: + default-currency: USD auto-save-interval: 10 provider: yaml From d3b3c5f0355a25979d08ee987794416f8a156297 Mon Sep 17 00:00:00 2001 From: Mcayear Date: Wed, 2 Oct 2024 18:42:11 +0800 Subject: [PATCH 2/6] refactor: yaml provider --- .../me/onebone/economyapi/EconomyAPI.java | 25 ++-- .../economyapi/config/EconomyAPIConfig.java | 35 ++++- .../economyapi/config/UpgradeConfig.java | 33 +++++ .../onebone/economyapi/provider/Provider.java | 16 ++ .../economyapi/provider/SQLiteProvider.java | 40 +++++ .../economyapi/provider/YamlProvider.java | 140 ++++++++++++------ src/main/resources/config.yml | 6 +- 7 files changed, 228 insertions(+), 67 deletions(-) create mode 100644 src/main/java/me/onebone/economyapi/config/UpgradeConfig.java diff --git a/src/main/java/me/onebone/economyapi/EconomyAPI.java b/src/main/java/me/onebone/economyapi/EconomyAPI.java index dc66b6c..4415689 100644 --- a/src/main/java/me/onebone/economyapi/EconomyAPI.java +++ b/src/main/java/me/onebone/economyapi/EconomyAPI.java @@ -39,6 +39,7 @@ import me.onebone.economyapi.provider.YamlProvider; import me.onebone.economyapi.task.AutoSaveTask; +import java.lang.reflect.InvocationTargetException; import java.text.DecimalFormat; import java.util.HashMap; import java.util.LinkedHashMap; @@ -348,25 +349,15 @@ public boolean hasAccount(String id) { } public String getMonetaryUnit() { - return this.getConfig().get("money.monetary-unit", "$"); + return MAIN_CONFIG.getDefaultCurrency().getMonetaryUnit(); } public double getDefaultMoney() { - if (this.getConfig().isDouble("money.default")) { - return this.getConfig().get("money.default", 1000D); - } else if (this.getConfig().isLong("money.default")) { - return this.getConfig().getLong("money.default", 1000); - } - return 1000; + return MAIN_CONFIG.getDefaultCurrency().getDefaultAmount(); } public double getMaxMoney() { - if (this.getConfig().isDouble("money.max")) { - return this.getConfig().get("money.max", 9999999999D); - } else if (this.getConfig().isLong("money.max")) { - return this.getConfig().getLong("money.max", 9999999999L); - } - return 9999999999D; + return MAIN_CONFIG.getDefaultCurrency().getMaxAmount(); } public void saveAll() { @@ -398,7 +389,7 @@ public void onEnable() { if (success) { this.getServer().getPluginManager().registerEvents(this, this); - this.getServer().getScheduler().scheduleDelayedRepeatingTask(new AutoSaveTask(this), this.getConfig().get("data.auto-save-interval", 10) * 1200, this.getConfig().get("data.auto-save-interval", 10) * 1200); + this.getServer().getScheduler().scheduleDelayedRepeatingTask(new AutoSaveTask(this), MAIN_CONFIG.getAutoSaveInterval() * 1200, MAIN_CONFIG.getAutoSaveInterval() * 1200); } } @@ -427,7 +418,7 @@ private void registerCommands() { } private boolean selectProvider() { - Class providerClass = this.providerClass.get((this.getConfig().get("data.provider", "yaml")).toLowerCase()); + Class providerClass = this.providerClass.get(MAIN_CONFIG.getProvider()); if (providerClass == null) { this.getLogger().critical("Invalid data provider was given."); @@ -435,11 +426,13 @@ private boolean selectProvider() { } try { - this.provider = (Provider) providerClass.newInstance(); + this.provider = (Provider) providerClass.getDeclaredConstructor().newInstance(); this.provider.init(this.getDataFolder()); } catch (InstantiationException | IllegalAccessException e) { this.getLogger().critical("Invalid data provider was given."); return false; + } catch (InvocationTargetException | NoSuchMethodException e) { + throw new RuntimeException(e); } this.provider.open(); diff --git a/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java b/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java index 7aa0926..6170a77 100644 --- a/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java +++ b/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java @@ -4,23 +4,29 @@ import cn.nukkit.utils.ConfigSection; import me.onebone.economyapi.EconomyAPI; import java.util.HashMap; +import java.util.List; import java.util.Map; public class EconomyAPIConfig { private final Config config; private final Map currencies = new HashMap<>(); private final String defaultCurrency; + private final int autoSaveInterval; + private final String provider; public EconomyAPIConfig() { - // 保存默认配置文件 - EconomyAPI.getInstance().saveDefaultConfig(); config = EconomyAPI.getInstance().getConfig(); + if (UpgradeConfig.tryUpgradeConfigVersion(config.getInt("version", 1))) { + config.reload(); + } // 读取多货币配置 loadCurrencies(); // 读取默认货币 defaultCurrency = config.getString("data.default-currency", "USD"); + autoSaveInterval = config.getInt("data.auto-save-interval", 10); + provider = config.getString("data.provider", "yaml"); } // 读取货币配置 @@ -35,7 +41,7 @@ private void loadCurrencies() { int exchangeRate = section.getInt("exchange-rate", 10000); // 默认USD为基准汇率 // 将货币添加到货币列表 - currencies.put(currencyName, new Currency(monetaryUnit, defaultAmount, maxAmount, exchangeRate)); + currencies.put(currencyName, new Currency(currencyName, monetaryUnit, defaultAmount, maxAmount, exchangeRate)); } } } @@ -50,20 +56,41 @@ public Currency getCurrency(String name) { return currencies.get(name); } + // 获取货币种类列表 + public List getCurrencyList() { + return currencies.keySet().stream().toList(); + } + + // 获取auto-save-interval + public int getAutoSaveInterval() { + return autoSaveInterval * 1200; + } + + // 获取provider + public String getProvider() { + return provider.toLowerCase(); + } + // 货币类,存储每种货币的属性 public static class Currency { + private final String name; private final String monetaryUnit; private final double defaultAmount; private final double maxAmount; private final int exchangeRate; - public Currency(String monetaryUnit, double defaultAmount, double maxAmount, int exchangeRate) { + public Currency(String name, String monetaryUnit, double defaultAmount, double maxAmount, int exchangeRate) { + this.name = name; this.monetaryUnit = monetaryUnit; this.defaultAmount = defaultAmount; this.maxAmount = maxAmount; this.exchangeRate = exchangeRate; } + public String getName() { + return name; + } + public String getMonetaryUnit() { return monetaryUnit; } diff --git a/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java b/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java new file mode 100644 index 0000000..a86cd94 --- /dev/null +++ b/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java @@ -0,0 +1,33 @@ +package me.onebone.economyapi.config; + +import cn.nukkit.utils.Config; +import me.onebone.economyapi.EconomyAPI; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class UpgradeConfig { + public static boolean tryUpgradeConfigVersion(int oldVersion) { + if (oldVersion == 1) { + Path target = Paths.get(EconomyAPI.getInstance().getDataFolder().toString(), "config.old.yml"); + try { + Files.move( + Paths.get(EconomyAPI.getInstance().getDataFolder().toString(), "config.yml"), + target); + } catch (IOException e) { + + } + Config oldConfig = new Config(target.toFile()); + Config config = EconomyAPI.getInstance().getConfig(); + config.set("currencies.USD.monetary-unit", oldConfig.getString("money.monetary-unit")); + config.set("currencies.USD.default", oldConfig.getDouble("money.default")); + config.set("currencies.USD.max", oldConfig.getDouble("money.max")); + config.set("data.auto-save-interval", oldConfig.getInt("data.auto-save-interval")); + config.set("data.provider", oldConfig.getString("data.provider")); + return true; + } + return false; + } +} diff --git a/src/main/java/me/onebone/economyapi/provider/Provider.java b/src/main/java/me/onebone/economyapi/provider/Provider.java index 7a088d6..4573a9f 100644 --- a/src/main/java/me/onebone/economyapi/provider/Provider.java +++ b/src/main/java/me/onebone/economyapi/provider/Provider.java @@ -31,20 +31,36 @@ public interface Provider { void close(); + boolean accountExists(String currencyName, String id); + boolean accountExists(String id); + boolean removeAccount(String currencyName, String id); + boolean removeAccount(String id); + boolean createAccount(String currencyName, String id, double defaultMoney); + boolean createAccount(String id, double defaultMoney); + boolean setMoney(String currencyName, String id, double amount); + boolean setMoney(String id, double amount); + boolean addMoney(String currencyName, String id, double amount); + boolean addMoney(String id, double amount); + boolean reduceMoney(String currencyName, String id, double amount); + boolean reduceMoney(String id, double amount); + double getMoney(String currencyName, String id); + double getMoney(String id); + LinkedHashMap getAll(String currencyName); + LinkedHashMap getAll(); String getName(); diff --git a/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java b/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java index 8715a43..d144011 100644 --- a/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java +++ b/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java @@ -53,11 +53,21 @@ public void close() { } } + @Override + public boolean accountExists(String currencyName, String id) { + return false; + } + @Override public boolean accountExists(String id) { return this.sqLiteHelper.hasData(TABLE_NAME, COLUMN_PLAYER, id); } + @Override + public boolean removeAccount(String currencyName, String id) { + return false; + } + @Override public boolean removeAccount(String id) { if (this.accountExists(id)) { @@ -67,6 +77,11 @@ public boolean removeAccount(String id) { return false; } + @Override + public boolean createAccount(String currencyName, String id, double defaultMoney) { + return false; + } + @Override public boolean createAccount(String id, double defaultMoney) { if (!this.accountExists(id)) { @@ -77,6 +92,11 @@ public boolean createAccount(String id, double defaultMoney) { return false; } + @Override + public boolean setMoney(String currencyName, String id, double amount) { + return false; + } + @Override public boolean setMoney(String id, double amount) { if (this.accountExists(id)) { @@ -88,6 +108,11 @@ public boolean setMoney(String id, double amount) { return false; } + @Override + public boolean addMoney(String currencyName, String id, double amount) { + return false; + } + @Override public boolean addMoney(String id, double amount) { if (this.accountExists(id)) { @@ -97,6 +122,11 @@ public boolean addMoney(String id, double amount) { return false; } + @Override + public boolean reduceMoney(String currencyName, String id, double amount) { + return false; + } + @Override public boolean reduceMoney(String id, double amount) { if (this.accountExists(id)) { @@ -106,6 +136,11 @@ public boolean reduceMoney(String id, double amount) { return false; } + @Override + public double getMoney(String currencyName, String id) { + return 0; + } + @Override public double getMoney(String id) { if (this.accountExists(id)) { @@ -114,6 +149,11 @@ public double getMoney(String id) { return -1; } + @Override + public LinkedHashMap getAll(String currencyName) { + return null; + } + @Override public LinkedHashMap getAll() { LinkedHashMap map = new LinkedHashMap<>(); diff --git a/src/main/java/me/onebone/economyapi/provider/YamlProvider.java b/src/main/java/me/onebone/economyapi/provider/YamlProvider.java index 710f282..f3ea50d 100644 --- a/src/main/java/me/onebone/economyapi/provider/YamlProvider.java +++ b/src/main/java/me/onebone/economyapi/provider/YamlProvider.java @@ -23,28 +23,27 @@ import java.io.File; import java.util.LinkedHashMap; +import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; + public class YamlProvider implements Provider { - private Config file = null; - private LinkedHashMap data = null; + private final LinkedHashMap currenciesData = new LinkedHashMap<>(); @Override public void init(File path) { - file = new Config(new File(path, "Money.yml"), Config.YAML); - file.set("version", 2); - - //noinspection unchecked - LinkedHashMap temp = (LinkedHashMap) file.getRootSection() - .computeIfAbsent("money", s -> new LinkedHashMap<>()); - - data = new LinkedHashMap<>(); - temp.forEach((username, money) -> { - if (money instanceof Integer) { - data.put(username, ((Integer) money).doubleValue()); - } else if (money instanceof Double) { - data.put(username, (Double) money); - } else if (money instanceof String) { - data.put(username, Double.parseDouble(money.toString())); - } + MAIN_CONFIG.getCurrencyList().forEach(currencyName -> { + Config file = new Config(new File(path, "money/" + currencyName + ".yml"), Config.YAML); + file.set("version", 2); + LinkedHashMap temp = (LinkedHashMap) file.getRootSection() + .computeIfAbsent("money", s -> new LinkedHashMap<>()); + temp.forEach((username, money) -> { + if (money instanceof Integer) { + file.set(username, ((Integer) money).doubleValue()); + } else if (money instanceof String) { + file.set(username, Double.parseDouble(money.toString())); + } + }); + file.save(); + currenciesData.put(currencyName, file); }); } @@ -55,27 +54,46 @@ public void open() { @Override public void save() { - file.set("money", data); - file.save(); + currenciesData.values().forEach(cfg -> cfg.save()); } @Override public void close() { this.save(); + currenciesData.clear(); + } - file = null; - data = null; + @Override + public boolean accountExists(String currencyName, String id) { + if (!currenciesData.containsKey(currencyName)) return false; + return currenciesData.get(currencyName).exists("money." + id); } @Override public boolean accountExists(String id) { - return data.containsKey(id); + return accountExists(MAIN_CONFIG.getDefaultCurrency().getName(), id); + } + + @Override + public boolean removeAccount(String currencyName, String id) { + if (!currenciesData.containsKey(currencyName)) return false; + if (accountExists(currencyName, id)) { + currenciesData.get(currencyName).remove("money." + id); + return true; + } + return false; } @Override public boolean removeAccount(String id) { - if (accountExists(id)) { - data.remove(id); + return removeAccount(MAIN_CONFIG.getDefaultCurrency().getName(), id); + } + + @Override + public boolean createAccount(String currencyName, String id, double defaultMoney) { + if (!accountExists(currencyName, id)) { + if (!currenciesData.containsKey(currencyName)) return false; + currenciesData.get(currencyName).set("money." + id, defaultMoney); return true; } return false; @@ -83,50 +101,84 @@ public boolean removeAccount(String id) { @Override public boolean createAccount(String id, double defaultMoney) { - if (!this.accountExists(id)) { - data.put(id, defaultMoney); + return createAccount(MAIN_CONFIG.getDefaultCurrency().getName(), defaultMoney); + } + + @Override + public boolean setMoney(String currencyName, String id, double amount) { + if (!accountExists(currencyName, id)) { + return false; } + currenciesData.get(currencyName).set("money." + id, amount); return false; } @Override public boolean setMoney(String id, double amount) { - if (data.containsKey(id)) { - data.put(id, amount); - return true; + return setMoney(MAIN_CONFIG.getDefaultCurrency().getName(), id, amount); + } + + @Override + public boolean addMoney(String currencyName, String id, double amount) { + if (!accountExists(currencyName, id)) { + return false; } - return false; + Config data = currenciesData.get(currencyName); + data.set("money." + id, data.getDouble("money." + id) + amount); + return true; } @Override public boolean addMoney(String id, double amount) { - if (data.containsKey(id)) { - data.put(id, data.get(id) + amount); - return true; + return addMoney(MAIN_CONFIG.getDefaultCurrency().getName(), id, amount); + } + + @Override + public boolean reduceMoney(String currencyName, String id, double amount) { + if (!accountExists(currencyName, id)) { + return false; } - return false; + Config data = currenciesData.get(currencyName); + data.set("money." + id, data.getDouble("money." + id) - amount); + return true; } @Override public boolean reduceMoney(String id, double amount) { - if (data.containsKey(id)) { - data.put(id, data.get(id) - amount); - return true; + return reduceMoney(MAIN_CONFIG.getDefaultCurrency().getName(), id, amount); + } + + @Override + public double getMoney(String currencyName, String id) { + if (!accountExists(currencyName, id)) { + return -1; } - return false; + return currenciesData.get(currencyName).getDouble("money." + id); } @Override public double getMoney(String id) { - if (data.containsKey(id)) { - return data.get(id); - } - return -1; + return getMoney(MAIN_CONFIG.getDefaultCurrency().getName(), id); + } + + public LinkedHashMap getAll(String currencyName) { + LinkedHashMap result = new LinkedHashMap<>(); + if (!currenciesData.containsKey(currencyName)) return result; + LinkedHashMap temp = (LinkedHashMap) currenciesData.get(currencyName).getRootSection() + .computeIfAbsent("money", s -> new LinkedHashMap<>()); + temp.forEach((username, money) -> { + if (money instanceof Integer) { + result.put(username, ((Integer) money).doubleValue()); + } else if (money instanceof String) { + result.put(username, Double.parseDouble(money.toString())); + } + }); + return result; } public LinkedHashMap getAll() { - return data; + return getAll(MAIN_CONFIG.getDefaultCurrency().getName()); } public String getName() { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index e070794..7e8146e 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -4,7 +4,7 @@ currencies: monetary-unit: "$" default: 1000.0 max: 9999999999.0 - exchange-rate: 10000 # 基准货币 USD, 汇率为 10000 + exchange-rate: 10000 # base currency USD, exchange rate is 10000 EUR: monetary-unit: "€" default: 500.0 @@ -17,5 +17,5 @@ currencies: exchange-rate: 13300 # 1 GBP = 1.33 USD data: default-currency: USD - auto-save-interval: 10 - provider: yaml + auto-save-interval: 10 # unit: minutes + provider: yaml # available values: yaml | sqlite From 312ca77b28ea7c5870eca4a9cb6640f3b2165053 Mon Sep 17 00:00:00 2001 From: Mcayear Date: Sat, 15 Feb 2025 12:17:55 +0800 Subject: [PATCH 3/6] refactor: sqlite provider --- pom.xml | 26 +- .../me/onebone/economyapi/EconomyAPI.java | 260 ++++++++++++++++++ .../economyapi/config/EconomyAPIConfig.java | 1 + .../economyapi/config/UpgradeConfig.java | 3 +- .../event/account/CreateAccountEvent.java | 14 + .../economyapi/event/money/AddMoneyEvent.java | 14 + .../event/money/ReduceMoneyEvent.java | 14 + .../economyapi/event/money/SetMoneyEvent.java | 14 + .../onebone/economyapi/provider/Provider.java | 18 -- .../economyapi/provider/SQLiteProvider.java | 145 ++++++---- .../economyapi/provider/YamlProvider.java | 25 +- src/main/resources/plugin.yml | 6 +- 12 files changed, 435 insertions(+), 105 deletions(-) diff --git a/pom.xml b/pom.xml index ccf17df..1d52ab2 100644 --- a/pom.xml +++ b/pom.xml @@ -2,10 +2,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - me.onebone - economyapi + me.onebone.economyapi.EconomyAPI + EconomyAPI 2.0.6-SNAPSHOT - EconomyAPI https://github.com/MemoriesOfTime/EconomyAPI @@ -49,7 +48,26 @@ - ${project.name}-${project.version} + ${project.name}-${project.version}-MOT + + + + src/main/resources + + **/plugin.yml + + true + + + + src/main/resources + + **/plugin.yml + + false + + + clean package diff --git a/src/main/java/me/onebone/economyapi/EconomyAPI.java b/src/main/java/me/onebone/economyapi/EconomyAPI.java index 4415689..a06b9e3 100644 --- a/src/main/java/me/onebone/economyapi/EconomyAPI.java +++ b/src/main/java/me/onebone/economyapi/EconomyAPI.java @@ -360,6 +360,266 @@ public double getMaxMoney() { return MAIN_CONFIG.getDefaultCurrency().getMaxAmount(); } + // start 多货币方法 + public LinkedHashMap getAllMoney(String currencyName) { + return this.provider.getAll(currencyName); + } + + public double myMoney(Player player, String currencyName) { + return this.myMoney(player.getUniqueId(), currencyName); + } + + public double myMoney(IPlayer player, String currencyName) { + return this.myMoney(player.getUniqueId(), currencyName); + } + + public double myMoney(UUID id, String currencyName) { + checkAndConvertLegacy(id); + return myMoneyInternal(id.toString(), currencyName); + } + + public double myMoney(String id, String currencyName) { + Optional uuid = checkAndConvertLegacy(id); + return uuid.map(uuid1 -> myMoney(uuid1, currencyName)).orElse(myMoneyInternal(id, currencyName)); + } + + private double myMoneyInternal(String id, String currencyName) { + return this.provider.getMoney(id.toLowerCase(), currencyName); + } + + public int setMoney(Player player, double amount, String currencyName) { + return this.setMoney(player.getUniqueId(), amount, currencyName, false); + } + + public int setMoney(Player player, double amount, String currencyName, boolean force) { + return this.setMoney(player.getUniqueId(), amount, currencyName, force); + } + + public int setMoney(IPlayer player, double amount, String currencyName) { + return this.setMoney(player.getUniqueId(), amount, currencyName, false); + } + + public int setMoney(IPlayer player, double amount, String currencyName, boolean force) { + return this.setMoney(player.getUniqueId(), amount, currencyName, force); + } + + public int setMoney(UUID id, double amount, String currencyName) { + return setMoney(id, amount, currencyName, false); + } + + public int setMoney(UUID id, double amount, String currencyName, boolean force) { + checkAndConvertLegacy(id); + return setMoneyInternal(id.toString(), amount, currencyName, force); + } + + public int setMoney(String id, double amount, String currencyName) { + return this.setMoney(id, amount, currencyName, false); + } + + public int setMoney(String id, double amount, String currencyName, boolean force) { + Optional uuid = checkAndConvertLegacy(id); + return uuid.map(uuid1 -> setMoney(uuid1, amount, currencyName, force)) + .orElse(setMoneyInternal(id, amount, currencyName, force)); + } + + private int setMoneyInternal(String id, double amount, String currencyName, boolean force) { + id = id.toLowerCase(); + if (amount < 0) { + return RET_INVALID; + } + SetMoneyEvent event = new SetMoneyEvent(id, amount, currencyName); + this.getServer().getPluginManager().callEvent(event); + if (!event.isCancelled() || force) { + if (this.provider.accountExists(id, currencyName)) { + amount = event.getAmount(); + if (amount <= getMaxMoney(currencyName)) { + this.provider.setMoney(currencyName, id, amount); + return RET_SUCCESS; + } else { + return RET_INVALID; + } + } else { + return RET_NO_ACCOUNT; + } + } + return RET_CANCELLED; + } + + public int addMoney(Player player, double amount, String currencyName) { + return this.addMoney(player.getUniqueId(), amount, currencyName, false); + } + + public int addMoney(Player player, double amount, String currencyName, boolean force) { + return this.addMoney(player.getUniqueId(), amount, currencyName, force); + } + + public int addMoney(IPlayer player, double amount, String currencyName) { + return this.addMoney(player.getUniqueId(), amount, currencyName, false); + } + + public int addMoney(IPlayer player, double amount, String currencyName, boolean force) { + return this.addMoney(player.getUniqueId(), amount, currencyName, force); + } + + public int addMoney(UUID id, double amount, String currencyName) { + return addMoney(id, amount, currencyName, false); + } + + public int addMoney(UUID id, double amount, String currencyName, boolean force) { + checkAndConvertLegacy(id); + return addMoneyInternal(id.toString(), amount, currencyName, force); + } + + public int addMoney(String id, double amount, String currencyName) { + return this.addMoney(id, amount, currencyName, false); + } + + public int addMoney(String id, double amount, String currencyName, boolean force) { + Optional uuid = checkAndConvertLegacy(id); + return uuid.map(uuid1 -> addMoney(uuid1, amount, currencyName, force)) + .orElse(addMoneyInternal(id, amount, currencyName, force)); + } + + private int addMoneyInternal(String id, double amount, String currencyName, boolean force) { + id = id.toLowerCase(); + if (amount < 0) { + return RET_INVALID; + } + AddMoneyEvent event = new AddMoneyEvent(id, amount, currencyName); + this.getServer().getPluginManager().callEvent(event); + if (!event.isCancelled() || force) { + double money = this.provider.getMoney(id, currencyName); + if (money != -1) { + if (money + amount > getMaxMoney(currencyName)) { + return RET_INVALID; + } else { + this.provider.addMoney(currencyName, id, amount); + return RET_SUCCESS; + } + } else { + return RET_NO_ACCOUNT; + } + } + return RET_CANCELLED; + } + + public int reduceMoney(Player player, double amount, String currencyName) { + return this.reduceMoney(player.getUniqueId(), amount, currencyName, false); + } + + public int reduceMoney(Player player, double amount, String currencyName, boolean force) { + return this.reduceMoney(player.getUniqueId(), amount, currencyName, force); + } + + public int reduceMoney(IPlayer player, double amount, String currencyName) { + return this.reduceMoney(player.getUniqueId(), amount, currencyName, false); + } + + public int reduceMoney(IPlayer player, double amount, String currencyName, boolean force) { + return this.reduceMoney(player.getUniqueId(), amount, currencyName, force); + } + + public int reduceMoney(UUID id, double amount, String currencyName) { + return reduceMoney(id, amount, currencyName, false); + } + + public int reduceMoney(UUID id, double amount, String currencyName, boolean force) { + checkAndConvertLegacy(id); + return reduceMoneyInternal(id.toString(), amount, currencyName, force); + } + + public int reduceMoney(String id, double amount, String currencyName) { + return this.reduceMoney(id, amount, currencyName, false); + } + + public int reduceMoney(String id, double amount, String currencyName, boolean force) { + Optional uuid = checkAndConvertLegacy(id); + return uuid.map(uuid1 -> reduceMoney(uuid1, amount, currencyName, force)) + .orElse(reduceMoneyInternal(id, amount, currencyName, force)); + } + + private int reduceMoneyInternal(String id, double amount, String currencyName, boolean force) { + id = id.toLowerCase(); + if (amount < 0) { + return RET_INVALID; + } + ReduceMoneyEvent event = new ReduceMoneyEvent(id, amount, currencyName); + this.getServer().getPluginManager().callEvent(event); + if (!event.isCancelled() || force) { + amount = event.getAmount(); + double money = this.provider.getMoney(id, currencyName); + if (money != -1) { + if (money - amount < 0) { + return RET_INVALID; + } else { + this.provider.reduceMoney(currencyName, id, amount); + return RET_SUCCESS; + } + } else { + return RET_NO_ACCOUNT; + } + } + return RET_CANCELLED; + } + + public boolean createAccount(Player player, double defaultMoney, String currencyName) { + return this.createAccount(player.getUniqueId(), defaultMoney, currencyName, false); + } + + public boolean createAccount(Player player, double defaultMoney, String currencyName, boolean force) { + return this.createAccount(player.getUniqueId(), defaultMoney, currencyName, force); + } + + public boolean createAccount(IPlayer player, double defaultMoney, String currencyName) { + return this.createAccount(player.getUniqueId(), defaultMoney, currencyName, false); + } + + public boolean createAccount(IPlayer player, double defaultMoney, String currencyName, boolean force) { + return this.createAccount(player.getUniqueId(), defaultMoney, currencyName, force); + } + + public boolean createAccount(UUID id, double defaultMoney, String currencyName) { + return this.createAccount(id, defaultMoney, currencyName, false); + } + + public boolean createAccount(UUID id, double defaultMoney, String currencyName, boolean force) { + checkAndConvertLegacy(id); + return createAccountInternal(id.toString(), defaultMoney, currencyName, force); + } + + public boolean createAccount(String id, double defaultMoney, String currencyName) { + return this.createAccount(id, defaultMoney, currencyName, false); + } + + public boolean createAccount(String id, double defaultMoney, String currencyName, boolean force) { + Optional uuid = checkAndConvertLegacy(id); + return uuid.map(uuid1 -> createAccount(uuid1, defaultMoney, currencyName, force)) + .orElse(createAccountInternal(id, defaultMoney, currencyName, force)); + } + + private boolean createAccountInternal(String id, double defaultMoney, String currencyName, boolean force) { + CreateAccountEvent event = new CreateAccountEvent(id, defaultMoney, currencyName); + this.getServer().getPluginManager().callEvent(event); + if (!event.isCancelled() || force) { + defaultMoney = event.getDefaultMoney() == -1D ? getDefaultMoney(currencyName) : event.getDefaultMoney(); + return this.provider.createAccount(currencyName, id, defaultMoney); + } + return false; + } + + public String getMonetaryUnit(String currencyName) { + return MAIN_CONFIG.getCurrency(currencyName).getMonetaryUnit(); + } + + public double getDefaultMoney(String currencyName) { + return MAIN_CONFIG.getCurrency(currencyName).getDefaultAmount(); + } + + public double getMaxMoney(String currencyName) { + return MAIN_CONFIG.getCurrency(currencyName).getMaxAmount(); + } + // end 多货币方法 + public void saveAll() { if (this.provider != null) { this.provider.save(); diff --git a/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java b/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java index 6170a77..0d71e6f 100644 --- a/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java +++ b/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java @@ -15,6 +15,7 @@ public class EconomyAPIConfig { private final String provider; public EconomyAPIConfig() { + EconomyAPI.getInstance().saveDefaultConfig(); config = EconomyAPI.getInstance().getConfig(); if (UpgradeConfig.tryUpgradeConfigVersion(config.getInt("version", 1))) { config.reload(); diff --git a/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java b/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java index a86cd94..dd5d060 100644 --- a/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java +++ b/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java @@ -16,8 +16,7 @@ public static boolean tryUpgradeConfigVersion(int oldVersion) { Files.move( Paths.get(EconomyAPI.getInstance().getDataFolder().toString(), "config.yml"), target); - } catch (IOException e) { - + } catch (IOException ignored) { } Config oldConfig = new Config(target.toFile()); Config config = EconomyAPI.getInstance().getConfig(); diff --git a/src/main/java/me/onebone/economyapi/event/account/CreateAccountEvent.java b/src/main/java/me/onebone/economyapi/event/account/CreateAccountEvent.java index 4ee0571..fc063a7 100644 --- a/src/main/java/me/onebone/economyapi/event/account/CreateAccountEvent.java +++ b/src/main/java/me/onebone/economyapi/event/account/CreateAccountEvent.java @@ -22,15 +22,25 @@ import cn.nukkit.event.Event; import cn.nukkit.event.HandlerList; +import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; + public class CreateAccountEvent extends Event implements Cancellable { public static HandlerList handlerList = new HandlerList(); private final String player; private double defaultMoney; + private final String currencyName; public CreateAccountEvent(String player, double defaultMoney) { this.player = player; this.defaultMoney = defaultMoney; + this.currencyName = MAIN_CONFIG.getDefaultCurrency().getName(); + } + + public CreateAccountEvent(String player, double defaultMoney, String currencyName) { + this.player = player; + this.defaultMoney = defaultMoney; + this.currencyName = currencyName; } public static HandlerList getHandlers() { @@ -48,4 +58,8 @@ public double getDefaultMoney() { public void setDefaultMoney(double amount) { this.defaultMoney = amount; } + + public String getCurrencyName() { + return this.currencyName; + } } diff --git a/src/main/java/me/onebone/economyapi/event/money/AddMoneyEvent.java b/src/main/java/me/onebone/economyapi/event/money/AddMoneyEvent.java index 37d0fa0..5910c06 100644 --- a/src/main/java/me/onebone/economyapi/event/money/AddMoneyEvent.java +++ b/src/main/java/me/onebone/economyapi/event/money/AddMoneyEvent.java @@ -22,15 +22,25 @@ import cn.nukkit.event.Event; import cn.nukkit.event.HandlerList; +import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; + public class AddMoneyEvent extends Event implements Cancellable { public static HandlerList handlerList = new HandlerList(); private final String player; private double amount; + private final String currencyName; public AddMoneyEvent(String player, double amount) { this.player = player; this.amount = amount; + this.currencyName = MAIN_CONFIG.getDefaultCurrency().getName(); + } + + public AddMoneyEvent(String player, double amount, String currencyName) { + this.player = player; + this.amount = amount; + this.currencyName = currencyName; } public static HandlerList getHandlers() { @@ -48,4 +58,8 @@ public double getAmount() { public void setAmount(double amount) { this.amount = amount; } + + public String getCurrencyName() { + return this.currencyName; + } } diff --git a/src/main/java/me/onebone/economyapi/event/money/ReduceMoneyEvent.java b/src/main/java/me/onebone/economyapi/event/money/ReduceMoneyEvent.java index 4ef1947..7464a9e 100644 --- a/src/main/java/me/onebone/economyapi/event/money/ReduceMoneyEvent.java +++ b/src/main/java/me/onebone/economyapi/event/money/ReduceMoneyEvent.java @@ -22,15 +22,25 @@ import cn.nukkit.event.Event; import cn.nukkit.event.HandlerList; +import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; + public class ReduceMoneyEvent extends Event implements Cancellable { public static HandlerList handlerList = new HandlerList(); private final String player; private double amount; + private final String currencyName; public ReduceMoneyEvent(String player, double amount) { this.player = player; this.amount = amount; + this.currencyName = MAIN_CONFIG.getDefaultCurrency().getName(); + } + + public ReduceMoneyEvent(String player, double amount, String currencyName) { + this.player = player; + this.amount = amount; + this.currencyName = currencyName; } public static HandlerList getHandlers() { @@ -48,4 +58,8 @@ public double getAmount() { public void setAmount(double amount) { this.amount = amount; } + + public String getCurrencyName() { + return this.currencyName; + } } diff --git a/src/main/java/me/onebone/economyapi/event/money/SetMoneyEvent.java b/src/main/java/me/onebone/economyapi/event/money/SetMoneyEvent.java index 95c22bc..3b5ba6e 100644 --- a/src/main/java/me/onebone/economyapi/event/money/SetMoneyEvent.java +++ b/src/main/java/me/onebone/economyapi/event/money/SetMoneyEvent.java @@ -22,15 +22,25 @@ import cn.nukkit.event.Event; import cn.nukkit.event.HandlerList; +import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; + public class SetMoneyEvent extends Event implements Cancellable { public static HandlerList handlerList = new HandlerList(); private final String player; private double amount; + private final String currencyName; public SetMoneyEvent(String player, double amount) { this.player = player; this.amount = amount; + this.currencyName = MAIN_CONFIG.getDefaultCurrency().getName(); + } + + public SetMoneyEvent(String player, double amount, String currencyName) { + this.player = player; + this.amount = amount; + this.currencyName = currencyName; } public static HandlerList getHandlers() { @@ -48,4 +58,8 @@ public double getAmount() { public void setAmount(double amount) { this.amount = amount; } + + public String getCurrencyName() { + return this.currencyName; + } } diff --git a/src/main/java/me/onebone/economyapi/provider/Provider.java b/src/main/java/me/onebone/economyapi/provider/Provider.java index 4573a9f..fce2110 100644 --- a/src/main/java/me/onebone/economyapi/provider/Provider.java +++ b/src/main/java/me/onebone/economyapi/provider/Provider.java @@ -1,23 +1,5 @@ package me.onebone.economyapi.provider; -/* - * EconomyAPI: Core of economy system for Nukkit - * Copyright (C) 2016 onebone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - import java.io.File; import java.util.LinkedHashMap; diff --git a/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java b/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java index d144011..ccf83b3 100644 --- a/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java +++ b/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java @@ -1,36 +1,39 @@ package me.onebone.economyapi.provider; -import cn.nukkit.item.ItemHelmetGold; -import com.smallaswater.easysqlx.common.data.SqlData; import com.smallaswater.easysqlx.sqlite.SQLiteHelper; - +import com.smallaswater.easysqlx.sqlite.SQLiteHelper.DBTable; import java.io.File; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; +import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; + /** * @author LT_Name */ public class SQLiteProvider implements Provider { - private static final String TABLE_NAME = "Money"; private static final String COLUMN_ID = "id"; private static final String COLUMN_PLAYER = "player"; private static final String COLUMN_MONEY = "money"; - + private static final String COLUMN_CURRENCY = "currency"; // 新增 currency 列 private SQLiteHelper sqLiteHelper; - - private final HashMap cache = new HashMap<>(); + private final HashMap cache = new HashMap<>(); // Key 修改为 currencyName:playerName @Override public void init(File path) { try { - this.sqLiteHelper = new SQLiteHelper(path.getAbsolutePath() + "/Money.db"); + this.sqLiteHelper = new SQLiteHelper(path.getAbsolutePath() + File.separator +"Money.db"); if (!this.sqLiteHelper.exists(TABLE_NAME)) { - this.sqLiteHelper.addTable(TABLE_NAME, SQLiteHelper.DBTable.asDbTable(MoneyData.class)); + DBTable table = DBTable.asDbTable(MoneyData.class); + table.put(COLUMN_CURRENCY, "varchar(20)"); // 添加 currency 列到表结构中 + this.sqLiteHelper.addTable(TABLE_NAME, table); } - this.sqLiteHelper.getAll(TABLE_NAME, MoneyData.class).forEach(data -> this.cache.put(data.getPlayer(), data)); + MAIN_CONFIG.getCurrencyList().forEach(currencyName -> { // 初始化时加载所有货币的数据 + this.sqLiteHelper.getDataByString(TABLE_NAME, COLUMN_CURRENCY + " = ?", new String[]{currencyName}, MoneyData.class) + .forEach(data -> this.cache.put(getCacheKey(currencyName, data.getPlayer()), data)); + }); } catch (Exception e) { throw new RuntimeException(e); } @@ -38,7 +41,6 @@ public void init(File path) { @Override public void open() { - } @Override @@ -53,134 +55,153 @@ public void close() { } } + private String getCacheKey(String currencyName, String playerName) { + return currencyName + ":" + playerName; + } + @Override public boolean accountExists(String currencyName, String id) { - return false; + LinkedList dataList = this.sqLiteHelper.getDataByString(TABLE_NAME, COLUMN_PLAYER + " = ? AND " + COLUMN_CURRENCY + " = ?", new String[]{id, currencyName}, MoneyData.class); + return !dataList.isEmpty(); } @Override public boolean accountExists(String id) { - return this.sqLiteHelper.hasData(TABLE_NAME, COLUMN_PLAYER, id); + return accountExists(MAIN_CONFIG.getDefaultCurrency().getName(), id); } @Override public boolean removeAccount(String currencyName, String id) { - return false; - } - - @Override - public boolean removeAccount(String id) { - if (this.accountExists(id)) { - this.sqLiteHelper.remove(TABLE_NAME, COLUMN_PLAYER, id); + if (accountExists(currencyName, id)) { + this.sqLiteHelper.remove(TABLE_NAME, COLUMN_PLAYER, id); // 移除账户时使用 player 作为 key,currency 通过 MoneyData 对象内部 currency 字段区分 + this.cache.remove(getCacheKey(currencyName, id)); // 从缓存中移除 return true; } return false; } @Override - public boolean createAccount(String currencyName, String id, double defaultMoney) { - return false; + public boolean removeAccount(String id) { + return removeAccount(MAIN_CONFIG.getDefaultCurrency().getName(), id); } @Override - public boolean createAccount(String id, double defaultMoney) { - if (!this.accountExists(id)) { + public boolean createAccount(String currencyName, String id, double defaultMoney) { + if (!accountExists(currencyName, id)) { MoneyData values = new MoneyData(id, defaultMoney); + values.setCurrency(currencyName); // 设置 currencyName this.sqLiteHelper.add(TABLE_NAME, values); + this.cache.put(getCacheKey(currencyName, id), values); // 添加到缓存 return true; } return false; } @Override - public boolean setMoney(String currencyName, String id, double amount) { - return false; + public boolean createAccount(String id, double defaultMoney) { + return createAccount(MAIN_CONFIG.getDefaultCurrency().getName(), id, defaultMoney); } @Override - public boolean setMoney(String id, double amount) { - if (this.accountExists(id)) { - MoneyData moneyData = this.getMoneyData(id); + public boolean setMoney(String currencyName, String id, double amount) { + if (accountExists(currencyName, id)) { + MoneyData moneyData = this.getMoneyData(currencyName, id); moneyData.setMoney(amount); - this.sqLiteHelper.set(TABLE_NAME, COLUMN_PLAYER, id, moneyData); + this.sqLiteHelper.set(TABLE_NAME, COLUMN_PLAYER, id, moneyData); // 使用 player 作为 key 更新,MoneyData 对象内部包含 currency 信息 + this.cache.put(getCacheKey(currencyName, id), moneyData); // 更新缓存 return true; } return false; } @Override - public boolean addMoney(String currencyName, String id, double amount) { - return false; + public boolean setMoney(String id, double amount) { + return setMoney(MAIN_CONFIG.getDefaultCurrency().getName(), id, amount); } @Override - public boolean addMoney(String id, double amount) { - if (this.accountExists(id)) { - this.setMoney(id, this.getMoney(id) + amount); + public boolean addMoney(String currencyName, String id, double amount) { + if (accountExists(currencyName, id)) { + this.setMoney(currencyName, id, this.getMoney(currencyName, id) + amount); return true; } return false; } @Override - public boolean reduceMoney(String currencyName, String id, double amount) { - return false; + public boolean addMoney(String id, double amount) { + return addMoney(MAIN_CONFIG.getDefaultCurrency().getName(), id, amount); } @Override - public boolean reduceMoney(String id, double amount) { - if (this.accountExists(id)) { - this.setMoney(id, this.getMoney(id) - amount); + public boolean reduceMoney(String currencyName, String id, double amount) { + if (accountExists(currencyName, id)) { + this.setMoney(currencyName, id, this.getMoney(currencyName, id) - amount); return true; } return false; } @Override - public double getMoney(String currencyName, String id) { - return 0; + public boolean reduceMoney(String id, double amount) { + return reduceMoney(MAIN_CONFIG.getDefaultCurrency().getName(), id, amount); } @Override - public double getMoney(String id) { - if (this.accountExists(id)) { - return this.getMoneyData(id).getMoney(); + public double getMoney(String currencyName, String id) { + MoneyData data = this.getMoneyData(currencyName, id); + if (data != null) { + return data.getMoney(); } return -1; } @Override - public LinkedHashMap getAll(String currencyName) { - return null; + public double getMoney(String id) { + return getMoney(MAIN_CONFIG.getDefaultCurrency().getName(), id); } @Override - public LinkedHashMap getAll() { + public LinkedHashMap getAll(String currencyName) { LinkedHashMap map = new LinkedHashMap<>(); - for (MoneyData data : this.cache.values()) { - map.put(data.getPlayer(), data.getMoney()); - } + MAIN_CONFIG.getCurrencyList().forEach(currency -> { + if (currency.equals(currencyName)) { + this.sqLiteHelper.getDataByString(TABLE_NAME, COLUMN_CURRENCY + " = ?", new String[]{currencyName}, MoneyData.class) + .forEach(data -> map.put(data.getPlayer(), data.getMoney())); + } + }); return map; } + @Override + public LinkedHashMap getAll() { + return getAll(MAIN_CONFIG.getDefaultCurrency().getName()); + } + @Override public String getName() { return "SQLite"; } - private MoneyData getMoneyData(String id) { - if (!this.cache.containsKey(id)) { - MoneyData data = this.sqLiteHelper.get(TABLE_NAME, COLUMN_PLAYER, id, MoneyData.class); - this.cache.put(id, data); + private MoneyData getMoneyData(String currencyName, String id) { + String cacheKey = getCacheKey(currencyName, id); + if (this.cache.containsKey(cacheKey)) { + return this.cache.get(cacheKey); } - return this.cache.get(id); + LinkedList dataList = this.sqLiteHelper.getDataByString(TABLE_NAME, COLUMN_PLAYER + " = ? AND " + COLUMN_CURRENCY + " = ?", new String[]{id, currencyName}, MoneyData.class); + if (!dataList.isEmpty()) { + MoneyData data = dataList.getFirst(); + this.cache.put(cacheKey, data); + return data; + } + return null; } public static class MoneyData { - public long id; public String player; public double money; + public String currency; // 新增 currency 字段 public MoneyData() { //SQLiteHelper创建类需要无参数的构造方法 @@ -206,5 +227,13 @@ public double getMoney() { public void setMoney(double money) { this.money = money; } + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } } -} +} \ No newline at end of file diff --git a/src/main/java/me/onebone/economyapi/provider/YamlProvider.java b/src/main/java/me/onebone/economyapi/provider/YamlProvider.java index f3ea50d..2470b4d 100644 --- a/src/main/java/me/onebone/economyapi/provider/YamlProvider.java +++ b/src/main/java/me/onebone/economyapi/provider/YamlProvider.java @@ -1,23 +1,5 @@ package me.onebone.economyapi.provider; -/* - * EconomyAPI: Core of economy system for Nukkit - * Copyright (C) 2016 onebone - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - import cn.nukkit.utils.Config; import java.io.File; @@ -25,13 +7,16 @@ import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; +/** + * @author onebone + */ public class YamlProvider implements Provider { private final LinkedHashMap currenciesData = new LinkedHashMap<>(); @Override public void init(File path) { MAIN_CONFIG.getCurrencyList().forEach(currencyName -> { - Config file = new Config(new File(path, "money/" + currencyName + ".yml"), Config.YAML); + Config file = new Config(new File(path, "money" + File.separator + currencyName + ".yml"), Config.YAML); file.set("version", 2); LinkedHashMap temp = (LinkedHashMap) file.getRootSection() .computeIfAbsent("money", s -> new LinkedHashMap<>()); @@ -101,7 +86,7 @@ public boolean createAccount(String currencyName, String id, double defaultMoney @Override public boolean createAccount(String id, double defaultMoney) { - return createAccount(MAIN_CONFIG.getDefaultCurrency().getName(), defaultMoney); + return createAccount(MAIN_CONFIG.getDefaultCurrency().getName(), id, defaultMoney); } @Override diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 7680bd1..7d528b7 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,8 +1,8 @@ -name: EconomyAPI -version: 2.0.5 +name: "${project.artifactId}" +version: "${project.version}" author: onebone api: ["1.0.13"] -main: me.onebone.economyapi.EconomyAPI +main: "${project.groupId}" softdepend: - "EasySQLX" From 3287666be4d78a24567182dca81286c517af3a7e Mon Sep 17 00:00:00 2001 From: Mcayear Date: Sat, 15 Feb 2025 17:21:58 +0800 Subject: [PATCH 4/6] refactor: command supports multiple currencies. --- pom.xml | 2 +- .../me/onebone/economyapi/EconomyAPI.java | 16 +++++++----- .../economyapi/command/GiveMoneyCommand.java | 21 ++++++++++----- .../economyapi/command/MyMoneyCommand.java | 10 ++++--- .../economyapi/command/PayCommand.java | 26 ++++++++++++------- .../economyapi/command/SetLangCommand.java | 9 ++++--- .../economyapi/command/SetMoneyCommand.java | 26 +++++++++++++------ .../economyapi/command/TakeMoneyCommand.java | 26 +++++++++++++------ .../economyapi/command/TopMoneyCommand.java | 24 ++++++++++++++--- .../economyapi/provider/YamlProvider.java | 2 ++ 10 files changed, 114 insertions(+), 48 deletions(-) diff --git a/pom.xml b/pom.xml index 1d52ab2..c8772ac 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ me.onebone.economyapi.EconomyAPI EconomyAPI - 2.0.6-SNAPSHOT + 2.1.0-SNAPSHOT https://github.com/MemoriesOfTime/EconomyAPI diff --git a/src/main/java/me/onebone/economyapi/EconomyAPI.java b/src/main/java/me/onebone/economyapi/EconomyAPI.java index a06b9e3..799c17b 100644 --- a/src/main/java/me/onebone/economyapi/EconomyAPI.java +++ b/src/main/java/me/onebone/economyapi/EconomyAPI.java @@ -21,6 +21,7 @@ import cn.nukkit.IPlayer; import cn.nukkit.Player; import cn.nukkit.Server; +import cn.nukkit.command.data.CommandEnum; import cn.nukkit.event.EventHandler; import cn.nukkit.event.Listener; import cn.nukkit.event.player.PlayerJoinEvent; @@ -41,10 +42,7 @@ import java.lang.reflect.InvocationTargetException; import java.text.DecimalFormat; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Optional; -import java.util.UUID; +import java.util.*; public class EconomyAPI extends PluginBase implements Listener { public static final int RET_NO_ACCOUNT = -3; @@ -120,7 +118,11 @@ private boolean createAccountInternal(String id, double defaultMoney, boolean fo this.getServer().getPluginManager().callEvent(event); if (!event.isCancelled() || force) { defaultMoney = event.getDefaultMoney() == -1D ? this.getDefaultMoney() : event.getDefaultMoney(); - return this.provider.createAccount(id, defaultMoney); + boolean failed = false; + for (String currencyName : MAIN_CONFIG.getCurrencyList()) { + failed = failed || !this.provider.createAccount(currencyName, id, defaultMoney); + } + return !failed;// usually return true. } return false; } @@ -488,7 +490,7 @@ private int addMoneyInternal(String id, double amount, String currencyName, bool AddMoneyEvent event = new AddMoneyEvent(id, amount, currencyName); this.getServer().getPluginManager().callEvent(event); if (!event.isCancelled() || force) { - double money = this.provider.getMoney(id, currencyName); + double money = this.provider.getMoney(currencyName, id); if (money != -1) { if (money + amount > getMaxMoney(currencyName)) { return RET_INVALID; @@ -547,7 +549,7 @@ private int reduceMoneyInternal(String id, double amount, String currencyName, b this.getServer().getPluginManager().callEvent(event); if (!event.isCancelled() || force) { amount = event.getAmount(); - double money = this.provider.getMoney(id, currencyName); + double money = this.provider.getMoney(currencyName, id); if (money != -1) { if (money - amount < 0) { return RET_INVALID; diff --git a/src/main/java/me/onebone/economyapi/command/GiveMoneyCommand.java b/src/main/java/me/onebone/economyapi/command/GiveMoneyCommand.java index bdcca18..86b8099 100644 --- a/src/main/java/me/onebone/economyapi/command/GiveMoneyCommand.java +++ b/src/main/java/me/onebone/economyapi/command/GiveMoneyCommand.java @@ -19,8 +19,8 @@ */ import cn.nukkit.Player; -import cn.nukkit.command.Command; import cn.nukkit.command.CommandSender; +import cn.nukkit.command.PluginCommand; import cn.nukkit.command.data.CommandParamType; import cn.nukkit.command.data.CommandParameter; import cn.nukkit.lang.LangCode; @@ -28,21 +28,26 @@ import cn.nukkit.utils.TextFormat; import me.onebone.economyapi.EconomyAPI; +import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; import static me.onebone.economyapi.EconomyAPI.serverLangCode; -public class GiveMoneyCommand extends Command { +public class GiveMoneyCommand extends PluginCommand { private final EconomyAPI plugin; public GiveMoneyCommand(EconomyAPI plugin) { - super("givemoney", "Gives money to player", "/givemoney ", new String[]{"deposit"}); + super("givemoney", plugin); + this.setDescription("Gives money to player"); + this.setUsage("/givemoney "); + this.setAliases(new String[]{"deposit"}); this.plugin = plugin; // command parameters commandParameters.clear(); commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("amount", CommandParamType.FLOAT, false) + CommandParameter.newType("player", false, CommandParamType.TARGET), + CommandParameter.newType("amount", false, CommandParamType.FLOAT), + CommandParameter.newEnum("currencyName", true, MAIN_CONFIG.getCurrencyList().toArray(new String[0])) }); } @@ -65,6 +70,10 @@ public boolean execute(CommandSender sender, String label, String[] args) { if (p != null) { player = p.getName(); } + String currencyName = MAIN_CONFIG.getDefaultCurrency().getName(); + if (args.length >= 3) { + currencyName = args[2]; + } try { double amount = Double.parseDouble(args[1]); if (amount < 0) { @@ -72,7 +81,7 @@ public boolean execute(CommandSender sender, String label, String[] args) { return true; } - int result = this.plugin.addMoney(player, amount); + int result = this.plugin.addMoney(player, amount, currencyName); switch (result) { case EconomyAPI.RET_INVALID: sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "reached-max", EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit())); diff --git a/src/main/java/me/onebone/economyapi/command/MyMoneyCommand.java b/src/main/java/me/onebone/economyapi/command/MyMoneyCommand.java index 23c5877..f862d57 100644 --- a/src/main/java/me/onebone/economyapi/command/MyMoneyCommand.java +++ b/src/main/java/me/onebone/economyapi/command/MyMoneyCommand.java @@ -21,6 +21,7 @@ import cn.nukkit.Player; import cn.nukkit.command.Command; import cn.nukkit.command.CommandSender; +import cn.nukkit.command.PluginCommand; import cn.nukkit.command.data.CommandParamType; import cn.nukkit.command.data.CommandParameter; import cn.nukkit.lang.LangCode; @@ -30,17 +31,20 @@ import static me.onebone.economyapi.EconomyAPI.serverLangCode; -public class MyMoneyCommand extends Command { +public class MyMoneyCommand extends PluginCommand { private final EconomyAPI plugin; public MyMoneyCommand(EconomyAPI plugin) { - super("mymoney", "Shows your money", "/money", new String[]{"money", "bal", "seemoney", "balance"}); + super("mymoney", plugin); + this.setDescription("Shows your money"); + this.setUsage("/money"); + this.setAliases(new String[]{"money", "bal", "seemoney", "balance"}); this.plugin = plugin; commandParameters.clear(); commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false) + CommandParameter.newType("player", true, CommandParamType.TARGET) }); } diff --git a/src/main/java/me/onebone/economyapi/command/PayCommand.java b/src/main/java/me/onebone/economyapi/command/PayCommand.java index 58a4cf8..6c03902 100644 --- a/src/main/java/me/onebone/economyapi/command/PayCommand.java +++ b/src/main/java/me/onebone/economyapi/command/PayCommand.java @@ -21,6 +21,7 @@ import cn.nukkit.Player; import cn.nukkit.command.Command; import cn.nukkit.command.CommandSender; +import cn.nukkit.command.PluginCommand; import cn.nukkit.command.data.CommandParamType; import cn.nukkit.command.data.CommandParameter; import cn.nukkit.lang.LangCode; @@ -29,21 +30,25 @@ import cn.nukkit.utils.TextFormat; import me.onebone.economyapi.EconomyAPI; +import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; import static me.onebone.economyapi.EconomyAPI.serverLangCode; -public class PayCommand extends Command { +public class PayCommand extends PluginCommand { private final EconomyAPI plugin; public PayCommand(EconomyAPI plugin) { - super("pay", "Pays to other player", "/pay "); + super("pay", plugin); + this.setDescription("Pays to other player"); + this.setUsage("/pay "); this.plugin = plugin; // command parameters commandParameters.clear(); commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("amount", CommandParamType.FLOAT, false) + CommandParameter.newType("player", false, CommandParamType.TARGET), + CommandParameter.newType("amount", false, CommandParamType.FLOAT), + CommandParameter.newEnum("currencyName", true, MAIN_CONFIG.getCurrencyList().toArray(new String[0])) }); } @@ -66,7 +71,6 @@ public boolean execute(CommandSender sender, String label, String[] args) { return true; } String player = args[0]; - Player p = this.plugin.getServer().getPlayer(player); if (p != null) { if (sender == p) { @@ -94,7 +98,11 @@ public boolean execute(CommandSender sender, String label, String[] args) { return true; } - int result = this.plugin.reduceMoney((Player) sender, amount); + String currencyName = MAIN_CONFIG.getDefaultCurrency().getName(); + if (args.length >= 3) { + currencyName = args[2]; + } + int result = this.plugin.reduceMoney((Player) sender, amount, currencyName); switch (result) { case EconomyAPI.RET_NO_ACCOUNT: sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "player-never-connected", player)); @@ -104,11 +112,11 @@ public boolean execute(CommandSender sender, String label, String[] args) { sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "pay-failed")); break; case EconomyAPI.RET_SUCCESS: - this.plugin.addMoney(player, amount, true); + this.plugin.addMoney(player, amount, currencyName, true); - sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "pay-success", EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit(), player)); + sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "pay-success", EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit(currencyName), player)); if (p != null) { - p.sendMessage(EconomyAPI.getI18n().tr(langCode, "money-paid", sender.getName(), EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit())); + p.sendMessage(EconomyAPI.getI18n().tr(langCode, "money-paid", sender.getName(), EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit(currencyName))); } break; } diff --git a/src/main/java/me/onebone/economyapi/command/SetLangCommand.java b/src/main/java/me/onebone/economyapi/command/SetLangCommand.java index ccab6bb..3d8dbf2 100644 --- a/src/main/java/me/onebone/economyapi/command/SetLangCommand.java +++ b/src/main/java/me/onebone/economyapi/command/SetLangCommand.java @@ -20,24 +20,27 @@ import cn.nukkit.command.Command; import cn.nukkit.command.CommandSender; +import cn.nukkit.command.PluginCommand; import cn.nukkit.command.data.CommandParamType; import cn.nukkit.command.data.CommandParameter; import cn.nukkit.lang.TranslationContainer; import cn.nukkit.utils.TextFormat; import me.onebone.economyapi.EconomyAPI; -public class SetLangCommand extends Command { +public class SetLangCommand extends PluginCommand { private final EconomyAPI plugin; public SetLangCommand(EconomyAPI plugin) { - super("setlang", "Sets your preferred language", "/setlang "); + super("setlang", plugin); + this.setDescription("Sets your preferred language"); + this.setUsage("/setlang "); this.plugin = plugin; // command parameters commandParameters.clear(); commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("ccTLD", CommandParamType.STRING, false) + CommandParameter.newType("ccTLD", false, CommandParamType.STRING) }); } diff --git a/src/main/java/me/onebone/economyapi/command/SetMoneyCommand.java b/src/main/java/me/onebone/economyapi/command/SetMoneyCommand.java index 24a3aa0..3693572 100644 --- a/src/main/java/me/onebone/economyapi/command/SetMoneyCommand.java +++ b/src/main/java/me/onebone/economyapi/command/SetMoneyCommand.java @@ -21,6 +21,7 @@ import cn.nukkit.Player; import cn.nukkit.command.Command; import cn.nukkit.command.CommandSender; +import cn.nukkit.command.PluginCommand; import cn.nukkit.command.data.CommandParamType; import cn.nukkit.command.data.CommandParameter; import cn.nukkit.lang.LangCode; @@ -28,21 +29,26 @@ import cn.nukkit.utils.TextFormat; import me.onebone.economyapi.EconomyAPI; +import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; import static me.onebone.economyapi.EconomyAPI.serverLangCode; -public class SetMoneyCommand extends Command { +public class SetMoneyCommand extends PluginCommand { private final EconomyAPI plugin; public SetMoneyCommand(EconomyAPI plugin) { - super("setmoney", "Sets player's balance", "/setmoney ", new String[]{"setbal", "setbalance"}); + super("setmoney", plugin); + this.setDescription("Sets player's balance"); + this.setUsage("/setmoney [currencyName]"); + this.setAliases(new String[]{"setbal", "setbalance"}); this.plugin = plugin; // command parameters commandParameters.clear(); commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("amount", CommandParamType.FLOAT, false) + CommandParameter.newType("player", false, CommandParamType.TARGET), + CommandParameter.newType("amount", false, CommandParamType.FLOAT), + CommandParameter.newEnum("currencyName", true, MAIN_CONFIG.getCurrencyList().toArray(new String[0])) }); } @@ -73,7 +79,11 @@ public boolean execute(CommandSender sender, String label, String[] args) { return true; } - int result = this.plugin.setMoney(player, amount); + String currencyName = MAIN_CONFIG.getDefaultCurrency().getName(); + if (args.length >= 3) { + currencyName = args[2]; + } + int result = this.plugin.setMoney(player, amount, currencyName); switch (result) { case EconomyAPI.RET_NO_ACCOUNT: sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "player-never-connected", player)); @@ -82,12 +92,12 @@ public boolean execute(CommandSender sender, String label, String[] args) { sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "setmoney-failed")); return true; case EconomyAPI.RET_INVALID: - sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "reached-max", EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit())); + sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "reached-max", EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit(currencyName))); return true; case EconomyAPI.RET_SUCCESS: - sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "setmoney-setmoney", player, EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit())); + sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "setmoney-setmoney", player, EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit(currencyName))); if (p != null) { - p.sendMessage(EconomyAPI.getI18n().tr(p.getLanguageCode(), "setmoney-set", EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit())); + p.sendMessage(EconomyAPI.getI18n().tr(p.getLanguageCode(), "setmoney-set", EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit(currencyName))); } return true; } diff --git a/src/main/java/me/onebone/economyapi/command/TakeMoneyCommand.java b/src/main/java/me/onebone/economyapi/command/TakeMoneyCommand.java index 77ab0a8..f7a589c 100644 --- a/src/main/java/me/onebone/economyapi/command/TakeMoneyCommand.java +++ b/src/main/java/me/onebone/economyapi/command/TakeMoneyCommand.java @@ -21,6 +21,7 @@ import cn.nukkit.Player; import cn.nukkit.command.Command; import cn.nukkit.command.CommandSender; +import cn.nukkit.command.PluginCommand; import cn.nukkit.command.data.CommandParamType; import cn.nukkit.command.data.CommandParameter; import cn.nukkit.lang.LangCode; @@ -28,21 +29,26 @@ import cn.nukkit.utils.TextFormat; import me.onebone.economyapi.EconomyAPI; +import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; import static me.onebone.economyapi.EconomyAPI.serverLangCode; -public class TakeMoneyCommand extends Command { +public class TakeMoneyCommand extends PluginCommand { private final EconomyAPI plugin; public TakeMoneyCommand(EconomyAPI plugin) { - super("takemoney", "Takes money from player", "/takemoney ", new String[]{"withdraw"}); + super("takemoney", plugin); + this.setDescription("Takes money from player"); + this.setUsage("/takemoney "); + this.setAliases(new String[]{"withdraw"}); this.plugin = plugin; // command parameters commandParameters.clear(); commandParameters.put("default", new CommandParameter[]{ - new CommandParameter("player", CommandParamType.TARGET, false), - new CommandParameter("amount", CommandParamType.FLOAT, false) + CommandParameter.newType("player", false, CommandParamType.TARGET), + CommandParameter.newType("amount", false, CommandParamType.FLOAT), + CommandParameter.newEnum("currencyName", true, MAIN_CONFIG.getCurrencyList().toArray(new String[0])) }); } @@ -72,10 +78,14 @@ public boolean execute(CommandSender sender, String label, String[] args) { return true; } - int result = this.plugin.reduceMoney(player, amount); + String currencyName = MAIN_CONFIG.getDefaultCurrency().getName(); + if (args.length >= 3) { + currencyName = args[2]; + } + int result = this.plugin.reduceMoney(player, amount, currencyName); switch (result) { case EconomyAPI.RET_INVALID: - sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "takemoney-player-lack-of-money", player, EconomyAPI.MONEY_FORMAT.format(amount), EconomyAPI.MONEY_FORMAT.format(this.plugin.myMoney(player)), plugin.getMonetaryUnit())); + sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "takemoney-player-lack-of-money", player, EconomyAPI.MONEY_FORMAT.format(amount), EconomyAPI.MONEY_FORMAT.format(this.plugin.myMoney(player, currencyName)), plugin.getMonetaryUnit(currencyName))); return true; case EconomyAPI.RET_NO_ACCOUNT: sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "player-never-connected", player)); @@ -84,9 +94,9 @@ public boolean execute(CommandSender sender, String label, String[] args) { sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "takemoney-failed", player)); return true; case EconomyAPI.RET_SUCCESS: - sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "takemoney-took-money", player, EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit())); + sender.sendMessage(EconomyAPI.getI18n().tr(langCode, "takemoney-took-money", player, EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit(currencyName))); if (p != null) { - p.sendMessage(EconomyAPI.getI18n().tr(p.getLanguageCode(), "takemoney-money-taken", EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit())); + p.sendMessage(EconomyAPI.getI18n().tr(p.getLanguageCode(), "takemoney-money-taken", EconomyAPI.MONEY_FORMAT.format(amount), plugin.getMonetaryUnit(currencyName))); } return true; } diff --git a/src/main/java/me/onebone/economyapi/command/TopMoneyCommand.java b/src/main/java/me/onebone/economyapi/command/TopMoneyCommand.java index abd3429..6b1f170 100644 --- a/src/main/java/me/onebone/economyapi/command/TopMoneyCommand.java +++ b/src/main/java/me/onebone/economyapi/command/TopMoneyCommand.java @@ -23,6 +23,9 @@ import cn.nukkit.Server; import cn.nukkit.command.Command; import cn.nukkit.command.CommandSender; +import cn.nukkit.command.PluginCommand; +import cn.nukkit.command.data.CommandParamType; +import cn.nukkit.command.data.CommandParameter; import cn.nukkit.lang.LangCode; import cn.nukkit.lang.TranslationContainer; import cn.nukkit.utils.TextFormat; @@ -30,15 +33,26 @@ import java.util.*; +import static me.onebone.economyapi.EconomyAPI.MAIN_CONFIG; import static me.onebone.economyapi.EconomyAPI.serverLangCode; -public class TopMoneyCommand extends Command { +public class TopMoneyCommand extends PluginCommand { private final EconomyAPI plugin; public TopMoneyCommand(EconomyAPI plugin) { - super("topmoney", "Shows top money of this server", "/topmoney [page]", new String[]{"baltop", "balancetop"}); + super("topmoney", plugin); + this.setDescription("Shows top money of this server"); + this.setUsage("/topmoney [page]"); + this.setAliases(new String[]{"baltop", "balancetop"}); this.plugin = plugin; + + // command parameters + commandParameters.clear(); + commandParameters.put("default", new CommandParameter[]{ + CommandParameter.newType("page", true, CommandParamType.INT), + CommandParameter.newEnum("currencyName", true, MAIN_CONFIG.getCurrencyList().toArray(new String[0])) + }); } private static String getName(String possibleUuid) { @@ -67,7 +81,11 @@ public boolean execute(final CommandSender sender, String label, final String[] try { int arg = args.length > 0 ? Integer.parseInt(args[0]) : 1; - final LinkedHashMap money = new LinkedHashMap<>(plugin.getAllMoney()); + String currencyName = MAIN_CONFIG.getDefaultCurrency().getName(); + if (args.length >= 2) { + currencyName = args[1]; + } + final LinkedHashMap money = new LinkedHashMap<>(plugin.getAllMoney(currencyName)); sender.getServer().getScheduler().scheduleTask(EconomyAPI.getInstance(), () -> { int page = args.length > 0 ? Math.max(1, Math.min(arg, money.size())) : 1; List list = new LinkedList<>(money.keySet()); diff --git a/src/main/java/me/onebone/economyapi/provider/YamlProvider.java b/src/main/java/me/onebone/economyapi/provider/YamlProvider.java index 2470b4d..26936af 100644 --- a/src/main/java/me/onebone/economyapi/provider/YamlProvider.java +++ b/src/main/java/me/onebone/economyapi/provider/YamlProvider.java @@ -155,6 +155,8 @@ public LinkedHashMap getAll(String currencyName) { temp.forEach((username, money) -> { if (money instanceof Integer) { result.put(username, ((Integer) money).doubleValue()); + } else if (money instanceof Double) { + result.put(username, (Double) money); } else if (money instanceof String) { result.put(username, Double.parseDouble(money.toString())); } From 051b523818eae3ee450ea4037007303b56dcec9a Mon Sep 17 00:00:00 2001 From: Mcayear Date: Sun, 16 Feb 2025 15:13:43 +0800 Subject: [PATCH 5/6] feat(config): upgrade config and data format to version 3 - Update config.yml to version 3 - Add support for multiple currencies - Upgrade SQLite database to new format - Update YAML data to new structure - Add upgrade confirmation and migration process --- .../me/onebone/economyapi/EconomyAPI.java | 21 ++- .../economyapi/config/EconomyAPIConfig.java | 9 +- .../economyapi/config/UpgradeConfig.java | 157 ++++++++++++++++++ .../economyapi/provider/SQLiteProvider.java | 14 +- .../economyapi/provider/YamlProvider.java | 4 +- src/main/resources/config.yml | 2 +- 6 files changed, 191 insertions(+), 16 deletions(-) diff --git a/src/main/java/me/onebone/economyapi/EconomyAPI.java b/src/main/java/me/onebone/economyapi/EconomyAPI.java index 799c17b..3ad80bd 100644 --- a/src/main/java/me/onebone/economyapi/EconomyAPI.java +++ b/src/main/java/me/onebone/economyapi/EconomyAPI.java @@ -21,7 +21,6 @@ import cn.nukkit.IPlayer; import cn.nukkit.Player; import cn.nukkit.Server; -import cn.nukkit.command.data.CommandEnum; import cn.nukkit.event.EventHandler; import cn.nukkit.event.Listener; import cn.nukkit.event.player.PlayerJoinEvent; @@ -31,6 +30,7 @@ import cn.nukkit.plugin.PluginBase; import me.onebone.economyapi.command.*; import me.onebone.economyapi.config.EconomyAPIConfig; +import me.onebone.economyapi.config.UpgradeConfig; import me.onebone.economyapi.event.account.CreateAccountEvent; import me.onebone.economyapi.event.money.AddMoneyEvent; import me.onebone.economyapi.event.money.ReduceMoneyEvent; @@ -44,6 +44,9 @@ import java.text.DecimalFormat; import java.util.*; +import static me.onebone.economyapi.config.UpgradeConfig.*; +import static me.onebone.economyapi.config.UpgradeConfig.tryUpgradeSQLiteData; + public class EconomyAPI extends PluginBase implements Listener { public static final int RET_NO_ACCOUNT = -3; public static final int RET_CANCELLED = -2; @@ -645,7 +648,21 @@ public void onLoad() { @Override public void onEnable() { - MAIN_CONFIG = new EconomyAPIConfig(); + if (EconomyAPI.getInstance().getConfig() != null && + UpgradeConfig.tryUpgradeConfigVersion(EconomyAPI.getInstance().getConfig().getInt("version", 1))) { + if (updateDoubleConfirmation()) { + MAIN_CONFIG = new EconomyAPIConfig(); + if (tryUpgradeYamlData()) { + EconomyAPI.getInstance().getLogger().info("YAML data upgrade complete."); + } + if (tryUpgradeSQLiteData()) { + EconomyAPI.getInstance().getLogger().info("SQLite data upgrade complete."); + } + } + } else { + EconomyAPI.getInstance().saveDefaultConfig(); + MAIN_CONFIG = new EconomyAPIConfig(); + } boolean success = this.initialize(); diff --git a/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java b/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java index 0d71e6f..9147c8a 100644 --- a/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java +++ b/src/main/java/me/onebone/economyapi/config/EconomyAPIConfig.java @@ -3,6 +3,7 @@ import cn.nukkit.utils.Config; import cn.nukkit.utils.ConfigSection; import me.onebone.economyapi.EconomyAPI; + import java.util.HashMap; import java.util.List; import java.util.Map; @@ -15,11 +16,7 @@ public class EconomyAPIConfig { private final String provider; public EconomyAPIConfig() { - EconomyAPI.getInstance().saveDefaultConfig(); config = EconomyAPI.getInstance().getConfig(); - if (UpgradeConfig.tryUpgradeConfigVersion(config.getInt("version", 1))) { - config.reload(); - } // 读取多货币配置 loadCurrencies(); @@ -47,6 +44,10 @@ private void loadCurrencies() { } } + public Config getConfig() { + return config; + } + // 获取默认货币 public Currency getDefaultCurrency() { return currencies.get(defaultCurrency); diff --git a/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java b/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java index dd5d060..079fce8 100644 --- a/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java +++ b/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java @@ -1,12 +1,22 @@ package me.onebone.economyapi.config; import cn.nukkit.utils.Config; +import cn.nukkit.utils.ConfigSection; +import com.smallaswater.easysqlx.sqlite.SQLiteHelper; import me.onebone.economyapi.EconomyAPI; +import me.onebone.economyapi.provider.SQLiteProvider; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Scanner; public class UpgradeConfig { public static boolean tryUpgradeConfigVersion(int oldVersion) { @@ -29,4 +39,151 @@ public static boolean tryUpgradeConfigVersion(int oldVersion) { } return false; } + + protected static String TEMP_CURRENCY_NAME = ""; + + public static boolean updateDoubleConfirmation() { + System.out.println("An older version of the Money.yml configuration file has been detected. Would you like to upgrade?"); + System.out.println("The upgrade process will perform the following steps:"); + System.out.println("1. Copy the Money.yml file to a new file under the money directory (money/.yml)"); + System.out.println("2. Modify the version of the new file to 3"); + System.out.println("3. Rename the old Money.yml file to Money.old.yml"); + System.out.print("Please confirm whether to upgrade (yes/no): "); + if (new Scanner(System.in).nextLine().toLowerCase().startsWith("y")) { + System.out.println("User confirmed the upgrade. Starting the upgrade process..."); + } else { + System.out.println("The plugin version is too high and does not support this configuration file. Please use version 2.0.6 of EconomyAPI!"); + System.exit(1); + } + // Input default currency + System.out.print("Please enter the default currency name (default: USD): "); + TEMP_CURRENCY_NAME = new Scanner(System.in).nextLine().trim(); + if (TEMP_CURRENCY_NAME.isEmpty()) { + TEMP_CURRENCY_NAME = "USD"; + } + System.out.println("Default currency name used: " + TEMP_CURRENCY_NAME); + + EconomyAPI.getInstance().saveDefaultConfig(); + EconomyAPI.getInstance().getConfig().getSection("currencies").set( + TEMP_CURRENCY_NAME, + new ConfigSection(new LinkedHashMap<>() {{ + put("monetary-unit", "$"); + put("default", 1000.0); + put("max", 9999999999.0); + put("exchange-rate", 10000); + }}) + ); + EconomyAPI.getInstance().getConfig().set("data.default-currency", TEMP_CURRENCY_NAME); + return true; + } + + public static boolean tryUpgradeYamlData() { + EconomyAPI economyAPI = EconomyAPI.getInstance(); + String dataFolder = economyAPI.getDataFolder().toString(); + + Path sourceFile = Paths.get(dataFolder, "Money.yml"); + Path targetDir = Paths.get(dataFolder, "money"); + Path targetFile = targetDir.resolve(EconomyAPI.MAIN_CONFIG.getDefaultCurrency().getName() + ".yml"); + Path oldSourceFile = Paths.get(dataFolder, "Money.old.yml"); + + if (!Files.exists(sourceFile)) { + economyAPI.getLogger().warning("Money.yml file not found."); + return false; + } + + try { + Files.createDirectories(targetDir); + Files.copy(sourceFile, targetFile, StandardCopyOption.REPLACE_EXISTING); + + Config file = new Config(targetFile.toFile(), Config.YAML); + file.set("version", 3); + file.save(); + + Files.move(sourceFile, oldSourceFile, StandardCopyOption.REPLACE_EXISTING); + return true; + } catch (IOException e) { + economyAPI.getLogger().warning("Failed to upgrade Money.yml data.", e); // 记录完整异常 + return false; + } + } + + public static boolean tryUpgradeSQLiteData() { + if (!EconomyAPI.MAIN_CONFIG.getProvider().equals("sqlite")) { + EconomyAPI.getInstance().getLogger().info("SQLite is not enabled, no upgrade is required."); + return false; + } + Path sourceFile = Paths.get(EconomyAPI.getInstance().getDataFolder().toString(), "MoneyV3.db"); + Path targetFile = Paths.get(EconomyAPI.getInstance().getDataFolder().toString(), "Money.db.old"); + try { + Files.move(sourceFile, targetFile, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException ignored) { + } + if (!Files.exists(sourceFile)) { + EconomyAPI.getInstance().getLogger().warning("MoneyV3.db file not found."); + return false; + } + String TABLE_NAME = "Money"; + try { + SQLiteHelper oldSQLiteHelper = new SQLiteHelper(EconomyAPI.getInstance().getDataFolder().getAbsolutePath() + File.separator + "Money.old.db"); + if (!oldSQLiteHelper.exists(TABLE_NAME)) { + System.out.println("Old data table 'Money' not found in Money.old.db, data migration skipped."); + return false; + } + List oldMoneyDataList = oldSQLiteHelper.getAll(TABLE_NAME, OldMoneyData.class); + if (oldMoneyDataList == null) { + System.out.println("Failed to read data from 'Money' table in Money.old.db, data migration aborted."); + return false; + } + SQLiteHelper sqLiteHelper = new SQLiteHelper(EconomyAPI.getInstance().getDataFolder().getAbsolutePath() + File.separator + "MoneyV3.db"); + if (!sqLiteHelper.exists(TABLE_NAME)) { + sqLiteHelper.addTable(TABLE_NAME, SQLiteHelper.DBTable.asDbTable(SQLiteProvider.MoneyData.class)); + } + for (OldMoneyData data : oldMoneyDataList) { + // 将 OldMoneyData 转换为 MoneyData + SQLiteProvider.MoneyData moneyData = new SQLiteProvider.MoneyData(data.getPlayer(), data.getMoney()); + moneyData.setCurrency(EconomyAPI.MAIN_CONFIG.getDefaultCurrency().getName()); + + sqLiteHelper.add(TABLE_NAME, moneyData); // 插入新的 MoneyData 对象 + } + System.out.println("SQLite data migration complete!"); // 添加迁移完成的提示 + return true; + } catch (ClassNotFoundException e) { + EconomyAPI.getInstance().getLogger().warning("Failed to upgrade MoneyV3.db data, runtime error.", e); + return false; + } catch (SQLException e) { + EconomyAPI.getInstance().getLogger().warning("Failed to upgrade Money.yml data, sql exception.", e); + return false; + } + } + + + public static class OldMoneyData { + public long id; + public String player; + public double money; + + public OldMoneyData() { + } + + public OldMoneyData(String player, double money) { + this.player = player; + this.money = money; + } + + public long getId() { + return id; + } + + public String getPlayer() { + return player; + } + + public double getMoney() { + return money; + } + + public void setMoney(double money) { + this.money = money; + } + } } diff --git a/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java b/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java index ccf83b3..1bfffe1 100644 --- a/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java +++ b/src/main/java/me/onebone/economyapi/provider/SQLiteProvider.java @@ -24,11 +24,9 @@ public class SQLiteProvider implements Provider { @Override public void init(File path) { try { - this.sqLiteHelper = new SQLiteHelper(path.getAbsolutePath() + File.separator +"Money.db"); + this.sqLiteHelper = new SQLiteHelper(path.getAbsolutePath() + File.separator +"MoneyV3.db"); if (!this.sqLiteHelper.exists(TABLE_NAME)) { - DBTable table = DBTable.asDbTable(MoneyData.class); - table.put(COLUMN_CURRENCY, "varchar(20)"); // 添加 currency 列到表结构中 - this.sqLiteHelper.addTable(TABLE_NAME, table); + this.sqLiteHelper.addTable(TABLE_NAME, DBTable.asDbTable(MoneyData.class)); } MAIN_CONFIG.getCurrencyList().forEach(currencyName -> { // 初始化时加载所有货币的数据 this.sqLiteHelper.getDataByString(TABLE_NAME, COLUMN_CURRENCY + " = ?", new String[]{currencyName}, MoneyData.class) @@ -198,10 +196,10 @@ private MoneyData getMoneyData(String currencyName, String id) { } public static class MoneyData { - public long id; - public String player; - public double money; - public String currency; // 新增 currency 字段 + private long id; + private String player; + private double money; + private String currency; public MoneyData() { //SQLiteHelper创建类需要无参数的构造方法 diff --git a/src/main/java/me/onebone/economyapi/provider/YamlProvider.java b/src/main/java/me/onebone/economyapi/provider/YamlProvider.java index 26936af..ad4463d 100644 --- a/src/main/java/me/onebone/economyapi/provider/YamlProvider.java +++ b/src/main/java/me/onebone/economyapi/provider/YamlProvider.java @@ -17,12 +17,14 @@ public class YamlProvider implements Provider { public void init(File path) { MAIN_CONFIG.getCurrencyList().forEach(currencyName -> { Config file = new Config(new File(path, "money" + File.separator + currencyName + ".yml"), Config.YAML); - file.set("version", 2); + file.set("version", 3); LinkedHashMap temp = (LinkedHashMap) file.getRootSection() .computeIfAbsent("money", s -> new LinkedHashMap<>()); temp.forEach((username, money) -> { if (money instanceof Integer) { file.set(username, ((Integer) money).doubleValue()); + } else if (money instanceof Double) { + file.set(username, money); } else if (money instanceof String) { file.set(username, Double.parseDouble(money.toString())); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 7e8146e..e9fa06f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,4 +1,4 @@ -version: 2 +version: 3 currencies: USD: monetary-unit: "$" From 9c34d479f3cbf33322751766b405edeac42e8a9b Mon Sep 17 00:00:00 2001 From: Mcayear Date: Sun, 16 Feb 2025 16:07:26 +0800 Subject: [PATCH 6/6] refactor: remove unused language files, update README. --- README.md | 23 +++++++++++ .../economyapi/config/UpgradeConfig.java | 1 - src/main/resources/lang_ch.json | 24 ------------ src/main/resources/lang_def.json | 39 ------------------- src/main/resources/lang_zh.json | 28 ------------- 5 files changed, 23 insertions(+), 92 deletions(-) delete mode 100644 src/main/resources/lang_ch.json delete mode 100644 src/main/resources/lang_def.json delete mode 100644 src/main/resources/lang_zh.json diff --git a/README.md b/README.md index a3e1755..e1fc51d 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ Core of economy system for Nukkit ## For developers +### Single Currency Economies + Developers can access to EconomyAPI's API by using: ```java EconomyAPI.getInstance().myMoney(player); @@ -27,7 +29,28 @@ EconomyAPI.getInstance().reduceMoney(player, amount); EconomyAPI.getInstance().addMoney(player, amount); ``` +> [!TIP] +> Operating through the provider: +> - `provider.addMoney(player, amount);` + +### Multiple Currency Economies + +**`currencyName`:** This parameter is a `String` that specifies the currency you want to interact with. If your economy system supports multiple currencies (e.g., real-world currencies like "USD", "EUR", "GBP" or in-game items like "Gold", "Silver", "Diamonds"), you can use this parameter to target a specific currency. + +If your system only has one currency, use the first set of methods (without the `currencyName` parameter). + +```java +EconomyAPI.getInstance().myMoney(player, currencyName); +EconomyAPI.getInstance().reduceMoney(player, amount, currencyName); +EconomyAPI.getInstance().addMoney(player, amount, currencyName); +``` + +> [!TIP] +> When operating through the provider, the parameter order needs to be adjusted: +> - `provider.addMoney(currencyName, player, amount);` + ### Maven repository + ```xml nukkitx-repo diff --git a/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java b/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java index 079fce8..b1a355a 100644 --- a/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java +++ b/src/main/java/me/onebone/economyapi/config/UpgradeConfig.java @@ -13,7 +13,6 @@ import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.sql.SQLException; -import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Scanner; diff --git a/src/main/resources/lang_ch.json b/src/main/resources/lang_ch.json deleted file mode 100644 index 2578c91..0000000 --- a/src/main/resources/lang_ch.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "language": "ch", - "language-set": "语言被设置为 %1", - "request-cancelled": "你的请求已被取消", - "player-not-connected": "玩家 %1 当前不在服务器上", - "player-never-connected": "服务器中不存在玩家 %1", - "topmoney-format": "[%1] %2: %3", - "takemoney-must-be-number": "金额必须是有效数字", - "takemoney-invalid-number": "无效的数字", - "takemoney-player-lack-of-money": "%1 没有 %MONETARY_UNIT%%2 元钱. %1 剩余金额: %MONETARY_UNIT%%3", - "takemoney-money-taken": "你的 %MONETARY_UNIT%%1 元钱已经被管理员偷走~ TAT", - "takemoney-took-money": "已经拿走 %1 的 %MONETARY_UNIT%%2 元钱", - "takemoney-failed": "偷钱失败~ TAT", - "givemoney-must-be-number": "金额必须是有效数字", - "givemoney-invalid-number": "无效的数字", - "givemoney-money-given": "有人给你了 %MONETARY_UNIT%%1 元钱", - "givemoney-gave-money": "已经给 %2 了%MONETARY_UNIT%%1 元钱", - "seemoney-seemoney": "玩家 %1 的金钱: %2", - "setmoney-setmoney": "玩家 %1 的金钱已经被设定为 %MONETARY_UNIT%%2 元钱", - "setmoney-failed": "设定失败~未知错误~ TAT", - "setmoney-invalid-number": "%MONETARY_UNIT%%1 是无效的金额", - "mymoney-mymoney": "你身上的钱: %MONETARY_UNIT%%1", - "mystatus-show": "你的储蓄状态: %1%" -} \ No newline at end of file diff --git a/src/main/resources/lang_def.json b/src/main/resources/lang_def.json deleted file mode 100644 index b515302..0000000 --- a/src/main/resources/lang_def.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "language": "en", - "commands.mymoney.usage": "/balance", - "commands.mymoney.description": "Check your available funds", - "commands.topmoney.usage": "/topbalance [page]", - "commands.topmoney.description": "Top balances on the server", - - "language-set": "§6Language set to §7c%1", - "request-cancelled": "§6Your request was cancelled", - "player-not-connected": "§2%1 §6is not on the server", - "player-never-connected": "§2%1 §2was never seen on this server", - "topmoney-tag": "§7[]--- §6Top Balance §7(§6Page §c%1§7/§c%2§7) ---[]", - "topmoney-total": "§6Server Balance §7: §c%1", - "topmoney-format": "§7(§6%1§7) §2%2§7: §c%3", - "topmoney-invalid-page-number": "§6Invalid page number was provided", - "pay-failed": "§6Failed to pay", - "pay-success": "§6Paid §c%MONETARY_UNIT%%1 §6to §2%2", - "pay-too-low": "§cThe amount is too small", - "pay-failed-self": "§cCan't pay self", - "money-paid": "§2%1 §6gave you §c%MONETARY_UNIT%%2", - "takemoney-must-be-number": "§6Amount must be numeric", - "takemoney-invalid-number": "§6Invalid number was provided", - "takemoney-player-lack-of-money": "§2%1 §6does not have §c%MONETARY_UNIT%%2§7. §2%1's §6money §7: §c%MONETARY_UNIT%%3", - "takemoney-money-taken": "§c%MONETARY_UNIT%%1 §6has been withdrawn from your account", - "takemoney-took-money": "§6You have withdrawn §c%MONETARY_UNIT%%2 §6from §2%1", - "takemoney-failed": "§6You have failed to take money from player", - "givemoney-must-be-number": "§6Amount must be numeric", - "givemoney-invalid-number": "§6Invalid number was provided", - "givemoney-money-given": "§6You have earned §c%MONETARY_UNIT%%1", - "givemoney-gave-money": "§6Gave §c%MONETARY_UNIT%%1 §6to §2%2", - "seemoney-seemoney": "§2%1's §6balance: §7%2", - "setmoney-setmoney": "§2%1's §6balance was set to §c%MONETARY_UNIT%%2", - "setmoney-set": "§6Your money was set to §c%MONETARY_UNIT%%1", - "setmoney-failed": "Failed to set money due to unknown error", - "setmoney-invalid-number": "§c%MONETARY_UNIT%%1 §6must be a numeric value", - "mymoney-mymoney": "§6Balance§7: §c%MONETARY_UNIT%%1", - "mystatus-show": "My money status: %1%", - "reached-max": "§c%MONETARY_UNIT%%1 §6is above the maximum amount of money allowed" -} diff --git a/src/main/resources/lang_zh.json b/src/main/resources/lang_zh.json deleted file mode 100644 index 27146af..0000000 --- a/src/main/resources/lang_zh.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "language": "zh", - "language-set": "語言被設定為 %1", - "request-cancelled": "您的請求已被取消", - "player-not-connected": "玩家 %1 目前不在伺服器上", - "player-never-connected": "伺服器中不存在玩家 %1", - "topmoney-format": "[%1] %2: %3", - "pay-failed": "付款失敗", - "pay-success": "付款 %1 %MONETARY_UNIT% 給 %2", - "money-paid": "%1 付款給你 %2 %MONETARY_UNIT%", - "takemoney-must-be-number": "金額必須是有效數字", - "takemoney-invalid-number": "無效的數字", - "takemoney-player-lack-of-money": "%1 沒有 %2 %MONETARY_UNIT% . %1 剩餘金額: %3 %MONETARY_UNIT%", - "takemoney-money-taken": "您的 %1 %MONETARY_UNIT% 已經被管理員拿走~ ", - "takemoney-took-money": "已經拿走 %1 的 %2 %MONETARY_UNIT%", - "takemoney-failed": "拿錢失敗", - "givemoney-must-be-number": "金額必須是有效數字", - "givemoney-invalid-number": "無效的數字", - "givemoney-money-given": "有人給您了 %1 %MONETARY_UNIT%", - "givemoney-gave-money": "已經給 %2 了%1 %MONETARY_UNIT%", - "seemoney-seemoney": "玩家 %1 的金錢: %2", - "setmoney-setmoney": "玩家 %1 的金錢已經被設定為 %2 %MONETARY_UNIT%", - "setmoney-set": "您被設定成 %1 %MONETARY_UNIT%", - "setmoney-failed": "設定失敗~未知錯誤~", - "setmoney-invalid-number": "%1 %MONETARY_UNIT% 是無效的金額", - "mymoney-mymoney": "您身上的錢: %1 %MONETARY_UNIT%", - "mystatus-show": "您錢的狀態 : %1%" -} \ No newline at end of file