package cc.fascinated.account; import cc.fascinated.Aetheria; import cc.fascinated.utils.Manager; import lombok.extern.log4j.Log4j2; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.server.PluginDisableEvent; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; @Log4j2 public class AccountManager extends Manager { private final long SAVE_INTERVAL = 5; // in minutes private static final Map ACCOUNTS = new HashMap<>(); public AccountManager() { for (Player player : Bukkit.getOnlinePlayers()) { registerAccount(player.getUniqueId()); } Bukkit.getAsyncScheduler().runAtFixedRate(Aetheria.INSTANCE, (task) -> { this.saveAccounts(); }, SAVE_INTERVAL, SAVE_INTERVAL, TimeUnit.MINUTES); } /** * Gets the account for the specified player. * * @param uuid the UUID of the player * @return the account */ public static Account getAccount(UUID uuid) { if (!ACCOUNTS.containsKey(uuid)) { return registerAccount(uuid); } return ACCOUNTS.get(uuid); } /** * Checks if an account is already registered for the specified player. * * @param uuid the UUID of the player * @return true if the account is already registered, false otherwise */ private boolean accountRegistered(UUID uuid) { return ACCOUNTS.containsKey(uuid); } /** * Registers an account for the specified player. * * @param uuid the UUID of the player */ private static Account registerAccount(UUID uuid) { Account account = new Account(uuid); ACCOUNTS.put(uuid, account); return account; } /** * Save all accounts to disk. */ private void saveAccounts() { long before = System.currentTimeMillis(); log.info("Saving accounts..."); for (Account account : ACCOUNTS.values()) { account.save(true); // Save the account } log.info("Saved {} accounts. ({}ms)", ACCOUNTS.size(), System.currentTimeMillis() - before); } @EventHandler public void onJoin(PlayerJoinEvent event) { if (accountRegistered(event.getPlayer().getUniqueId())) { // Account already registered return; } registerAccount(event.getPlayer().getUniqueId()); } @EventHandler public void onQuit(PlayerQuitEvent event) { Account account = getAccount(event.getPlayer().getUniqueId()); account.save(true); ACCOUNTS.remove(event.getPlayer().getUniqueId()); } @EventHandler public void onPluginDisable(PluginDisableEvent event) { if (event.getPlugin() != Aetheria.INSTANCE) { return; } this.saveAccounts(); // Save the accounts to disk ACCOUNTS.clear(); // Remove the accounts from the cache } }