aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Ryujinx.Ava/UI/ViewModels/AmiiboWindowViewModel.cs76
-rw-r--r--src/Ryujinx/Ui/Windows/AmiiboWindow.cs77
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()