package cc.fascinated.account; import cc.fascinated.Aetheria; import cc.fascinated.utils.io.Config; import cc.fascinated.utils.Manager; import lombok.extern.log4j.Log4j2; import lombok.extern.slf4j.Slf4j; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; 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.io.File; 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); } 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) { return ACCOUNTS.get(uuid); // todo: load account if not found } /** * Registers an account for the specified player. * * @param player the player to register the account for */ private void registerAccount(Player player) { Account account = new Account(player.getUniqueId()); ACCOUNTS.put(player.getUniqueId(), 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 (getAccount(event.getPlayer().getUniqueId()) == null) { registerAccount(event.getPlayer()); } } @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(); } }