/// <summary> /// Loads mods into the manager from the location specified by the location manager /// </summary> public static async Task LoadModsAsync(this Manager manager, LocationManager locations) { var dir = locations.GetModDir(); foreach (var subDir in dir.EnumerateDirectories()) { // Directory is only valid if its name is a major version if (AccurateVersion.TryParse(subDir.Name, out var version) && (version.ToMajor() == version)) { var modManager = manager.GetModManager(version); foreach (var fsi in subDir.EnumerateFileSystemInfos()) { var(success, mod) = await Mod.TryLoadAsync(fsi); if (success) { modManager.Add(mod); Log.Verbose($"Successfully loaded mod {mod.Name} version {mod.Version}"); } } // Load state var file = new FileInfo(Path.Combine(subDir.FullName, "mod-list.json")); if (file.Exists) { try { var state = await ModFamilyStateGrouping.FromFileAsync(file); state.ApplyToManager(modManager); Log.Verbose($"Successfully loaded mod list file '{file.FullName}'"); } catch (Exception ex) { Log.Warning(ex, $"Unable to load mod list file '{file.FullName}'"); } } } } }
internal static bool TryParseFileName(string fileName, out string name, out AccurateVersion version) { name = null; version = default; int index = fileName.LastIndexOf('_'); if ((index < 1) || (index >= fileName.Length - 1)) { return(false); } name = fileName.Substring(0, index); if (string.IsNullOrWhiteSpace(name)) { return(false); } var versionString = fileName.Substring(index + 1); return(AccurateVersion.TryParse(versionString, out version)); }