Skip to content

Commit

Permalink
Completed savings feature
Browse files Browse the repository at this point in the history
added message caching for when messages are sent to offline players
  • Loading branch information
tomhmagic committed Sep 6, 2023
1 parent d7a3655 commit 1ed27e2
Show file tree
Hide file tree
Showing 19 changed files with 391 additions and 145 deletions.
79 changes: 20 additions & 59 deletions src/main/java/com/tanukicraft/townypay/TownyPay.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,35 @@

import com.palmergames.bukkit.towny.TownyAPI;
import com.palmergames.bukkit.towny.TownyCommandAddonAPI;
import com.palmergames.bukkit.towny.exceptions.KeyAlreadyRegisteredException;
import com.palmergames.bukkit.towny.exceptions.TownyException;
import com.palmergames.bukkit.towny.exceptions.initialization.TownyInitException;
import com.palmergames.bukkit.towny.object.Translatable;
import com.palmergames.bukkit.towny.object.TranslationLoader;
import com.palmergames.bukkit.towny.object.metadata.BooleanDataField;
import com.palmergames.bukkit.towny.object.metadata.IntegerDataField;
import com.palmergames.bukkit.util.Colors;
import com.palmergames.bukkit.util.Version;
import com.tanukicraft.townypay.commands.*;
import com.tanukicraft.townypay.listeners.PlayerJoinEventListener;
import com.tanukicraft.townypay.listeners.TownyNewDayEventListener;
import com.tanukicraft.townypay.settings.NationSettings;
import com.tanukicraft.townypay.settings.TownSettings;
import com.tanukicraft.townypay.metadata.MetaDataInit;
import com.tanukicraft.townypay.util.CustomConfig;
import org.bukkit.*;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Objects;


