Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
e5eb9c2
custom Wheel Wizard data folder
patchzyy Sep 20, 2025
a7f506a
validation logic
patchzyy Sep 20, 2025
fb7184d
Update PathManager.cs
patchzyy Sep 21, 2025
0722813
Update PathManager.cs
patchzyy Sep 21, 2025
056d524
Update PathManager.cs
patchzyy Sep 22, 2025
ec3a0bb
Update PathManager.cs
patchzyy Sep 23, 2025
076c0cb
Handle directory deletion
patchzyy Oct 5, 2025
ca4747b
Update PathManager.cs
patchzyy Oct 5, 2025
0d5af02
view changes
WantToBeeMe Oct 5, 2025
542c5fc
Add platform-specific build configurations
patchzyy Oct 5, 2025
da1c566
HOTFIX crash on initializing popup window for surtain monitors
WantToBeeMe Oct 5, 2025
de9b4c0
Merge branch 'dev' into ChangeAppdataFolder
WantToBeeMe Oct 5, 2025
586ee87
Improve app data folder move with detailed outcomes and error handling
patchzyy Oct 5, 2025
2f823e4
Merge pull request #196 from TeamWheelWizard/ChangeAppdataFolder
WantToBeeMe Oct 5, 2025
9e4d76e
Update WheelWizard.csproj
patchzyy Oct 25, 2025
7ab9f0b
Fix bug when importing multiple files program got stuck and didnt sho…
patchzyy Dec 7, 2025
5eff3c6
Added protection for people selecting DolphinTool.exe
patchzyy Dec 7, 2025
5b3cf8b
Merge pull request #202 from TeamWheelWizard/Small-Bug-Fixes
patchzyy Dec 25, 2025
c51f1fe
Add Mii image hover support to MiiBlock
patchzyy Dec 27, 2025
54470c8
Refactor RR room/player models and update API integration
patchzyy Dec 27, 2025
cf1462e
Add open host indicator to PlayerListItem
patchzyy Dec 27, 2025
e8789c4
Add leaderboard integration and top player highlighting
patchzyy Dec 28, 2025
e916b2b
Remove unused Rwfc domain models
patchzyy Dec 28, 2025
d118774
Update RrPlayer.cs
patchzyy Dec 28, 2025
dde34d3
Update RoomDetailsPage.axaml
patchzyy Dec 28, 2025
6df12f3
Add RRrating.pul VR/BR import and friend code utilities
patchzyy Dec 28, 2025
05c5e6e
Add player profile popup and integration
patchzyy Dec 29, 2025
02c1945
Refactor player profile loading to use IApiCaller
patchzyy Dec 29, 2025
9bf06b1
Merge pull request #207 from TeamWheelWizard/Vr-fix
patchzyy Dec 29, 2025
bd40910
Merge pull request #205 from TeamWheelWizard/MiiImageHover
patchzyy Dec 29, 2025
e074ff8
Update RwfcLeaderboardVrStats.cs
patchzyy Dec 29, 2025
0b2e47c
Merge pull request #206 from TeamWheelWizard/Switch-to-New-RWFC
patchzyy Dec 29, 2025
ff5ab7a
fix: Migrate RWFC update endpoint from HTTP to HTTPS
matellush Jan 4, 2026
6c20aa0
Update PlayerProfileResponse.cs
patchzyy Jan 11, 2026
49719da
Merge pull request #208 from TeamWheelWizard/ProfilePage
patchzyy Jan 11, 2026
6d2eaf5
Merge pull request #209 from TeamWheelWizard/https-updates
patchzyy Jan 11, 2026
763e2cb
Update number
patchzyy Jan 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,7 +1,54 @@
<Project>
<PropertyGroup>
<CSharpier_Check>false</CSharpier_Check>
<Configurations>Debug;Release;Debug-Windows;Debug-Linux;Debug-macOS;Release-Windows;Release-Linux;Release-macOS</Configurations>
<Platforms>AnyCPU</Platforms>
</PropertyGroup>

