package com.nisovin.magicspells.util;
import java.io.File;
import java.io.FilenameFilter;
import java.util.List;
import java.util.Set;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import com.nisovin.magicspells.MagicSpells;
public class MagicConfig {
private YamlConfiguration mainConfig;
public MagicConfig(File file) {
this(MagicSpells.plugin);
}
public MagicConfig(MagicSpells plugin) {
try {
File folder = plugin.getDataFolder();
File file = new File(folder, "config.yml");
// load main config
mainConfig = new YamlConfiguration();
if (file.exists()) {
mainConfig.load(file);
}
if (!mainConfig.contains("general")) mainConfig.createSection("general");
if (!mainConfig.contains("mana")) mainConfig.createSection("mana");
if (!mainConfig.contains("spells")) mainConfig.createSection("spells");
// load general
File generalConfigFile = new File(folder, "general.yml");
if (generalConfigFile.exists()) {
YamlConfiguration generalConfig = new YamlConfiguration();
try {
generalConfig.load(generalConfigFile);
Set<String> keys = generalConfig.getKeys(true);
for (String key : keys) {
mainConfig.set("general." + key, generalConfig.get(key));
}
} catch (Exception e) {
MagicSpells.error("Error loading config file general.yml");
MagicSpells.handleException(e);
}
}
// load mana
File manaConfigFile = new File(folder, "mana.yml");
if (manaConfigFile.exists()) {
YamlConfiguration manaConfig = new YamlConfiguration();
try {
manaConfig.load(manaConfigFile);
Set<String> keys = manaConfig.getKeys(true);
for (String key : keys) {
mainConfig.set("mana." + key, manaConfig.get(key));
}
} catch (Exception e) {
MagicSpells.error("Error loading config file mana.yml");
MagicSpells.handleException(e);
}
}
// load no magic zones
File zonesConfigFile = new File(folder, "zones.yml");
if (zonesConfigFile.exists()) {
YamlConfiguration zonesConfig = new YamlConfiguration();
try {
zonesConfig.load(zonesConfigFile);
Set<String> keys = zonesConfig.getKeys(true);
for (String key : keys) {
mainConfig.set("no-magic-zones." + key, zonesConfig.get(key));
}
} catch (Exception e) {
MagicSpells.error("Error loading config file zones.yml");
MagicSpells.handleException(e);
}
}
// load spell configs
for (File spellConfigFile : folder.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.startsWith("spell") && name.endsWith(".yml");
}
})) {
YamlConfiguration spellConfig = new YamlConfiguration();
try {
spellConfig.load(spellConfigFile);
Set<String> keys = spellConfig.getKeys(false);
for (String key : keys) {
if (key.equals("predefined-items")) {
ConfigurationSection sec = mainConfig.getConfigurationSection("general.predefined-items");
if (sec == null) {
sec = mainConfig.createSection("general.predefined-items");
}
for (String itemKey : spellConfig.getConfigurationSection("predefined-items").getKeys(false)) {
sec.set(itemKey, spellConfig.get("predefined-items." + itemKey));
}
} else if (key.equals("variables")) {
ConfigurationSection sec = mainConfig.getConfigurationSection("general.variables");
if (sec == null) {
sec = mainConfig.createSection("general.variables");
}
for (String itemKey : spellConfig.getConfigurationSection("variables").getKeys(false)) {
sec.set(itemKey, spellConfig.get("variables." + itemKey));
}
} else {
mainConfig.set("spells." + key, spellConfig.get(key));
}
}
} catch (Exception e) {
MagicSpells.error("Error loading config file " + spellConfigFile.getName());
MagicSpells.handleException(e);
}
}
// load mini configs
File spellConfigsFolder = new File(folder, "spellconfigs");
if (spellConfigsFolder.exists()) {
loadSpellConfigs(spellConfigsFolder);
}
} catch (Exception ex) {
MagicSpells.handleException(ex);
}
}
private void loadSpellConfigs(File folder) {
YamlConfiguration conf;
String name;
File[] files = folder.listFiles();
for (File file : files) {
if (file.isDirectory()) {
loadSpellConfigs(file);
} else if (file.getName().endsWith(".yml")) {
name = file.getName().replace(".yml", "");
conf = new YamlConfiguration();
try {
conf.load(file);
for(String key : conf.getKeys(false)) {
mainConfig.set("spells." + name + "." + key, conf.get(key));
}
} catch (Exception e) {
MagicSpells.error("Error reading spell config file: " + file.getName());
e.printStackTrace();
}
}
}
}
public boolean isLoaded() {
return (mainConfig.contains("general") && mainConfig.contains("spells"));
}
public boolean contains(String path) {
if (mainConfig.contains(path)) {
return true;
} else {
return false;
}
}
public int getInt(String path, int def) {
return mainConfig.getInt(path, def);
}
public long getLong(String path, long def) {
return mainConfig.getLong(path, def);
}
public double getDouble(String path, double def) {
if (mainConfig.contains(path) && mainConfig.isInt(path)) {
return mainConfig.getInt(path);
} else {
return mainConfig.getDouble(path, def);
}
}
public boolean getBoolean(String path, boolean def) {
return mainConfig.getBoolean(path, def);
}
public boolean isString(String path) {
if (mainConfig.contains(path)) {
return mainConfig.isString(path);
} else {
return false;
}
}
public String getString(String path, String def) {
if (mainConfig.contains(path)) {
return mainConfig.get(path).toString();
} else {
return def;
}
}
public boolean isList(String path) {
if (mainConfig.contains(path)) {
return mainConfig.isList(path);
} else {
return false;
}
}
public List<Integer> getIntList(String path, List<Integer> def) {
if (mainConfig.contains(path)) {
List<Integer> l = mainConfig.getIntegerList(path);
if (l != null) {
return l;
}
}
return def;
}
public List<Byte> getByteList(String path, List<Byte> def) {
if (mainConfig.contains(path)) {
List<Byte> l = mainConfig.getByteList(path);
if (l != null) {
return l;
}
}
return def;
}
public List<String> getStringList(String path, List<String> def) {
if (mainConfig.contains(path)) {
List<String> l = mainConfig.getStringList(path);
if (l != null) {
return l;
}
}
return def;
}
public List<?> getList(String path, List<?> def) {
if (mainConfig.contains(path)) {
List<?> l = mainConfig.getList(path);
if (l != null) {
return l;
}
}
return def;
}
public Set<String> getKeys(String path) {
if (mainConfig.contains(path) && mainConfig.isConfigurationSection(path)) {
return mainConfig.getConfigurationSection(path).getKeys(false);
} else {
return null;
}
}
public boolean isSection(String path) {
if (mainConfig.contains(path)) {
return mainConfig.isConfigurationSection(path);
} else {
return false;
}
}
public ConfigurationSection getSection(String path) {
if (mainConfig.contains(path)) {
return mainConfig.getConfigurationSection(path);
} else {
return null;
}
}
public Set<String> getSpellKeys() {
if (mainConfig != null && mainConfig.contains("spells") && mainConfig.isConfigurationSection("spells")) {
return mainConfig.getConfigurationSection("spells").getKeys(false);
} else {
return null;
}
}
}