diff --git a/src/main/java/jesse/keeblarcraft/BankMgr/BankManager.java b/src/main/java/jesse/keeblarcraft/BankMgr/BankManager.java index 50cabf2..9f3d6a5 100644 --- a/src/main/java/jesse/keeblarcraft/BankMgr/BankManager.java +++ b/src/main/java/jesse/keeblarcraft/BankMgr/BankManager.java @@ -6,6 +6,8 @@ import java.util.ArrayList; import java.util.Map.Entry; import jesse.keeblarcraft.BankMgr.BankAccountType.ACCOUNT_TYPE; +import jesse.keeblarcraft.ChatStuff.ChatFormatting; +import jesse.keeblarcraft.ChatStuff.ChatMsg; import jesse.keeblarcraft.ConfigMgr.ConfigManager; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; @@ -23,7 +25,7 @@ public final class BankManager { return static_inst; } - private class PlayerBankConfig { + private static class PlayerBankConfig { List activeBanks = new ArrayList(); // List of all banks a player has accounts in String defaultSelectedBank = ""; String defaultSelectedAccount = ""; @@ -31,10 +33,10 @@ public final class BankManager { // Key = player uuid // Val = player config - HashMap playerConfigs = new HashMap(); // Stores global detail information for bank mgr to use + private HashMap playerConfigs = new HashMap(); // Stores global detail information for bank mgr to use private static Integer KEEBLARCRAFT_SERVER_BANK_ID = 1000; // Server global bank (default bank on server) - ConfigManager config = new ConfigManager(); + private ConfigManager config = new ConfigManager(); // KEY = Bank routing number // Val = Bank object @@ -45,9 +47,6 @@ public final class BankManager { private HashMap bankNameFastMap = new HashMap(); public BankManager() { - if (playerConfigs == null) { - playerConfigs = new HashMap(); - } } // TODO: THIS NEEDS TO READ IN FROM A FILE TO STOP NUKING BANKS ON REBOOT @@ -57,14 +56,18 @@ public final class BankManager { /// @brief Initializes all the banks on the server at construction time ///////////////////////////////////////////////////////////////////////////// public void InitializeBanks() { - banks.put(KEEBLARCRAFT_SERVER_BANK_ID, new IndividualBank(Integer.toString(KEEBLARCRAFT_SERVER_BANK_ID), "KeeblarcraftGlobal")); + banks.put(KEEBLARCRAFT_SERVER_BANK_ID, new IndividualBank(Integer.toString(KEEBLARCRAFT_SERVER_BANK_ID), "Keeblarcraft")); // Initialize fast map for (Entry bank : banks.entrySet()) { - bankNameFastMap.put(bank.getValue().GetBankName(), bank.getValue().GetRoutingNumber()); + bankNameFastMap.put(bank.getValue().GetBankName().toUpperCase(), bank.getValue().GetRoutingNumber()); } } + public Boolean IsDefaultAccount(String playerUuid, String globalAccountId) { + return playerConfigs.containsKey(playerUuid) && playerConfigs.get(playerUuid).defaultSelectedAccount.equals(globalAccountId); + } + ///////////////////////////////////////////////////////////////////////////// /// @fn GetAllBankNames /// @@ -100,14 +103,10 @@ public final class BankManager { ///////////////////////////////////////////////////////////////////////////// public IndividualBank GetBankByName(String name) { IndividualBank bank = null; - System.out.println("GetBankByName called with value " + name); if (bankNameFastMap.containsKey(name)) { - System.out.println("Value of bank with name is " + bankNameFastMap.get(name)); - System.out.println("Banks map size is " + banks.size()); bank = banks.get(bankNameFastMap.get(name)); } - System.out.println("Returning bank information"); return bank; } @@ -117,34 +116,22 @@ public final class BankManager { /// @param[in] player Player object to change default accounts of /// /// @param[in] The new default account global account identifier - /// - /// @return Changes the players default account at a selected bank - ///////////////////////////////////////////////////////////////////////////// public void ChangeDefaultPlayerAccount(ServerPlayerEntity player, String newDefaultAccount) { - String bankName = AccountNumberGenerator.GetFinancialSymbolFromId(newDefaultAccount); - - // Verify bank exists first - System.out.println(bankNameFastMap); - - for(Entry entry : bankNameFastMap.entrySet()) { - System.out.println("KEY: " + entry.getKey()); - } - - if (bankNameFastMap.containsKey(bankName)) { - Integer routNum = bankNameFastMap.get(bankName); - IndividualBank bank = banks.get(routNum); - - // Verify this person has access to this account - if(bank.IsAccountHolder(newDefaultAccount, player.getUuidAsString())) { - // Finally update config to this account since checks pass + Integer routingNumber = AccountNumberGenerator.GetRoutingNumberFromId(newDefaultAccount); + if (banks.containsKey(routingNumber)) { + IndividualBank bank = banks.get(routingNumber); + String accountId = AccountNumberGenerator.GetAccountNumberFromId(newDefaultAccount); // Short ID; not global! + if (bank.IsAccountHolder(accountId, player.getUuidAsString())) { playerConfigs.get(player.getUuidAsString()).defaultSelectedAccount = newDefaultAccount; + } else { + player.sendMessage(Text.of("You are not an account holder on this account! Cannot set")); } } else { player.sendMessage(Text.of("Could not change default selected account. Bank does not exist!")); } } - // This guarentees a player config exists; and so can be called from many areas. Does not erase pre-existing config + // This guarantees a player config exists; and so can be called from many areas. Does not erase pre-existing config public boolean EnsurePlayerConfigExists(String uuid) { if (!playerConfigs.containsKey(uuid)) { playerConfigs.put(uuid, new PlayerBankConfig()); @@ -227,17 +214,17 @@ public final class BankManager { ///////////////////////////////////////////////////////////////////////////// public void InitiateBankFundsTransfer(ServerPlayerEntity fromPlayer, String toAccount, Integer amount, String reason) { // Get player default selection + if (!playerConfigs.containsKey(fromPlayer.getUuidAsString()) || playerConfigs.get(fromPlayer.getUuidAsString()).defaultSelectedAccount.isEmpty()) { + fromPlayer.sendMessage(Text.of("You need to select a default bank account from the bank you have selected to wire from first! /bank select-default-account")); + return; + } + String fromAccount = playerConfigs.get(fromPlayer.getUuidAsString()).defaultSelectedAccount; - - String fromAccountSymbol = AccountNumberGenerator.GetFinancialSymbolFromId(fromAccount); - String toAccountSymbol = AccountNumberGenerator.GetFinancialSymbolFromId(toAccount); - - System.out.println("InitiateBankFundsTransfer: FROM_ACCOUNT, FROM_ACCOUNT_SYMBOL, TO_ACCOUNT_SYMBOL: " + fromAccount + ", " + fromAccountSymbol + ", " + toAccountSymbol); - - Integer destRoutingNumber = bankNameFastMap.get(toAccountSymbol); - Integer fromRoutingNumber = bankNameFastMap.get(fromAccountSymbol); - IndividualBank destBank = banks.get(destRoutingNumber); - IndividualBank fromBank = banks.get(fromRoutingNumber); + Integer fromRoutingNumber = AccountNumberGenerator.GetRoutingNumberFromId(fromAccount); + Integer toRoutingNumber = AccountNumberGenerator.GetRoutingNumberFromId(toAccount); + IndividualBank destBank = banks.get(fromRoutingNumber); + IndividualBank fromBank = banks.get(toRoutingNumber); + String fromAccountSymbol = AccountNumberGenerator.GetFinancialSymbolFromId(fromAccount); // For chat // Verify banks exist if (destBank != null && fromBank != null) { @@ -254,8 +241,21 @@ public final class BankManager { } } - public void InitiateBankAccountClosure(String bankIdentifier, ServerPlayerEntity player, String bankAccountId) { + public void InitiateBankAccountClosure(ServerPlayerEntity player, String accountId) { + Integer routing = AccountNumberGenerator.GetRoutingNumberFromId(accountId); + if (banks.containsKey(routing)) { + IndividualBank bank = banks.get(routing); + boolean success = bank.CloseAccount(AccountNumberGenerator.GetAccountNumberFromId(accountId), player.getUuidAsString()); + + if (success) { + player.sendMessage(Text.of("Successfully closed account.")); + } else { + player.sendMessage(Text.of(ChatMsg.ColorMsg("Failed to close account. Contact bank manager for more information.", ChatFormatting.COLOR_CODE.RED))); + } + } else { + player.sendMessage(Text.of(ChatMsg.ColorMsg("That bank doesn't exist.", ChatFormatting.COLOR_CODE.RED))); + } } ///////////////////////////////////////////////////////////////////////////// diff --git a/src/main/java/jesse/keeblarcraft/BankMgr/IndividualAccount.java b/src/main/java/jesse/keeblarcraft/BankMgr/IndividualAccount.java index c987da5..0963682 100644 --- a/src/main/java/jesse/keeblarcraft/BankMgr/IndividualAccount.java +++ b/src/main/java/jesse/keeblarcraft/BankMgr/IndividualAccount.java @@ -15,9 +15,9 @@ public class IndividualAccount { private Integer routingNumber; // Will always be the bank it's in private List accountHolders; private List accountHolderUuids; - private Integer accountBalance; - private Boolean allowNegativeBalance; - private Boolean accountLocked; + private int accountBalance; + private boolean allowNegativeBalance = false; + private boolean accountLocked = false; private ACCOUNT_TYPE accountType; @@ -117,7 +117,9 @@ public class IndividualAccount { /// @return True if succeeds, false if fails ///////////////////////////////////////////////////////////////////////////// public Boolean Deposit(Integer amount) { - Boolean success = false; + boolean success = false; + System.out.println("Depositing " + amount); + System.out.println("is account locked: " + accountLocked); if (!accountLocked) { accountBalance += amount; @@ -137,13 +139,13 @@ public class IndividualAccount { /// @return True if succeeds, false if fails ///////////////////////////////////////////////////////////////////////////// public Boolean Withdraw(Integer amount) { - Boolean success = false; + boolean success = false; if (!accountLocked) { // Determine remaining balance - Integer remaining = accountBalance - amount; - success = (remaining < 0 && !allowNegativeBalance); + int remaining = accountBalance - amount; + success = (remaining >= 0 || allowNegativeBalance); // Complete the transaction if successful if (success) { @@ -159,13 +161,10 @@ public class IndividualAccount { /// @return True if account can afford withdrawal, false if not ///////////////////////////////////////////////////////////////////////////// public Boolean CanWithdraw(Integer amount) { - Boolean canWithdraw = false; - - if (!accountLocked && (accountBalance - amount >= 0 || allowNegativeBalance)) { - canWithdraw = true; - } - - return canWithdraw; + System.out.println("Account balance: " + accountBalance); + System.out.println("Allow negative balance: " + allowNegativeBalance); + System.out.println("Account positive after deduction: " + (accountBalance - amount >= 0)); + return !accountLocked && (accountBalance - amount >= 0 || allowNegativeBalance); } ///////////////////////////////////////////////////////////////////////////// @@ -173,14 +172,8 @@ public class IndividualAccount { /// /// @return True if name is on name list ///////////////////////////////////////////////////////////////////////////// - public Boolean IsHolder(String name) { - Boolean ret = false; - - if (accountHolders.contains(name)) { - ret = true; - } - - return ret; + public Boolean IsHolder(String uuid) { + return accountHolderUuids.contains(uuid); } ///////////////////////////////////////////////////////////////////////////// @@ -210,6 +203,10 @@ public class IndividualAccount { return accountBalance; } + public ACCOUNT_TYPE GetAccountType() { + return accountType; + } + ///////////////////////////////////////////////////////////////////////////// /// @fn GetAccountNumber /// diff --git a/src/main/java/jesse/keeblarcraft/BankMgr/IndividualBank.java b/src/main/java/jesse/keeblarcraft/BankMgr/IndividualBank.java index 889a540..518e486 100644 --- a/src/main/java/jesse/keeblarcraft/BankMgr/IndividualBank.java +++ b/src/main/java/jesse/keeblarcraft/BankMgr/IndividualBank.java @@ -1,9 +1,6 @@ package jesse.keeblarcraft.BankMgr; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; import static java.util.Map.entry; @@ -13,6 +10,7 @@ import java.io.File; import jesse.keeblarcraft.ConfigMgr.ConfigManager; import jesse.keeblarcraft.Keeblarcraft; import jesse.keeblarcraft.BankMgr.BankAccountType.ACCOUNT_TYPE; +import jesse.keeblarcraft.Utils.CommonStructures.Pair; // Contains the information of an individual bank // @@ -35,7 +33,7 @@ public class IndividualBank { // Think FDIC but from the servers account (keeblarcraft insurance corporation) // KBIC will ensure an amount of money based on its trustworthiness to a bank and the number of holders it has. - private Integer kbicInsuredAmount = 0; + private Integer kbicInsuredAmount = 75_000; private Boolean kbicInsured = false; // bankMoney is the total amount of money the bank possesses itself. The bank itself is personally responsible @@ -83,7 +81,7 @@ public class IndividualBank { String accountsListDir = CONFIG_LOCATION + routingNumber.toString() + "/accounts/"; System.out.println("accountsListDir + bankName is " + accountsListDir + nameOfBank); accounts = config.GetJsonObjectFromFile(accountsListDir + nameOfBank, Accounts.class); - existingFile = true; + existingFile = accounts != null; // TODO: REPLACE WITH SQL SERVER. DIRTY ITERATE OVER ALL FILES IN DIRECTORY TO LOAD STRUCTURE File dir = new File(accountsListDir); @@ -129,13 +127,13 @@ public class IndividualBank { List accountHolders = account.getValue().GetAccountHolders(); // Match each user to the secondary map & add to list-value if not existing - for (Integer holderIndex = 0; holderIndex < accountHolders.size(); holderIndex++) { - if (accounts.accountsListFromName.containsKey(accountHolders.get(holderIndex))) { + for (String accountHolder : accountHolders) { + if (accounts.accountsListFromName.containsKey(accountHolder)) { // Case 1: User exists, update map entry - accounts.accountsListFromName.get(accountHolders.get(holderIndex)).add(account.getKey()); // Add a new account id to this person in the new flat map + accounts.accountsListFromName.get(accountHolder).add(account.getKey()); // Add a new account id to this person in the new flat map } else { // Case 2: User does not already exist; add a new map entry - accounts.accountsListFromName.put(accountHolders.get(holderIndex), List.of(account.getKey())); // Store name as key, and new List with the value of ACCOUNT # + accounts.accountsListFromName.put(accountHolder, List.of(account.getKey())); // Store name as key, and new List with the value of ACCOUNT # } } } @@ -168,9 +166,14 @@ public class IndividualBank { List accountsFromUser = new ArrayList(); List listOfAccounts = accounts.accountsListFromName.get(uuid); - if (listOfAccounts != null && listOfAccounts.size() > 0) { - for (int i = 0; i < listOfAccounts.size(); i++) { - accountsFromUser.add(accounts.accountsList.get(listOfAccounts.get(i))); + System.out.println("Account list size: " + accounts.accountsList.size()); + System.out.println("GetAccountsOfUser debug"); + System.out.println("Is listOfAccounts null? " + (listOfAccounts == null)); + System.out.println("If not null, what is size? " + listOfAccounts.size()); + + if (listOfAccounts != null && !listOfAccounts.isEmpty()) { + for (String listOfAccount : listOfAccounts) { + accountsFromUser.add(accounts.accountsList.get(listOfAccount)); } } return accountsFromUser; @@ -298,11 +301,17 @@ public class IndividualBank { /// @brief Adds money to an account at this bank if it exists ///////////////////////////////////////////////////////////////////////////// public void AddMoneyToAccount(String accountId, Integer amount) { - IndividualAccount account = accounts.accountsList.get(accountId); + IndividualAccount account = accounts.accountsList.get(AccountNumberGenerator.GetAccountNumberFromId(accountId)); System.out.println("Received account # " + accountId + " and money amnt " + amount); + System.out.println("Is account null? " + (account == null ? "YES":"NO")); - if (account != null) { - account.Deposit(amount); + System.out.println("accounts.accountList.size() : " + accounts.accountsList.size()); + for (Entry accnt : accounts.accountsList.entrySet()) { + System.out.println("Account num in entry: " + accnt.getValue().GetAccountNumber()); + } + + if (account != null && account.Deposit(amount)) { + GenerateTransactionReport(TransactionMetadata.TRANSACTION_TYPE.DEPOSIT, new Pair<>("ADMIN", "ADMIN"), new Pair<>("ADMIN", "ADMIN"), amount, "ADMIN"); FlashConfig("bank/" + routingNumber + "/accounts"); } } @@ -317,15 +326,10 @@ public class IndividualBank { /// @brief Subtracts money from an account at this bank if it exists ///////////////////////////////////////////////////////////////////////////// public void SubtractMoneyFromAccount(String accountId, Integer amount) { - IndividualAccount account = accounts.accountsList.get(accountId); + IndividualAccount account = accounts.accountsList.get(AccountNumberGenerator.GetAccountNumberFromId(accountId)); - for (Entry debug : accounts.accountsList.entrySet()) { - System.out.println("ACCOUNT ID: " + debug.getKey()); - System.out.println("ACCOUNT NUM: " + debug.getValue().GetAccountNumber()); - } - - if (account != null) { - account.Withdraw(amount); + if (account != null && account.Withdraw(amount)) { + GenerateTransactionReport(TransactionMetadata.TRANSACTION_TYPE.WITHDRAWAL, new Pair<>("ADMIN", "ADMIN"), new Pair<>("ADMIN", "ADMIN"), amount, "ADMIN"); FlashConfig("bank/" + routingNumber + "/accounts"); } } @@ -351,6 +355,7 @@ public class IndividualBank { if (account != null) { account.SetMoney(amount); + GenerateTransactionReport(TransactionMetadata.TRANSACTION_TYPE.OTHER, new Pair<>("ADMIN", "ADMIN"), new Pair<>("ADMIN", "ADMIN"), amount, "ADMIN"); FlashConfig("bank/" + routingNumber + "/accounts"); } } @@ -407,6 +412,29 @@ public class IndividualBank { return success; } + // fromParty is expected to be UUID mapped to username + // toParty is expected to be UUID mapped to username + // NOTHING should be null in this generation! + public void GenerateTransactionReport(TransactionMetadata.TRANSACTION_TYPE transactionType, Pair fromParty, Pair toParty, Integer amount, String reason) { + // The transaction ID is to be formatted (for now) as #-FROMUUID-TOUUID-RNG + // For this version, we pray there is not a duplicate RNG dupe and no checking is done for now! + StringBuilder transactionId = new StringBuilder("#" + fromParty.GetKey() + "-" + toParty.GetKey() + Integer.toString(new Random().nextInt(100_000_000) + 1_000_000)); + TransactionMetadata trans = new TransactionMetadata(transactionType, fromParty, toParty, amount, transactionId.toString(), reason); + + // This is a hacky solution to make sure the transaction file doesn't exist. It is "technically" possible we fail 10 times in a row + // then can't write and thus no papertrail is left - however if the RNG fails to make a unique enough number with these UUID's between + // 1 million and 100 million then we have other issues to worry about. + int maxTries = 10; + // We now want to iterate over the files in the transaction dir and pop a new file in + while (config.DoesFileExist("bank/" + routingNumber + "/transactions/" + transactionId) && maxTries-- >= 0) { + transactionId.append(Integer.toString(new Random().nextInt(100_000_000) + 1_000_000)); + } + + if (!config.DoesFileExist("bank/" + routingNumber + "/transactions/" + transactionId)) { + config.WriteToJsonFile("bank/" + routingNumber + "/transactions/" + transactionId + ".json", trans); + } + } + ///////////////////////////////////////////////////////////////////////////// /// @fn AliasAccount /// @@ -453,13 +481,15 @@ public class IndividualBank { /// /// @return True if can close, false if not ///////////////////////////////////////////////////////////////////////////// - public Boolean CloseAccount(String accountId) { - Boolean success = false; + public Boolean CloseAccount(String accountId, String playerUuid) { + boolean success = false; - String accountNumber = AccountNumberGenerator.GetAccountNumberFromId(accountId); - - if (accounts.accountsList.get(accountNumber).GetAccountBalance() == 0) { - accounts.accountsList.remove(accountNumber); + if (accounts.accountsList.containsKey(accountId) && accounts.accountsList.get(accountId).GetAccountBalance() == 0) { + System.out.println("Closing user account..."); + // The below two lists should ALWAYS be in sync. If there is a discrepancy; this may segfault! + accounts.accountsList.remove(accountId); + accounts.accountsListFromName.get(playerUuid).remove(accountId); + FlashConfig("bank/" + routingNumber + "/accounts"); success = true; } return success; @@ -476,11 +506,7 @@ public class IndividualBank { /// @return True if this bank has this account identifier, false if not ///////////////////////////////////////////////////////////////////////////// public Boolean HasAccount(String accountIdentifier) { - Boolean containsAccount = false; - if (accounts.accountsList.containsKey(accountIdentifier)) { - containsAccount = true; - } - return containsAccount; + return accounts.accountsList.containsKey(accountIdentifier); } ///////////////////////////////////////////////////////////////////////////// @@ -496,10 +522,16 @@ public class IndividualBank { /// @return True if this account can afford this withdrawal. False if not ///////////////////////////////////////////////////////////////////////////// public Boolean IsValidWithdrawal(Integer withdrawalAmount, String accountIdentifier) { - Boolean isValid = false; + boolean isValid = false; - if (accounts.accountsList.containsKey(accountIdentifier)) { - IndividualAccount account = accounts.accountsList.get(accountIdentifier); + System.out.println("Account id: " + accountIdentifier); + System.out.println("Short account id: " + AccountNumberGenerator.GetAccountNumberFromId(accountIdentifier)); + String localAccountId = AccountNumberGenerator.GetAccountNumberFromId(accountIdentifier); + System.out.println("Amount to withdraw: " + withdrawalAmount); + System.out.println("accounts list map: " + accounts.accountsList); + if (accounts.accountsList.containsKey(localAccountId)) { + IndividualAccount account = accounts.accountsList.get(localAccountId); + System.out.println("Is account null? " + (account == null)); if (account.CanWithdraw(withdrawalAmount)) { isValid = true; @@ -524,9 +556,16 @@ public class IndividualBank { public Boolean IsAccountHolder(String accountIdentifier, String uuid) { Boolean isHolder = false; + System.out.println("Looking for accountIdentifier: " + accountIdentifier); + for (Entry account : accounts.accountsList.entrySet()) { + System.out.println("ACCOUNT ID: " + account.getKey()); + } + // Verify account exists first if (accounts.accountsList.containsKey(accountIdentifier)) { isHolder = accounts.accountsList.get(accountIdentifier).IsHolder(uuid); + } else { + System.out.println("Account identifier found to not exist"); } return isHolder; @@ -546,7 +585,7 @@ public class IndividualBank { ///////////////////////////////////////////////////////////////////////////// public void FlashConfig(String dirName) { for (Entry singleAccount : accounts.accountsList.entrySet()) { - + System.out.println("FlashConfig. dirname: " + dirName); // Iterate over each one & verify if a file exists inside the dir. if it does; // nuke it and // replace it with the new contents in memory @@ -554,6 +593,7 @@ public class IndividualBank { // delete file File file = new File(dirName + "/" + accountNum + ".json"); + System.out.println("Checking path: " + dirName + "/" + accountNum + ".json"); if (file.exists()) { file.delete(); } diff --git a/src/main/java/jesse/keeblarcraft/BankMgr/TransactionMetadata.java b/src/main/java/jesse/keeblarcraft/BankMgr/TransactionMetadata.java index 1fa54f7..622efc2 100644 --- a/src/main/java/jesse/keeblarcraft/BankMgr/TransactionMetadata.java +++ b/src/main/java/jesse/keeblarcraft/BankMgr/TransactionMetadata.java @@ -1,17 +1,30 @@ package jesse.keeblarcraft.BankMgr; +import jesse.keeblarcraft.Utils.CommonStructures.Pair; + // All details that involve a transaction attempt public class TransactionMetadata { - enum TRANSACTION_TYPE { + public enum TRANSACTION_TYPE { DEBIT, CREDIT, WITHDRAWAL, - DEPOSIT + DEPOSIT, + OTHER } - public String fromParty; // Account ID - public String toParty; // Account ID or party (like ATM/self,etc) + public Pair fromParty; // Account ID + public Pair toParty; // Account ID or party (like ATM/self,etc) public Integer amount; public String transactionId; public TRANSACTION_TYPE transactionType; + public String reason; + + public TransactionMetadata(TRANSACTION_TYPE transactionType, Pair fromParty, Pair toParty, Integer amount, String reason, String transactionId) { + this.transactionType = transactionType; + this.transactionId = transactionId; + this.amount = amount; + this.toParty = toParty; + this.fromParty = fromParty; + this.reason = reason; + } } diff --git a/src/main/java/jesse/keeblarcraft/ChatStuff/ChatMsg.java b/src/main/java/jesse/keeblarcraft/ChatStuff/ChatMsg.java index 527fdd4..521a747 100644 --- a/src/main/java/jesse/keeblarcraft/ChatStuff/ChatMsg.java +++ b/src/main/java/jesse/keeblarcraft/ChatStuff/ChatMsg.java @@ -19,8 +19,8 @@ import net.minecraft.text.Style; import net.minecraft.text.Text; public class ChatMsg { - public Text regularText = Text.of(""); - public MutableText mutableText = (MutableText) regularText; + public static Text regularText = Text.of(""); + public static MutableText mutableText = (MutableText) regularText; ///////////////////////////////////////////////////////////////////////////// /// @fn MakeCopyableTxt /// @@ -35,7 +35,7 @@ public class ChatMsg { /// /// @return MutableText of text intended to be used to send to player ///////////////////////////////////////////////////////////////////////////// - public MutableText MakeCopyableTxt(String terminalTxt, String hoverTxt, Integer copyInt) { + public static MutableText MakeCopyableTxt(String terminalTxt, String hoverTxt, Integer copyInt) { return MakeCopyableTxt(terminalTxt, hoverTxt, Integer.toString(copyInt)); } @@ -53,23 +53,24 @@ public class ChatMsg { /// /// @return MutableText of text intended to be used to send to player ///////////////////////////////////////////////////////////////////////////// - public MutableText MakeCopyableTxt(String terminalTxt, String hoverTxt, List expandedList) { - String expanded = "["; + public static MutableText MakeCopyableTxt(String terminalTxt, String hoverTxt, List expandedList) { + StringBuilder expanded = new StringBuilder("["); int index = 0; for (String str : expandedList) { - expanded += str; + expanded.append(str); // Add delimiter if next index is not at size if (++index < expandedList.size()) { - expanded += ","; + expanded.append(","); } } - expanded += "]"; + expanded.append("]"); - return MakeCopyableTxt(terminalTxt, hoverTxt, expanded); + return MakeCopyableTxt(terminalTxt, hoverTxt, expanded.toString()); } + // TODO: This will be added eventually; but requires Mixin black magic // public MutableText MakeClickCallback(MutableText text, ChatMsgClickEvent callback) { // text.styled(style -> style.withClickEvent(callback)); // return text; @@ -89,7 +90,7 @@ public class ChatMsg { /// /// @return MutableText of text intended to be used to send to player ///////////////////////////////////////////////////////////////////////////// - public MutableText MakeCopyableTxt(String terminalTxt, String hoverTxt, String copyStr) { + public static MutableText MakeCopyableTxt(String terminalTxt, String hoverTxt, String copyStr) { Text copyableText = Text.of(terminalTxt); MutableText testTxt = (MutableText) copyableText; testTxt.setStyle(Style.EMPTY.withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, copyStr)) @@ -113,7 +114,7 @@ public class ChatMsg { /// /// @return Formatted string of colored text ///////////////////////////////////////////////////////////////////////////// - public String ColorMsg(Integer msg, COLOR_CODE color) { + public static String ColorMsg(Integer msg, COLOR_CODE color) { regularText = Text.of(ChatFormatting.GetColor(color) + msg + ChatFormatting.COLOR_END); mutableText = (MutableText) regularText; return ChatFormatting.GetColor(color) + msg + ChatFormatting.COLOR_END; @@ -156,7 +157,7 @@ public class ChatMsg { /// /// @return Formatted list of strings ///////////////////////////////////////////////////////////////////////////// - public List ColorMsg(List msg, COLOR_CODE color) { + public static List ColorMsg(List msg, COLOR_CODE color) { List retList = new ArrayList(); for (String str : msg) { @@ -199,18 +200,16 @@ public class ChatMsg { /// /// @return Formatted string of colored text ///////////////////////////////////////////////////////////////////////////// - public String FormatMsg(String helpCmd, COLOR_CODE primaryColor, COLOR_CODE secondaryColor) { - String coloredStr = ChatFormatting.GetColor(primaryColor); + public static String FormatMsg(String helpCmd, COLOR_CODE primaryColor, COLOR_CODE secondaryColor) { + StringBuilder coloredStr = new StringBuilder(ChatFormatting.GetColor(primaryColor)); List splitStr = List.of(helpCmd.split("\\.")); - Boolean isFirst = true; + boolean isFirst = true; for (String str : splitStr) { + coloredStr.append(str); if (isFirst) { - coloredStr += str; isFirst = false; - coloredStr += ChatFormatting.GetColor(secondaryColor); - } else { - coloredStr += str; + coloredStr.append(ChatFormatting.GetColor(secondaryColor)); } } diff --git a/src/main/java/jesse/keeblarcraft/Commands/BankCommands.java b/src/main/java/jesse/keeblarcraft/Commands/BankCommands.java index 8e4a54d..6d6883e 100644 --- a/src/main/java/jesse/keeblarcraft/Commands/BankCommands.java +++ b/src/main/java/jesse/keeblarcraft/Commands/BankCommands.java @@ -14,6 +14,7 @@ import jesse.keeblarcraft.BankMgr.BankManager; import jesse.keeblarcraft.BankMgr.IndividualAccount; import jesse.keeblarcraft.BankMgr.IndividualBank; import jesse.keeblarcraft.BankMgr.BankAccountType.ACCOUNT_TYPE; +import jesse.keeblarcraft.ChatStuff.ChatFormatting; import jesse.keeblarcraft.ChatStuff.ChatFormatting.COLOR_CODE; import jesse.keeblarcraft.ChatStuff.ChatMsg; import jesse.keeblarcraft.ConfigMgr.ConfigManager; @@ -23,39 +24,38 @@ import net.minecraft.text.Text; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; public class BankCommands { - private static List FILLER_WORDS = new ArrayList(List.of("of", "from", "as", "with", "name", "dubbed", "coined", "note")); - private static String HELPCMD_HELP = "help"; - private static String HELPCMD_CREATE = "create"; - private static String HELPCMD_SELECT = "select"; - private static String HELPCMD_CLOSE = "close"; - private static String HELPCMD_REPORT = "report"; - private static String HELPCMD_BALANCE = "balance"; - private static String HELPCMD_EXAMPLES = "examples"; - private static String HELPCMD_MOVE = "move"; - private static String HELPCMD_SYNTAX = "syntax"; - private static String HELPCMD_ALIAS = "alias"; - private static String HELPCMD_WIRE = "wire"; - private static String HELPCMD_ACCOUNTS = "accounts"; - private static String HELPCMD_ADMIN_BALANCE_CHANGE = "admin-set-balance"; - private static String HELPCMD_ADMIN_BALANCE_GET = "admin-get-balance"; - private static String HELPCMD_ADMIN_CREATE_BANK = "admin-create-bank"; - private static String HELPCMD_ADMIN_CLOSE_BANK = "admin-close-bank"; - private static String HELPCMD_ADMIN_FORCE_WIRE = "admin-force-wire"; - private static String HELPCMD_ADMIN_LOCK_BANK = "admin-lock-bank"; - private static String HELPCMD_SET_SERVER_ALLOWANCE = "admin-set-server-allowance"; - private static String HELPCMD_GET_SERVER_ALLOWANCE = "admin-get-server-allowance"; - private static String HELPCMD_ADMIN_COMMANDS_LIST = "admin-commands-list"; - private static String HELPCMD_ADMIN_ACCOUNTS = "admin-accounts"; - private static String HELPCMD_ADMIN_ACCOUNTS_LIST = "admin-accounts-list"; - private static String HELPCMD_ADMIN_ACCOUNTS_MOVE = "admin-accounts-move"; - private static String HELPCMD_ADMIN_ACCOUNTS_FORCE_CLOSE = "admin-accounts-force-close"; - private static String HELPCMD_ADMIN_ACCOUNTS_ADD = "admin-accounts-add"; - private static String HELPCMD_ADMIN_ACCOUNTS_TRANSACTIONS = "admin-accounts-transactions"; - private static String HELPCMD_ADMIN_ACCOUNTS_LOCK = "admin-accounts-lock"; + private static final String HELPCMD_HELP = "help"; + private static final String HELPCMD_CREATE = "create"; + private static final String HELPCMD_SELECT = "select"; + private static final String HELPCMD_CLOSE = "close"; + private static final String HELPCMD_REPORT = "report"; + private static final String HELPCMD_BALANCE = "balance"; + private static final String HELPCMD_EXAMPLES = "examples"; + private static final String HELPCMD_MOVE = "move"; + private static final String HELPCMD_SYNTAX = "syntax"; + private static final String HELPCMD_ALIAS = "alias"; + private static final String HELPCMD_WIRE = "wire"; + private static final String HELPCMD_ACCOUNTS = "accounts"; + private static final String HELPCMD_ADMIN_BALANCE_CHANGE = "admin-set-balance"; + private static final String HELPCMD_ADMIN_BALANCE_GET = "admin-get-balance"; + private static final String HELPCMD_ADMIN_CREATE_BANK = "admin-create-bank"; + private static final String HELPCMD_ADMIN_CLOSE_BANK = "admin-close-bank"; + private static final String HELPCMD_ADMIN_FORCE_WIRE = "admin-force-wire"; + private static final String HELPCMD_ADMIN_LOCK_BANK = "admin-lock-bank"; + private static final String HELPCMD_SET_SERVER_ALLOWANCE = "admin-set-server-allowance"; + private static final String HELPCMD_GET_SERVER_ALLOWANCE = "admin-get-server-allowance"; + private static final String HELPCMD_ADMIN_COMMANDS_LIST = "admin-commands-list"; + private static final String HELPCMD_ADMIN_ACCOUNTS = "admin-accounts"; + private static final String HELPCMD_ADMIN_ACCOUNTS_LIST = "admin-accounts-list"; + private static final String HELPCMD_ADMIN_ACCOUNTS_MOVE = "admin-accounts-move"; + private static final String HELPCMD_ADMIN_ACCOUNTS_FORCE_CLOSE = "admin-accounts-force-close"; + private static final String HELPCMD_ADMIN_ACCOUNTS_ADD = "admin-accounts-add"; + private static final String HELPCMD_ADMIN_ACCOUNTS_TRANSACTIONS = "admin-accounts-transactions"; + private static final String HELPCMD_ADMIN_ACCOUNTS_LOCK = "admin-accounts-lock"; ChatMsg msgFormatter = new ChatMsg(); - private static Map HELP_COMMANDS = Map.ofEntries( + private static final Map HELP_COMMANDS = Map.ofEntries( entry ( HELPCMD_HELP, "Usage: /bank help. This is the general help message for the bank system. For detailed help messages, please run /bank help . List of possible " + @@ -200,7 +200,9 @@ public class BankCommands { // Bank help CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { var bankRoot = CommandManager.literal("bank").build(); - var help = CommandManager.literal("help").build(); + var help = CommandManager.literal("help") + .executes(context -> HelpCommand(context.getSource().getPlayer(), "")) + .build(); var helpTarget = CommandManager.argument("target", StringArgumentType.greedyString()) .executes(context -> HelpCommand(context.getSource().getPlayer(), StringArgumentType.getString(context, "target"))) .build(); @@ -389,11 +391,28 @@ public class BankCommands { bankRoot.addChild(help); help.addChild(helpTarget); }); + + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + var wire = CommandManager.literal("wire").build(); + var account = CommandManager.argument("global_account_id", StringArgumentType.string()).build(); + var amount = CommandManager.argument("amount", IntegerArgumentType.integer()).build(); + var reason = CommandManager.argument("reason", StringArgumentType.greedyString()) + .executes(context -> WireCommand( + context.getSource().getPlayer(), + IntegerArgumentType.getInteger(context, "amount"), + StringArgumentType.getString(context, "global_account_id"), + StringArgumentType.getString(context, "reason") + )) + .build(); + + dispatcher.getRoot().addChild(wire); + wire.addChild(account); + }); } public int SelectBank(ServerPlayerEntity player, String bank) { System.out.println("Select bank called"); - BankManager.GetInstance().ChangeDefaultSelectedBank(player, bank); + BankManager.GetInstance().ChangeDefaultSelectedBank(player, bank.toUpperCase()); return 0; } @@ -407,11 +426,7 @@ public class BankCommands { /// @return True if player is operator, false if not ///////////////////////////////////////////////////////////////////////////// public Boolean IsOperator(ServerPlayerEntity player) { - if (player.hasPermissionLevel(4)) { - return true; - } else { - return false; - } + return player.hasPermissionLevel(4); } public int AdminSubtractMoney(ServerPlayerEntity player, Integer amount, String account, String reason) { @@ -429,10 +444,6 @@ public class BankCommands { return 0; } - public String GetServerAllowance() { - return ""; - } - ///////////////////////////////////////////////////////////////////////////// /// @fn AdminBalanceChange /// @@ -485,9 +496,6 @@ public class BankCommands { } - // Possible code paths: - // REQUIRED = {Routing # or Bank name} - // OPTIONAL = [] ///////////////////////////////////////////////////////////////////////////// /// @fn ManageAccounts /// @@ -503,39 +511,48 @@ public class BankCommands { sourcePlayer.sendMessage(Text.of("[BANK INFO FOR " + bankName.toUpperCase() + "]")); System.out.println("userAccounts size: " + userAccounts.size()); - for (int i = 0; i < userAccounts.size(); i++) { - String accountNumber = userAccounts.get(i).GetAccountNumber(); - String globalAccountNumber = userAccounts.get(i).GetGlobalAccountNumber(); - List accountHolders = userAccounts.get(i).GetAccountHolders(); - Integer accountBalance = userAccounts.get(i).GetAccountBalance(); + for (IndividualAccount userAccount : userAccounts) { + String accountNumber = userAccount.GetAccountNumber(); + String globalAccountNumber = userAccount.GetGlobalAccountNumber(); - String l1 = "ACCOUNT NUMBER: " + msgFormatter.ColorMsg(accountNumber, COLOR_CODE.BLUE); - String l2 = "GLOBAL ACCOUNT NUMBER: " + msgFormatter.ColorMsg(globalAccountNumber, COLOR_CODE.BLUE); - String l3 = "HOLDERS: " + msgFormatter.ColorMsg(accountHolders, COLOR_CODE.GRAY); - String l4 = "BALANCE: " + msgFormatter.ColorMsg(accountBalance, COLOR_CODE.GREEN); + List accountHolders = userAccount.GetAccountHolders(); + Integer accountBalance = userAccount.GetAccountBalance(); + ACCOUNT_TYPE accountType = userAccount.GetAccountType(); - sourcePlayer.sendMessage((Text) msgFormatter.MakeCopyableTxt(l1, "Click to copy", accountNumber)); - sourcePlayer.sendMessage((Text) msgFormatter.MakeCopyableTxt(l2, "Click to copy", globalAccountNumber)); - sourcePlayer.sendMessage((Text) msgFormatter.MakeCopyableTxt(l3, "Click to copy", accountHolders)); - sourcePlayer.sendMessage((Text) msgFormatter.MakeCopyableTxt(l4, "Click to copy", accountBalance)); + String l1 = "ACCOUNT NUMBER: " + ChatMsg.ColorMsg(accountNumber, COLOR_CODE.BLUE); + String l2 = "GLOBAL ACCOUNT NUMBER: " + ChatMsg.ColorMsg(globalAccountNumber, COLOR_CODE.BLUE); + String l3 = "HOLDERS: " + ChatMsg.ColorMsg(accountHolders, COLOR_CODE.GRAY); + String l4 = "ACCOUNT TYPE: " + ChatMsg.ColorMsg(accountType.name(), COLOR_CODE.GRAY); + String l5 = "BALANCE: " + ChatMsg.ColorMsg(accountBalance, COLOR_CODE.GREEN); + + // If this is the default account of the player; we will append a "[SELECTED]" tag on it + boolean isDefaultAccount = BankManager.GetInstance().IsDefaultAccount(sourcePlayer.getUuidAsString(), globalAccountNumber); + if (isDefaultAccount) { + l2 = l2 + ChatMsg.ColorMsg(" [SELECTED]", COLOR_CODE.GREEN); + } + + sourcePlayer.sendMessage((Text) ChatMsg.MakeCopyableTxt(l1, "Click to copy", accountNumber)); + sourcePlayer.sendMessage((Text) ChatMsg.MakeCopyableTxt(l2, "Click to copy", globalAccountNumber)); + sourcePlayer.sendMessage((Text) ChatMsg.MakeCopyableTxt(l3, "Click to copy", accountHolders)); + sourcePlayer.sendMessage((Text) ChatMsg.MakeCopyableTxt(l4, "Click to copy", accountType.name())); + sourcePlayer.sendMessage((Text) ChatMsg.MakeCopyableTxt(l5, "Click to copy", accountBalance)); sourcePlayer.sendMessage(Text.of("\n")); } } else { - sourcePlayer.sendMessage(Text.of(msgFormatter.ColorMsg("That bank does not exist", COLOR_CODE.RED))); + sourcePlayer.sendMessage(Text.of(ChatMsg.ColorMsg("That bank does not exist", COLOR_CODE.RED))); } return 0; } - // TODO: make prettier - public int ListAllBanks(ServerPlayerEntity sourcePlayer) { - sourcePlayer.sendMessage(Text.of("Here is a list of available banks on the server: " + BankManager.GetInstance().GetAllBankNames())); + // Lists out all the banks on the server in a format that the player can read and click to copy + public int ListAllBanks(ServerPlayerEntity player) { + for (String bank : BankManager.GetInstance().GetAllBankNames()) { + String formattedBankName = ChatMsg.ColorMsg(bank, ChatFormatting.COLOR_CODE.BLUE); + player.sendMessage((Text) ChatMsg.MakeCopyableTxt("BANK: " + formattedBankName, "Click to copy bank name", bank)); + } return 0; } - // Possible code paths: - // REQUIRED (path 1) = {AMOUNT} [FROM:{INTERNAL ACCOUNT #|ALIAS}] TO:{INTERNAL ACCOUNT #|ALIAS} ***Note: can be assumed to be SELECTED default if not specified - // REQUIRED (path 2) = {INTERNAL ACCOUNT #|ALIAS} {EXTERNAL BANK/FACTION ID} - // OPTIONAL = [] ///////////////////////////////////////////////////////////////////////////// /// @fn MoveCommand /// @@ -543,95 +560,15 @@ public class BankCommands { /// /// @param[in] argList is the argument list to be parsed /// - /// @brief Command to move account. Read above comment for code paths + /// @brief Not finished in this version of the mod ///////////////////////////////////////////////////////////////////////////// - public int MoveCommand(ServerPlayerEntity sourcePlayer, Integer amount, String fromAccount, String toAccount) { + public int MoveCommand(ServerPlayerEntity player, Integer amount, String fromAccount, String toAccount) { + player.sendMessage(Text.of("This command is not supported in this version. You can accomplish the same thing with /wire though, just make sure you have a default account selected first!")); return 0; } - // Posible code paths: - // REQUIRED = {ACCOUNT-ID|ALIAS} {ALIAS} - // OPTIONAL = [] - ///////////////////////////////////////////////////////////////////////////// - /// @fn AliasCommand - /// - /// @param[in] player is player who ran command - /// - /// @param[in] argList is the argument list to be parsed - /// - /// @brief Aliases an account with a nick name - ///////////////////////////////////////////////////////////////////////////// - public void AliasCommand(ServerPlayerEntity sourcePlayer, List argList) { - - if (argList.size() > 0) { - String newAlias = argList.get(0); - /* - * CALL TO BANKMGR TO SEE IF ALIAS ARG ALREADY EXISTS - */ - } else { - sourcePlayer.sendMessage(Text.of("Unrecognized alias command. Please run \"/bank help ALIAS\" for more information.")); - } - } - - // Possible code paths: - // REQUIRED = {...} valid argList required - // OPTIONAL = [] - // NOTE: This is just a shorthand to get to `/bank create report` - ///////////////////////////////////////////////////////////////////////////// - /// @fn ReportCommand - /// - /// @param[in] player is player who ran command - /// - /// @param[in] argList is the argument list to be parsed - /// - /// @brief Shorthand function call-through to CreateCommand for generating - /// an account(s) report. - ///////////////////////////////////////////////////////////////////////////// - // public void ReportCommand(ServerPlayerEntity sourcePlayer, List argList) { - // if (argList.size() > 0) { - // argList.add(0, "report"); // Since we lose 'report' when we pass it as an alias/passthrough; we just shim it into the first spot - // CreateCommand(sourcePlayer, argList); - // } else { - // sourcePlayer.sendMessage(Text.of("Unrecognized report command. Please run \"/bank help REPORT\" for more information.")); - // } - // } - - // Possible code paths: - // REQUIRED = {} - // OPTIONAL = [identifier|alias] - public int BalanceCommand(ServerPlayerEntity sourcePlayer, List argList) { - String accountToBalance = "default"; - /* - * - * Code here to get default account from player - * - */ - - if (argList.size() == 1) { - /* - * Set accountToBalance here - */ - } - - /* - * Return to player balance here in new chatutil function not yet made - */ - - return 0; - } - - // Possible code paths: - // REQUIRED = {ACCOUNT ID|ALIAS} - // OPTIONAL = [] - public int CloseCommand(ServerPlayerEntity sourcePlayer, String account) { - // if (argList.size() > 0) { - // String accountToClose = argList.get(0); - // /* - // * CALL TO BANKMGR TO DO STUFF - // */ - // } else { - // sourcePlayer.sendMessage(Text.of("Unrecognized close command. Please see \"/bank help CLOSE\" for more information.")); - // } + public int CloseCommand(ServerPlayerEntity player, String account) { + BankManager.GetInstance().InitiateBankAccountClosure(player, account); return 0; } @@ -674,11 +611,11 @@ public class BankCommands { System.out.println("Running help command"); List helpCommand = new ArrayList(Arrays.asList(helpCommandList.split(" "))); - if (helpCommand.size() == 0) { + if (helpCommand.isEmpty()) { // General help command for (Entry helpCmd : HELP_COMMANDS.entrySet()) { - String cmd = msgFormatter.ColorMsg(helpCmd.getKey(), COLOR_CODE.GOLD); - String details = msgFormatter.FormatMsg(helpCmd.getValue(), COLOR_CODE.BLUE, COLOR_CODE.GRAY); + String cmd = ChatMsg.ColorMsg(helpCmd.getKey(), COLOR_CODE.GOLD); + String details = ChatMsg.FormatMsg(helpCmd.getValue(), COLOR_CODE.BLUE, COLOR_CODE.GRAY); sourcePlayer.sendMessage(Text.of(cmd + " --> " + details)); sourcePlayer.sendMessage(Text.of("\n")); @@ -686,23 +623,24 @@ public class BankCommands { } else { // Iterate over list; verifying what commands are found List unknownCmds = new ArrayList(); - for (int i = 0; i < helpCommand.size(); i++) { - String newHelpCmd = helpCommand.get(i); + for (String newHelpCmd : helpCommand) { if (HELP_COMMANDS.containsKey(newHelpCmd)) { // Print help for this specific command - String cmd = msgFormatter.ColorMsg(newHelpCmd, COLOR_CODE.GOLD); - String details = msgFormatter.FormatMsg(HELP_COMMANDS.get(newHelpCmd), COLOR_CODE.BLUE, COLOR_CODE.GRAY); + String cmd = ChatMsg.ColorMsg(newHelpCmd, COLOR_CODE.GOLD); + String details = ChatMsg.FormatMsg(HELP_COMMANDS.get(newHelpCmd), COLOR_CODE.BLUE, COLOR_CODE.GRAY); sourcePlayer.sendMessage(Text.of(cmd + " -> " + details)); - } else { + } else if (!newHelpCmd.isEmpty()){ // Add to unknown list at end unknownCmds.add(newHelpCmd); + } else { + sourcePlayer.sendMessage(Text.of(ChatMsg.ColorMsg("This is the generic help command for the banking system! You should read the dedicated discord channel to figure out how to setup an account. If you want more, you can do '/help {bank command 1} {bank command 2}' if you want a specific help message on that command. Happy taxing!", COLOR_CODE.BLUE))); } } // After all prints have finished tell the player the commands they plugged in that we did not recognize - if (unknownCmds.size() > 0) { - String msg = msgFormatter.ColorMsg("The following commands do not exist or were mispelt: ", COLOR_CODE.RED); + if (!unknownCmds.isEmpty()) { + String msg = ChatMsg.ColorMsg("The following commands do not exist or were mis-pelt: ", COLOR_CODE.RED); sourcePlayer.sendMessage(Text.of(msg + unknownCmds)); } } diff --git a/src/main/java/jesse/keeblarcraft/ConfigMgr/ConfigManager.java b/src/main/java/jesse/keeblarcraft/ConfigMgr/ConfigManager.java index 469d853..9420af9 100644 --- a/src/main/java/jesse/keeblarcraft/ConfigMgr/ConfigManager.java +++ b/src/main/java/jesse/keeblarcraft/ConfigMgr/ConfigManager.java @@ -45,9 +45,7 @@ public class ConfigManager { // Get a File reference to a file that is created on disk private File GetFile(String confFile) { File file = null; - System.out.println("Get file called for " + GLOBAL_CONFIG + confFile); try { - System.out.println("GetFile Cur Dir: " + Paths.get("").toAbsolutePath().toString()); file = new File(GLOBAL_CONFIG + confFile); } catch (Exception e) {} return file; @@ -273,6 +271,13 @@ public class ConfigManager { public void WriteToJsonFile(String fileName, Object data) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); try { + // The FileWriter cannot create objects; so we create parent directories before writing. This may be + // changed in the future + File parent = GetFile(fileName).getParentFile(); + if (!parent.exists()) { + parent.mkdirs(); + } + FileWriter writer = new FileWriter(GetFile(fileName)); gson.toJson(data, writer); writer.flush(); @@ -305,7 +310,7 @@ public class ConfigManager { } public Boolean DoesFileExist(String fileName) { - return GetFile(fileName) != null; + return GetFile(fileName).exists(); } public Boolean DoesDirectoryExist(String dirName) { diff --git a/src/main/java/jesse/keeblarcraft/CustomBlocks/BlockEntities/FactionBlockEntity.java b/src/main/java/jesse/keeblarcraft/CustomBlocks/BlockEntities/FactionBlockEntity.java index e91b482..11ce764 100644 --- a/src/main/java/jesse/keeblarcraft/CustomBlocks/BlockEntities/FactionBlockEntity.java +++ b/src/main/java/jesse/keeblarcraft/CustomBlocks/BlockEntities/FactionBlockEntity.java @@ -186,7 +186,7 @@ public class FactionBlockEntity extends BlockEntity implements ExtendedScreenHan // Slots 2, 4, 6 are DEFENSE/PASSIVE slots // Slot 7 is the special slot reserved EXCLUSIVELY for LEGENDARY Tier only! Legendary CANNOT go in other slots! for (ItemStack item : inventory) { - + System.out.println("Item name: " + item.getName()); } } diff --git a/src/main/java/jesse/keeblarcraft/Utils/Setup.java b/src/main/java/jesse/keeblarcraft/Utils/Setup.java index 1983469..53049a9 100644 --- a/src/main/java/jesse/keeblarcraft/Utils/Setup.java +++ b/src/main/java/jesse/keeblarcraft/Utils/Setup.java @@ -29,7 +29,6 @@ import jesse.keeblarcraft.Utils.CustomExceptions.SETUP_FAILED_EXCEPTION; // If we do not have these, or only partial - then functionality may be disabled for runtime performance public final class Setup { private static Setup static_inst; - private static String GLOBAL_CONFIG = "config/keeblarcraft/"; public Setup() {}