93 lines
2.6 KiB
Java
93 lines
2.6 KiB
Java
|
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<UUID, Account> 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();
|
||
|
}
|
||
|
}
|