Baltop improvements & mocking of Server

This commit is contained in:
AppleDash 2017-07-15 16:36:32 -04:00
parent 03cd019763
commit 01938349cb
11 changed files with 646 additions and 10 deletions

View File

@ -2,6 +2,7 @@ package org.appledash.saneeconomy;
import org.appledash.saneeconomy.economy.EconomyManager;
import org.appledash.saneeconomy.economy.logger.TransactionLogger;
import org.appledash.saneeconomy.vault.VaultHook;
import java.util.Optional;
@ -24,4 +25,6 @@ public interface ISaneEconomy {
* @return TransactionLogger, if there is one. Otherwise, Optional.empty()
*/
Optional<TransactionLogger> getTransactionLogger();
VaultHook getVaultHook();
}

View File

@ -174,4 +174,8 @@ public class SaneEconomy extends SanePlugin implements ISaneEconomy {
public static Logger logger(){
return instance.getLogger();
}
public VaultHook getVaultHook() {
return vaultHook;
}
}

View File

@ -6,6 +6,7 @@ import org.appledash.saneeconomy.economy.economable.Economable;
import org.appledash.saneeconomy.economy.transaction.Transaction;
import org.appledash.saneeconomy.economy.transaction.TransactionResult;
import org.appledash.saneeconomy.event.SaneEconomyTransactionEvent;
import org.appledash.saneeconomy.utils.MapUtil;
import org.appledash.saneeconomy.utils.NumberUtils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
@ -165,7 +166,7 @@ public class EconomyManager {
Economable receiver = transaction.getReceiver();
double amount = transaction.getAmount(); // This amount is validated upon creation of Transaction
if (Bukkit.getServer() != null) { // Bukkit.getServer() == null from our JUnit tests.
if (Bukkit.getServer().getPluginManager() != null) { // Bukkit.getServer() == null from our JUnit tests.
SaneEconomyTransactionEvent evt = new SaneEconomyTransactionEvent(transaction);
Bukkit.getServer().getPluginManager().callEvent(evt);
if (evt.isCancelled()) {
@ -196,16 +197,19 @@ public class EconomyManager {
* @return Map of OfflinePlayer to Double
*/
public Map<OfflinePlayer, Double> getTopPlayerBalances(int amount, int offset) {
Map<UUID, Double> uuidBalances = backend.getTopPlayerBalances(amount, offset);
Map<OfflinePlayer, Double> playerBalances = new LinkedHashMap<>();
Map<UUID, Double> uuidBalances = backend.getTopPlayerBalances();
LinkedHashMap<OfflinePlayer, Double> playerBalances = new LinkedHashMap<>();
uuidBalances.forEach((uuid, balance) -> {
if (Bukkit.getServer().getOfflinePlayer(uuid) != null) {
playerBalances.put(Bukkit.getServer().getOfflinePlayer(uuid), balance);
OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(uuid);
if (offlinePlayer != null) {
if (this.saneEconomy.getVaultHook() == null || !this.saneEconomy.getVaultHook().hasPermission(offlinePlayer, "saneeconomy.balancetop.hide")) {
playerBalances.put(Bukkit.getServer().getOfflinePlayer(uuid), balance);
}
}
});
return playerBalances;
return MapUtil.skipAndTake(playerBalances, offset, amount);
}
public EconomyStorageBackend getBackend() {

View File

@ -39,7 +39,7 @@ public interface EconomyStorageBackend {
* @param amount Maximum number to get.
* @return Map of player UUIDs to amounts.
*/
LinkedHashMap<UUID, Double> getTopPlayerBalances(int amount, int offset);
LinkedHashMap<UUID, Double> getTopPlayerBalances();
/**
* Reload this backend's database from disk.

View File

@ -33,9 +33,8 @@ public abstract class EconomyStorageBackendCaching implements EconomyStorageBack
return balances.get(economable.getUniqueIdentifier());
}
@Override
public LinkedHashMap<UUID, Double> getTopPlayerBalances(int amount, int offset) {
return MapUtil.skipAndTake(topPlayerBalances, offset, amount);
public LinkedHashMap<UUID, Double> getTopPlayerBalances() {
return topPlayerBalances;
}
@Override

View File

@ -1,8 +1,11 @@
package org.appledash.saneeconomy.vault;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.permission.Permission;
import org.appledash.saneeconomy.SaneEconomy;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.ServicePriority;
/**
@ -24,4 +27,10 @@ public class VaultHook {
public void unhook() {
Bukkit.getServicesManager().unregister(Economy.class, provider);
}
public boolean hasPermission(OfflinePlayer offlinePlayer, String permNode) {
RegisteredServiceProvider<Permission> rsp = this.plugin.getServer().getServicesManager().getRegistration(Permission.class);
return rsp != null && rsp.getProvider().playerHas(null, offlinePlayer, permNode);
}
}

View File

@ -50,6 +50,9 @@ permissions:
saneeconomy.balancetop:
description: Allows you to view the players on the server who have the most money.
default: true
saneeconomy.balancetop.hide:
description: Players with this node are hidden from /baltop
default: false
saneeconomy.update-notify:
description: Allows you to be notified of updates to the plugin on join.
default: op
@ -61,5 +64,6 @@ permissions:
saneeconomy.pay: true
saneeconomy.admin: true
saneeconomy.balancetop: true
saneeconomy.balancetop.hide: false
saneeconomy.update-notify: true
default: op

View File

@ -1,5 +1,6 @@
package org.appledash.saneeconomy.test;
import com.google.common.collect.ImmutableList;
import org.appledash.saneeconomy.economy.Currency;
import org.appledash.saneeconomy.economy.EconomyManager;
import org.appledash.saneeconomy.economy.economable.Economable;
@ -14,6 +15,10 @@ import org.junit.Before;
import org.junit.Test;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
/**
* Created by AppleDash on 7/29/2016.
@ -77,9 +82,44 @@ public class EconomyManagerTest {
}
@Test
public void testTopBalances() {
Random random = new Random();
List<Economable> economables = new ArrayList<>(10);
for (int i = 0; i < 10; i++) {
Economable economable = Economable.wrap(new MockOfflinePlayer("Dude" + i));
economables.add(economable);
this.economyManager.setBalance(economable, random.nextInt(1000));
}
this.economyManager.getBackend().reloadTopPlayerBalances();
List<Double> javaSortedBalances = economables.stream().map(this.economyManager::getBalance).sorted((left, right) -> -left.compareTo(right)).collect(Collectors.toList());
List<Double> ecoManTopBalances = ImmutableList.copyOf(this.economyManager.getTopPlayerBalances(10, 0).values());
Assert.assertTrue("List is not correctly sorted!", areListsEqual(javaSortedBalances, ecoManTopBalances));
Assert.assertEquals("Wrong number of top balances!", 5, this.economyManager.getTopPlayerBalances(5, 0).size());
}
private <T> boolean areListsEqual(List<T> first, List<T> second) {
if (first.size() != second.size()) {
throw new IllegalArgumentException("Lists must be same length (first=" + first.size() + ", second=" + second.size() + ")");
}
for (int i = 0; i < first.size(); i++) {
if (!first.get(i).equals(second.get(i))) {
return false;
}
}
return true;
}
@Test(expected = IllegalArgumentException.class)
public void testNegativeBalance() {
Economable economable = Economable.wrap(new MockOfflinePlayer("Bob"));
economyManager.setBalance(economable, -1.0);
}
}

View File

@ -20,6 +20,7 @@ public class MockOfflinePlayer implements OfflinePlayer {
private MockOfflinePlayer(UUID uuid, String name) {
this.uuid = uuid;
this.name = name;
MockServer.getInstance().addOfflinePlayer(this);
}
public MockOfflinePlayer(String name) {

View File

@ -3,6 +3,7 @@ package org.appledash.saneeconomy.test.mock;
import org.appledash.saneeconomy.ISaneEconomy;
import org.appledash.saneeconomy.economy.EconomyManager;
import org.appledash.saneeconomy.economy.logger.TransactionLogger;
import org.appledash.saneeconomy.vault.VaultHook;
import java.util.Optional;
@ -20,4 +21,9 @@ public class MockSaneEconomy implements ISaneEconomy {
public Optional<TransactionLogger> getTransactionLogger() {
return Optional.empty();
}
@Override
public VaultHook getVaultHook() {
return null;
}
}

View File

@ -0,0 +1,566 @@
package org.appledash.saneeconomy.test.mock;
import org.bukkit.*;
import org.bukkit.advancement.Advancement;
import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarFlag;
import org.bukkit.boss.BarStyle;
import org.bukkit.boss.BossBar;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.PluginCommand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.help.HelpMap;
import org.bukkit.inventory.*;
import org.bukkit.map.MapView;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.ServicesManager;
import org.bukkit.plugin.messaging.Messenger;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scoreboard.ScoreboardManager;
import org.bukkit.util.CachedServerIcon;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.*;
import java.util.logging.Logger;
/**
* Created by appledash on 7/15/17.
* Blackjack is best pony.
*/
public class MockServer implements Server {
public static MockServer instance;
public static MockServer getInstance() {
if (instance == null) {
instance = new MockServer();
Bukkit.setServer(instance);
}
return instance;
}
private Logger logger = Logger.getLogger("MockServer");
private Map<UUID, OfflinePlayer> offlinePlayers = new HashMap<>();
public void addOfflinePlayer(OfflinePlayer offlinePlayer) {
this.offlinePlayers.put(offlinePlayer.getUniqueId(), offlinePlayer);
}
@Override
public String getName() {
return "SaneEconomy Mock Server";
}
@Override
public String getVersion() {
return "0.1.0";
}
@Override
public String getBukkitVersion() {
return "Unknown";
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return null;
}
@Override
public int getMaxPlayers() {
return 0;
}
@Override
public int getPort() {
return 0;
}
@Override
public int getViewDistance() {
return 0;
}
@Override
public String getIp() {
return null;
}
@Override
public String getServerName() {
return null;
}
@Override
public String getServerId() {
return null;
}
@Override
public String getWorldType() {
return null;
}
@Override
public boolean getGenerateStructures() {
return false;
}
@Override
public boolean getAllowEnd() {
return false;
}
@Override
public boolean getAllowNether() {
return false;
}
@Override
public boolean hasWhitelist() {
return false;
}
@Override
public void setWhitelist(boolean b) {
}
@Override
public Set<OfflinePlayer> getWhitelistedPlayers() {
return null;
}
@Override
public void reloadWhitelist() {
}
@Override
public int broadcastMessage(String s) {
return 0;
}
@Override
public String getUpdateFolder() {
return null;
}
@Override
public File getUpdateFolderFile() {
return null;
}
@Override
public long getConnectionThrottle() {
return 0;
}
@Override
public int getTicksPerAnimalSpawns() {
return 0;
}
@Override
public int getTicksPerMonsterSpawns() {
return 0;
}
@Override
public Player getPlayer(String s) {
return null;
}
@Override
public Player getPlayerExact(String s) {
return null;
}
@Override
public List<Player> matchPlayer(String s) {
return null;
}
@Override
public Player getPlayer(UUID uuid) {
return null;
}
@Override
public PluginManager getPluginManager() {
return null;
}
@Override
public BukkitScheduler getScheduler() {
return null;
}
@Override
public ServicesManager getServicesManager() {
return null;
}
@Override
public List<World> getWorlds() {
return null;
}
@Override
public World createWorld(WorldCreator worldCreator) {
return null;
}
@Override
public boolean unloadWorld(String s, boolean b) {
return false;
}
@Override
public boolean unloadWorld(World world, boolean b) {
return false;
}
@Override
public World getWorld(String s) {
return null;
}
@Override
public World getWorld(UUID uuid) {
return null;
}
@Override
public MapView getMap(short i) {
return null;
}
@Override
public MapView createMap(World world) {
return null;
}
@Override
public void reload() {
}
@Override
public void reloadData() {
}
@Override
public Logger getLogger() {
return this.logger;
}
@Override
public PluginCommand getPluginCommand(String s) {
return null;
}
@Override
public void savePlayers() {
}
@Override
public boolean dispatchCommand(CommandSender commandSender, String s) throws CommandException {
return false;
}
@Override
public boolean addRecipe(Recipe recipe) {
return false;
}
@Override
public List<Recipe> getRecipesFor(ItemStack itemStack) {
return null;
}
@Override
public Iterator<Recipe> recipeIterator() {
return null;
}
@Override
public void clearRecipes() {
}
@Override
public void resetRecipes() {
}
@Override
public Map<String, String[]> getCommandAliases() {
return null;
}
@Override
public int getSpawnRadius() {
return 0;
}
@Override
public void setSpawnRadius(int i) {
}
@Override
public boolean getOnlineMode() {
return false;
}
@Override
public boolean getAllowFlight() {
return false;
}
@Override
public boolean isHardcore() {
return false;
}
@Override
public void shutdown() {
}
@Override
public int broadcast(String s, String s1) {
return 0;
}
@Override
public OfflinePlayer getOfflinePlayer(String s) {
return null;
}
@Override
public OfflinePlayer getOfflinePlayer(UUID uuid) {
return this.offlinePlayers.get(uuid);
}
@Override
public Set<String> getIPBans() {
return null;
}
@Override
public void banIP(String s) {
}
@Override
public void unbanIP(String s) {
}
@Override
public Set<OfflinePlayer> getBannedPlayers() {
return null;
}
@Override
public BanList getBanList(BanList.Type type) {
return null;
}
@Override
public Set<OfflinePlayer> getOperators() {
return null;
}
@Override
public GameMode getDefaultGameMode() {
return null;
}
@Override
public void setDefaultGameMode(GameMode gameMode) {
}
@Override
public ConsoleCommandSender getConsoleSender() {
return null;
}
@Override
public File getWorldContainer() {
return null;
}
@Override
public OfflinePlayer[] getOfflinePlayers() {
return new OfflinePlayer[0];
}
@Override
public Messenger getMessenger() {
return null;
}
@Override
public HelpMap getHelpMap() {
return null;
}
@Override
public Inventory createInventory(InventoryHolder inventoryHolder, InventoryType inventoryType) {
return null;
}
@Override
public Inventory createInventory(InventoryHolder inventoryHolder, InventoryType inventoryType, String s) {
return null;
}
@Override
public Inventory createInventory(InventoryHolder inventoryHolder, int i) throws IllegalArgumentException {
return null;
}
@Override
public Inventory createInventory(InventoryHolder inventoryHolder, int i, String s) throws IllegalArgumentException {
return null;
}
@Override
public Merchant createMerchant(String s) {
return null;
}
@Override
public int getMonsterSpawnLimit() {
return 0;
}
@Override
public int getAnimalSpawnLimit() {
return 0;
}
@Override
public int getWaterAnimalSpawnLimit() {
return 0;
}
@Override
public int getAmbientSpawnLimit() {
return 0;
}
@Override
public boolean isPrimaryThread() {
return false;
}
@Override
public String getMotd() {
return null;
}
@Override
public String getShutdownMessage() {
return null;
}
@Override
public Warning.WarningState getWarningState() {
return null;
}
@Override
public ItemFactory getItemFactory() {
return null;
}
@Override
public ScoreboardManager getScoreboardManager() {
return null;
}
@Override
public CachedServerIcon getServerIcon() {
return null;
}
@Override
public CachedServerIcon loadServerIcon(File file) throws IllegalArgumentException, Exception {
return null;
}
@Override
public CachedServerIcon loadServerIcon(BufferedImage bufferedImage) throws IllegalArgumentException, Exception {
return null;
}
@Override
public void setIdleTimeout(int i) {
}
@Override
public int getIdleTimeout() {
return 0;
}
@Override
public ChunkGenerator.ChunkData createChunkData(World world) {
return null;
}
@Override
public BossBar createBossBar(String s, BarColor barColor, BarStyle barStyle, BarFlag... barFlags) {
return null;
}
@Override
public Entity getEntity(UUID uuid) {
return null;
}
@Override
public Advancement getAdvancement(NamespacedKey namespacedKey) {
return null;
}
@Override
public Iterator<Advancement> advancementIterator() {
return null;
}
@Override
public UnsafeValues getUnsafe() {
return null;
}
@Override
public Spigot spigot() {
return null;
}
@Override
public void sendPluginMessage(Plugin plugin, String s, byte[] bytes) {
}
@Override
public Set<String> getListeningPluginChannels() {
return null;
}
}