public final class TownyPay extends JavaPlugin {

private File customConfigFile;
private FileConfiguration customConfig;
private static Version requiredTownyVersion = Version.fromString("0.99.5.0");
private static final Version requiredTownyVersion = Version.fromString("0.99.5.0");
private static TownyPay plugin;


Expand All @@ -41,10 +42,11 @@ public static TownyPay getPlugin() {
}



// Called when the plugin first loads.
@Override
public void onLoad() {
loadCustomDataField();
MetaDataInit.loadCustomDataField();
}
@Override
public void onEnable() {
Expand All @@ -66,8 +68,9 @@ public boolean loadAll() {
printArt();
townyVersionCheck();
loadConfig();
createCustomConfig();
//Load languages
loadLocalization(false);
loadLocalization();

//Load commands and listeners
registerCommands();
Expand All @@ -91,7 +94,7 @@ public void createPluginFolder(){
if(!f.exists())
f.mkdir();
}
private void loadLocalization(boolean reload) throws TownyException {
private void loadLocalization() throws TownyException {
try {
Plugin plugin = getPlugin();
Path langFolderPath = Paths.get(plugin.getDataFolder().getPath()).resolve("lang");
Expand All @@ -101,9 +104,6 @@ private void loadLocalization(boolean reload) throws TownyException {
} catch (TownyInitException e) {
throw new TownyException("Locale files failed to load! Disabling!");
}
if (reload) {
info(Translatable.of("msg_reloaded_lang").defaultLocale());
}
}
private void printArt() {
Bukkit.getConsoleSender().sendMessage("");
Expand All @@ -118,6 +118,7 @@ private void printArt() {
private void registerListeners() {
PluginManager pm = Bukkit.getServer().getPluginManager();
pm.registerEvents(new TownyNewDayEventListener(), this);
pm.registerEvents(new PlayerJoinEventListener(), this);
}

private void registerCommands() {
Expand Down Expand Up @@ -147,9 +148,14 @@ private void loadConfig(){
createPluginFolder();
this.saveDefaultConfig();
}
private void createCustomConfig() {
CustomConfig.setup("MessageCache", "yml");
CustomConfig.get().options().copyDefaults(true);
CustomConfig.save();
}

private String getTownyVersion() {
return Bukkit.getPluginManager().getPlugin("Towny").getDescription().getVersion();
return Objects.requireNonNull(Bukkit.getPluginManager().getPlugin("Towny")).getDescription().getVersion();
}
private void townyVersionCheck() throws TownyException{
if (!(Version.fromString(getTownyVersion()).compareTo(requiredTownyVersion) >= 0))
Expand All @@ -163,51 +169,6 @@ public static void info(String message) {
}


// Parts of a datafield

// Use those parts to create a new data field to store an integer
private static IntegerDataField TownyPayBudgetField = new IntegerDataField("TownyPayBudget", 0, "Budget");
private static IntegerDataField TownyPaySpendField = new IntegerDataField("TownyPaySpend", 0, "Spend");
private static IntegerDataField TownyPaySetPayField = new IntegerDataField("TownyPaySetPay", 0, "Pay");
private static BooleanDataField TownyPayToggleField = new BooleanDataField("TownyPayToggle", true, "Pay Toggle");
private static IntegerDataField TownyPaySavingsField = new IntegerDataField("TownyPaySavings", 0, "Savings");
private static IntegerDataField TownyPayHoldingsField = new IntegerDataField("TownyPayHoldings", 0, "Holdings");

private void loadCustomDataField(){
// (Optional) Try to globally register the data field.
// Globally registering data fields allow them to be modified in-game by administrators.
try {
TownyAPI.getInstance().registerCustomDataField(TownyPayBudgetField);
} catch (KeyAlreadyRegisteredException e) {
getLogger().warning(e.getMessage()); // A flag with the same key name already exists try again
}
try {
TownyAPI.getInstance().registerCustomDataField(TownyPaySpendField);
} catch (KeyAlreadyRegisteredException e) {
getLogger().warning(e.getMessage()); // A flag with the same key name already exists try again
}
try {
TownyAPI.getInstance().registerCustomDataField(TownyPaySetPayField);
} catch (KeyAlreadyRegisteredException e) {
getLogger().warning(e.getMessage()); // A flag with the same key name already exists try again
}
try {
TownyAPI.getInstance().registerCustomDataField(TownyPayToggleField);
} catch (KeyAlreadyRegisteredException e) {
getLogger().warning(e.getMessage()); // A flag with the same key name already exists try again
}
try {
TownyAPI.getInstance().registerCustomDataField(TownyPaySavingsField);
} catch (KeyAlreadyRegisteredException e) {
getLogger().warning(e.getMessage()); // A flag with the same key name already exists try again
}
try {
TownyAPI.getInstance().registerCustomDataField(TownyPayHoldingsField);
} catch (KeyAlreadyRegisteredException e) {
getLogger().warning(e.getMessage()); // A flag with the same key name already exists try again
}

getLogger().info("Custom data fields successfully registered!");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,7 @@ public boolean onCommand(CommandSender commandSender, Command command, String s,
//remove the tax from the player
targetRes.getAccount().withdraw(calcTax, String.valueOf(Translatable.of("townypay.nation.BudgetPaymentTaxReason")));
//message the player
Player targetPlayer = targetRes.getPlayer();
MessageUtil.sendPlayerMsg(targetPlayer,Translatable.of("townypay.general.PaymentReceived",senderNation, pay, tax));
MessageUtil.sendResidentMsg(targetRes,Translatable.of("townypay.general.PaymentReceived",senderNation, pay, tax));
//message the sender
MessageUtil.sendMsg(commandSender,Translatable.of("townypay.general.PaymentSend", targetRes, pay));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,20 @@

import java.util.Collections;
import java.util.List;
import java.util.Objects;


public class ResidentPayAddon extends BaseCommand implements CommandExecutor, TabCompleter {
@Override
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings){
Resident res = TownyAPI.getInstance().getResident((Player) commandSender);
assert res != null;
if (res.hasPermissionNode("townypay.command.resident.pay")) { //check for perm

String target = null;
try {
target = TownyAPI.getInstance().getResident(strings[0]).toString();
} catch (Exception e) {
target = Objects.requireNonNull(TownyAPI.getInstance().getResident(strings[0])).toString();
} catch (Exception ignored) {
}
if(strings.length == 2){ //check player and value was given
if (target == null) { //if no valid player was given
Expand Down Expand Up @@ -55,7 +58,9 @@ public boolean onCommand(CommandSender commandSender, Command command, String s,
return false;
} else { //pay given player

assert targetRes != null;
Town targetTown = GeneralUtil.getTown(targetRes);
assert senderRes != null;
Town senderTown = GeneralUtil.getTown(senderRes);
Nation targetNation = GeneralUtil.getNation(targetRes);
Nation senderNation = GeneralUtil.getNation(senderRes);
Expand All @@ -67,16 +72,16 @@ public boolean onCommand(CommandSender commandSender, Command command, String s,
}
}

double calcTax = (pay / 100) * tax;
double calcTax = ((double) pay / 100) * tax;

//send money
senderRes.getAccount().payTo(pay, targetRes.getAccount(), String.valueOf(Translatable.of("townypay.Resident.PaymentReason")));

//remove the tax from the player
targetRes.getAccount().withdraw(calcTax, String.valueOf(Translatable.of("townypay.Resident.PaymentTaxReason")));
//message the player
Player targetPlayer = targetRes.getPlayer();
MessageUtil.sendPlayerMsg(targetPlayer,Translatable.of("townypay.general.PaymentReceived",senderRes, pay, tax));
MessageUtil.sendResidentMsg(targetRes,Translatable.of("townypay.general.PaymentReceived",senderRes, pay, tax));

//message the sender
MessageUtil.sendMsg(commandSender,Translatable.of("townypay.general.PaymentSend", targetRes, pay));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,6 @@ public class ResidentSavingsAddon extends BaseCommand implements CommandExecutor
@Override
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) {
Resident res = TownyAPI.getInstance().getResident((Player) commandSender);
commandSender.sendMessage("DEBUG: length = " + strings.length);
commandSender.sendMessage("DEBUG: arg0 = " + strings[0]);
//commandSender.sendMessage("DEBUG: arg1 = " + strings[1]);
commandSender.sendMessage("DEBUG: s???? = " + s);
assert res != null;
if (res.hasPermissionNode("townypay.command.resident.savings")) {

Expand All @@ -36,12 +32,10 @@ public boolean onCommand(CommandSender commandSender, Command command, String s,
switch (arg) {
case "info":
sendSavingsInfo(commandSender, res);
commandSender.sendMessage("DEBUG: info section");
break;
case "deposit":
if (!GeneralUtil.isNotInteger(strings[1])) {
amount = Integer.parseInt(strings[1]);
commandSender.sendMessage("DEBUG: deposit section");
savingsDeposit(commandSender, res, amount);
} else {
MessageUtil.sendErrorMsg(commandSender, Translatable.of("townypay.general.ValueError"));
Expand All @@ -50,7 +44,6 @@ public boolean onCommand(CommandSender commandSender, Command command, String s,
case "withdraw":
if (!GeneralUtil.isNotInteger(strings[1])) {
amount = Integer.parseInt(strings[1]);
commandSender.sendMessage("DEBUG: withdraw section");
savingsWithdraw(commandSender, res, amount);
} else {
MessageUtil.sendErrorMsg(commandSender, Translatable.of("townypay.general.ValueError"));
Expand Down Expand Up @@ -89,6 +82,7 @@ private void savingsDeposit(CommandSender sender, Resident resident, int amount)
} else {
int newHoldings = currentHoldings + amount;
SavingsMetaDataController.setHoldingsData(resident,newHoldings);
resident.getAccount().withdraw(amount, String.valueOf(Translatable.of("townypay.Savings.Deposit")));
MessageUtil.sendMsg(sender, Translatable.of("townypay.Resident.Savings.Deposit", amount, newHoldings));
}
}
Expand All @@ -103,7 +97,8 @@ private void savingsWithdraw(CommandSender sender, Resident resident, int amount
int newSavings = currentSavings - amount;

SavingsMetaDataController.setSavingsData(resident,newSavings);
resident.getAccount().withdraw(amount, String.valueOf(Translatable.of("townypay.Resident.Savings.Withdraw")));
resident.getAccount().deposit(amount, String.valueOf(Translatable.of("townypay.Savings.Withdraw")));
MessageUtil.sendMsg(sender, Translatable.of("townypay.Resident.Savings.Withdraw", amount, newSavings));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,7 @@ public boolean onCommand(CommandSender commandSender, Command command, String s,
//remove the tax from the player
targetRes.getAccount().withdraw(calcTax, String.valueOf(Translatable.of("townypay.town.BudgetPaymentTaxReason")));
//message the player
Player targetPlayer = targetRes.getPlayer();
MessageUtil.sendPlayerMsg(targetPlayer,Translatable.of("townypay.general.PaymentReceived",senderTown, pay, tax));
MessageUtil.sendResidentMsg(targetRes,Translatable.of("townypay.general.PaymentReceived",senderTown, pay, tax));
//message the sender
MessageUtil.sendMsg(commandSender,Translatable.of("townypay.general.PaymentSend", targetRes, pay));

Expand Down
16 changes: 12 additions & 4 deletions src/main/java/com/tanukicraft/townypay/functions/PayFunctions.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public static void payMayors() {
MessageUtil.logStatus(Translatable.of("townypay.status.log.mayorpay.start"));

for (Town town : towns) {
Boolean enabled = true;
boolean enabled = true;

if (MayorPayMetaDataController.hasToggleData(town)) {
enabled = MayorPayMetaDataController.getToggleData(town);
Expand All @@ -41,7 +41,8 @@ public static void payMayors() {
double bal = town.getAccount().getHoldingBalance();
double profit = GeneralUtil.calcProfit(bal, upkeep, townProfitCalc);
if (TownSettings.canSetPay()) {
if (!MayorPayMetaDataController.hasPayData(town)) {
String stringCheck = String.valueOf(MayorPayMetaDataController.getPayData(town));
if (!MayorPayMetaDataController.hasPayData(town) || !GeneralUtil.isNotInteger(stringCheck)) {
MayorPayMetaDataController.setPayData(town, TownSettings.getPayValue());
}
mayorPay = MayorPayMetaDataController.getPayData(town);
Expand All @@ -66,6 +67,9 @@ public static void payMayors() {
assert player != null;
player.withdraw(taxFloor, String.valueOf(Translatable.of("townypay.town.PayTaxReason")));

//Message Mayor
MessageUtil.sendResidentMsg(town.getMayor(),Translatable.of("townypay.town.PayMsg", payFloor, taxFloor));

MessageUtil.logStatus(Translatable.of("townypay.status.log.mayorpay", town, payFloor, player.getName(), taxFloor));
} else {
MessageUtil.logStatus(Translatable.of("townypay.status.log.nobalance.town", town));
Expand All @@ -91,7 +95,7 @@ public static void payKings() {
MessageUtil.logStatus(Translatable.of("townypay.status.log.kingpay.start"));

for (Nation nation : nations) {
Boolean enabled = true;
boolean enabled = true;

if (KingPayMetaDataController.hasToggleData(nation)) {
enabled = KingPayMetaDataController.getToggleData(nation);
Expand All @@ -103,7 +107,8 @@ public static void payKings() {
double profit = GeneralUtil.calcProfit(bal, upkeep, nationProfitCalc);
if (enabled) {
if (TownSettings.canSetPay()) {
if (!KingPayMetaDataController.hasPayData(nation)) {
String stringCheck = String.valueOf(KingPayMetaDataController.getPayData(nation));
if (!KingPayMetaDataController.hasPayData(nation) || !GeneralUtil.isNotInteger(stringCheck)) {
KingPayMetaDataController.setPayData(nation, TownSettings.getPayValue());
}
kingPay = KingPayMetaDataController.getPayData(nation);
Expand All @@ -129,6 +134,9 @@ public static void payKings() {
assert player != null;
player.withdraw(taxFloor, String.valueOf(Translatable.of("townypay.nation.PayTaxReason")));

//Message Mayor
MessageUtil.sendResidentMsg(nation.getKing(),Translatable.of("townypay.nation.PayMsg", payFloor, taxFloor));

MessageUtil.logStatus(Translatable.of("townypay.status.log.kingpay", nation, payFloor, player.getName(), taxFloor));
} else {
MessageUtil.logStatus(Translatable.of("townypay.status.log.nobalance.nation", nation));
Expand Down
Loading

0 comments on commit 1ed27e2

Please sign in to comment.