Merge pull request 'add eft launcher closed pre-check' (#39) from waffle.lord/SPT-AKI-Installer:master into master

Reviewed-on: CWX/SPT-AKI-Installer#39
This commit is contained in:
IsWaffle 2023-11-09 15:36:40 +00:00
commit 69b662917d
8 changed files with 92 additions and 4 deletions

View File

@ -11,8 +11,10 @@ namespace SPTInstaller.Controllers;
public class InstallController public class InstallController
{ {
public event EventHandler RecheckRequested = delegate { };
public event EventHandler<IProgressableTask> TaskChanged = delegate { }; public event EventHandler<IProgressableTask> TaskChanged = delegate { };
private bool _installRunning = false;
private IPreCheck[] _preChecks { get; set; } private IPreCheck[] _preChecks { get; set; }
private IProgressableTask[] _tasks { get; set; } private IProgressableTask[] _tasks { get; set; }
@ -20,6 +22,22 @@ public class InstallController
{ {
_tasks = tasks; _tasks = tasks;
_preChecks = preChecks; _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<IResult> RunPreChecks() public async Task<IResult> RunPreChecks()
@ -51,6 +69,8 @@ public class InstallController
public async Task<IResult> RunTasks() public async Task<IResult> RunTasks()
{ {
_installRunning = true;
Log.Information("-<>--<>- Running Installer Tasks -<>--<>-"); Log.Information("-<>--<>- Running Installer Tasks -<>--<>-");
foreach (var task in _tasks) foreach (var task in _tasks)

View File

@ -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<PreCheckResult> 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();
});
}
}

View File

@ -10,6 +10,7 @@ public interface IPreCheck
public bool IsRequired { get; } public bool IsRequired { get; }
public string PreCheckDetails { get; } public string PreCheckDetails { get; }
public StatusSpinner.SpinnerState State { get; set; } public StatusSpinner.SpinnerState State { get; set; }
public event EventHandler ReeevaluationRequested;
public Task<IResult> RunCheck(); public Task<IResult> RunCheck();
} }

View File

@ -8,6 +8,7 @@ namespace SPTInstaller.Models;
public abstract class PreCheckBase : ReactiveObject, IPreCheck public abstract class PreCheckBase : ReactiveObject, IPreCheck
{ {
public event EventHandler ReeevaluationRequested = delegate { };
private string _id; private string _id;
public string Id public string Id
{ {
@ -84,6 +85,14 @@ public abstract class PreCheckBase : ReactiveObject, IPreCheck
(_, _) => StatusSpinner.SpinnerState.Error (_, _) => StatusSpinner.SpinnerState.Error
}; };
/// <summary>
/// Request pre-checks to be re-evaluated
/// </summary>
public void RequestReevaluation()
{
ReeevaluationRequested?.Invoke(this, null);
}
public async Task<IResult> RunCheck() public async Task<IResult> RunCheck()
{ {
State = StatusSpinner.SpinnerState.Running; State = StatusSpinner.SpinnerState.Running;

View File

@ -34,8 +34,8 @@ internal class Program
#if !TEST #if !TEST
ServiceHelper.Register<PreCheckBase, NetFramework472PreCheck>(); ServiceHelper.Register<PreCheckBase, NetFramework472PreCheck>();
ServiceHelper.Register<PreCheckBase, NetCore6PreCheck>(); ServiceHelper.Register<PreCheckBase, NetCore6PreCheck>();
ServiceHelper.Register<PreCheckBase, FreeSpacePreCheck>(); ServiceHelper.Register<PreCheckBase, FreeSpacePreCheck>();
ServiceHelper.Register<PreCheckBase, EftLauncherPreCheck>();
ServiceHelper.Register<InstallerTaskBase, InitializationTask>(); ServiceHelper.Register<InstallerTaskBase, InitializationTask>();
ServiceHelper.Register<InstallerTaskBase, ReleaseCheckTask>(); ServiceHelper.Register<InstallerTaskBase, ReleaseCheckTask>();

View File

@ -9,8 +9,8 @@
<PackageIcon>icon.ico</PackageIcon> <PackageIcon>icon.ico</PackageIcon>
<ApplicationIcon>Assets\icon.ico</ApplicationIcon> <ApplicationIcon>Assets\icon.ico</ApplicationIcon>
<Configurations>Debug;Release;TEST</Configurations> <Configurations>Debug;Release;TEST</Configurations>
<AssemblyVersion>2.18</AssemblyVersion> <AssemblyVersion>2.19</AssemblyVersion>
<FileVersion>2.18</FileVersion> <FileVersion>2.19</FileVersion>
<Company>SPT-AKI</Company> <Company>SPT-AKI</Company>
</PropertyGroup> </PropertyGroup>

View File

@ -79,11 +79,25 @@ public class PreChecksViewModel : ViewModelBase
set => this.RaiseAndSetIfChanged(ref _installButtonCheckState, value); 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) public PreChecksViewModel(IScreen host) : base(host)
{ {
var data = ServiceHelper.Get<InternalData?>(); var data = ServiceHelper.Get<InternalData?>();
var installer = ServiceHelper.Get<InstallController?>(); var installer = ServiceHelper.Get<InstallController?>();
installer.RecheckRequested += ReCheckRequested;
InstallButtonText = "Please wait ..."; InstallButtonText = "Please wait ...";
InstallButtonCheckState = StatusSpinner.SpinnerState.Pending; InstallButtonCheckState = StatusSpinner.SpinnerState.Pending;
@ -158,6 +172,7 @@ public class PreChecksViewModel : ViewModelBase
{ {
UpdateInfo.ShowCard = false; UpdateInfo.ShowCard = false;
Log.Logger.Information("Opening Detailed PreCheck View"); Log.Logger.Information("Opening Detailed PreCheck View");
installer.RecheckRequested -= ReCheckRequested;
NavigateTo(new DetailedPreChecksViewModel(HostScreen)); NavigateTo(new DetailedPreChecksViewModel(HostScreen));
}); });

View File

@ -18,7 +18,7 @@
InfoText="{Binding CacheInfoText}" State="{Binding CacheCheckState}" InfoText="{Binding CacheInfoText}" State="{Binding CacheCheckState}"
/> />
<TextBlock Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3" <TextBlock Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2"
Foreground="DodgerBlue" FontWeight="SemiBold" FontSize="16" Foreground="DodgerBlue" FontWeight="SemiBold" FontSize="16"
Text="{Binding InstallPath}" TextWrapping="Wrap" Text="{Binding InstallPath}" TextWrapping="Wrap"
Margin="5" Margin="5"