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:
commit
118f9a3a72
@ -6,6 +6,7 @@ using Humanizer;
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using osu.Framework.Extensions.ObjectExtensions;
|
using osu.Framework.Extensions.ObjectExtensions;
|
||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
|
using osu.Game.Extensions;
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
using osu.Game.Online.Multiplayer;
|
using osu.Game.Online.Multiplayer;
|
||||||
using osu.Game.Online.Rooms;
|
using osu.Game.Online.Rooms;
|
||||||
@ -93,6 +94,29 @@ namespace osu.Game.Tests.NonVisual.Multiplayer
|
|||||||
checkPlayingUserCount(1);
|
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)
|
private void checkPlayingUserCount(int expectedCount)
|
||||||
=> AddAssert($"{"user".ToQuantity(expectedCount)} playing", () => MultiplayerClient.CurrentMatchPlayingUserIds.Count == expectedCount);
|
=> AddAssert($"{"user".ToQuantity(expectedCount)} playing", () => MultiplayerClient.CurrentMatchPlayingUserIds.Count == expectedCount);
|
||||||
|
|
||||||
|
@ -13,14 +13,14 @@ namespace osu.Game.Online.API.Requests
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class GetUsersRequest : APIRequest<GetUsersResponse>
|
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)
|
public GetUsersRequest(int[] userIds)
|
||||||
{
|
{
|
||||||
if (userIds.Length > max_ids_per_request)
|
if (userIds.Length > MAX_IDS_PER_REQUEST)
|
||||||
throw new ArgumentException($"{nameof(GetUsersRequest)} calls only support up to {max_ids_per_request} IDs at once");
|
throw new ArgumentException($"{nameof(GetUsersRequest)} calls only support up to {MAX_IDS_PER_REQUEST} IDs at once");
|
||||||
|
|
||||||
UserIds = userIds;
|
UserIds = userIds;
|
||||||
}
|
}
|
||||||
|
@ -815,19 +815,22 @@ namespace osu.Game.Online.Multiplayer
|
|||||||
/// <param name="multiplayerUsers">The <see cref="MultiplayerRoomUser"/>s to populate.</param>
|
/// <param name="multiplayerUsers">The <see cref="MultiplayerRoomUser"/>s to populate.</param>
|
||||||
protected async Task PopulateUsers(IEnumerable<MultiplayerRoomUser> multiplayerUsers)
|
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))
|
||||||
|
|
||||||
await API.PerformAsync(request).ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (request.Response == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Dictionary<int, APIUser> users = request.Response.Users.ToDictionary(user => user.Id);
|
|
||||||
|
|
||||||
foreach (var multiplayerUser in multiplayerUsers)
|
|
||||||
{
|
{
|
||||||
if (users.TryGetValue(multiplayerUser.UserID, out var user))
|
var request = new GetUsersRequest(userChunk);
|
||||||
multiplayerUser.User = user;
|
|
||||||
|
await API.PerformAsync(request).ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (request.Response == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Dictionary<int, APIUser> users = request.Response.Users.ToDictionary(user => user.Id);
|
||||||
|
|
||||||
|
foreach (var multiplayerUser in multiplayerUsers)
|
||||||
|
{
|
||||||
|
if (users.TryGetValue(multiplayerUser.UserID, out var user))
|
||||||
|
multiplayerUser.User = user;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user