<!-- Platform-specific constants for Debug configurations -->
<PropertyGroup Condition="'$(Configuration)' == 'Debug-Windows'">
<DefineConstants>$(DefineConstants);DEBUG;TRACE;WINDOWS</DefineConstants>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<Optimize>false</Optimize>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)' == 'Debug-Linux'">
<DefineConstants>$(DefineConstants);DEBUG;TRACE;LINUX</DefineConstants>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<Optimize>false</Optimize>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)' == 'Debug-macOS'">
<DefineConstants>$(DefineConstants);DEBUG;TRACE;MACOS</DefineConstants>
<RuntimeIdentifier>osx-arm64</RuntimeIdentifier>
<Optimize>false</Optimize>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
</PropertyGroup>

<!-- Platform-specific constants for Release configurations -->
<PropertyGroup Condition="'$(Configuration)' == 'Release-Windows'">
<DefineConstants>$(DefineConstants);TRACE;WINDOWS</DefineConstants>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<Optimize>true</Optimize>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)' == 'Release-Linux'">
<DefineConstants>$(DefineConstants);TRACE;LINUX</DefineConstants>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<Optimize>true</Optimize>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)' == 'Release-macOS'">
<DefineConstants>$(DefineConstants);TRACE;MACOS</DefineConstants>
<RuntimeIdentifier>osx-arm64</RuntimeIdentifier>
<Optimize>true</Optimize>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="CSharpier.MsBuild" Version="0.30.6">
<PrivateAssets>all</PrivateAssets>
Expand Down
1 change: 1 addition & 0 deletions Flatpak/io.github.TeamWheelWizard.WheelWizard.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
</provides>

<releases>
<release version="2.3.4" date="2026-01-11"/>
<release version="2.3.3" date="2025-09-14"/>
<release version="2.3.2" date="2025-07-01"/>
<release version="2.3.1" date="2025-06-30"/>
Expand Down
5 changes: 4 additions & 1 deletion WheelWizard.Test/Features/WhWzDataTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,10 @@ public async Task LoadBadgesAsync_OverwritesExistingBadges_WhenCalledMultipleTim
Assert.Contains(BadgeVariant.WhWzDev, initialBadges);

// Arrange - Second load with different data
var updatedBadgeData = new Dictionary<string, BadgeVariant[]> { { "FC1", [BadgeVariant.Translator, BadgeVariant.Firestarter_GoldWinner] } };
var updatedBadgeData = new Dictionary<string, BadgeVariant[]>
{
{ "FC1", [BadgeVariant.Translator, BadgeVariant.Firestarter_GoldWinner] },
};

