Skip to content

Commit

Permalink
Added Admin commands. Revised history.
Browse files Browse the repository at this point in the history
Added test classes.
  • Loading branch information
tastybento committed Oct 19, 2020
1 parent c4156eb commit 5ac1d27
Show file tree
Hide file tree
Showing 23 changed files with 1,095 additions and 82 deletions.
5 changes: 3 additions & 2 deletions src/main/java/world/bentobox/bank/Bank.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import org.bukkit.Material;
import org.eclipse.jdt.annotation.Nullable;

import world.bentobox.bank.commands.UserCommand;
import world.bentobox.bank.commands.admin.AdminCommand;
import world.bentobox.bank.commands.user.UserCommand;
import world.bentobox.bentobox.api.addons.Addon;
import world.bentobox.bentobox.api.configuration.Config;
import world.bentobox.bentobox.api.flags.Flag;
Expand Down Expand Up @@ -65,7 +66,7 @@ public void onEnable() {
.forEach(gm -> {
// Register command
gm.getPlayerCommand().ifPresent(playerCmd -> new UserCommand(this, playerCmd, settings.getUserCommand()));
//gm.getAdminCommand().ifPresent(adminCmd -> new AdminCommand(this, adminCmd, settings.getAdminCommand(), settings.getAdminAliases().split(" ")));
gm.getAdminCommand().ifPresent(adminCmd -> new AdminCommand(this, adminCmd, settings.getAdminCommand()));
// Log
this.log("Hooking into " + gm.getDescription().getName());
});
Expand Down
100 changes: 80 additions & 20 deletions src/main/java/world/bentobox/bank/BankManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,17 @@

import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.eclipse.jdt.annotation.Nullable;

import com.google.common.base.Enums;

import world.bentobox.bank.data.AccountHistory;
import world.bentobox.bank.data.BankAccounts;
import world.bentobox.bank.data.TxType;
import world.bentobox.bentobox.api.events.island.IslandEvent.IslandPreclearEvent;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.Database;
import world.bentobox.bentobox.database.objects.Island;
Expand All @@ -23,7 +31,7 @@
* @author tastybento
*
*/
public class BankManager {
public class BankManager implements Listener {
private static final int MAX_SIZE = 20;
// Database handler for accounts
private final Database<BankAccounts> handler;
Expand Down Expand Up @@ -53,22 +61,31 @@ public void loadBalances() {
handler.loadObjects().forEach(ba -> balances.put(ba.getUniqueId(), ba.getBalance())));
}

/**
* @param user - depositor and island member
* @param amount - amount
* @param world - island's world
* @return BankResponse
*/
public CompletableFuture<BankResponse> deposit(User user, double amount, World world) {
// Get player's account
Island island = addon.getIslands().getIsland(world, user);
if (island == null) {
return CompletableFuture.completedFuture(BankResponse.FAILURE_NO_ISLAND);
}
return deposit(user, island, amount, TxType.DEPOSIT);
}

/**
* @param user - depositor
* @param island - island
* @param amount - amount
* @return BankResponse
*/
public CompletableFuture<BankResponse> deposit(User user, Island island, double amount, TxType type) {
try {
BankAccounts account = getAccount(island.getUniqueId());
account.setBalance(account.getBalance() + amount);
account.getHistory().put(System.currentTimeMillis(), user.getName() + ":" + amount);
cache.put(island.getUniqueId(), account);
balances.put(island.getUniqueId(), account.getBalance());
CompletableFuture<BankResponse> result = new CompletableFuture<>();
handler.saveObjectAsync(account).thenRun(() -> result.complete(BankResponse.SUCCESS));
return result;
return this.set(user, island, (account.getBalance() + amount), type);
} catch (IOException e) {
return CompletableFuture.completedFuture(BankResponse.FAILURE_LOAD_ERROR);
}
Expand All @@ -95,13 +112,28 @@ private BankAccounts getAccount(String uuid) throws IOException {
return account;
}

/**
* @param user - island member
* @param amount - amount
* @param world - world
* @return BankResponse
*/
public CompletableFuture<BankResponse> withdraw(User user, double amount, World world) {
// Get player's island
Island island = addon.getIslands().getIsland(world, user);
if (island == null) {
return CompletableFuture.completedFuture(BankResponse.FAILURE_NO_ISLAND);
}
return withdraw(user, island, amount, TxType.WITHDRAW);
}

/**
* @param user - user withdrawing
* @param island - island
* @param amount - amount
* @return BankResponse
*/
public CompletableFuture<BankResponse> withdraw(User user, Island island, double amount, TxType type) {
BankAccounts account;
if (!handler.objectExists(island.getUniqueId())) {
// No account = no balance
Expand All @@ -120,31 +152,28 @@ public CompletableFuture<BankResponse> withdraw(User user, double amount, World
return CompletableFuture.completedFuture(BankResponse.FAILURE_LOW_BALANCE);
}
// Success
account.setBalance(account.getBalance() - amount);
account.getHistory().put(System.currentTimeMillis(), user.getName() + ":-" + amount);
cache.put(island.getUniqueId(), account);
balances.put(island.getUniqueId(), account.getBalance());
CompletableFuture<BankResponse> result = new CompletableFuture<>();
handler.saveObjectAsync(account).thenRun(() -> result.complete(BankResponse.SUCCESS));
return result;
return this.set(user, island, (account.getBalance() - amount), type);
}

public double getBalance(User user, World world) {
// Get player's island
Island island = addon.getIslands().getIsland(world, user);
public double getBalance(@Nullable Island island) {
if (island == null) {
return 0D;
}
return balances.getOrDefault(island.getUniqueId(), 0D);
}

public double getBalance(User user, World world) {
return getBalance(addon.getIslands().getIsland(world, user));
}

public List<AccountHistory> getHistory(Island island) {
try {
BankAccounts account = getAccount(island.getUniqueId());
return account.getHistory().entrySet().stream().map(en -> {
String[] split = en.getValue().split(":");
if (split.length == 2) {
return new AccountHistory(en.getKey(), split[0], Double.valueOf(split[1]));
if (split.length == 3) {
TxType type = Enums.getIfPresent(TxType.class, split[1]).or(TxType.UNKNOWN);
return new AccountHistory(en.getKey(), split[0], Double.valueOf(split[2]), type);
}
return null;
}).filter(Objects::nonNull).collect(Collectors.toList());
Expand All @@ -159,4 +188,35 @@ public List<AccountHistory> getHistory(Island island) {
public Map<String, Double> getBalances() {
return balances;
}

/**
* Sets an island's account value to an amount
* @param user - user who is doing the setting
* @param island - island
* @param amount - amount
* @param type - type of transaction
* @return BankResponse
*/
public CompletableFuture<BankResponse> set(User user, @Nullable Island island, double amount, TxType type) {
try {
BankAccounts account = getAccount(island.getUniqueId());
account.setBalance(amount);
account.getHistory().put(System.currentTimeMillis(), user.getName() + ":" + type + ":" + amount);
cache.put(island.getUniqueId(), account);
balances.put(island.getUniqueId(), account.getBalance());
CompletableFuture<BankResponse> result = new CompletableFuture<>();
handler.saveObjectAsync(account).thenRun(() -> result.complete(BankResponse.SUCCESS));
return result;
} catch (IOException e) {
return CompletableFuture.completedFuture(BankResponse.FAILURE_LOAD_ERROR);
}
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onIslandDelete(IslandPreclearEvent e) {
String id = e.getIsland().getUniqueId();
handler.deleteID(id);
cache.remove(id);
balances.remove(id);
}
}
31 changes: 0 additions & 31 deletions src/main/java/world/bentobox/bank/commands/AdminCommand.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package world.bentobox.bank.commands.admin;

import java.util.List;

import org.eclipse.jdt.annotation.Nullable;

import world.bentobox.bank.Bank;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.localization.TextVariables;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;

/**
* @author tastybento
*
*/
public class AdminBalanceCommand extends AdminCommand {

private @Nullable Island island;

public AdminBalanceCommand(CompositeCommand parent) {
super(parent, "balance");
}

@Override
public void setup() {
this.setPermission("bank.admin.balance");
this.setDescription("bank.admin.description");
}

@Override
public boolean canExecute(User user, String label, List<String> args) {
// Check if there's the right number of arguments
if (args.size() != 1) {
this.showHelp(this, user);
return false;
}
// Get target's island
island = getIslands().getIsland(getWorld(), getAddon().getPlayers().getUser(args.get(0)));
if (island == null) {
user.sendMessage("general.errors.no-island");
return false;
}
return true;
}

@Override
public boolean execute(User user, String label, List<String> args) {
user.sendMessage("bank.balance.island-balance", TextVariables.NUMBER, ((Bank)getAddon())
.getVault()
.format(((Bank)getAddon())
.getBankManager()
.getBalance(island)));
return true;
}

}
44 changes: 44 additions & 0 deletions src/main/java/world/bentobox/bank/commands/admin/AdminCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package world.bentobox.bank.commands.admin;

import java.util.List;
import java.util.Optional;

import world.bentobox.bank.Bank;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.util.Util;

/**
* @author tastybento
*
*/
public class AdminCommand extends CompositeCommand {

public AdminCommand(Bank bank, CompositeCommand adminCmd, String adminCommand) {
super(bank, adminCmd, adminCommand);
}

public AdminCommand(CompositeCommand parent, String string) {
super(parent, string);
}

@Override
public void setup() {
this.setDescription("bank.admin.description");
new AdminStatementCommand(this);
new AdminBalanceCommand(this);
new AdminGiveCommand(this);
new AdminSetCommand(this);
new AdminTakeCommand(this);
}

@Override
public boolean execute(User user, String label, List<String> args) {
return true;
}

@Override
public Optional<List<String>> tabComplete(User user, String alias, List<String> args) {
return Optional.of(Util.getOnlinePlayerList(user));
}
}

0 comments on commit 5ac1d27

Please sign in to comment.