Skip to content

Commit

Permalink
implement individual intervals for payouts
Browse files Browse the repository at this point in the history
  • Loading branch information
mastercake10 committed Sep 21, 2023
1 parent 00ec36d commit 772b46a
Show file tree
Hide file tree
Showing 9 changed files with 231 additions and 121 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public void onJoin(PlayerJoinEvent event){

pending.forEach(k -> {
System.out.println("paying user from pending payout: " + k);
main.pay(event.getPlayer());
main.pay(event.getPlayer(), main.getPayouts().get(k), main.getPluginData().getPlayerData(event.getPlayer()).getPayoutData(k));
});

}
Expand Down
99 changes: 59 additions & 40 deletions Plugin/src/main/java/de/Linus122/TimeIsMoney/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,9 @@
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import de.Linus122.TimeIsMoney.data.MySQLPluginData;
import de.Linus122.TimeIsMoney.data.PlayerData;
import de.Linus122.TimeIsMoney.data.PluginData;
import de.Linus122.TimeIsMoney.data.YamlPluginData;
import de.Linus122.TimeIsMoney.data.*;
import de.Linus122.TimeIsMoney.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Server;
Expand Down Expand Up @@ -172,22 +169,33 @@ public void onEnable() {
}

public void startPlaytimeWatcher() {
String intervalString = getConfig().getString("global_interval", getConfig().getInt("give_money_every_second") + "s");
int globalTimerSeconds = Utils.parseTimeFormat(intervalString);

playtimeWatcherTask = Bukkit.getScheduler().runTaskTimer(this, () -> {
for (Player player : Bukkit.getOnlinePlayers()) {
if (disabledWorlds.contains(player.getWorld().getName())) continue;
PlayerData playerData = this.pluginData.getPlayerData(player);

playerData.setSecondsSinceLastPayout(playerData.getSecondsSinceLastPayout() + 1);
if (playerData.getSecondsSinceLastPayout() >= getConfig().getInt("give_money_every_second")) {
// new payout triggered, handling the payout
pay(player);
for(Payout payout : this.getApplicablePayoutsForPlayer(player)) {
PayoutData playerPayoutData = playerData.getPayoutData(payout.id);
playerPayoutData.setSecondsSinceLastPayout(playerPayoutData.getSecondsSinceLastPayout() + 1);

int intervalSeconds = payout.interval != 0 ? payout.interval : globalTimerSeconds;

if (playerPayoutData.getSecondsSinceLastPayout() >= intervalSeconds) {
// new payout triggered, handling the payout
pay(player, payout, playerPayoutData);

if(this.pluginData instanceof MySQLPluginData) {
// let other servers know of this payout
((MySQLPluginData) this.pluginData).createPendingPayout(player);
if(this.pluginData instanceof MySQLPluginData) {
// let other servers know of this payout
((MySQLPluginData) this.pluginData).createPendingPayout(player);
}
playerPayoutData.setSecondsSinceLastPayout(0);
}
playerData.setSecondsSinceLastPayout(0);
}


}
}, 20L, 20L);
}
Expand Down Expand Up @@ -221,6 +229,7 @@ private void loadPayouts() {
payouts.clear();
for (String key : finalconfig.getConfigurationSection("payouts").getKeys(false)) {
Payout payout = new Payout();
payout.id = Integer.parseInt(key);
payout.max_payout_per_day = finalconfig.getDouble("payouts." + key + ".max_payout_per_day");
payout.payout_amount = finalconfig.getDouble("payouts." + key + ".payout_amount");
if (finalconfig.isSet("payouts." + key + ".permission")) {
Expand All @@ -236,6 +245,10 @@ private void loadPayouts() {
if (finalconfig.isSet("payouts." + key + ".chance")) {
payout.chance = finalconfig.getDouble("payouts." + key + ".chance");
}
if (finalconfig.isSet("payouts." + key + ".interval")) {
// TODO: Add error message when parsing failed
payout.interval = Utils.parseTimeFormat(finalconfig.getString("payouts." + key + ".interval"));
}
payouts.add(payout);
}
logger.info("[TimeIsMoney] &aLoaded " + finalconfig.getConfigurationSection("payouts").getKeys(false).size() + " Payouts!");
Expand Down Expand Up @@ -267,7 +280,32 @@ private boolean setupEconomy() {
private List<Payout> getApplicablePayoutsForPlayer(Player player){
if (!this.getConfig().getBoolean("choose-payout-by-chance")) {
// Choose applicable payouts by permission
return payouts.stream().filter(payout -> player.hasPermission(payout.permission) || payout.permission.length() == 0).collect(Collectors.toList());
List<Payout> payouts_ = payouts.stream().filter(payout -> player.hasPermission(payout.permission) || payout.permission.length() == 0).collect(Collectors.toList());

if(finalconfig.getBoolean("choose-only-one-payout", true)) {
List<Payout> finalPayouts = new ArrayList<>();
// add payouts with a custom timer anyways
finalPayouts.addAll(payouts_.stream().filter(payout -> payout.interval != 0).collect(Collectors.toList()));

// choose the last element of the payouts that does not have a custom timer
List<Payout> payoutsWithoutInterval = payouts_.stream().filter(payout -> payout.interval == 0).collect(Collectors.toList());
finalPayouts.add(payoutsWithoutInterval.get(payoutsWithoutInterval.size() - 1));
return finalPayouts;
} else if(this.getConfig().getBoolean("merge-payouts")) {
// Mering multiple payouts to one
Payout payout = new Payout();
payout.id = 1;
for (Payout payout_ : payouts_) {
if(payout_.interval != 0) {
continue;
}
payout.commands.addAll(payout_.commands);
payout.commands_if_afk.addAll(payout_.commands_if_afk);
payout.payout_amount += payout_.payout_amount;
payout.max_payout_per_day += payout_.max_payout_per_day;
}
}
return payouts_;
}else {
// Get a random payout
Random rnd = new Random();
Expand All @@ -290,34 +328,11 @@ private List<Payout> getApplicablePayoutsForPlayer(Player player){
*
* @param player The player to pay.
*/
public void pay(Player player) {
public void pay(Player player, Payout payout, PayoutData payoutPlayerData) {
if (player == null) return;

PlayerData playerData = this.pluginData.getPlayerData(player);

//REACHED MAX PAYOUT CHECK

List<Payout> applicablePayouts = this.getApplicablePayoutsForPlayer(player);
if (applicablePayouts.size() == 0) {
return;
}

Payout payout = new Payout();

if(this.getConfig().getBoolean("merge-payouts")) {
// Mering multiple payouts to one
for (Payout payout_ : applicablePayouts) {
payout.commands.addAll(payout_.commands);
payout.commands_if_afk.addAll(payout_.commands_if_afk);
payout.payout_amount += payout_.payout_amount;
payout.max_payout_per_day += payout_.max_payout_per_day;
}
}else {
payout = applicablePayouts.get(applicablePayouts.size() - 1);
}

if (payout.max_payout_per_day != -1) {
if (playerData.getReceivedToday() >= payout.max_payout_per_day) { //Reached max payout
if (payoutPlayerData.getReceivedToday() >= payout.max_payout_per_day) { //Reached max payout

if(finalconfig.getBoolean("display-payout-limit-reached-message-once") && payoutLimitReached.contains(player.getUniqueId())) {
return;
Expand Down Expand Up @@ -440,7 +455,7 @@ public void pay(Player player) {
}

//ADD PAYED MONEY
playerData.setReceivedToday(playerData.getReceivedToday() + payout_amt);
payoutPlayerData.setReceivedToday(payoutPlayerData.getReceivedToday() + payout_amt);


lastLocation.put(player.getUniqueId(), player.getLocation());
Expand Down Expand Up @@ -565,4 +580,8 @@ private void sendActionbarReflect(final Player player, final String message) {
public PluginData getPluginData() {
return pluginData;
}

public List<Payout> getPayouts() {
return payouts;
}
}
6 changes: 6 additions & 0 deletions Plugin/src/main/java/de/Linus122/TimeIsMoney/Payout.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
* @since 1.9.6.1
*/
class Payout {
int id;
/**
* The payout amount.
*/
Expand All @@ -34,4 +35,9 @@ class Payout {
* The list of commands to execute if this payout is earned while afk.
*/
List<String> commands_if_afk = new ArrayList<>();

/**
* Interval seconds
*/
int interval = 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,13 @@ public MySQLPluginData(Main main, String host, int port, String username, String
this.plugin.getLogger().info(String.format("MySQL connected!", host, port, database));

// table for the player data
String sqlCreate = "CREATE TABLE IF NOT EXISTS playerData ("
+ " uuid VARCHAR(36) PRIMARY KEY,"
String sqlCreate = "CREATE TABLE IF NOT EXISTS payoutData ("
+ " uuid VARCHAR(36),"
+ " id INT,"
+ " receivedToday DOUBLE,"
+ " secondsSinceLastPayout INTEGER,"
+ " lastPayoutDate DATE)";
+ " lastPayoutDate DATE,"
+ " primary key (uuid, id))";

Statement statement = connection.createStatement();
statement.execute(sqlCreate);
Expand Down Expand Up @@ -73,33 +75,35 @@ public void saveData() {
}

public void savePlayerData(UUID uuid, PlayerData playerData) {
try {
PreparedStatement preparedStatement = connection
.prepareStatement("REPLACE INTO playerData (uuid, receivedToday, secondsSinceLastPayout, lastPayoutDate) VALUES (?, ?, ? ,?)");
preparedStatement.setString(1, uuid.toString());
preparedStatement.setDouble(2, playerData.getReceivedToday());
preparedStatement.setInt(3, playerData.getSecondsSinceLastPayout());
preparedStatement.setDate(4, new java.sql.Date(playerData.getLastPayoutDate().getTime()));

preparedStatement.execute();

} catch (SQLException e) {
e.printStackTrace();
}
playerData.getPayoutDataMap().forEach((payoutID, payoutData) -> {
try {
PreparedStatement preparedStatement = connection
.prepareStatement("REPLACE INTO playerData (uuid, payout_id receivedToday, secondsSinceLastPayout, lastPayoutDate) VALUES (?, ?, ?, ? ,?)");
preparedStatement.setString(1, uuid.toString());
preparedStatement.setInt(1, payoutID);
preparedStatement.setDouble(2, payoutData.getReceivedToday());
preparedStatement.setInt(3, payoutData.getSecondsSinceLastPayout());
preparedStatement.setDate(4, new java.sql.Date(payoutData.getLastPayoutDate().getTime()));

preparedStatement.execute();

} catch (SQLException e) {
e.printStackTrace();
}
});
}

@Override
public void loadData() {

}

private AbstractMap.Entry<UUID, PlayerData> readPlayerData(ResultSet result) throws SQLException {
UUID uuid = UUID.fromString(result.getString("uuid"));
private PayoutData readPayoutData(ResultSet result) throws SQLException {
double receivedToday = result.getDouble("receivedToday");
int secondsOnline = result.getInt("secondsSinceLastPayout");
Date date = new Date(result.getDate("lastPayoutDate").getTime());

return new AbstractMap.SimpleEntry<>(uuid, new PlayerData(receivedToday, date, secondsOnline));
return new PayoutData(receivedToday, date, secondsOnline);
}

@Blocking
Expand All @@ -108,14 +112,16 @@ public PlayerData getPlayerData(@NotNull Player player) {
return playerDataMap.get(player.getUniqueId());
}
try{
PlayerData playerData = new PlayerData();
// get data from DB
ResultSet result = connection.prepareStatement("SELECT * FROM playerData WHERE uuid='" + player.getUniqueId() + "'").executeQuery();
if(result.next()) {
AbstractMap.Entry<UUID, PlayerData> data = this.readPlayerData(result);
playerDataMap.put(data.getKey(), data.getValue());
} else {
// no entry, create new object
playerDataMap.put(player.getUniqueId(), new PlayerData(0, new java.util.Date(), 0));
while(result.next()) {
UUID uuid = UUID.fromString(result.getString("uuid"));
int payoutID = result.getInt("payout_id");

PayoutData payoutData = this.readPayoutData(result);
playerData.getPayoutDataMap().put(payoutID, payoutData);
playerDataMap.put(uuid, playerData);
}
} catch (SQLException e) {
e.printStackTrace();
Expand Down
52 changes: 52 additions & 0 deletions Plugin/src/main/java/de/Linus122/TimeIsMoney/data/PayoutData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package de.Linus122.TimeIsMoney.data;

import org.apache.commons.lang.time.DateUtils;

import java.util.Date;

public class PayoutData {
private double receivedToday = 0d;
private Date lastPayoutDate;
private int secondsSinceLastPayout = 0;

public PayoutData(double receivedToday, Date lastPayoutDate, int secondsSinceLastPayout) {
this.receivedToday = receivedToday;
this.lastPayoutDate = lastPayoutDate;
this.secondsSinceLastPayout = secondsSinceLastPayout;
}

public double getReceivedToday() {
if(lastPayoutDate == null || !DateUtils.isSameDay(lastPayoutDate, new Date())) {
// new day, reset total money received
receivedToday = 0d;
}
return receivedToday;
}


/**
* Sets the total amount of money received for today and updates the {@link #lastPayoutDate} variable to now.
* @param receivedToday Amount of money received today
* @since 1.9.7
*/
public void setReceivedToday(double receivedToday) {
this.receivedToday = receivedToday;
lastPayoutDate = new Date();
}

public int getSecondsSinceLastPayout() {
return secondsSinceLastPayout;
}

public void setSecondsSinceLastPayout(int secondsSinceLastPayout) {
this.secondsSinceLastPayout = secondsSinceLastPayout;
}

public Date getLastPayoutDate() {
return lastPayoutDate;
}

public void setLastPayoutDate(Date lastPayoutDate) {
this.lastPayoutDate = lastPayoutDate;
}
}
Loading

0 comments on commit 772b46a

Please sign in to comment.