192 lines
5.9 KiB
Java
Raw Normal View History

package me.libraryaddict.disguise.utilities.config;
import lombok.Getter;
import me.libraryaddict.disguise.LibsDisguises;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.reflection.ClassGetter;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
/**
* Created by libraryaddict on 31/01/2021.
*/
public class ConfigLoader {
@Getter
private final List<String> configs = new ArrayList<>();
public ConfigLoader() {
for (String s : ClassGetter.getEntriesForPackage(ConfigLoader.class, "configs")) {
if (!s.endsWith(".yml")) {
continue;
}
if (s.endsWith("/disguises.yml") || s.endsWith("/sounds.yml")) {
continue;
}
configs.add(s);
}
}
public void saveMissingConfigs() {
File oldFile = new File(LibsDisguises.getInstance().getDataFolder(), "config.yml");
boolean migrated = oldFile.exists();
for (String config : configs) {
File f = new File(LibsDisguises.getInstance().getDataFolder(), config);
if (f.exists()) {
migrated = false;
continue;
}
saveDefaultConfig(config);
}
if (migrated) {
DisguiseUtilities.getLogger().info("Migrated old config system to new config system");
oldFile.delete();
}
}
public YamlConfiguration loadDefaults() {
YamlConfiguration globalConfig = new YamlConfiguration();
for (String config : configs) {
try {
YamlConfiguration c = new YamlConfiguration();
c.loadFromString(ReflectionManager.getResourceAsString(LibsDisguises.getInstance().getFile(), config));
for (String k : c.getKeys(true)) {
if (c.isConfigurationSection(k)) {
continue;
}
globalConfig.set(k, c.get(k));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
return globalConfig;
}
public YamlConfiguration load() {
YamlConfiguration globalConfig = new YamlConfiguration();
for (String config : configs) {
YamlConfiguration c = YamlConfiguration.loadConfiguration(new File(LibsDisguises.getInstance().getDataFolder(), config));
for (String k : c.getKeys(true)) {
if (c.isConfigurationSection(k)) {
continue;
}
globalConfig.set(k, c.get(k));
}
}
return globalConfig;
}
public void saveDefaultConfigs() {
for (String config : configs) {
saveDefaultConfig(config);
}
File f = new File(LibsDisguises.getInstance().getDataFolder(), "config.yml");
f.delete();
}
public void saveDefaultConfig(String name) {
DisguiseUtilities.getLogger().info("Config " + name + " is out of date (Or missing)! Now refreshing it!");
String ourConfig = ReflectionManager.getResourceAsString(LibsDisguises.getInstance().getFile(), name);
YamlConfiguration savedConfig = null;
File loadFrom = new File(LibsDisguises.getInstance().getDataFolder(), name);
File configFile = loadFrom;
if (!loadFrom.exists()) {
loadFrom = new File(LibsDisguises.getInstance().getDataFolder(), "config.yml");
}
if (loadFrom.exists()) {
savedConfig = YamlConfiguration.loadConfiguration(loadFrom);
} else {
try {
savedConfig = new YamlConfiguration();
savedConfig.loadFromString(ourConfig);
} catch (Exception e) {
e.printStackTrace();
}
}
String[] string = ourConfig.split("\n");
StringBuilder section = new StringBuilder();
for (int i = 0; i < string.length; i++) {
String s = string[i];
if (s.trim().startsWith("#") || !s.contains(":")) {
continue;
}
String rawKey = s.split(":")[0];
if (section.length() > 0) {
int matches = StringUtils.countMatches(rawKey, " ");
int allowed = 0;
for (int a = 0; a < matches; a++) {
allowed = section.indexOf(".", allowed) + 1;
}
section = new StringBuilder(section.substring(0, allowed));
}
String key = (rawKey.startsWith(" ") ? section.toString() : "") + rawKey.trim();
if (savedConfig.isConfigurationSection(key)) {
section.append(key).append(".");
} else if (savedConfig.isSet(key)) {
String rawVal = s.split(":")[1].trim();
Object val = savedConfig.get(key);
if (savedConfig.isString(key) && !rawVal.equals("true") && !rawVal.equals("false")) {
val = "'" + StringEscapeUtils.escapeJava(val.toString().replace(ChatColor.COLOR_CHAR + "", "&")) + "'";
}
string[i] = rawKey + ": " + val;
}
}
try {
if (!configFile.getParentFile().exists()) {
configFile.mkdirs();
}
configFile.delete();
configFile.createNewFile();
try (PrintWriter out = new PrintWriter(configFile)) {
out.write(StringUtils.join(string, "\n"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}