namespace OnekoOnline; class ConfigFile { public readonly string Path; readonly Dictionary ConfigOptions = []; bool OptionChanged = false; const string TopLine = "# OnekoOnline Config File"; public ConfigFile(string path) { Path = path; if (!File.Exists(Path)) { Console.WriteLine("Config file does not exist, creating one."); File.WriteAllText(Path, TopLine); OptionChanged = true; SaveFileDelayed(3000); return; } string[] fileContents = File.ReadAllLines(Path); foreach (string line in fileContents) { if (line[0] == '#' || !line.Contains('=') || line.Length < 3) continue; string key = line[0..line.IndexOf('=')]; string value = line[(line.IndexOf('=')+1)..]; ConfigOptions.Add(key, value); } } public async void SaveFileDelayed(int delayInMilliseconds) { await Task.Delay(delayInMilliseconds); SaveFile(); } public void SaveFile() { if (!OptionChanged) return; List linesToWrite = [TopLine]; foreach (KeyValuePair pair in ConfigOptions.OrderBy(k => k.Key)) linesToWrite.Add(pair.Key + "=" + pair.Value); File.WriteAllLines(Path, linesToWrite); OptionChanged = false; } public T GetValue(string Key, T defaultValue) where T : IConvertible { if (ConfigOptions.TryGetValue(Key, out string? value)) { try { return (T)Convert.ChangeType(value, typeof(T)); } catch { Console.WriteLine($"Config option {Key} is invalid, setting to default."); } } SetValue(Key, defaultValue); return defaultValue; } public string GetValue(string Key, string defaultValue) { if (ConfigOptions.TryGetValue(Key, out string? value)) { return value; } SetValue(Key, defaultValue); return defaultValue; } public void SetValue(string Key, T Value) where T : IConvertible { string? ValueString = Value.ToString(); if (ValueString is null) return; SetValue(Key, ValueString); } public void SetValue(string Key, string Value) { if (ConfigOptions.TryAdd(Key, Value)) { OptionChanged = true; } else if (ConfigOptions[Key] != Value) { ConfigOptions[Key] = Value; OptionChanged = true; } } }