Restructure EconomyStorageBackends a bit and add support for manipulating the balances of offline players.

This commit is contained in:
AppleDash 2016-07-19 20:21:51 -04:00
parent 4a1a363c71
commit 143604b80c
9 changed files with 87 additions and 76 deletions

View File

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

View File

@ -5,7 +5,8 @@ import org.appledash.saneeconomy.command.SaneEconomyCommand;
import org.appledash.saneeconomy.command.exception.CommandException;
import org.appledash.saneeconomy.command.exception.type.usage.NeedPlayerException;
import org.appledash.saneeconomy.utils.MessageUtils;
import org.bukkit.Bukkit;
import org.appledash.saneeconomy.utils.PlayerUtils;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -45,10 +46,10 @@ public class BalanceCommand extends SaneEconomyCommand {
}
}
Player player = Bukkit.getServer().getPlayer(playerName);
OfflinePlayer player = PlayerUtils.getOfflinePlayer(playerName);
if (player == null) {
MessageUtils.sendMessage(sender, "That player is not online.");
MessageUtils.sendMessage(sender, "That player does not exist.");
return;
}

View File

@ -9,7 +9,8 @@ import org.appledash.saneeconomy.command.exception.type.usage.TooFewArgumentsExc
import org.appledash.saneeconomy.economy.EconomyManager;
import org.appledash.saneeconomy.utils.MessageUtils;
import org.appledash.saneeconomy.utils.NumberUtils;
import org.bukkit.Bukkit;
import org.appledash.saneeconomy.utils.PlayerUtils;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -52,10 +53,10 @@ public class EconomyAdminCommand extends SaneEconomyCommand {
sAmount = args[2];
}
Player targetPlayer = Bukkit.getServer().getPlayer(sTargetPlayer);
OfflinePlayer targetPlayer = PlayerUtils.getOfflinePlayer(sTargetPlayer);
if (targetPlayer == null) {
MessageUtils.sendMessage(sender, "That player is not online.");
MessageUtils.sendMessage(sender, "That player does not exist.");
return;
}

View File

@ -38,7 +38,7 @@ public class EconomyManager {
* @param player Player
* @return Formatted balance
*/
public String getFormattedBalance(Player player) {
public String getFormattedBalance(OfflinePlayer player) {
return currency.formatAmount(backend.getBalance(player));
}

View File

@ -0,0 +1,43 @@
package org.appledash.saneeconomy.economy.backend.type;
import org.appledash.saneeconomy.economy.backend.EconomyStorageBackend;
import org.appledash.saneeconomy.utils.MapUtil;
import org.bukkit.OfflinePlayer;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;
/**
* Created by appledash on 7/19/16.
* Blackjack is still best pony.
*/
public abstract class EconomyStorageBackendCaching implements EconomyStorageBackend {
protected HashMap<UUID, Double> playerBalances = new HashMap<>();
protected Map<UUID, Double> topBalances = new LinkedHashMap<>();
@Override
public boolean accountExists(OfflinePlayer player) {
return playerBalances.containsKey(player.getUniqueId());
}
@Override
public synchronized double getBalance(OfflinePlayer player) {
if (!accountExists(player)) {
return 0.0D;
}
return playerBalances.get(player.getUniqueId());
}
@Override
public Map<UUID, Double> getTopBalances(int amount) {
return MapUtil.takeFromMap(topBalances, amount);
}
@Override
public void reloadTopBalances() {
topBalances = MapUtil.sortByValue(playerBalances);
}
}

View File

@ -1,26 +1,19 @@
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;
/**
* Created by AppleDash on 6/13/2016.
* Blackjack is still best pony.
*/
public class EconomyStorageBackendFlatfile implements EconomyStorageBackend {
public class EconomyStorageBackendFlatfile extends EconomyStorageBackendCaching {
private static final int SCHEMA_VERSION = 1;
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;
@ -50,11 +43,6 @@ public class EconomyStorageBackendFlatfile implements EconomyStorageBackend {
}
}
@Override
public void reloadTopBalances() {
topBalances = MapUtil.sortByValue(playerBalances);
}
private void saveDatabase() {
if (file.exists()) {
file.delete();
@ -70,28 +58,9 @@ public class EconomyStorageBackendFlatfile implements EconomyStorageBackend {
}
}
@Override
public synchronized boolean accountExists(OfflinePlayer player) {
return playerBalances.containsKey(player.getUniqueId());
}
@Override
public synchronized double getBalance(OfflinePlayer player) {
if (!playerBalances.containsKey(player.getUniqueId())) {
return 0.0D;
}
return playerBalances.get(player.getUniqueId());
}
@Override
public synchronized void setBalance(OfflinePlayer player, double newBalance) {
playerBalances.put(player.getUniqueId(), newBalance);
saveDatabase();
}
@Override
public Map<UUID, Double> getTopBalances(int amount) {
return MapUtil.takeFromMap(topBalances, amount);
}
}

View File

@ -1,30 +1,21 @@
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;
/**
* Created by AppleDash on 6/14/2016.
* Blackjack is still best pony.
*/
public class EconomyStorageBackendMySQL implements EconomyStorageBackend {
public class EconomyStorageBackendMySQL extends EconomyStorageBackendCaching {
private final String dbUrl;
private final String dbUser;
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;
this.dbUser = dbUser;
@ -85,25 +76,6 @@ public class EconomyStorageBackendMySQL implements EconomyStorageBackend {
}
}
@Override
public void reloadTopBalances() {
topBalances = MapUtil.sortByValue(playerBalances);
}
@Override
public boolean accountExists(OfflinePlayer player) {
return playerBalances.containsKey(player.getUniqueId());
}
@Override
public synchronized double getBalance(OfflinePlayer player) {
if (!accountExists(player)) {
return 0.0D;
}
return playerBalances.get(player.getUniqueId());
}
@Override
public synchronized void setBalance(final OfflinePlayer player, final double newBalance) {
final double oldBalance = getBalance(player);
@ -126,11 +98,6 @@ public class EconomyStorageBackendMySQL implements EconomyStorageBackend {
});
}
@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,30 @@
package org.appledash.saneeconomy.utils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
/**
* Created by appledash on 7/19/16.
* Blackjack is still best pony.
*/
public class PlayerUtils {
/**
* Get an online or offline player from Bukkit.
* This is guaranteed to be a player who has played before, but is not guaranteed to be currently online.
* @param playerName The player's name
* @return OfflinePlayer object, or null if never played
*/
public static OfflinePlayer getOfflinePlayer(String playerName) {
OfflinePlayer player = Bukkit.getServer().getPlayer(playerName);
if (player == null) {
player = Bukkit.getServer().getOfflinePlayer(playerName);
}
if (player != null && !player.hasPlayedBefore()) {
return null;
}
return player;
}
}

View File

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