From e532030037c8c73ae7a9f912671ae913a865e578 Mon Sep 17 00:00:00 2001 From: matellush <202132988+matellush@users.noreply.github.com> Date: Sun, 5 Jul 2026 14:38:36 +0200 Subject: [PATCH] fix(gamebanana): Filter out mod results with content ratings --- WheelWizard.Test/Features/GameBananaTests.cs | 1 + .../GameBanana/Domain/GameBananaModDetails.cs | 5 ++++- .../GameBanana/Domain/GameBananaModPreview.cs | 3 +++ .../Features/GameBanana/GameBananaSingletonService.cs | 1 + WheelWizard/Services/Endpoints.cs | 5 +---- .../Popups/ModManagement/ModBrowserWindow.axaml.cs | 2 +- .../Views/Popups/ModManagement/ModContent.axaml.cs | 11 ++++++++--- 7 files changed, 19 insertions(+), 9 deletions(-) diff --git a/WheelWizard.Test/Features/GameBananaTests.cs b/WheelWizard.Test/Features/GameBananaTests.cs index 5d59fb34..dc76757b 100644 --- a/WheelWizard.Test/Features/GameBananaTests.cs +++ b/WheelWizard.Test/Features/GameBananaTests.cs @@ -212,6 +212,7 @@ private GameBananaModPreview CreateFakeModPreview(int id) }, ModelName = "Mod", PreviewMedia = new(), + HasContentRatings = false, }; } diff --git a/WheelWizard/Features/GameBanana/Domain/GameBananaModDetails.cs b/WheelWizard/Features/GameBanana/Domain/GameBananaModDetails.cs index e2f210c0..0f7a9199 100644 --- a/WheelWizard/Features/GameBanana/Domain/GameBananaModDetails.cs +++ b/WheelWizard/Features/GameBanana/Domain/GameBananaModDetails.cs @@ -63,5 +63,8 @@ public class GameBananaModDetails public required int DownloadCount { get; set; } [JsonPropertyName("_aFiles")] - public required List Files { get; set; } + public List? Files { get; set; } + + [JsonPropertyName("_aArchivedFiles")] + public List? ArchivedFiles { get; set; } } diff --git a/WheelWizard/Features/GameBanana/Domain/GameBananaModPreview.cs b/WheelWizard/Features/GameBanana/Domain/GameBananaModPreview.cs index ed38982e..2473767c 100644 --- a/WheelWizard/Features/GameBanana/Domain/GameBananaModPreview.cs +++ b/WheelWizard/Features/GameBanana/Domain/GameBananaModPreview.cs @@ -25,6 +25,9 @@ public class GameBananaModPreview [JsonPropertyName("_aPreviewMedia")] public required GameBananaPreviewMedia PreviewMedia { get; set; } + [JsonPropertyName("_bHasContentRatings")] + public required bool HasContentRatings { get; set; } + [JsonPropertyName("_nLikeCount")] public int LikeCount { get; set; } diff --git a/WheelWizard/Features/GameBanana/GameBananaSingletonService.cs b/WheelWizard/Features/GameBanana/GameBananaSingletonService.cs index c8af8100..8535dc9c 100644 --- a/WheelWizard/Features/GameBanana/GameBananaSingletonService.cs +++ b/WheelWizard/Features/GameBanana/GameBananaSingletonService.cs @@ -70,6 +70,7 @@ public GameBananaModPreview GetLoadingPreview() AvatarUrl = "", }, PreviewMedia = new(), + HasContentRatings = false, }; } } diff --git a/WheelWizard/Services/Endpoints.cs b/WheelWizard/Services/Endpoints.cs index 47debccb..87202e6a 100644 --- a/WheelWizard/Services/Endpoints.cs +++ b/WheelWizard/Services/Endpoints.cs @@ -15,7 +15,7 @@ public static class Endpoints /// /// The base address for accessing the GameBanana API /// - public const string GameBananaBaseAddress = "https://gamebanana.com/apiv11"; + public const string GameBananaBaseAddress = "https://gamebanana.com/apiv12"; /// /// The address for the GitHub API @@ -48,7 +48,4 @@ public static class Endpoints // Other public const string MiiChannelWAD = "-"; - - //GameBanana - public const string GameBananaBaseUrl = "https://gamebanana.com/apiv11"; } diff --git a/WheelWizard/Views/Popups/ModManagement/ModBrowserWindow.axaml.cs b/WheelWizard/Views/Popups/ModManagement/ModBrowserWindow.axaml.cs index 0511ed61..41162b61 100644 --- a/WheelWizard/Views/Popups/ModManagement/ModBrowserWindow.axaml.cs +++ b/WheelWizard/Views/Popups/ModManagement/ModBrowserWindow.axaml.cs @@ -87,7 +87,7 @@ private async Task LoadMods(int page, string searchTerm = "", bool ensurePatchRe } var metadata = result.Value.MetaData; - var newMods = result.Value.Records.Where(mod => mod.ModelName == "Mod").ToList(); + var newMods = result.Value.Records.Where(mod => mod.ModelName == "Mod" && !mod.HasContentRatings).ToList(); foreach (var mod in newMods) { diff --git a/WheelWizard/Views/Popups/ModManagement/ModContent.axaml.cs b/WheelWizard/Views/Popups/ModManagement/ModContent.axaml.cs index d5ce47b9..d22c4b77 100644 --- a/WheelWizard/Views/Popups/ModManagement/ModContent.axaml.cs +++ b/WheelWizard/Views/Popups/ModManagement/ModContent.axaml.cs @@ -1,4 +1,4 @@ -using Avalonia.Interactivity; +using Avalonia.Interactivity; using Avalonia.Media.Imaging; using WheelWizard.GameBanana; using WheelWizard.GameBanana.Domain; @@ -216,8 +216,13 @@ private async Task DownloadAndInstallCurrentModAsync() if (prepareResult.IsFailure) return prepareResult.Error; - var downloadUrls = OverrideDownloadUrl != null ? [OverrideDownloadUrl] : CurrentMod.Files.Select(f => f.DownloadUrl).ToList(); - if (!downloadUrls.Any()) + var downloadUrls = + OverrideDownloadUrl != null + ? [OverrideDownloadUrl] + : CurrentMod.Files?.Select(f => f.DownloadUrl).ToList() + ?? CurrentMod.ArchivedFiles?.Select(f => f.DownloadUrl).ToList() + ?? []; + if (downloadUrls.Count == 0) return Fail("No downloadable files were found for this mod."); var progressWindow = new ProgressWindow(t("progress.downloading_mod", CurrentMod.Name)!);