From 5e766a8eae813c93964442bd75b3ea570ba4ca68 Mon Sep 17 00:00:00 2001 From: Liam Date: Wed, 3 Apr 2024 19:26:54 +0100 Subject: [PATCH] use expiring map for accounts --- pom.xml | 6 +++++ src/main/java/cc/fascinated/Aetheria.java | 3 ++- .../cc/fascinated/account/AccountManager.java | 23 +++++++++++++------ .../commandspy/CommandSpyManager.java | 3 +++ 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index f6bcf4d..a9470d3 100644 --- a/pom.xml +++ b/pom.xml @@ -171,6 +171,12 @@ 4.9.2 provided + + com.google.guava + guava + 33.1.0-jre + compile + \ No newline at end of file diff --git a/src/main/java/cc/fascinated/Aetheria.java b/src/main/java/cc/fascinated/Aetheria.java index ed3c003..bd3233a 100644 --- a/src/main/java/cc/fascinated/Aetheria.java +++ b/src/main/java/cc/fascinated/Aetheria.java @@ -4,12 +4,12 @@ import cc.fascinated.account.AccountManager; import cc.fascinated.chat.ChatManager; import cc.fascinated.command.CommandManager; import cc.fascinated.commandspy.CommandSpyManager; -import cc.fascinated.commandspy.command.CommandSpyCommand; import cc.fascinated.event.EventManager; import cc.fascinated.metrics.MetricManager; import cc.fascinated.motd.MotdManager; import cc.fascinated.placeholder.PlaceholderManager; import cc.fascinated.playercolor.PlayerColorManager; +import cc.fascinated.renderdistance.RenderDistanceManager; import cc.fascinated.utils.BuildData; import cc.fascinated.worldsize.WorldSizeManager; import lombok.Getter; @@ -49,5 +49,6 @@ public class Aetheria extends JavaPlugin { new ChatManager(); new MotdManager(); new CommandSpyManager(); + new RenderDistanceManager(); } } \ No newline at end of file diff --git a/src/main/java/cc/fascinated/account/AccountManager.java b/src/main/java/cc/fascinated/account/AccountManager.java index 3f95a44..b184fe1 100644 --- a/src/main/java/cc/fascinated/account/AccountManager.java +++ b/src/main/java/cc/fascinated/account/AccountManager.java @@ -10,6 +10,8 @@ import cc.fascinated.utils.DiscordWebhook; import cc.fascinated.utils.Manager; import cc.fascinated.utils.Priority; import cc.fascinated.utils.Style; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.viaversion.viaversion.api.Via; import lombok.extern.log4j.Log4j2; import org.bukkit.Bukkit; @@ -30,7 +32,16 @@ import java.util.concurrent.TimeUnit; public class AccountManager extends Manager implements Listener { private final long SAVE_INTERVAL = 5; // in minutes - private static final Map ACCOUNTS = new HashMap<>(); + private static final Cache ACCOUNTS = CacheBuilder.newBuilder() + .expireAfterAccess(30, TimeUnit.MINUTES) + .removalListener(notification -> { + Account account = (Account) notification.getValue(); + if (account != null) { + account.save(); // Save the account when it is removed from the cache + log.info("Saved account for {} because it was removed from the cache.", account.getName()); + } + }) + .build(); public AccountManager() { CommandManager.registerCommand(new SaveAccountsCommand()); @@ -57,7 +68,7 @@ public class AccountManager extends Manager implements Listener { * @return the account */ public static Account getAccount(UUID uuid) { - return ACCOUNTS.get(uuid); + return ACCOUNTS.getIfPresent(uuid); } /** @@ -67,7 +78,7 @@ public class AccountManager extends Manager implements Listener { * @return true if the account is already registered, false otherwise */ private boolean isAccountLoaded(UUID uuid) { - return ACCOUNTS.containsKey(uuid); + return ACCOUNTS.getIfPresent(uuid) != null; } /** @@ -87,7 +98,8 @@ public class AccountManager extends Manager implements Listener { long before = System.currentTimeMillis(), saved = 0; // The amount of accounts that were saved log.info("Saving accounts..."); - for (Account account : ACCOUNTS.values()) { + for (Map.Entry entry : ACCOUNTS.asMap().entrySet()) { + Account account = entry.getValue(); boolean didSave = account.save(); // Save the account if (didSave) { saved++; @@ -148,13 +160,10 @@ public class AccountManager extends Manager implements Listener { .replace("%player%", event.getPlayer().getName()) .replace("player-color", account.getPlayerColorProfile().getColor().toString()) )); - account.save(); // Save the account - ACCOUNTS.remove(account.getUuid()); // Remove the account from the cache } @Override public void onAetheriaDisable() { saveAccounts(); // Save the accounts to disk - ACCOUNTS.clear(); // Remove the accounts from the cache } } diff --git a/src/main/java/cc/fascinated/commandspy/CommandSpyManager.java b/src/main/java/cc/fascinated/commandspy/CommandSpyManager.java index b3695bb..b752c0e 100644 --- a/src/main/java/cc/fascinated/commandspy/CommandSpyManager.java +++ b/src/main/java/cc/fascinated/commandspy/CommandSpyManager.java @@ -41,6 +41,9 @@ public class CommandSpyManager extends Manager { @Override public void onCommandPreProcess(Account account, PlayerCommandPreprocessEvent event) { for (Account commandSpyAccount : COMMAND_SPY_ENABLED) { + if (account.equals(commandSpyAccount)) { // Don't send the command to the account that executed it + continue; + } commandSpyAccount.sendMessage(Lang.COMMAND_SPY_FORMAT.getAsString() .replace("player-color", account.getPlayerColorProfile().getColor().toString()) .replace("%player%", account.getName())