1
0
mirror of https://github.com/ppy/osu.git synced 2025-03-11 02:57:18 +08:00

Merge pull request #32210 from smoogipoo/fix-multi-join-many-users

Fix being unable to join multiplayer rooms with many users
This commit is contained in:
Dean Herbert 2025-03-04 13:13:15 +09:00 committed by GitHub
commit 118f9a3a72
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 43 additions and 16 deletions

View File

@ -6,6 +6,7 @@ using Humanizer;
using NUnit.Framework;
using osu.Framework.Extensions.ObjectExtensions;
using osu.Framework.Testing;
using osu.Game.Extensions;
using osu.Game.Online.API.Requests.Responses;
using osu.Game.Online.Multiplayer;
using osu.Game.Online.Rooms;
@ -93,6 +94,29 @@ namespace osu.Game.Tests.NonVisual.Multiplayer
checkPlayingUserCount(1);
}
[Test]
public void TestJoinRoomWithManyUsers()
{
AddStep("leave room", () => MultiplayerClient.LeaveRoom());
AddUntilStep("wait for room part", () => !RoomJoined);
AddStep("create room with many users", () =>
{
var newRoom = new Room();
newRoom.CopyFrom(SelectedRoom.Value!);
newRoom.RoomID = null;
MultiplayerClient.RoomSetupAction = room =>
{
room.Users.AddRange(Enumerable.Range(PLAYER_1_ID, 100).Select(id => new MultiplayerRoomUser(id)));
};
RoomManager.CreateRoom(newRoom);
});
AddUntilStep("wait for room join", () => RoomJoined);
}
private void checkPlayingUserCount(int expectedCount)
=> AddAssert($"{"user".ToQuantity(expectedCount)} playing", () => MultiplayerClient.CurrentMatchPlayingUserIds.Count == expectedCount);

View File

@ -13,14 +13,14 @@ namespace osu.Game.Online.API.Requests
/// </summary>
public class GetUsersRequest : APIRequest<GetUsersResponse>
{
public readonly int[] UserIds;
public const int MAX_IDS_PER_REQUEST = 50;
private const int max_ids_per_request = 50;
public readonly int[] UserIds;
public GetUsersRequest(int[] userIds)
{
if (userIds.Length > max_ids_per_request)
throw new ArgumentException($"{nameof(GetUsersRequest)} calls only support up to {max_ids_per_request} IDs at once");
if (userIds.Length > MAX_IDS_PER_REQUEST)
throw new ArgumentException($"{nameof(GetUsersRequest)} calls only support up to {MAX_IDS_PER_REQUEST} IDs at once");
UserIds = userIds;
}

View File

@ -815,7 +815,9 @@ namespace osu.Game.Online.Multiplayer
/// <param name="multiplayerUsers">The <see cref="MultiplayerRoomUser"/>s to populate.</param>
protected async Task PopulateUsers(IEnumerable<MultiplayerRoomUser> multiplayerUsers)
{
var request = new GetUsersRequest(multiplayerUsers.Select(u => u.UserID).Distinct().ToArray());
foreach (int[] userChunk in multiplayerUsers.Select(u => u.UserID).Distinct().Chunk(GetUsersRequest.MAX_IDS_PER_REQUEST))
{
var request = new GetUsersRequest(userChunk);
await API.PerformAsync(request).ConfigureAwait(false);
@ -830,6 +832,7 @@ namespace osu.Game.Online.Multiplayer
multiplayerUser.User = user;
}
}
}
/// <summary>
/// Updates the local room settings with the given <see cref="MultiplayerRoomSettings"/>.