public void InsertAfter <TTask>(IQueueableTask afterTask) where TTask : IQueueableTask { var expression = _values.Aggregate <KeyValuePair <string, object>, ExplicitArgsExpression>(null, (current, keyValue) => current == null ? ObjectFactory.Container.With(keyValue.Key).EqualTo(keyValue.Value) : current.With(keyValue.Key).EqualTo(keyValue.Value)); _queueableTaskManager.InsertAfter(expression.GetInstance <TTask>(), afterTask); }
public void InsertAfter <TTask>(IQueueableTask afterTask) where TTask : IQueueableTask { _queueableTaskManager.InsertAfter(_expression.GetInstance <TTask>(), afterTask); }
public override async Task Run(CancellationToken token) { try { // Cast the data instance to InstallUrlAction. var data = Data as InstallUrlAction; if (data == null) { UpdateStatus("Invalid URL supplied.", 100, TaskStatus.Canceled); return; } // Fetch asset information from the PN API. UpdateStatus("Fetching asset information...", 0, TaskStatus.Running); var assetData = await _website.API.GetAsset(data.Id); if (assetData.Type == AssetType.Mod && assetData.Resource.Data.Version == null) { UpdateStatus($"The '{assetData.Name}' mod has not yet been released! Ask the author to release it.", 100, TaskStatus.Canceled); return; } // Download the asset trough the RemoveAssetRepository. UpdateStatus($"Installing {assetData.Type.ToString().ToLower()} '{assetData.Name}'...", 15, TaskStatus.Running); var downloadedAsset = await _remoteAssetRepository.DownloadAsset(assetData); // Store the asset in in the appropriate location. var asset = await _parkitect.Assets.StoreAsset(downloadedAsset); // If the downloaded asset is a mod, add a "compile mod" task to the queue. var modAsset = asset as IModAsset; if (modAsset != null) { _queueableTaskManager.With(modAsset).InsertAfter <CompileModTask>(this); } // Ensure dependencies have been installed. foreach (var dependency in assetData.Dependencies.Data) { // if (!dependency.Required && !InstallOptionalDependencies) // continue; if (_parkitect.Assets.Any(a => a.Id == dependency.Id)) { continue; } // Create install task for the dependency. var installDependencyTask = ObjectFactory.GetInstance <InstallAssetTask>(); installDependencyTask.Data = new InstallUrlAction(dependency.Id); // Insert the install task in the queueable task manager. _queueableTaskManager.InsertAfter(installDependencyTask, this); } // Update the status of the task. UpdateStatus($"Installed {assetData.Type.ToString().ToLower()} '{assetData.Name}'.", 100, TaskStatus.Finished); } catch (Exception e) { UpdateStatus($"Installation failed. {e.Message}", 100, TaskStatus.FinishedWithErrors); } }