using System.Collections.Generic; using System.IO; using System.Linq; namespace ModpackLauncher.Services; /// /// Pre-seeds Iris's config/iris.properties with a default shader pack /// for fresh installs, so friends launch the game and the recommended shader /// is already on rather than them having to dig through Video Settings. /// /// Respects user choice: if the file already exists with a non-empty /// shaderPack=... entry, we leave it alone -- only fresh installs (or /// installs where Iris has never been opened) get the default. /// public sealed class IrisConfigService { public void SetDefaultShader(string gameDir, string shaderPackFilename) { if (string.IsNullOrWhiteSpace(shaderPackFilename)) return; var configDir = Path.Combine(gameDir, "config"); Directory.CreateDirectory(configDir); var path = Path.Combine(configDir, "iris.properties"); var lines = File.Exists(path) ? File.ReadAllLines(path).ToList() : new List(); // If a shaderPack is already chosen and non-empty (the user picked // something), respect it and bail. var existingShader = lines .Select(l => l.TrimStart()) .Where(l => l.Length > 0 && l[0] != '#') .Select(l => { var i = l.IndexOf('='); return i < 0 ? null : new { Key = l.Substring(0, i).Trim(), Value = l.Substring(i + 1).Trim() }; }) .Where(p => p != null && p.Key.Equals("shaderPack", System.StringComparison.OrdinalIgnoreCase)) .Select(p => p!.Value) .FirstOrDefault(); if (!string.IsNullOrEmpty(existingShader)) return; // No shader set -- write our defaults. Update existing keys in-place if // they exist (e.g. shaderPack="" placeholder), append otherwise. var defaults = new Dictionary(System.StringComparer.OrdinalIgnoreCase) { { "shaderPack", shaderPackFilename }, { "enableShaders", "true" }, }; var seen = new HashSet(System.StringComparer.OrdinalIgnoreCase); for (int i = 0; i < lines.Count; i++) { var trimmed = lines[i].TrimStart(); if (trimmed.Length == 0 || trimmed[0] == '#') continue; var idx = trimmed.IndexOf('='); if (idx < 0) continue; var key = trimmed.Substring(0, idx).Trim(); if (defaults.TryGetValue(key, out var val)) { lines[i] = $"{key}={val}"; seen.Add(key); } } foreach (var (k, v) in defaults) { if (!seen.Contains(k)) lines.Add($"{k}={v}"); } File.WriteAllLines(path, lines); } }