package de.steamwar.bausystem.configplayer; import de.steamwar.bausystem.linkage.LinkageType; import de.steamwar.bausystem.linkage.Linked; import de.steamwar.sql.UserConfig; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import yapion.hierarchy.output.StringOutput; import yapion.hierarchy.types.YAPIONObject; import yapion.parser.YAPIONParser; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.logging.Level; @Linked(LinkageType.LISTENER) public class Config implements Listener { @Getter private static Config instance; { instance = this; } private final Map playerConfigurations = new HashMap<>(); private static final Map CONFIG_CONVERTER_MAP = new HashMap<>(); public static void addConfigConverter(ConfigConverter configConverter) { CONFIG_CONVERTER_MAP.putIfAbsent(configConverter.version(), configConverter); } @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { get(event.getPlayer()); } @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { save(event.getPlayer()); playerConfigurations.remove(event.getPlayer().getUniqueId()); } /** * Get a PlayerConfig, optionally loads it from the DataBase and migrates it if necessary. * * @param player the player from whom to get the config. * @return the config object */ public YAPIONObject get(Player player) { UUID uuid = player.getUniqueId(); if (!playerConfigurations.containsKey(uuid)) { String s = UserConfig.getConfig(uuid, "bausystem"); YAPIONObject yapionObject; if (s == null) { yapionObject = ConfigCreator.createDefaultConfig(); } else { yapionObject = YAPIONParser.parse(s); } yapionObject = update(yapionObject); playerConfigurations.put(uuid, yapionObject); return yapionObject; } return playerConfigurations.get(uuid); } /** * Save a PlayerConfig, this does not remove the key value mapping from the map. * * @param player the player to save the config. */ public void save(Player player) { UUID uuid = player.getUniqueId(); if (playerConfigurations.containsKey(uuid)) { YAPIONObject yapionObject = playerConfigurations.get(uuid); String string = yapionObject.toYAPION(new StringOutput()).getResult(); UserConfig.updatePlayerConfig(uuid, "bausystem", string); } } private YAPIONObject update(YAPIONObject yapionObject) { int version = yapionObject.getPlainValue("@version"); while (version < ConfigCreator.currentVersion) { ConfigConverter configConverter = CONFIG_CONVERTER_MAP.getOrDefault(version, null); if (configConverter == null) { Bukkit.getLogger().log(Level.SEVERE, "No updater found for version " + version); return ConfigCreator.createDefaultConfig(); } try { configConverter.update(yapionObject); } catch (Exception e) { Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e); return ConfigCreator.createDefaultConfig(); } int newVersion = yapionObject.getPlainValue("@version"); if (version == newVersion) { Bukkit.getLogger().log(Level.SEVERE, "Version Tag was the same after conversion"); return ConfigCreator.createDefaultConfig(); } if (newVersion < version) { Bukkit.getLogger().log(Level.SEVERE, "Version Tag was earlier after conversion"); return ConfigCreator.createDefaultConfig(); } version = newVersion; } return yapionObject; } }