/// <summary> /// Downloads mods in an asynchronous fashion. /// </summary> public static async Task DownloadPackagesAsync(IEnumerable <string> modIds, bool includePrerelease, bool includeUnlisted, CancellationToken token = default) { var nugetUtility = IoC.Get <NugetHelper>(); var packages = new List <IPackageSearchMetadata>(); var missingPackages = new List <string>(); /* Get details of every mod. */ foreach (var modId in modIds) { var packageDetails = await nugetUtility.GetPackageDetails(modId, includePrerelease, includeUnlisted, token); if (packageDetails.Any()) { packages.Add(packageDetails.Last()); } else { missingPackages.Add(modId); } } /* Get dependencies of every mod. */ foreach (var package in packages.ToArray()) { var dependencies = await nugetUtility.FindDependencies(package, includePrerelease, includeUnlisted, token); packages.AddRange(dependencies.Dependencies); missingPackages.AddRange(dependencies.PackagesNotFound); } /* Remove already existing packages. */ var allMods = IoC.Get <ManageModsViewModel>().Mods.ToArray(); HashSet <string> allModIds = new HashSet <string>(allMods.Length); foreach (var mod in allMods) { allModIds.Add(mod.ModConfig.ModId); } // Remove mods we already have. packages = packages.Where(x => !allModIds.Contains(x.Identity.Id)).ToList(); missingPackages = missingPackages.Where(x => !allModIds.Contains(x)).ToList(); ActionWrappers.ExecuteWithApplicationDispatcher(() => { var dialog = new NugetFetchPackageDialog(packages, missingPackages); dialog.ShowDialog(); }); }
/// <summary> /// Downloads mods in an asynchronous fashion provided a list of known and missing packages. /// </summary> /// <param name="packages">List of existing known packages.</param> /// <param name="missingPackages">List of packages known to be missing.</param> /// <param name="includePrerelease">Include pre-release packages.</param> /// <param name="includeUnlisted">Include unlisted packages.</param> /// <param name="token">Used to cancel the operation.</param> public static async Task DownloadNuGetPackagesAsync(List <NugetTuple <IPackageSearchMetadata> > packages, List <string> missingPackages, bool includePrerelease, bool includeUnlisted, CancellationToken token = default) { if (!_hasInternetConnection) { return; } /* Get dependencies of every mod. */ foreach (var package in packages.ToArray()) { var repository = package.Repository; var searchResult = await repository.FindDependencies(package.Generic, includePrerelease, includeUnlisted, token); packages.AddRange( searchResult.Dependencies.Select(x => new NugetTuple <IPackageSearchMetadata>(package.Repository, x))); missingPackages.AddRange(searchResult.PackagesNotFound); } /* Remove already existing packages. */ var allMods = IoC.Get <ModConfigService>().Mods.ToArray(); HashSet <string> allModIds = new HashSet <string>(allMods.Length); foreach (var mod in allMods) { allModIds.Add(mod.Config.ModId); } // Remove mods we already have. packages = packages.Where(x => !allModIds.Contains(x.Generic.Identity.Id)).ToList(); missingPackages = missingPackages.Where(x => !allModIds.Contains(x)).ToList(); ActionWrappers.ExecuteWithApplicationDispatcher(() => { var dialog = new NugetFetchPackageDialog(packages, missingPackages); dialog.ShowDialog(); }); }