package net.obnoxint.mcdev.omclib;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.bukkit.entity.Player;
final class PlayerPropertiesManager {
private static final String PLAYER_PROPERTIES_FILE_EXTENSION = ".dat";
private static final String PLAYER_PROPERTIES_FOLDER_NAME = "playerProperties";
private final Map<String, PlayerProperties> playerProperties = new HashMap<>();
private final File playerPropertiesFolder;
PlayerPropertiesManager(final OmcLibPlugin plugin) {
this.playerPropertiesFolder = new File(plugin.getDataFolder(), PLAYER_PROPERTIES_FOLDER_NAME);
init();
}
PlayerProperties getPlayerProperties(final Player player) {
PlayerProperties r = null;
if (player != null) {
final String n = player.getName();
if (!playerProperties.containsKey(n)) {
loadPlayerProperties(n);
}
r = playerProperties.get(n);
}
return r;
}
void storeAllPlayerProperties() {
for (final String n : playerProperties.keySet()) {
storePlayerProperties(n);
}
}
private void init() {
if (!playerPropertiesFolder.exists()) {
playerPropertiesFolder.mkdirs();
}
}
private void loadPlayerProperties(final String name) {
final File f = new File(playerPropertiesFolder, name + PLAYER_PROPERTIES_FILE_EXTENSION);
if (f.exists()) {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new GZIPInputStream(new FileInputStream(f)));
playerProperties.put(name, (PlayerProperties) ois.readObject());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
try {
ois.close();
} catch (NullPointerException | IOException e) {}
} else {
try {
f.createNewFile();
} catch (final IOException e) {
e.printStackTrace();
}
playerProperties.put(name, new PlayerProperties());
storePlayerProperties(name);
}
}
private void storePlayerProperties(final String name) {
final File f = new File(playerPropertiesFolder, name + PLAYER_PROPERTIES_FILE_EXTENSION);
ObjectOutputStream ous;
try {
ous = new ObjectOutputStream(new GZIPOutputStream(new FileOutputStream(f)));
ous.writeObject(playerProperties.get(name));
ous.flush();
ous.close();
} catch (final IOException e) {
e.printStackTrace();
}
}
}