package cn.academy.core.config;
import cn.academy.core.AcademyCraft;
import cn.academy.core.network.NetworkManager;
import cn.lambdalib.annoreg.core.Registrant;
import cn.lambdalib.annoreg.mc.RegInitCallback;
import cn.lambdalib.util.generic.RegistryUtils;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.ResourceLocation;
import org.apache.logging.log4j.Logger;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.file.Files;
@Registrant
public final class ACConfig {
private ACConfig() {}
private static Config config;
private static String lastError = null;
private static void __init() {
Logger log = AcademyCraft.log;
ResourceLocation defaultRes = new ResourceLocation("academy:config/default.conf");
Reader reader = new InputStreamReader(RegistryUtils.getResourceStream(defaultRes));
config = ConfigFactory.parseReader(reader);
File customFile = new File("config/academy-craft-data.conf");
if (!customFile.isFile()) {
try {
Files.copy(RegistryUtils.getResourceStream(defaultRes), customFile.toPath());
} catch (IOException ex) {
log.error("Error when copying config template to config folder", ex);
}
}
try {
Config customConfig = ConfigFactory.parseFile(customFile);
config = customConfig.withFallback(config);
} catch (RuntimeException ex) {
log.error("An error occured parsing custom config", ex);
lastError = ex.toString();
}
}
public static void updateConfig(Config cfg)
{
if(cfg==null)
__init();
else
config=cfg;
}
@RegInitCallback
private static void __forceLoadAtInit() {
instance();
FMLCommonHandler.instance().bus().register(new LoginEvents());
}
public static Config instance() {
synchronized (ACConfig.class) {
if (config == null) {
__init();
}
return config;
}
}
/**
* @return Last error, will clear the error storage. null if no error.
*/
public static String fetchLastError() {
String ret = lastError;
lastError = null;
return ret;
}
public static class LoginEvents {
@SubscribeEvent
public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent evt) {
String err = fetchLastError();
if (err != null) {
evt.player.addChatMessage(new ChatComponentTranslation("ac.data_config_parse_fail"));
evt.player.addChatMessage(new ChatComponentTranslation(err));
}
if(!evt.player.worldObj.isRemote)
NetworkManager.sendTo(config, (EntityPlayerMP) evt.player);
}
}
}