Skip to content

Commit

Permalink
Added placeholders that format large balances
Browse files Browse the repository at this point in the history
%Bank_[gamemode]_island_balance_formatted%
%Bank_[gamemode]_visited_island_balance_formatted%

Completes #9
  • Loading branch information
tastybento committed Nov 14, 2020
1 parent cc8ecf9 commit 87cbc50
Show file tree
Hide file tree
Showing 11 changed files with 74 additions and 78 deletions.
44 changes: 41 additions & 3 deletions src/main/java/world/bentobox/bank/PhManager.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package world.bentobox.bank;

import java.math.BigInteger;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;

import org.bukkit.World;
import org.eclipse.jdt.annotation.Nullable;

import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.addons.GameModeAddon;
Expand All @@ -16,6 +21,16 @@
*
*/
public class PhManager {
private static final BigInteger THOUSAND = BigInteger.valueOf(1000);
private static final TreeMap<BigInteger, String> LEVELS;
static {
LEVELS = new TreeMap<>();

LEVELS.put(THOUSAND, "k");
LEVELS.put(THOUSAND.pow(2), "M");
LEVELS.put(THOUSAND.pow(3), "G");
LEVELS.put(THOUSAND.pow(4), "T");
}

private final BentoBox plugin;
private final BankManager bankManager;
Expand Down Expand Up @@ -45,7 +60,16 @@ protected boolean registerPlaceholders(GameModeAddon gm) {

// Visited Island Balance
plugin.getPlaceholdersManager().registerPlaceholder(addon,
gm.getDescription().getName().toLowerCase() + "_visited_island_balance", user -> getVisitedIslandBalance(gm, user));
gm.getDescription().getName().toLowerCase() + "_visited_island_balance", user -> getVisitedIslandBalance(gm, user, false));

// Formatted Island Balance
plugin.getPlaceholdersManager().registerPlaceholder(addon,
gm.getDescription().getName().toLowerCase() + "_island_balance_formatted",
user -> format(bankManager.getBalance(user, gm.getOverWorld())));

// Formatted Visited Island Balance
plugin.getPlaceholdersManager().registerPlaceholder(addon,
gm.getDescription().getName().toLowerCase() + "_visited_island_balance_formatted", user -> getVisitedIslandBalance(gm, user, true));

// Register Ranked Placeholders
for (int i = 1; i <= Objects.requireNonNull(addon.getSettings()).getRanksNumber(); i++) {
Expand All @@ -60,11 +84,11 @@ protected boolean registerPlaceholders(GameModeAddon gm) {
return true;
}

String getVisitedIslandBalance(GameModeAddon gm, User user) {
String getVisitedIslandBalance(GameModeAddon gm, User user, boolean formatted) {
if (user == null || user.getLocation() == null) return "";
if (!gm.inWorld(user.getWorld())) return addon.getVault().format(0D);
return addon.getIslands().getIslandAt(user.getLocation())
.map(island -> addon.getVault().format(bankManager.getBalance(island)))
.map(island -> formatted ? format(bankManager.getBalance(island)) : addon.getVault().format(bankManager.getBalance(island)))
.orElse(addon.getVault().format(0D));
}

Expand Down Expand Up @@ -139,4 +163,18 @@ protected void setNames(List<String> names) {
this.names = names;
}

/**
* Get the string representation of money. May be converted to shorthand notation, e.g., 104556 = 10.5k
* @param lvl - value to represent
* @return string of the value.
*/
private String format(@Nullable double value) {
String level = addon.getVault().format(value);
BigInteger levelValue = BigInteger.valueOf((long)value);
Map.Entry<BigInteger, String> stage = LEVELS.floorEntry(levelValue);
if (stage != null) {
level = new DecimalFormat("#.#").format(levelValue.divide(stage.getKey().divide(THOUSAND)).doubleValue()/1000.0) + stage.getValue();
}
return level;
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
package world.bentobox.bank.commands;

import java.math.BigInteger;
import java.text.DecimalFormat;
import java.util.Collections;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.lang.math.NumberUtils;
import org.eclipse.jdt.annotation.Nullable;

import world.bentobox.bank.Bank;
import world.bentobox.bentobox.api.commands.CompositeCommand;
Expand All @@ -24,17 +20,6 @@
*/
public abstract class AbstractBankCommand extends CompositeCommand {

private static final BigInteger THOUSAND = BigInteger.valueOf(1000);
private static final TreeMap<BigInteger, String> LEVELS;
static {
LEVELS = new TreeMap<>();

LEVELS.put(THOUSAND, "k");
LEVELS.put(THOUSAND.pow(2), "M");
LEVELS.put(THOUSAND.pow(3), "G");
LEVELS.put(THOUSAND.pow(4), "T");
}

protected AbstractBankCommand(CompositeCommand parent, String string) {
super(parent, string);
this.addon = ((Bank)getAddon());
Expand Down Expand Up @@ -145,22 +130,4 @@ protected boolean parseValue(User user, String arg) {
return true;
}

/**
* Get the string representation of money. May be converted to shorthand notation, e.g., 104556 = 10.5k
* @param lvl - value to represent
* @return string of the value.
*/
public String format(@Nullable double value) {
String level = addon.getVault().format(value);
// If balance is greater than 1 million use shorthand version
if(value > 999999) {
BigInteger levelValue = BigInteger.valueOf((long)value);

Map.Entry<BigInteger, String> stage = LEVELS.floorEntry(levelValue);
if (stage != null) {
level = new DecimalFormat("#.#").format(levelValue.divide(stage.getKey().divide(THOUSAND)).doubleValue()/1000.0) + stage.getValue();
}
}
return level;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public boolean canExecute(User user, String label, List<String> args) {

@Override
public boolean execute(User user, String label, List<String> args) {
user.sendMessage("bank.balance.island-balance", TextVariables.NUMBER, format(addon
user.sendMessage("bank.balance.island-balance", TextVariables.NUMBER, addon.getVault().format(addon
.getBankManager()
.getBalance(island)));
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public boolean execute(User user, String label, List<String> args) {
if (result == BankResponse.SUCCESS) {
user.sendMessage("bank.admin.give.success",
TextVariables.NAME, this.target.getName(),
TextVariables.NUMBER, format(((Bank)getAddon()).getBankManager().getBalance(island)));
TextVariables.NUMBER, addon.getVault().format(((Bank)getAddon()).getBankManager().getBalance(island)));
} else {
user.sendMessage("bank.errors.bank-error");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public boolean execute(User user, String label, List<String> args) {
.set(user, island.getUniqueId(), value, value, TxType.SET)
.thenAccept(result -> {
if (result == BankResponse.SUCCESS) {
user.sendMessage("bank.admin.set.success", TextVariables.NAME, target.getName(), TextVariables.NUMBER, format(addon.getBankManager().getBalance(island)));
user.sendMessage("bank.admin.set.success", TextVariables.NAME, target.getName(), TextVariables.NUMBER, addon.getVault().format(addon.getBankManager().getBalance(island)));
} else {
user.sendMessage("bank.errors.bank-error");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public boolean execute(User user, String label, List<String> args) {
case SUCCESS:
user.sendMessage("bank.admin.give.success",
TextVariables.NAME, this.target.getName(),
TextVariables.NUMBER, format(addon.getBankManager().getBalance(island)));
TextVariables.NUMBER, addon.getVault().format(addon.getBankManager().getBalance(island)));
break;
default:
user.sendMessage("bank.errors.bank-error");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public boolean canExecute(User user, String label, List<String> args) {

@Override
public boolean execute(User user, String label, List<String> args) {
user.sendMessage("bank.balance.island-balance", TextVariables.NUMBER, format(addon
user.sendMessage("bank.balance.island-balance", TextVariables.NUMBER, addon.getVault().format(addon
.getBankManager()
.getBalance(island)));
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import net.milkbowl.vault.economy.EconomyResponse;
import net.milkbowl.vault.economy.EconomyResponse.ResponseType;
import world.bentobox.bank.Bank;
import world.bentobox.bank.commands.AbstractBankCommand;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.localization.TextVariables;
Expand Down Expand Up @@ -37,7 +36,7 @@ public boolean canExecute(User user, String label, List<String> args) {
@Override
public boolean execute(User user, String label, List<String> args) {
// Check if the player has the balance
VaultHook vault = ((Bank)this.getAddon()).getVault();
VaultHook vault = addon.getVault();
double balance = vault.getBalance(user, getWorld());
if (balance < value) {
user.sendMessage("bank.errors.too-much");
Expand All @@ -58,7 +57,7 @@ public boolean execute(User user, String label, List<String> args) {
user.sendMessage("general.errors.no-island");
break;
case SUCCESS:
user.sendMessage("bank.deposit.success", TextVariables.NUMBER, format(addon.getBankManager().getBalance(island)));
user.sendMessage("bank.deposit.success", TextVariables.NUMBER, vault.format(addon.getBankManager().getBalance(island)));
break;
default:
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public boolean execute(User user, String label, List<String> args) {
break;
default:
addon.getVault().deposit(user, value, getWorld());
user.sendMessage("bank.withdraw.success", TextVariables.NUMBER, format(addon.getBankManager().getBalance(island)));
user.sendMessage("bank.withdraw.success", TextVariables.NUMBER, addon.getVault().format(addon.getBankManager().getBalance(island)));
break;

}
Expand Down
28 changes: 25 additions & 3 deletions src/test/java/world/bentobox/bank/PhManagerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,8 @@ public void testRegisterPlaceholders() {
@Test
public void testGetVisitedIslandBalanceWrongWorld() {
when(gm.inWorld(eq(world))).thenReturn(false);
assertEquals("$0.0", pm.getVisitedIslandBalance(gm, user));
assertEquals("$0.0", pm.getVisitedIslandBalance(gm, user, false));
assertEquals("$0.0", pm.getVisitedIslandBalance(gm, user, true));
}

/**
Expand All @@ -144,17 +145,38 @@ public void testGetVisitedIslandBalanceWrongWorld() {
@Test
public void testGetVisitedIslandBalanceNoIsland() {
when(im.getIslandAt(eq(location))).thenReturn(Optional.empty());
assertEquals("$0.0", pm.getVisitedIslandBalance(gm, user));
assertEquals("$0.0", pm.getVisitedIslandBalance(gm, user, false));
assertEquals("$0.0", pm.getVisitedIslandBalance(gm, user, true));
}

/**
* Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User)}.
*/
@Test
public void testGetVisitedIslandBalance() {
assertEquals("$1234.56", pm.getVisitedIslandBalance(gm, user));
assertEquals("$1234.56", pm.getVisitedIslandBalance(gm, user, false));
assertEquals("1.2k", pm.getVisitedIslandBalance(gm, user, true));
}

/**
* Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User)}.
*/
@Test
public void testGetVisitedIslandBalanceLargest() {
when(bm.getBalance(eq(island))).thenReturn(Double.MAX_VALUE);
assertEquals("9223372T", pm.getVisitedIslandBalance(gm, user, true));
}

/**
* Test method for {@link world.bentobox.bank.PhManager#getVisitedIslandBalance(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.api.user.User)}.
*/
@Test
public void testGetVisitedIslandBalanceBig() {
when(bm.getBalance(eq(island))).thenReturn(123456789D);
assertEquals("123.5M", pm.getVisitedIslandBalance(gm, user, true));
}


/**
* Test method for {@link world.bentobox.bank.PhManager#getRankName(org.bukkit.World, int)}.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,34 +159,4 @@ public void testExecuteUserStringListOfString() {
verify(user).sendMessage(eq("bank.balance.island-balance"), eq(TextVariables.NUMBER), eq("0.0"));
}

/**
* Test method for {@link world.bentobox.bank.commands.user.BalanceCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}.
*/
@Test
public void testExecuteUserStringListOfStringLargeBalance() {
when(bankManager.getBalance(any())).thenReturn(Double.MAX_VALUE);
assertTrue(bc.execute(user, "balance", Collections.emptyList()));
verify(user).sendMessage(eq("bank.balance.island-balance"), eq(TextVariables.NUMBER), eq("9223372T"));
}

/**
* Test method for {@link world.bentobox.bank.commands.user.BalanceCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}.
*/
@Test
public void testExecuteUserStringListOfStringLargeBalance999999() {
when(bankManager.getBalance(any())).thenReturn(999999D);
assertTrue(bc.execute(user, "balance", Collections.emptyList()));
verify(user).sendMessage(eq("bank.balance.island-balance"), eq(TextVariables.NUMBER), eq("999999.0"));
}

/**
* Test method for {@link world.bentobox.bank.commands.user.BalanceCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}.
*/
@Test
public void testExecuteUserStringListOfStringLargeBalance1M() {
when(bankManager.getBalance(any())).thenReturn(1000000D);
assertTrue(bc.execute(user, "balance", Collections.emptyList()));
verify(user).sendMessage(eq("bank.balance.island-balance"), eq(TextVariables.NUMBER), eq("1M"));
}

}

0 comments on commit 87cbc50

Please sign in to comment.