diff --git a/SPTInstaller/CustomControls/Dialogs/WhyCacheThoughDialog.axaml.cs b/SPTInstaller/CustomControls/Dialogs/WhyCacheThoughDialog.axaml.cs index 1a3d4d4..e9435ca 100644 --- a/SPTInstaller/CustomControls/Dialogs/WhyCacheThoughDialog.axaml.cs +++ b/SPTInstaller/CustomControls/Dialogs/WhyCacheThoughDialog.axaml.cs @@ -59,39 +59,8 @@ public partial class WhyCacheThoughDialog : UserControl public void ClearCachedMetaData() { - var cachedMetadata = - new DirectoryInfo(DownloadCacheHelper.CachePath).GetFiles("*.json", SearchOption.TopDirectoryOnly); - - var message = "no cached metadata to remove"; - - if (cachedMetadata.Length == 0) - { - AdditionalInfo = message; - AdditionalInfoColor = "dodgerblue"; - Log.Information(message); - return; - } - - var allDeleted = true; - - foreach (var file in cachedMetadata) - { - try - { - file.Delete(); - file.Refresh(); - if (file.Exists) - { - allDeleted = false; - } - } - catch (Exception ex) - { - Log.Error(ex, $"Failed to delete cached metadata file: {file.Name}"); - } - } - - message = allDeleted ? "cached metadata removed" : "some files could not be removed. Check logs"; + var allDeleted = DownloadCacheHelper.ClearMetadataCache(); + var message = allDeleted ? "cached metadata removed" : "some files could not be removed. Check logs"; AdditionalInfo = message; AdditionalInfoColor = allDeleted ? "green" : "red"; Log.Information(message); diff --git a/SPTInstaller/Helpers/DownloadCacheHelper.cs b/SPTInstaller/Helpers/DownloadCacheHelper.cs index 3843030..1666e71 100644 --- a/SPTInstaller/Helpers/DownloadCacheHelper.cs +++ b/SPTInstaller/Helpers/DownloadCacheHelper.cs @@ -42,6 +42,26 @@ public static class DownloadCacheHelper return DirectorySizeHelper.SizeSuffix(cacheSize); } + + + public static bool ClearMetadataCache() + { + var metaData = new DirectoryInfo(CachePath).GetFiles("*.json", SearchOption.TopDirectoryOnly); + var allDeleted = true; + + foreach (var file in metaData) + { + file.Delete(); + file.Refresh(); + + if (file.Exists) + { + allDeleted = false; + } + } + + return allDeleted; + } /// /// Check if a file in the cache already exists diff --git a/SPTInstaller/Installer Tasks/ReleaseCheckTask.cs b/SPTInstaller/Installer Tasks/ReleaseCheckTask.cs index 37e40d1..ca1a218 100644 --- a/SPTInstaller/Installer Tasks/ReleaseCheckTask.cs +++ b/SPTInstaller/Installer Tasks/ReleaseCheckTask.cs @@ -24,40 +24,70 @@ public class ReleaseCheckTask : InstallerTaskBase SetStatus("Checking SPT Releases", "", null, ProgressStyle.Indeterminate); var progress = new Progress((d) => { SetStatus(null, null, (int)Math.Floor(d)); }); - var SPTReleaseInfoFile = - await DownloadCacheHelper.GetOrDownloadFileAsync("release.json", DownloadCacheHelper.ReleaseMirrorUrl, - progress, DownloadCacheHelper.SuggestedTtl); - if (SPTReleaseInfoFile == null) + ReleaseInfo? sptReleaseInfo = null; + PatchInfo? patchMirrorInfo = null; + + int retries = 1; + + while (retries >= 0) { - return Result.FromError("Failed to download release metadata, try clicking the 'Whats this' button below followed by the 'Clear Metadata cache' button"); + retries--; + + try + { + var sptReleaseInfoFile = + await DownloadCacheHelper.GetOrDownloadFileAsync("release.json", DownloadCacheHelper.ReleaseMirrorUrl, + progress, DownloadCacheHelper.SuggestedTtl); + + if (sptReleaseInfoFile == null) + { + return Result.FromError("Failed to download release metadata, try clicking the 'Whats this' button below followed by the 'Clear Metadata cache' button"); + } + + SetStatus("Checking for Patches", "", null, ProgressStyle.Indeterminate); + + var sptPatchMirrorsFile = + await DownloadCacheHelper.GetOrDownloadFileAsync("mirrors.json", DownloadCacheHelper.PatchMirrorUrl, + progress, DownloadCacheHelper.SuggestedTtl); + + if (sptPatchMirrorsFile == null) + { + return Result.FromError("Failed to download patch mirror data, try clicking the 'Whats this' button below followed by the 'Clear Metadata cache' button"); + } + + sptReleaseInfo = + JsonConvert.DeserializeObject(File.ReadAllText(sptReleaseInfoFile.FullName)); + + patchMirrorInfo = + JsonConvert.DeserializeObject(File.ReadAllText(sptPatchMirrorsFile.FullName)); + + break; + } + catch (Exception ex) + { + if (retries >= 0) + { + SetStatus("Clearing cache and retrying ...", "", null, ProgressStyle.Indeterminate); + await Task.Delay(1000); + DownloadCacheHelper.ClearMetadataCache(); + continue; + } + + return Result.FromError( + $"An error occurred while deserializing SPT or patch data.\n\nMost likely we are uploading a new patch.\nPlease wait and try again in an hour\n\nERROR: {ex.Message}"); + } } - - var SPTReleaseInfo = - JsonConvert.DeserializeObject(File.ReadAllText(SPTReleaseInfoFile.FullName)); - - SetStatus("Checking for Patches", "", null, ProgressStyle.Indeterminate); - - var SPTPatchMirrorsFile = - await DownloadCacheHelper.GetOrDownloadFileAsync("mirrors.json", DownloadCacheHelper.PatchMirrorUrl, - progress, DownloadCacheHelper.SuggestedTtl); - - if (SPTPatchMirrorsFile == null) + + if (sptReleaseInfo == null || patchMirrorInfo == null) { - return Result.FromError("Failed to download patch mirror data, try clicking the 'Whats this' button below followed by the 'Clear Metadata cache' button"); + return Result.FromError( + "Release or mirror info was null. If you are seeing this report it. This should never be hit"); } - - var patchMirrorInfo = - JsonConvert.DeserializeObject(File.ReadAllText(SPTPatchMirrorsFile.FullName)); - - if (SPTReleaseInfo == null || patchMirrorInfo == null) - { - return Result.FromError("An error occurred while deserializing SPT or patch data, try clicking the 'Whats this' button below followed by the 'Clear Metadata cache' button"); - } - - _data.ReleaseInfo = SPTReleaseInfo; + + _data.ReleaseInfo = sptReleaseInfo; _data.PatchInfo = patchMirrorInfo; - int intSPTVersion = int.Parse(SPTReleaseInfo.ClientVersion); + int intSPTVersion = int.Parse(sptReleaseInfo.ClientVersion); int intGameVersion = int.Parse(_data.OriginalGameVersion); // note: it's possible the game version could be lower than the SPT version and still need a patch if the major version numbers change @@ -99,10 +129,10 @@ public class ReleaseCheckTask : InstallerTaskBase if (sptClientIsOutdated) { return Result.FromError( - "Could not find a downgrade patcher for the version of EFT you have installed." + - "\nThis can happen due to one of the following reasons:" + - "\n* Live EFT just updated. The SPT team will create a new patcher within 24 hours, hold tight!" + - "\n* Live EFT just updated. You have not installed it on your computer using your Battlestate Games launcher"); + "Live EFT has recently updated. The SPT team needs to make a new patcher." + + "\n* It's usually made within 24 hours." + + "\n* The patcher is only for turning your EFT files into an older version for SPT to use." + + "\n* This does not mean SPT is being updated to a newer version."); } if (liveClientIsOutdated) @@ -113,7 +143,7 @@ public class ReleaseCheckTask : InstallerTaskBase _data.PatchNeeded = patchNeedCheck; string status = - $"Current Release: {SPTReleaseInfo.ClientVersion} - {(_data.PatchNeeded ? "Patch Available" : "No Patch Needed")}"; + $"Current Release: {sptReleaseInfo.ClientVersion} - {(_data.PatchNeeded ? "Patch Available" : "No Patch Needed")}"; SetStatus(null, status); diff --git a/SPTInstaller/SPTInstaller.csproj b/SPTInstaller/SPTInstaller.csproj index 8d6a127..6c35921 100644 --- a/SPTInstaller/SPTInstaller.csproj +++ b/SPTInstaller/SPTInstaller.csproj @@ -10,8 +10,8 @@ icon.ico Assets\spt_installer.ico Debug;Release;TEST - 2.94 - 2.94 + 2.96 + 2.96 SPT diff --git a/SPTInstaller/ViewModels/PreChecksViewModel.cs b/SPTInstaller/ViewModels/PreChecksViewModel.cs index b09ebc6..8301c2c 100644 --- a/SPTInstaller/ViewModels/PreChecksViewModel.cs +++ b/SPTInstaller/ViewModels/PreChecksViewModel.cs @@ -244,29 +244,44 @@ public class PreChecksViewModel : ViewModelBase InstallButtonCheckState = StatusSpinner.SpinnerState.Running; var progress = new Progress((d) => { }); - - var SPTReleaseInfoFile = - await DownloadCacheHelper.GetOrDownloadFileAsync("release.json", DownloadCacheHelper.ReleaseMirrorUrl, - progress, DownloadCacheHelper.SuggestedTtl); - - if (SPTReleaseInfoFile == null) + + ReleaseInfo? sptReleaseInfo = null; + var retries = 1; + + while (retries >= 0) { - InstallButtonText = "Could not get SPT release metadata"; - InstallButtonCheckState = StatusSpinner.SpinnerState.Error; - return; + retries--; + + try + { + var sptReleaseInfoFile = + await DownloadCacheHelper.GetOrDownloadFileAsync("release.json", DownloadCacheHelper.ReleaseMirrorUrl, + progress, DownloadCacheHelper.SuggestedTtl); + + if (sptReleaseInfoFile == null) + { + InstallButtonText = "Could not get SPT release metadata"; + InstallButtonCheckState = StatusSpinner.SpinnerState.Error; + return; + } + + sptReleaseInfo = + JsonConvert.DeserializeObject(File.ReadAllText(sptReleaseInfoFile.FullName)); + } + catch (Exception) + { + DownloadCacheHelper.ClearMetadataCache(); + } } - - var SPTReleaseInfo = - JsonConvert.DeserializeObject(File.ReadAllText(SPTReleaseInfoFile.FullName)); - - if (SPTReleaseInfo == null) + + if (sptReleaseInfo == null) { InstallButtonText = "Could not parse latest SPT release"; InstallButtonCheckState = StatusSpinner.SpinnerState.Error; return; } - InstallButtonText = $"Start Install: SPT v{SPTReleaseInfo.SPTVersion}"; + InstallButtonText = $"Start Install: SPT v{sptReleaseInfo.SPTVersion}"; InstallButtonCheckState = StatusSpinner.SpinnerState.OK; AllowDetailsButton = true;