diff --git a/SPTInstaller/Helpers/FileHelper.cs b/SPTInstaller/Helpers/FileHelper.cs index cad871a..960b568 100644 --- a/SPTInstaller/Helpers/FileHelper.cs +++ b/SPTInstaller/Helpers/FileHelper.cs @@ -162,54 +162,48 @@ public static class FileHelper } } - private enum PathCheckType + public static bool CheckPathForProblemLocations(string path, out PathCheck failedCheck) { - EndsWith = 0, - Contains = 1, - DriveRoot = 2 - } + failedCheck = new(); - public static bool CheckPathForProblemLocations(string path, out string detectedName) - { - detectedName = ""; - - var problemNames = new Dictionary() + var problemPaths = new List() { - { "Documents", PathCheckType.EndsWith }, - { "Desktop", PathCheckType.Contains }, - { "scoped_dir", PathCheckType.Contains }, - { "Downloads", PathCheckType.Contains }, - { "OneDrive", PathCheckType.Contains }, - { "NextCloud", PathCheckType.Contains }, - { "DropBox", PathCheckType.Contains }, - { "Google", PathCheckType.Contains }, - { "Program Files", PathCheckType.Contains }, - { "Program Files (x86)", PathCheckType.Contains }, - { "Drive Root", PathCheckType.DriveRoot } + new("Documents", PathCheckType.EndsWith, PathCheckAction.Warn), + new("Desktop", PathCheckType.EndsWith, PathCheckAction.Deny), + new("Desktop", PathCheckType.Contains, PathCheckAction.Warn), + new("scoped_dir", PathCheckType.Contains, PathCheckAction.Deny), + new("Downloads", PathCheckType.Contains, PathCheckAction.Deny), + new("OneDrive", PathCheckType.Contains, PathCheckAction.Deny), + new("NextCloud", PathCheckType.Contains, PathCheckAction.Deny), + new("DropBox", PathCheckType.Contains, PathCheckAction.Deny), + new("Google", PathCheckType.Contains, PathCheckAction.Deny), + new("Program Files", PathCheckType.Contains, PathCheckAction.Deny), + new("Program Files (x86", PathCheckType.Contains, PathCheckAction.Deny), + new("Drive Root", PathCheckType.DriveRoot, PathCheckAction.Deny) }; - foreach (var name in problemNames) + foreach (var check in problemPaths) { - switch (name.Value) + switch (check.CheckType) { case PathCheckType.EndsWith: - if (path.ToLower().EndsWith(name.Key.ToLower())) + if (path.ToLower().EndsWith(check.Target.ToLower())) { - detectedName = name.Key; + failedCheck = check; return true; } break; case PathCheckType.Contains: - if (path.ToLower().Contains(name.Key.ToLower())) + if (path.ToLower().Contains(check.Target.ToLower())) { - detectedName = name.Key; + failedCheck = check; return true; } break; case PathCheckType.DriveRoot: if (Regex.Match(path.ToLower(), @"^\w:(\\|\/)$").Success) { - detectedName = name.Key; + failedCheck = check; return true; } break; diff --git a/SPTInstaller/Installer Tasks/ReleaseCheckTask.cs b/SPTInstaller/Installer Tasks/ReleaseCheckTask.cs index 0f0919d..76b60ff 100644 --- a/SPTInstaller/Installer Tasks/ReleaseCheckTask.cs +++ b/SPTInstaller/Installer Tasks/ReleaseCheckTask.cs @@ -60,7 +60,7 @@ public class ReleaseCheckTask : InstallerTaskBase if (comparePatchToAki == null && patchNeedCheck) { - return Result.FromError("No patcher available for your version"); + return Result.FromError("No patcher available for your version. A patcher is usually created within 24 hours of an EFT update.\nYou can join our discord and watch the dev-webhooks channel for '[SPT-AKI/Downgrade-Patches] Release created' to know when a patcher is available"); } _data.PatchNeeded = patchNeedCheck; diff --git a/SPTInstaller/Models/PathCheck.cs b/SPTInstaller/Models/PathCheck.cs new file mode 100644 index 0000000..79042ed --- /dev/null +++ b/SPTInstaller/Models/PathCheck.cs @@ -0,0 +1,32 @@ +namespace SPTInstaller.Models; + +public enum PathCheckType +{ + EndsWith = 0, + Contains = 1, + DriveRoot = 2 +} + +public enum PathCheckAction +{ + Warn = 0, + Deny = 1, +} + +public class PathCheck +{ + public string Target { get; private set; } + public PathCheckType CheckType { get; private set; } + public PathCheckAction CheckAction { get; private set; } + + public PathCheck() + { + } + + public PathCheck(string target, PathCheckType checkType, PathCheckAction checkAction) + { + Target = target; + CheckType = checkType; + CheckAction = checkAction; + } +} \ No newline at end of file diff --git a/SPTInstaller/SPTInstaller.csproj b/SPTInstaller/SPTInstaller.csproj index e7879f0..00fc406 100644 --- a/SPTInstaller/SPTInstaller.csproj +++ b/SPTInstaller/SPTInstaller.csproj @@ -9,8 +9,8 @@ icon.ico Assets\icon.ico Debug;Release;TEST - 2.55 - 2.55 + 2.56 + 2.56 SPT-AKI diff --git a/SPTInstaller/ViewModels/PreChecksViewModel.cs b/SPTInstaller/ViewModels/PreChecksViewModel.cs index a4a255d..12f4724 100644 --- a/SPTInstaller/ViewModels/PreChecksViewModel.cs +++ b/SPTInstaller/ViewModels/PreChecksViewModel.cs @@ -164,19 +164,38 @@ public class PreChecksViewModel : ViewModelBase Task.Run(async () => { - if (FileHelper.CheckPathForProblemLocations(InstallPath, out var detectedName)) + if (FileHelper.CheckPathForProblemLocations(InstallPath, out var failedCheck )) { - await Dispatcher.UIThread.InvokeAsync(async () => - { - Log.Warning("Problem folder detected, confirming install path ..."); - var confirmation = await DialogHost.Show(new ConfirmationDialog($"We suspect you may be installing into a problematic folder: {detectedName}.\nYou might want to consider installing somewhere else to avoid issues.\n\nAre you sure you want to install to this path?\n{InstallPath}")); - - if (confirmation == null || !bool.TryParse(confirmation.ToString(), out var confirm) || !confirm) + switch (failedCheck.CheckAction) { - Log.Information("User declined install path, exiting"); - Environment.Exit(0); + case PathCheckAction.Warn: + { + await Dispatcher.UIThread.InvokeAsync(async () => + { + Log.Warning("Problem path detected, confirming install path ..."); + var confirmation = await DialogHost.Show(new ConfirmationDialog( + $"We suspect you may be installing into a problematic folder: {failedCheck.Target}.\nYou might want to consider installing somewhere else to avoid issues.\n\nAre you sure you want to install to this path?\n{InstallPath}")); + + if (confirmation == null || !bool.TryParse(confirmation.ToString(), out var confirm) || + !confirm) + { + Log.Information("User declined install path, exiting"); + Environment.Exit(0); + } + }); + + break; + } + + case PathCheckAction.Deny: + { + Log.Error("Problem path detected, install denied"); + NavigateTo(new MessageViewModel(HostScreen, Result.FromError($"We suspect you may be installing into a problematic folder: {failedCheck.Target}.\nWe won't be letting you install here. Please move the installer to another folder.\nSuggestion: a folder under your drive root, such as 'C:\\spt\\'\nDenied Path: {InstallPath}"))); + break; + } + default: + throw new ArgumentOutOfRangeException(); } - }); Log.Information("User accepted install path"); }