Add /balancetop command.

This commit is contained in:
AppleDash 2016-07-11 20:22:07 -04:00
parent 6e93b03894
commit a89b36fc99
11 changed files with 156 additions and 10 deletions

View File

@ -6,10 +6,10 @@
<parent>
<groupId>org.appledash</groupId>
<artifactId>SaneEconomy</artifactId>
<version>0.5.4-SNAPSHOT</version>
<version>0.5.5-SNAPSHOT</version>
</parent>
<artifactId>SaneEconomyCore</artifactId>
<version>0.5.4-SNAPSHOT</version>
<version>0.5.5-SNAPSHOT</version>
<dependencies>
<dependency>

View File

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

View File

@ -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[] {
"/<command>"
};
}
@Override
public void onCommand(CommandSender sender, String[] args) throws CommandException {
if (args.length > 0) {
throw new TooManyArgumentsException();
}
Map<OfflinePlayer, Double> 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)));
}
}

View File

@ -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<OfflinePlayer, Double> getTopBalances(int amount) {
Map<UUID, Double> uuidBalances = backend.getTopBalances(amount);
Map<OfflinePlayer, Double> playerBalances = new LinkedHashMap<>();
uuidBalances.forEach((uuid, balance) -> playerBalances.put(Bukkit.getServer().getOfflinePlayer(uuid), balance));
return playerBalances;
}
public EconomyStorageBackend getBackend() {
return backend;
}

View File

@ -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<UUID, Double> getTopBalances(int amount);
/**
* Reload this backend's database from disk.
*/
void reloadDatabase();
/**
* Reload this backend's top balances.
*/
void reloadTopBalances();
}

View File

@ -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<UUID, Double> playerBalances = new HashMap<>();
private Map<UUID, Double> 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<UUID, Double> getTopBalances(int amount) {
return MapUtil.takeFromMap(topBalances, amount);
}
}

View File

@ -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<UUID, Double> playerBalances = new HashMap<>();
private Map<UUID, Double> 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<UUID, Double> getTopBalances(int amount) {
return MapUtil.takeFromMap(topBalances, amount);
}
private void ensureAccountExists(OfflinePlayer player, Connection conn) {
if (!accountExists(player, conn)) {
try {

View File

@ -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 <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
List<Map.Entry<K, V>> list =
new LinkedList<>(map.entrySet());
Collections.sort(list, (o1, o2) -> (o1.getValue()).compareTo(o2.getValue()));
Map<K, V> result = new LinkedHashMap<>();
for (Map.Entry<K, V> entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
public static <K, V> Map<K, V> takeFromMap(Map<K, V> map, int amount) {
Map<K, V> newMap = new LinkedHashMap<>();
for (Map.Entry<K, V> entry : map.entrySet()) {
if (newMap.size() > amount) {
break;
}
newMap.put(entry.getKey(), entry.getValue());
}
return newMap;
}
}

View File

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

View File

@ -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: /<command> reload-database
pernission: saneeconomy.admin
balancetop:
aliases: [baltop, topbal]
description: Show the players who have the most money on the server.
usage: /<command>
permission: saneeconomy.balancetop

View File

@ -6,7 +6,7 @@
<groupId>org.appledash</groupId>
<artifactId>SaneEconomy</artifactId>
<version>0.5.4-SNAPSHOT</version>
<version>0.5.5-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>