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);
        }
Esempio n. 2
0
 public void InsertAfter <TTask>(IQueueableTask afterTask) where TTask : IQueueableTask
 {
     _queueableTaskManager.InsertAfter(_expression.GetInstance <TTask>(), afterTask);
 }
Esempio n. 3
0
        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);
            }
        }