using System; using System.Collections.Generic; using BepInEx.Configuration; using HarmonyLib; namespace CruiseAssist.Commons; internal abstract class ConfigManager { public static ConfigFile Config { get; private set; } protected ConfigManager(ConfigFile config) { _instance = this; Config = config; Config.SaveOnConfigSet = false; } public static void CheckConfig(Step step) { _instance.CheckConfigImplements(step); } protected abstract void CheckConfigImplements(Step step); public static ConfigEntry Bind(ConfigDefinition configDefinition, T defaultValue, ConfigDescription configDescription = null) { return Config.Bind(configDefinition, defaultValue, configDescription); } public static ConfigEntry Bind(string section, string key, T defaultValue, ConfigDescription configDescription = null) { return Config.Bind(section, key, defaultValue, configDescription); } public static ConfigEntry Bind(string section, string key, T defaultValue, string description) { return Config.Bind(section, key, defaultValue, description); } public static ConfigEntry GetEntry(ConfigDefinition configDefinition) { ConfigEntry configEntry; try { configEntry = (ConfigEntry)Config[configDefinition]; } catch (KeyNotFoundException ex) { LogManager.LogError($"{ex.GetType()}: configDefinition={configDefinition}"); throw; } return configEntry; } public static ConfigEntry GetEntry(string section, string key) { return GetEntry(new ConfigDefinition(section, key)); } public static T GetValue(ConfigDefinition configDefinition) { return GetEntry(configDefinition).Value; } public static T GetValue(string section, string key) { return GetEntry(section, key).Value; } public static bool ContainsKey(ConfigDefinition configDefinition) { return Config.ContainsKey(configDefinition); } public static bool ContainsKey(string section, string key) { return Config.ContainsKey(new ConfigDefinition(section, key)); } public static bool UpdateEntry(string section, string key, T value) where T : IComparable { var entry = GetEntry(section, key); var value2 = entry.Value; var flag = value2.CompareTo(value) == 0; bool flag2; if (flag) { flag2 = false; } else { entry.Value = value; flag2 = true; } return flag2; } public static bool RemoveEntry(ConfigDefinition key) { return Config.Remove(key); } public static Dictionary GetOrphanedEntries() { var flag = _orphanedEntries == null; if (flag) { _orphanedEntries = Traverse.Create(Config).Property>("OrphanedEntries").Value; } return _orphanedEntries; } public static void Migration(string newSection, string newKey, T defaultValue, string oldSection, string oldKey) { GetOrphanedEntries(); var configDefinition = new ConfigDefinition(oldSection, oldKey); var flag = _orphanedEntries.TryGetValue(configDefinition, out var text); if (!flag) return; Bind(newSection, newKey, defaultValue).SetSerializedValue(text); _orphanedEntries.Remove(configDefinition); LogManager.LogInfo(string.Concat("migration ", oldSection, ".", oldKey, "(", text, ") => ", newSection, ".", newKey)); } public static void Save(bool clearOrphanedEntries = false) { if (clearOrphanedEntries) { GetOrphanedEntries().Clear(); } Config.Save(); LogManager.LogInfo("save config."); } public static void Clear() { Config.Clear(); } public static void Reload() { Config.Reload(); } private static ConfigManager _instance; private static Dictionary _orphanedEntries; public enum Step { Awake, GameMainBegin, UniverseGenCreateGalaxy, State, ChangeSeed } }