diff options
-rw-r--r-- | src/Ryujinx.Ava/UI/ViewModels/AmiiboWindowViewModel.cs | 76 | ||||
-rw-r--r-- | src/Ryujinx/Ui/Windows/AmiiboWindow.cs | 77 |
2 files changed, 90 insertions, 63 deletions
diff --git a/src/Ryujinx.Ava/UI/ViewModels/AmiiboWindowViewModel.cs b/src/Ryujinx.Ava/UI/ViewModels/AmiiboWindowViewModel.cs index 83624f5f..c41e8bcc 100644 --- a/src/Ryujinx.Ava/UI/ViewModels/AmiiboWindowViewModel.cs +++ b/src/Ryujinx.Ava/UI/ViewModels/AmiiboWindowViewModel.cs @@ -188,35 +188,61 @@ namespace Ryujinx.Ava.UI.ViewModels _httpClient.Dispose(); } - private async Task LoadContentAsync() + private bool TryGetAmiiboJson(string json, out AmiiboJson amiiboJson) { - string amiiboJsonString = DefaultJson; + try + { + amiiboJson = JsonHelper.Deserialize<AmiiboJson>(json, _serializerContext.AmiiboJson); - if (File.Exists(_amiiboJsonPath)) + return true; + } + catch { - amiiboJsonString = await File.ReadAllTextAsync(_amiiboJsonPath); + amiiboJson = JsonHelper.Deserialize<AmiiboJson>(DefaultJson, _serializerContext.AmiiboJson); - if (await NeedsUpdate(JsonHelper.Deserialize(amiiboJsonString, _serializerContext.AmiiboJson).LastUpdated)) + return false; + } + } + + private async Task<AmiiboJson> GetMostRecentAmiiboListOrDefaultJson() + { + bool localIsValid = false; + bool remoteIsValid = false; + AmiiboJson amiiboJson = JsonHelper.Deserialize<AmiiboJson>(DefaultJson, _serializerContext.AmiiboJson); + + try + { + localIsValid = TryGetAmiiboJson(File.ReadAllText(_amiiboJsonPath), out amiiboJson); + + if (!localIsValid || await NeedsUpdate(amiiboJson.LastUpdated)) { - amiiboJsonString = await DownloadAmiiboJson(); + remoteIsValid = TryGetAmiiboJson(await DownloadAmiiboJson(), out amiiboJson); } } - else + catch { - try + if (!(localIsValid || remoteIsValid)) { - amiiboJsonString = await DownloadAmiiboJson(); + // Neither local or remote files are valid JSON, close window. + ShowInfoDialog(); + Close(); } - catch (Exception ex) + else if (!remoteIsValid) { - Logger.Error?.Print(LogClass.Application, $"Failed to download amiibo data: {ex}"); - + // Only the local file is valid, the local one should be used + // but the user should be warned. ShowInfoDialog(); } } - _amiiboList = JsonHelper.Deserialize(amiiboJsonString, _serializerContext.AmiiboJson).Amiibo; - _amiiboList = _amiiboList.OrderBy(amiibo => amiibo.AmiiboSeries).ToList(); + return amiiboJson; + } + + private async Task LoadContentAsync() + { + AmiiboJson amiiboJson = await GetMostRecentAmiiboListOrDefaultJson(); + + _amiiboList = amiiboJson.Amiibo.OrderBy(amiibo => amiibo.AmiiboSeries).ToList(); ParseAmiiboData(); } @@ -362,26 +388,14 @@ namespace Ryujinx.Ava.UI.ViewModels private async Task<bool> NeedsUpdate(DateTime oldLastModified) { - try - { - HttpResponseMessage response = - await _httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, "https://amiibo.ryujinx.org/")); - - if (response.IsSuccessStatusCode) - { - return response.Content.Headers.LastModified != new DateTimeOffset(oldLastModified.Ticks - (oldLastModified.Ticks % TimeSpan.TicksPerSecond), TimeSpan.Zero); - } + HttpResponseMessage response = await _httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, "https://amiibo.ryujinx.org/")); - return false; - } - catch (Exception ex) + if (response.IsSuccessStatusCode) { - Logger.Error?.Print(LogClass.Application, $"Failed to check for amiibo updates: {ex}"); - - ShowInfoDialog(); - - return false; + return response.Content.Headers.LastModified != oldLastModified; } + + return false; } private async Task<string> DownloadAmiiboJson() diff --git a/src/Ryujinx/Ui/Windows/AmiiboWindow.cs b/src/Ryujinx/Ui/Windows/AmiiboWindow.cs index f9e4da59..2673f912 100644 --- a/src/Ryujinx/Ui/Windows/AmiiboWindow.cs +++ b/src/Ryujinx/Ui/Windows/AmiiboWindow.cs @@ -72,37 +72,61 @@ namespace Ryujinx.Ui.Windows _ = LoadContentAsync(); } - private async Task LoadContentAsync() + private bool TryGetAmiiboJson(string json, out AmiiboJson amiiboJson) + { + try + { + amiiboJson = JsonHelper.Deserialize<AmiiboJson>(json, _serializerContext.AmiiboJson); + + return true; + } + catch + { + amiiboJson = JsonHelper.Deserialize<AmiiboJson>(DefaultJson, _serializerContext.AmiiboJson); + + return false; + } + } + + private async Task<AmiiboJson> GetMostRecentAmiiboListOrDefaultJson() { - string amiiboJsonString = DefaultJson; + bool localIsValid = false; + bool remoteIsValid = false; + AmiiboJson amiiboJson = JsonHelper.Deserialize<AmiiboJson>(DefaultJson, _serializerContext.AmiiboJson); - if (File.Exists(_amiiboJsonPath)) + try { - amiiboJsonString = await File.ReadAllTextAsync(_amiiboJsonPath); + localIsValid = TryGetAmiiboJson(File.ReadAllText(_amiiboJsonPath), out amiiboJson); - if (await NeedsUpdate(JsonHelper.Deserialize(amiiboJsonString, _serializerContext.AmiiboJson).LastUpdated)) + if (!localIsValid || await NeedsUpdate(amiiboJson.LastUpdated)) { - amiiboJsonString = await DownloadAmiiboJson(); + remoteIsValid = TryGetAmiiboJson(await DownloadAmiiboJson(), out amiiboJson); } } - else + catch { - try + if (!(localIsValid || remoteIsValid)) { - amiiboJsonString = await DownloadAmiiboJson(); + // Neither local or remote files are valid JSON, close window. + ShowInfoDialog(); + Close(); } - catch (Exception ex) + else if (!remoteIsValid) { - Logger.Error?.Print(LogClass.Application, $"Failed to download amiibo data: {ex}"); - + // Only the local file is valid, the local one should be used + // but the user should be warned. ShowInfoDialog(); - - Close(); } } - _amiiboList = JsonHelper.Deserialize(amiiboJsonString, _serializerContext.AmiiboJson).Amiibo; - _amiiboList = _amiiboList.OrderBy(amiibo => amiibo.AmiiboSeries).ToList(); + return amiiboJson; + } + + private async Task LoadContentAsync() + { + AmiiboJson amiiboJson = await GetMostRecentAmiiboListOrDefaultJson(); + + _amiiboList = amiiboJson.Amiibo.OrderBy(amiibo => amiibo.AmiiboSeries).ToList(); if (LastScannedAmiiboShowAll) { @@ -172,25 +196,14 @@ namespace Ryujinx.Ui.Windows private async Task<bool> NeedsUpdate(DateTime oldLastModified) { - try - { - HttpResponseMessage response = await _httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, "https://amiibo.ryujinx.org/")); - - if (response.IsSuccessStatusCode) - { - return response.Content.Headers.LastModified != new DateTimeOffset(oldLastModified.Ticks - (oldLastModified.Ticks % TimeSpan.TicksPerSecond), TimeSpan.Zero); - } + HttpResponseMessage response = await _httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, "https://amiibo.ryujinx.org/")); - return false; - } - catch (Exception ex) + if (response.IsSuccessStatusCode) { - Logger.Error?.Print(LogClass.Application, $"Failed to check for amiibo updates: {ex}"); - - ShowInfoDialog(); - - return false; + return response.Content.Headers.LastModified != oldLastModified; } + + return false; } private async Task<string> DownloadAmiiboJson() |