From c72b6412eaca8e595635aa3e37266f15ec70ffd7 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Sat, 28 Feb 2026 00:42:44 +0900 Subject: [PATCH] Add pool type to matchmaking room invited event (#36765) Rebase of https://github.com/smoogipoo/osu/pull/193 Going forward, the client will have to know the type of pool being invited to so that it can enter the appropriate screen when clicking the notification. Unfortunately, SignalR does not support overloading methods, or even adding parameters to them, so this PR deprecates the `MatchmakingRoomInvited` event and adds its replacement `MatchmakingRoomInvitedWithParams` with a complex `invitation` parameter that we _can_ extend in the future if required (such as potentially adding the name of the pool). This also prepares the notification by extracting some code to a `Complete` method receiving said `invitation` parameter. This part of code will be further modified to enter the correct screen: https://github.com/smoogipoo/osu/blob/0a4018045b9d908f66c63dee65d0059d05b26e43/osu.Game/Screens/OnlinePlay/Matchmaking/Queue/QueueController.cs#L200 In particular, I have tested that new clients continue to work with the old server (dev.ppy.sh) in quick play | | Old Server | New Server | | ------------- |:-------------:| :-----:| | Old Client | :green_circle: | :green_circle: | | New Client | :green_circle: | :green_circle: | --- .../Online/Matchmaking/IMatchmakingClient.cs | 11 +++++++ .../MatchmakingRoomInvitationParams.cs | 16 ++++++++++ .../Online/Multiplayer/MultiplayerClient.cs | 10 +++++-- .../Multiplayer/OnlineMultiplayerClient.cs | 1 + .../Matchmaking/Queue/QueueController.cs | 29 ++++++++++--------- 5 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 osu.Game/Online/Matchmaking/MatchmakingRoomInvitationParams.cs diff --git a/osu.Game/Online/Matchmaking/IMatchmakingClient.cs b/osu.Game/Online/Matchmaking/IMatchmakingClient.cs index be05e3ca0d..e44eafb390 100644 --- a/osu.Game/Online/Matchmaking/IMatchmakingClient.cs +++ b/osu.Game/Online/Matchmaking/IMatchmakingClient.cs @@ -23,8 +23,19 @@ namespace osu.Game.Online.Matchmaking /// declined, /// or ignored - in which case it will automatically be declined after a short timeout period. /// + /// + /// Provided for compatibility with older clients - can be removed 20260825. + /// Task MatchmakingRoomInvited(); + /// + /// Signals that a match has been found and the local user is invited to it. + /// The invitation may be accepted, + /// declined, + /// or ignored - in which case it will automatically be declined after a short timeout period. + /// + Task MatchmakingRoomInvitedWithParams(MatchmakingRoomInvitationParams invitation); + /// /// Signals that the matchmaking room is ready to be opened. /// diff --git a/osu.Game/Online/Matchmaking/MatchmakingRoomInvitationParams.cs b/osu.Game/Online/Matchmaking/MatchmakingRoomInvitationParams.cs new file mode 100644 index 0000000000..38b4d85734 --- /dev/null +++ b/osu.Game/Online/Matchmaking/MatchmakingRoomInvitationParams.cs @@ -0,0 +1,16 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using MessagePack; + +namespace osu.Game.Online.Matchmaking +{ + [MessagePackObject] + [Serializable] + public class MatchmakingRoomInvitationParams + { + [Key(0)] + public MatchmakingPoolType Type { get; set; } + } +} diff --git a/osu.Game/Online/Multiplayer/MultiplayerClient.cs b/osu.Game/Online/Multiplayer/MultiplayerClient.cs index 62228e60bd..b9b4419cbb 100644 --- a/osu.Game/Online/Multiplayer/MultiplayerClient.cs +++ b/osu.Game/Online/Multiplayer/MultiplayerClient.cs @@ -123,7 +123,7 @@ namespace osu.Game.Online.Multiplayer public event Action? MatchmakingQueueJoined; public event Action? MatchmakingQueueLeft; - public event Action? MatchmakingRoomInvited; + public event Action? MatchmakingRoomInvited; public event Action? MatchmakingRoomReady; public event Action? MatchmakingLobbyStatusChanged; public event Action? MatchmakingQueueStatusChanged; @@ -1085,7 +1085,13 @@ namespace osu.Game.Online.Multiplayer Task IMatchmakingClient.MatchmakingRoomInvited() { - Scheduler.Add(() => MatchmakingRoomInvited?.Invoke()); + // Compatibility with older servers. + return ((IMatchmakingClient)this).MatchmakingRoomInvitedWithParams(new MatchmakingRoomInvitationParams { Type = MatchmakingPoolType.QuickPlay }); + } + + Task IMatchmakingClient.MatchmakingRoomInvitedWithParams(MatchmakingRoomInvitationParams invitation) + { + Scheduler.Add(() => MatchmakingRoomInvited?.Invoke(invitation)); return Task.CompletedTask; } diff --git a/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs b/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs index b36e2cf177..b23a0b3db2 100644 --- a/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs +++ b/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs @@ -76,6 +76,7 @@ namespace osu.Game.Online.Multiplayer connection.On(nameof(IMatchmakingClient.MatchmakingQueueJoined), ((IMatchmakingClient)this).MatchmakingQueueJoined); connection.On(nameof(IMatchmakingClient.MatchmakingQueueLeft), ((IMatchmakingClient)this).MatchmakingQueueLeft); connection.On(nameof(IMatchmakingClient.MatchmakingRoomInvited), ((IMatchmakingClient)this).MatchmakingRoomInvited); + connection.On(nameof(IMatchmakingClient.MatchmakingRoomInvitedWithParams), ((IMatchmakingClient)this).MatchmakingRoomInvitedWithParams); connection.On(nameof(IMatchmakingClient.MatchmakingRoomReady), ((IMatchmakingClient)this).MatchmakingRoomReady); connection.On(nameof(IMatchmakingClient.MatchmakingLobbyStatusChanged), ((IMatchmakingClient)this).MatchmakingLobbyStatusChanged); connection.On(nameof(IMatchmakingClient.MatchmakingQueueStatusChanged), ((IMatchmakingClient)this).MatchmakingQueueStatusChanged); diff --git a/osu.Game/Screens/OnlinePlay/Matchmaking/Queue/QueueController.cs b/osu.Game/Screens/OnlinePlay/Matchmaking/Queue/QueueController.cs index 6d23dd4eb1..9456e56bf9 100644 --- a/osu.Game/Screens/OnlinePlay/Matchmaking/Queue/QueueController.cs +++ b/osu.Game/Screens/OnlinePlay/Matchmaking/Queue/QueueController.cs @@ -11,6 +11,7 @@ using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Sprites; using osu.Framework.Screens; using osu.Game.Graphics; +using osu.Game.Online.Matchmaking; using osu.Game.Online.Multiplayer; using osu.Game.Online.Rooms; using osu.Game.Overlays; @@ -94,15 +95,12 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.Queue closeNotifications(); }); - private void onMatchmakingRoomInvited() => Scheduler.Add(() => + private void onMatchmakingRoomInvited(MatchmakingRoomInvitationParams invitation) => Scheduler.Add(() => { CurrentState.Value = ScreenQueue.MatchmakingScreenState.PendingAccept; - if (backgroundNotification != null) - { - backgroundNotification.State = ProgressNotificationState.Completed; - backgroundNotification = null; - } + backgroundNotification?.Complete(invitation); + backgroundNotification = null; }); private void onMatchmakingRoomReady(long roomId, string password) => Scheduler.Add(() => @@ -183,6 +181,17 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.Queue return false; }; + CancelRequested = () => + { + client.MatchmakingLeaveQueue().FireAndForget(); + return true; + }; + + matchFoundSample = audio.Samples.Get(@"Multiplayer/Matchmaking/match-found"); + } + + public void Complete(MatchmakingRoomInvitationParams invitation) + { CompletionClickAction = () => { client.MatchmakingAcceptInvitation().FireAndForget(); @@ -194,13 +203,7 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.Queue return true; }; - CancelRequested = () => - { - client.MatchmakingLeaveQueue().FireAndForget(); - return true; - }; - - matchFoundSample = audio.Samples.Get(@"Multiplayer/Matchmaking/match-found"); + State = ProgressNotificationState.Completed; } protected override Notification CreateCompletionNotification()