_apiCaller
.CallApiAsync(Arg.Any<Expression<Func<IWhWzDataApi, Task<Dictionary<string, BadgeVariant[]>>>>>())
Expand Down
8 changes: 4 additions & 4 deletions WheelWizard.sln
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DF73A1D9-B01E-4826-A0F3-A8105E66A931}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DF73A1D9-B01E-4826-A0F3-A8105E66A931}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DF73A1D9-B01E-4826-A0F3-A8105E66A931}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DF73A1D9-B01E-4826-A0F3-A8105E66A931}.Release|Any CPU.Build.0 = Release|Any CPU
{C2A6FF37-2E6B-4683-A8DA-AD965E1CC55A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C2A6FF37-2E6B-4683-A8DA-AD965E1CC55A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DF73A1D9-B01E-4826-A0F3-A8105E66A931}.Debug|Any CPU.ActiveCfg = Debug-Windows|Any CPU
{DF73A1D9-B01E-4826-A0F3-A8105E66A931}.Debug|Any CPU.Build.0 = Debug-Windows|Any CPU
{C2A6FF37-2E6B-4683-A8DA-AD965E1CC55A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C2A6FF37-2E6B-4683-A8DA-AD965E1CC55A}.Release|Any CPU.Build.0 = Release|Any CPU
{C2A6FF37-2E6B-4683-A8DA-AD965E1CC55A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C2A6FF37-2E6B-4683-A8DA-AD965E1CC55A}.Debug|Any CPU.Build.0 = Debug|Any CPU
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace WheelWizard.CustomDistributions;
public interface ICustomDistributionSingletonService
{
List<IDistribution> GetAllDistributions();

// FIXME: Abstract this reference away. A generic Distributions service kinda loses its purpose when you still have to reference a distribution by name (like done here)
// Instead you would want something like DistService.GetCurrentDistro()
// The rest of the application should not have to know what distribution is currently active.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace WheelWizard.CustomDistributions.Domain;

public interface IRetroRewindApi
{
[Get("/RetroRewind/RetroRewind.zip")]
[Get("/RetroRewind/zip/RetroRewind.zip")]
Task<HttpContent> DownloadRetroRewindZip();

[Get("/RetroRewind/RetroRewindVersion.txt")]
Expand Down
6 changes: 4 additions & 2 deletions WheelWizard/Features/CustomDistributions/RetroRewind.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ private async Task<OperationResult> DownloadAndExtractRetroRewind(ProgressWindow

//where all distributions are stored
var destinationParentDir = _fileSystem.DirectoryInfo.New(PathManager.RiivolutionWhWzFolderPath);

OperationResult? result = null;
try
{
Expand Down Expand Up @@ -482,13 +482,15 @@ private async Task<List<UpdateData>> GetAllVersionData()
var description = parts[3].Trim();
if (string.IsNullOrWhiteSpace(version) || string.IsNullOrWhiteSpace(url) || string.IsNullOrWhiteSpace(path))
continue;
// Fix old URLs using HTTP to the new endpoint
var fixedUrl = url.Replace(Endpoints.OldRRUrl, Endpoints.RRUrl);
if (!SemVersion.TryParse(version, out var _))
continue;
var parsedVersion = SemVersion.Parse(version);
var updateData = new UpdateData
{
Version = parsedVersion,
Url = url,
Url = fixedUrl,
Description = description,
};
versions.Add(updateData);
Expand Down
11 changes: 9 additions & 2 deletions WheelWizard/Features/RrRooms/Domain/IRwfcApi.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
using Refit;
using WheelWizard.Models;

namespace WheelWizard.RrRooms;

public interface IRwfcApi
{
[Get("/api/groups")]
Task<List<RwfcRoom>> GetWiiGroupsAsync();
[Get("/api/roomstatus")]
Task<RwfcRoomStatusResponse> GetRoomStatusAsync();

[Get("/api/leaderboard/top/{limit}")]
Task<List<RwfcLeaderboardEntry>> GetTopLeaderboardAsync(int limit);

[Get("/api/leaderboard/player/{friendCode}")]
Task<PlayerProfileResponse> GetPlayerProfileAsync(string friendCode);
}
20 changes: 20 additions & 0 deletions WheelWizard/Features/RrRooms/Domain/RwfcLeaderboardEntry.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace WheelWizard.RrRooms;

public sealed class RwfcLeaderboardEntry
{
public required string Pid { get; set; }
public string Name { get; set; } = string.Empty;
public string FriendCode { get; set; } = string.Empty;

public int? Vr { get; set; }
public int? Rank { get; set; }
public int? ActiveRank { get; set; }

public DateTime? LastSeen { get; set; }
public bool IsActive { get; set; }
public bool IsSuspicious { get; set; }

public RwfcLeaderboardVrStats? VrStats { get; set; }

public string? MiiImageBase64 { get; set; }
}
8 changes: 8 additions & 0 deletions WheelWizard/Features/RrRooms/Domain/RwfcLeaderboardVrStats.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace WheelWizard.RrRooms;

public sealed class RwfcLeaderboardVrStats
{
public int Last24Hours { get; set; } = 0;
public int LastWeek { get; set; } = 0;
public int LastMonth { get; set; } = 0;
}
15 changes: 0 additions & 15 deletions WheelWizard/Features/RrRooms/Domain/RwfcPlayer.cs

This file was deleted.

19 changes: 19 additions & 0 deletions WheelWizard/Features/RrRooms/Domain/RwfcRoomStatusPlayer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
namespace WheelWizard.RrRooms;

public sealed class RwfcRoomStatusPlayer
{
public required string Pid { get; set; }
public string Name { get; set; } = string.Empty;

public string FriendCode { get; set; } = string.Empty;

public int? Vr { get; set; }
public int? Br { get; set; }

public bool IsOpenHost { get; set; }
public bool IsSuspended { get; set; }

public RwfcMii? Mii { get; set; }

public List<string> ConnectionMap { get; set; } = [];
}
13 changes: 13 additions & 0 deletions WheelWizard/Features/RrRooms/Domain/RwfcRoomStatusResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace WheelWizard.RrRooms;

public sealed class RwfcRoomStatusResponse
{
public required List<RwfcRoomStatusRoom> Rooms { get; set; }

//todo: figure out what these refer to:
public DateTime Timestamp { get; set; }

public int? Id { get; set; }
public int? MinimumId { get; set; }
public int? MaximumId { get; set; }
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
namespace WheelWizard.RrRooms;

public sealed class RwfcRoom
public sealed class RwfcRoomStatusRoom
{
public required string Id { get; set; }

public string? Game { get; set; }
public required DateTime Created { get; set; }
public required string Type { get; set; }
public required bool Suspend { get; set; }
public required DateTime Created { get; set; }

public string? Host { get; set; }
public string? Rk { get; set; }
public required Dictionary<string, RwfcPlayer> Players { get; set; }

public required List<RwfcRoomStatusPlayer> Players { get; set; }

public bool Suspend { get; set; }
}
17 changes: 17 additions & 0 deletions WheelWizard/Features/RrRooms/RrLeaderboardSingletonService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using WheelWizard.Shared.Services;

namespace WheelWizard.RrRooms;

public interface IRrLeaderboardSingletonService
{
Task<OperationResult<List<RwfcLeaderboardEntry>>> GetTopPlayersAsync(int limit = 50);
}

public class RrLeaderboardSingletonService(IApiCaller<IRwfcApi> apiCaller) : IRrLeaderboardSingletonService
{
public async Task<OperationResult<List<RwfcLeaderboardEntry>>> GetTopPlayersAsync(int limit = 50)
{
var boundedLimit = Math.Clamp(limit, 1, 200);
return await apiCaller.CallApiAsync(api => api.GetTopLeaderboardAsync(boundedLimit));
}
}
6 changes: 5 additions & 1 deletion WheelWizard/Features/RrRooms/RrRoomsExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,13 @@ public static class RrRoomsExtensions
{
public static IServiceCollection AddRrRooms(this IServiceCollection services)
{
services.AddWhWzRefitApi<IRwfcApi>(Endpoints.RwfcBaseAddress, new() { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower });
services.AddWhWzRefitApi<IRwfcApi>(
Endpoints.RwfcBaseAddress,
new() { PropertyNameCaseInsensitive = true, PropertyNamingPolicy = JsonNamingPolicy.CamelCase }
);

services.AddSingleton<IRrRoomsSingletonService, RrRoomsSingletonService>();
services.AddSingleton<IRrLeaderboardSingletonService, RrLeaderboardSingletonService>();

return services;
}
Expand Down
10 changes: 7 additions & 3 deletions WheelWizard/Features/RrRooms/RrRoomsSingletonService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ namespace WheelWizard.RrRooms;

public interface IRrRoomsSingletonService
{
Task<OperationResult<List<RwfcRoom>>> GetRoomsAsync();
Task<OperationResult<List<RwfcRoomStatusRoom>>> GetRoomsAsync();
}

public class RrRoomsSingletonService(IApiCaller<IRwfcApi> apiCaller) : IRrRoomsSingletonService
{
public async Task<OperationResult<List<RwfcRoom>>> GetRoomsAsync()
public async Task<OperationResult<List<RwfcRoomStatusRoom>>> GetRoomsAsync()
{
return await apiCaller.CallApiAsync(rwfcApi => rwfcApi.GetWiiGroupsAsync());
var result = await apiCaller.CallApiAsync(rwfcApi => rwfcApi.GetRoomStatusAsync());
if (result.IsFailure)
return result.Error;

return result.Value.Rooms;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ public bool IsOnline
if (currentRooms.Count <= 0)
return false;

var onlinePlayers = currentRooms.SelectMany(room => room.Players.Values).ToList();
return onlinePlayers.Any(player => player.Fc == FriendCode);
var onlinePlayers = currentRooms.SelectMany(room => room.Players).ToList();
return onlinePlayers.Any(player => player.FriendCode == FriendCode);
}
set
{
Expand Down
Loading
Loading