diff --git a/SPTInstaller/Installer Tasks/PreChecks/FreeSpacePreCheck.cs b/SPTInstaller/Installer Tasks/PreChecks/FreeSpacePreCheck.cs index f894265..db3b2c5 100644 --- a/SPTInstaller/Installer Tasks/PreChecks/FreeSpacePreCheck.cs +++ b/SPTInstaller/Installer Tasks/PreChecks/FreeSpacePreCheck.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Linq; +using System.Threading.Tasks; using SPTInstaller.Helpers; using SPTInstaller.Models; @@ -13,13 +14,35 @@ public class FreeSpacePreCheck : PreCheckBase _internalData = internalData; } - public override async Task CheckOperation() + public override async Task CheckOperation() { - if (_internalData.OriginalGamePath is null || _internalData.TargetInstallPath is null) - { - return false; - } + if (_internalData.OriginalGamePath is null) + return PreCheckResult.FromError("Could not find EFT game path"); - return DirectorySizeHelper.CheckAvailableSize(_internalData.OriginalGamePath, _internalData.TargetInstallPath); + if (_internalData.TargetInstallPath is null) + return PreCheckResult.FromError("Could not find install target path"); + + try + { + var eftSourceDirectoryInfo = new DirectoryInfo(_internalData.OriginalGamePath); + var installTargetDirectoryInfo = new DirectoryInfo(_internalData.TargetInstallPath); + + var eftSourceDirSize = DirectorySizeHelper.GetSizeOfDirectory(eftSourceDirectoryInfo); + var availableSize = DriveInfo.GetDrives().FirstOrDefault(d => d.Name.ToLower() == installTargetDirectoryInfo.Root.Name.ToLower())?.AvailableFreeSpace ?? 0; + + var availableSpaceMessage = $"Available Space: {DirectorySizeHelper.SizeSuffix(availableSize, 2)}"; + var requiredSpaceMessage = $"Space Required for EFT Client: {DirectorySizeHelper.SizeSuffix(eftSourceDirSize, 2)}"; + + if (eftSourceDirSize > availableSize) + { + return PreCheckResult.FromError($"Not enough free space on {installTargetDirectoryInfo.Root.Name} to install SPT\n\n{availableSpaceMessage}\n{requiredSpaceMessage}"); + } + + return PreCheckResult.FromSuccess($"There is enough space available on {installTargetDirectoryInfo.Root.Name} to install SPT.\n\n{availableSpaceMessage}\n{requiredSpaceMessage}"); + } + catch (Exception ex) + { + return PreCheckResult.FromException(ex); + } } } \ No newline at end of file diff --git a/SPTInstaller/Installer Tasks/PreChecks/NetCore6PreCheck.cs b/SPTInstaller/Installer Tasks/PreChecks/NetCore6PreCheck.cs index eb7c763..8afb81f 100644 --- a/SPTInstaller/Installer Tasks/PreChecks/NetCore6PreCheck.cs +++ b/SPTInstaller/Installer Tasks/PreChecks/NetCore6PreCheck.cs @@ -10,11 +10,24 @@ public class NetCore6PreCheck : PreCheckBase { } - public override async Task CheckOperation() + public override async Task CheckOperation() { var minRequiredVersion = new Version("6.0.0"); string[] output; + var failedButtonText = "Download .Net Core 6 Desktop Runtime"; + + var failedButtonAction = () => + { + Process.Start(new ProcessStartInfo + { + FileName = "cmd.exe", + UseShellExecute = true, + WindowStyle = ProcessWindowStyle.Hidden, + ArgumentList = { "/C", "start", "https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-6.0.4-windows-x64-installer" } + }); + }; + try { var proc = Process.Start(new ProcessStartInfo() @@ -32,9 +45,11 @@ public class NetCore6PreCheck : PreCheckBase catch (Exception ex) { // TODO: logging - return false; + return PreCheckResult.FromException(ex); } + var highestFoundVersion = new Version("0.0.0"); + foreach (var lineVersion in output) { if (lineVersion.StartsWith("Microsoft.WindowsDesktop.App") && lineVersion.Split(" ").Length > 1) @@ -43,14 +58,16 @@ public class NetCore6PreCheck : PreCheckBase var foundVersion = new Version(stringVerion); - // not fully sure if we should only check for 6.x.x versions or if higher major versions are ok -waffle + // waffle: not fully sure if we should only check for 6.x.x versions or if higher major versions are ok if (foundVersion >= minRequiredVersion) { - return true; + return PreCheckResult.FromSuccess($".Net Core {minRequiredVersion} Desktop Runtime or higher is installed.\n\nInstalled Version: {foundVersion}"); } + + highestFoundVersion = foundVersion > highestFoundVersion ? foundVersion : highestFoundVersion; } } - return false; + return PreCheckResult.FromError($".Net Core Desktop Runtime version {minRequiredVersion} or higher is required.\n\nHighest Version Found: {(highestFoundVersion > new Version("0.0.0") ? highestFoundVersion : "Not Found")}\n\nThis is required to play SPT, but you can install it later if and shouldn't affect the SPT install process.", failedButtonText, failedButtonAction); } } \ No newline at end of file diff --git a/SPTInstaller/Installer Tasks/PreChecks/NetFramework472PreCheck.cs b/SPTInstaller/Installer Tasks/PreChecks/NetFramework472PreCheck.cs index 55c8160..37bd4f2 100644 --- a/SPTInstaller/Installer Tasks/PreChecks/NetFramework472PreCheck.cs +++ b/SPTInstaller/Installer Tasks/PreChecks/NetFramework472PreCheck.cs @@ -1,5 +1,6 @@ using Microsoft.Win32; using SPTInstaller.Models; +using System.Diagnostics; using System.Threading.Tasks; namespace SPTInstaller.Installer_Tasks.PreChecks; @@ -10,7 +11,7 @@ public class NetFramework472PreCheck : PreCheckBase { } - public override async Task CheckOperation() + public override async Task CheckOperation() { try { @@ -18,27 +19,45 @@ public class NetFramework472PreCheck : PreCheckBase var key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full"); + var failedButtonText = "Download .Net Framework 4.7.2"; + + var failedButtonAction = () => + { + Process.Start(new ProcessStartInfo + { + FileName = "cmd.exe", + UseShellExecute = true, + WindowStyle = ProcessWindowStyle.Hidden, + ArgumentList = { "/C", "start", "https://dotnet.microsoft.com/download/dotnet-framework/thank-you/net472-developer-pack-offline-installer" } + }); + }; + if (key == null) { - return false; + return PreCheckResult.FromError("Could not find .Net Framework on system.\n\nThis is required to play SPT, but you can install it later and shouldn't affect the SPT install process.", failedButtonText, failedButtonAction); } var value = key.GetValue("Version"); - if (value != null && value is string versionString) + if (value == null || value is not string versionString) { - var installedVersion = new Version(versionString); - - return installedVersion > minRequiredVersion; + return PreCheckResult.FromError("Something went wrong. This precheck failed for an unknown reason. :("); } - return false; + var installedVersion = new Version(versionString); + + if (installedVersion < minRequiredVersion) + { + return PreCheckResult.FromError($".Net Framework {versionString} is installed, but {minRequiredVersion} or higher is required.\n\nYou can install it later and shouldn't affect the SPT install process.", failedButtonText, failedButtonAction); + } + + return PreCheckResult.FromSuccess($".Net Framework {minRequiredVersion} or higher is installed.\n\nInstalled Version: {installedVersion}"); } catch (Exception ex) { // TODO: log exceptions - return false; + return PreCheckResult.FromException(ex); } } } \ No newline at end of file