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 int SAVE_INTERVAL = 60 * 5; // 5 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.SECONDS); } /** * 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() { log.info("Saving accounts..."); for (Account account : ACCOUNTS.values()) { account.save(true); // Save the account } log.info("Saved " + ACCOUNTS.size() + " accounts."); } @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(); } }