/// <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}'");
                        }
                    }
                }
            }
        }
예제 #2
0
        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));
        }