From a89b36fc99e43f54788b8184dde4004196dfef20 Mon Sep 17 00:00:00 2001 From: AppleDash Date: Mon, 11 Jul 2016 20:22:07 -0400 Subject: [PATCH] Add /balancetop command. --- SaneEconomyCore/pom.xml | 4 +- .../appledash/saneeconomy/SaneEconomy.java | 10 +++-- .../command/type/BalanceTopCommand.java | 43 +++++++++++++++++++ .../saneeconomy/economy/EconomyManager.java | 19 ++++++++ .../backend/EconomyStorageBackend.java | 15 +++++++ .../type/EconomyStorageBackendFlatfile.java | 13 ++++++ .../type/EconomyStorageBackendMySQL.java | 14 ++++++ .../appledash/saneeconomy/utils/MapUtil.java | 35 +++++++++++++++ .../saneeconomy/utils/MessageUtils.java | 2 +- SaneEconomyCore/src/main/resources/plugin.yml | 9 +++- pom.xml | 2 +- 11 files changed, 156 insertions(+), 10 deletions(-) create mode 100644 SaneEconomyCore/src/main/java/org/appledash/saneeconomy/command/type/BalanceTopCommand.java create mode 100644 SaneEconomyCore/src/main/java/org/appledash/saneeconomy/utils/MapUtil.java diff --git a/SaneEconomyCore/pom.xml b/SaneEconomyCore/pom.xml index 9d786bb..8930528 100644 --- a/SaneEconomyCore/pom.xml +++ b/SaneEconomyCore/pom.xml @@ -6,10 +6,10 @@ org.appledash SaneEconomy - 0.5.4-SNAPSHOT + 0.5.5-SNAPSHOT SaneEconomyCore - 0.5.4-SNAPSHOT + 0.5.5-SNAPSHOT diff --git a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/SaneEconomy.java b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/SaneEconomy.java index 21cd1e4..88e2871 100644 --- a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/SaneEconomy.java +++ b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/SaneEconomy.java @@ -1,10 +1,7 @@ package org.appledash.saneeconomy; import org.appledash.saneeconomy.command.SaneEconomyCommand; -import org.appledash.saneeconomy.command.type.BalanceCommand; -import org.appledash.saneeconomy.command.type.EconomyAdminCommand; -import org.appledash.saneeconomy.command.type.PayCommand; -import org.appledash.saneeconomy.command.type.SaneEcoCommand; +import org.appledash.saneeconomy.command.type.*; import org.appledash.saneeconomy.economy.Currency; import org.appledash.saneeconomy.economy.EconomyManager; import org.appledash.saneeconomy.economy.backend.EconomyStorageBackend; @@ -34,6 +31,7 @@ public class SaneEconomy extends JavaPlugin { put("ecoadmin", new EconomyAdminCommand()); put("pay", new PayCommand()); put("saneeconomy", new SaneEcoCommand()); + put("balancetop", new BalanceTopCommand()); }}; public SaneEconomy() { @@ -61,6 +59,10 @@ public class SaneEconomy extends JavaPlugin { } getServer().getScheduler().scheduleAsyncDelayedTask(this, GithubVersionChecker::checkUpdateAvailable); + + getServer().getScheduler().runTaskTimerAsynchronously(this, () -> { + economyManager.getBackend().reloadTopBalances(); + }, 0, (20 * 300) /* Update baltop every 5 minutes */); } @Override diff --git a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/command/type/BalanceTopCommand.java b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/command/type/BalanceTopCommand.java new file mode 100644 index 0000000..2f4d010 --- /dev/null +++ b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/command/type/BalanceTopCommand.java @@ -0,0 +1,43 @@ +package org.appledash.saneeconomy.command.type; + +import org.appledash.saneeconomy.SaneEconomy; +import org.appledash.saneeconomy.command.SaneEconomyCommand; +import org.appledash.saneeconomy.command.exception.CommandException; +import org.appledash.saneeconomy.command.exception.type.usage.TooManyArgumentsException; +import org.appledash.saneeconomy.utils.MessageUtils; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; + +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Created by AppleDash on 6/13/2016. + * Blackjack is still best pony. + */ +public class BalanceTopCommand extends SaneEconomyCommand { + @Override + public String getPermission() { + return "saneeconomy.balancetop"; + } + + @Override + public String[] getUsage() { + return new String[] { + "/" + }; + } + + @Override + public void onCommand(CommandSender sender, String[] args) throws CommandException { + if (args.length > 0) { + throw new TooManyArgumentsException(); + } + + Map topBalances = SaneEconomy.getInstance().getEconomyManager().getTopBalances(10); + AtomicInteger index = new AtomicInteger(1); /* I know it's stupid, but you can't do some_int++ from within the lambda. */ + + MessageUtils.sendMessage(sender, "Top %d players:", topBalances.size()); + topBalances.forEach((player, balance) -> MessageUtils.sendMessage(sender, "[%02d] %s - %s", index.getAndIncrement(), player.getName(), SaneEconomy.getInstance().getEconomyManager().getCurrency().formatAmount(balance))); + } +} diff --git a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/EconomyManager.java b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/EconomyManager.java index f55f675..605b65e 100644 --- a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/EconomyManager.java +++ b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/EconomyManager.java @@ -2,9 +2,14 @@ package org.appledash.saneeconomy.economy; import org.appledash.saneeconomy.economy.backend.EconomyStorageBackend; import org.appledash.saneeconomy.utils.NumberUtils; +import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.UUID; + /** * Created by AppleDash on 6/13/2016. * Blackjack is still best pony. @@ -149,6 +154,20 @@ public class EconomyManager { return true; } + /** + * Get the players who have the most money. + * @param amount Maximum number of players to show. + * @return Map of OfflinePlayer to Double + */ + public Map getTopBalances(int amount) { + Map uuidBalances = backend.getTopBalances(amount); + Map playerBalances = new LinkedHashMap<>(); + + uuidBalances.forEach((uuid, balance) -> playerBalances.put(Bukkit.getServer().getOfflinePlayer(uuid), balance)); + + return playerBalances; + } + public EconomyStorageBackend getBackend() { return backend; } diff --git a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/EconomyStorageBackend.java b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/EconomyStorageBackend.java index dfa7750..6e57b67 100644 --- a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/EconomyStorageBackend.java +++ b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/EconomyStorageBackend.java @@ -2,6 +2,9 @@ package org.appledash.saneeconomy.economy.backend; import org.bukkit.OfflinePlayer; +import java.util.Map; +import java.util.UUID; + /** * Created by AppleDash on 6/13/2016. * Blackjack is still best pony. @@ -46,8 +49,20 @@ public interface EconomyStorageBackend { */ double subtractBalance(OfflinePlayer player, double amount); + /** + * Get the UUIDs of the players who have the most money, along with how much money they have. + * @param amount Maximum number to get. + * @return Map of player UUIDs to amounts. + */ + Map getTopBalances(int amount); + /** * Reload this backend's database from disk. */ void reloadDatabase(); + + /** + * Reload this backend's top balances. + */ + void reloadTopBalances(); } diff --git a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/type/EconomyStorageBackendFlatfile.java b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/type/EconomyStorageBackendFlatfile.java index d3ae457..9ead866 100644 --- a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/type/EconomyStorageBackendFlatfile.java +++ b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/type/EconomyStorageBackendFlatfile.java @@ -2,10 +2,12 @@ package org.appledash.saneeconomy.economy.backend.type; import org.appledash.saneeconomy.SaneEconomy; import org.appledash.saneeconomy.economy.backend.EconomyStorageBackend; +import org.appledash.saneeconomy.utils.MapUtil; import org.bukkit.OfflinePlayer; import java.io.*; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.UUID; @@ -18,6 +20,7 @@ public class EconomyStorageBackendFlatfile implements EconomyStorageBackend { private final File file; private Map playerBalances = new HashMap<>(); + private Map topBalances = new LinkedHashMap<>(); public EconomyStorageBackendFlatfile(File file) { this.file = file; @@ -47,6 +50,11 @@ public class EconomyStorageBackendFlatfile implements EconomyStorageBackend { } } + @Override + public void reloadTopBalances() { + topBalances = MapUtil.sortByValue(playerBalances); + } + private void saveDatabase() { if (file.exists()) { file.delete(); @@ -99,4 +107,9 @@ public class EconomyStorageBackendFlatfile implements EconomyStorageBackend { return newAmount; } + + @Override + public Map getTopBalances(int amount) { + return MapUtil.takeFromMap(topBalances, amount); + } } diff --git a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/type/EconomyStorageBackendMySQL.java b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/type/EconomyStorageBackendMySQL.java index 2aec483..78bfcd5 100644 --- a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/type/EconomyStorageBackendMySQL.java +++ b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/economy/backend/type/EconomyStorageBackendMySQL.java @@ -2,11 +2,14 @@ package org.appledash.saneeconomy.economy.backend.type; import org.appledash.saneeconomy.SaneEconomy; import org.appledash.saneeconomy.economy.backend.EconomyStorageBackend; +import org.appledash.saneeconomy.utils.MapUtil; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import java.sql.*; import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.UUID; /** @@ -19,6 +22,8 @@ public class EconomyStorageBackendMySQL implements EconomyStorageBackend { private final String dbPassword; private final HashMap playerBalances = new HashMap<>(); + private Map topBalances = new LinkedHashMap<>(); + public EconomyStorageBackendMySQL(String dbUrl, String dbUser, String dbPassword) { this.dbUrl = dbUrl; @@ -80,6 +85,10 @@ public class EconomyStorageBackendMySQL implements EconomyStorageBackend { } } + @Override + public void reloadTopBalances() { + topBalances = MapUtil.sortByValue(playerBalances); + } @Override public boolean accountExists(OfflinePlayer player) { @@ -139,6 +148,11 @@ public class EconomyStorageBackendMySQL implements EconomyStorageBackend { return newBalance; } + @Override + public Map getTopBalances(int amount) { + return MapUtil.takeFromMap(topBalances, amount); + } + private void ensureAccountExists(OfflinePlayer player, Connection conn) { if (!accountExists(player, conn)) { try { diff --git a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/utils/MapUtil.java b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/utils/MapUtil.java new file mode 100644 index 0000000..b6c368f --- /dev/null +++ b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/utils/MapUtil.java @@ -0,0 +1,35 @@ +package org.appledash.saneeconomy.utils; + +import java.util.*; + +/** + * Created by appledash on 7/11/16. + * Blackjack is still best pony. + */ +public class MapUtil { + /* Originally found on StackOverflow: http://stackoverflow.com/a/2581754/1849152 */ + public static > Map sortByValue(Map map) { + List> list = + new LinkedList<>(map.entrySet()); + Collections.sort(list, (o1, o2) -> (o1.getValue()).compareTo(o2.getValue())); + + Map result = new LinkedHashMap<>(); + for (Map.Entry entry : list) { + result.put(entry.getKey(), entry.getValue()); + } + return result; + } + + public static Map takeFromMap(Map map, int amount) { + Map newMap = new LinkedHashMap<>(); + + for (Map.Entry entry : map.entrySet()) { + if (newMap.size() > amount) { + break; + } + newMap.put(entry.getKey(), entry.getValue()); + } + + return newMap; + } +} diff --git a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/utils/MessageUtils.java b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/utils/MessageUtils.java index b1e90d4..d9023a3 100644 --- a/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/utils/MessageUtils.java +++ b/SaneEconomyCore/src/main/java/org/appledash/saneeconomy/utils/MessageUtils.java @@ -16,7 +16,7 @@ public class MessageUtils { * @param fmt String#format format * @param args String#format args */ - public static void sendMessage(CommandSender target, String fmt, String... args) { + public static void sendMessage(CommandSender target, String fmt, Object... args) { String prefix = ChatColor.translateAlternateColorCodes('&', SaneEconomy.getInstance().getConfig().getString("chat.prefix", "")); target.sendMessage(prefix + String.format(fmt, (Object[])args)); } diff --git a/SaneEconomyCore/src/main/resources/plugin.yml b/SaneEconomyCore/src/main/resources/plugin.yml index 16ae560..16d9d80 100644 --- a/SaneEconomyCore/src/main/resources/plugin.yml +++ b/SaneEconomyCore/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ name: SaneEconomy author: AppleDash main: org.appledash.saneeconomy.SaneEconomy -version: 0.5.4 +version: 0.5.5 softdepends: [Vault] commands: balance: @@ -22,5 +22,10 @@ commands: saneeconomy: aliases: [saneeco] description: Various admin commands for SaneEconomy. - usage: /command reload-database + usage: / reload-database pernission: saneeconomy.admin + balancetop: + aliases: [baltop, topbal] + description: Show the players who have the most money on the server. + usage: / + permission: saneeconomy.balancetop diff --git a/pom.xml b/pom.xml index 5609bb6..ec00efb 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.appledash SaneEconomy - 0.5.4-SNAPSHOT + 0.5.5-SNAPSHOT pom