diff --git a/SPTInstaller/Controllers/InstallController.cs b/SPTInstaller/Controllers/InstallController.cs index e2b4b15..54cdfab 100644 --- a/SPTInstaller/Controllers/InstallController.cs +++ b/SPTInstaller/Controllers/InstallController.cs @@ -11,8 +11,10 @@ namespace SPTInstaller.Controllers; public class InstallController { + public event EventHandler RecheckRequested = delegate { }; public event EventHandler TaskChanged = delegate { }; + private bool _installRunning = false; private IPreCheck[] _preChecks { get; set; } private IProgressableTask[] _tasks { get; set; } @@ -20,6 +22,22 @@ public class InstallController { _tasks = tasks; _preChecks = preChecks; + + _preChecks.ForEach(x => x.ReeevaluationRequested += (s, e) => + { + if (s is IPreCheck preCheck) + { + Log.Information($"{preCheck.Name}: requested re-evaluation"); + + if (_installRunning) + { + Log.Warning("Install is running, re-evaluation denied (how did you do this?)"); + return; + } + + RecheckRequested?.Invoke(this, null); + } + }); } public async Task RunPreChecks() @@ -51,6 +69,8 @@ public class InstallController public async Task RunTasks() { + _installRunning = true; + Log.Information("-<>--<>- Running Installer Tasks -<>--<>-"); foreach (var task in _tasks) diff --git a/SPTInstaller/Installer Tasks/PreChecks/EftLauncherPreCheck.cs b/SPTInstaller/Installer Tasks/PreChecks/EftLauncherPreCheck.cs new file mode 100644 index 0000000..f80a919 --- /dev/null +++ b/SPTInstaller/Installer Tasks/PreChecks/EftLauncherPreCheck.cs @@ -0,0 +1,43 @@ +using System.Diagnostics; +using System.Threading.Tasks; +using Serilog; +using SPTInstaller.Models; + +namespace SPTInstaller.Installer_Tasks.PreChecks; + +public class EftLauncherPreCheck : PreCheckBase +{ + public EftLauncherPreCheck() : base("EFT Launcher Closed", true) + { + } + + public async override Task CheckOperation() + { + var eftLauncherProcs = Process.GetProcessesByName("BsgLauncher"); + + return eftLauncherProcs.Length == 0 + ? PreCheckResult.FromSuccess("Eft launcher is closed") + : PreCheckResult.FromError("Eft launcher is open. Please close it to install SPT", + "Kill EFT Launcher Processes", + () => + { + var bsgLauncherProcs = Process.GetProcessesByName("BsgLauncher"); + + foreach (var proc in bsgLauncherProcs) + { + try + { + proc.Kill(); + proc.WaitForExit(); + Log.Information($"Killed Proc: {proc.ProcessName}#{proc.Id}"); + } + catch (Exception ex) + { + Log.Error(ex, $"Failed to kill proc: {proc.ProcessName}#{proc.Id}"); + } + } + + RequestReevaluation(); + }); + } +} \ No newline at end of file diff --git a/SPTInstaller/Interfaces/IPreCheck.cs b/SPTInstaller/Interfaces/IPreCheck.cs index 53e9c0d..c132312 100644 --- a/SPTInstaller/Interfaces/IPreCheck.cs +++ b/SPTInstaller/Interfaces/IPreCheck.cs @@ -10,6 +10,7 @@ public interface IPreCheck public bool IsRequired { get; } public string PreCheckDetails { get; } public StatusSpinner.SpinnerState State { get; set; } + public event EventHandler ReeevaluationRequested; public Task RunCheck(); } \ No newline at end of file diff --git a/SPTInstaller/Models/PreCheckBase.cs b/SPTInstaller/Models/PreCheckBase.cs index 0e1fe0c..6003e2c 100644 --- a/SPTInstaller/Models/PreCheckBase.cs +++ b/SPTInstaller/Models/PreCheckBase.cs @@ -8,6 +8,7 @@ namespace SPTInstaller.Models; public abstract class PreCheckBase : ReactiveObject, IPreCheck { + public event EventHandler ReeevaluationRequested = delegate { }; private string _id; public string Id { @@ -84,6 +85,14 @@ public abstract class PreCheckBase : ReactiveObject, IPreCheck (_, _) => StatusSpinner.SpinnerState.Error }; + /// + /// Request pre-checks to be re-evaluated + /// + public void RequestReevaluation() + { + ReeevaluationRequested?.Invoke(this, null); + } + public async Task RunCheck() { State = StatusSpinner.SpinnerState.Running; diff --git a/SPTInstaller/Program.cs b/SPTInstaller/Program.cs index 8b99ec6..2734524 100644 --- a/SPTInstaller/Program.cs +++ b/SPTInstaller/Program.cs @@ -34,8 +34,8 @@ internal class Program #if !TEST ServiceHelper.Register(); ServiceHelper.Register(); - ServiceHelper.Register(); + ServiceHelper.Register(); ServiceHelper.Register(); ServiceHelper.Register(); diff --git a/SPTInstaller/SPTInstaller.csproj b/SPTInstaller/SPTInstaller.csproj index cfc7ed3..4500b7e 100644 --- a/SPTInstaller/SPTInstaller.csproj +++ b/SPTInstaller/SPTInstaller.csproj @@ -9,8 +9,8 @@ icon.ico Assets\icon.ico Debug;Release;TEST - 2.18 - 2.18 + 2.19 + 2.19 SPT-AKI diff --git a/SPTInstaller/ViewModels/PreChecksViewModel.cs b/SPTInstaller/ViewModels/PreChecksViewModel.cs index 1cbeee0..d87575f 100644 --- a/SPTInstaller/ViewModels/PreChecksViewModel.cs +++ b/SPTInstaller/ViewModels/PreChecksViewModel.cs @@ -79,11 +79,25 @@ public class PreChecksViewModel : ViewModelBase set => this.RaiseAndSetIfChanged(ref _installButtonCheckState, value); } + private void ReCheckRequested(object? sender, EventArgs e) + { + Task.Run(async () => + { + if (sender is InstallController installer) + { + var result = await installer.RunPreChecks(); + AllowInstall = result.Succeeded; + } + }); + } + public PreChecksViewModel(IScreen host) : base(host) { var data = ServiceHelper.Get(); var installer = ServiceHelper.Get(); + installer.RecheckRequested += ReCheckRequested; + InstallButtonText = "Please wait ..."; InstallButtonCheckState = StatusSpinner.SpinnerState.Pending; @@ -158,6 +172,7 @@ public class PreChecksViewModel : ViewModelBase { UpdateInfo.ShowCard = false; Log.Logger.Information("Opening Detailed PreCheck View"); + installer.RecheckRequested -= ReCheckRequested; NavigateTo(new DetailedPreChecksViewModel(HostScreen)); }); diff --git a/SPTInstaller/Views/DetailedPreChecksView.axaml b/SPTInstaller/Views/DetailedPreChecksView.axaml index da142bf..4e3de19 100644 --- a/SPTInstaller/Views/DetailedPreChecksView.axaml +++ b/SPTInstaller/Views/DetailedPreChecksView.axaml @@ -18,7 +18,7 @@ InfoText="{Binding CacheInfoText}" State="{Binding CacheCheckState}" /> -