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); } Bukkit.getAsyncScheduler().runAtFixedRate(Aetheria.INSTANCE, (task) -> { this.saveAccounts(); }, SAVE_INTERVAL, SAVE_INTERVAL, TimeUnit.MINUTES); } /** * Gets the account for the specified player. * * @param player the player * @return the account */ public static Account getAccount(Player player) { UUID uuid = player.getUniqueId(); if (!ACCOUNTS.containsKey(uuid)) { return registerAccount(player); } return ACCOUNTS.get(uuid); } /** * Checks if an account is already registered for the specified player. * * @param player the player * @return true if the account is already registered, false otherwise */ private boolean accountRegistered(Player player) { return ACCOUNTS.containsKey(player.getUniqueId()); } /** * Registers an account for the specified player. * * @param player the player */ private static Account registerAccount(Player player) { UUID uuid = player.getUniqueId(); Account account = new Account(player); 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) { Player player = event.getPlayer(); if (accountRegistered(player)) { // Account already registered return; } registerAccount(player); } @EventHandler public void onQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); Account account = getAccount(player); account.save(true); ACCOUNTS.remove(player.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 } }