From 851606db48d35d51173ac708ab19ac64fc0fef46 Mon Sep 17 00:00:00 2001 From: timiimit Date: Thu, 11 May 2023 20:04:40 +0200 Subject: [PATCH 1/2] Add no_score_multiplier to room model --- osu.Server.Spectator/Database/Models/multiplayer_room.cs | 1 + osu.Server.Spectator/Hubs/MultiplayerHub.cs | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/osu.Server.Spectator/Database/Models/multiplayer_room.cs b/osu.Server.Spectator/Database/Models/multiplayer_room.cs index 950c8333..edd32c4e 100644 --- a/osu.Server.Spectator/Database/Models/multiplayer_room.cs +++ b/osu.Server.Spectator/Database/Models/multiplayer_room.cs @@ -28,5 +28,6 @@ public class multiplayer_room public database_queue_mode queue_mode { get; set; } public ushort auto_start_duration { get; set; } public bool auto_skip { get; set; } + public bool no_score_multiplier { get; set; } } } diff --git a/osu.Server.Spectator/Hubs/MultiplayerHub.cs b/osu.Server.Spectator/Hubs/MultiplayerHub.cs index 4ba798b4..212893b4 100644 --- a/osu.Server.Spectator/Hubs/MultiplayerHub.cs +++ b/osu.Server.Spectator/Hubs/MultiplayerHub.cs @@ -192,7 +192,8 @@ private async Task retrieveRoom(long roomId) MatchType = databaseRoom.type.ToMatchType(), QueueMode = databaseRoom.queue_mode.ToQueueMode(), AutoStartDuration = TimeSpan.FromSeconds(databaseRoom.auto_start_duration), - AutoSkip = databaseRoom.auto_skip + AutoSkip = databaseRoom.auto_skip, + NoScoreMultiplier = databaseRoom.no_score_multiplier } }; From 8652b020eb6774acfc29d5006162fbb935ad3579 Mon Sep 17 00:00:00 2001 From: timiimit Date: Fri, 2 Jun 2023 10:26:55 +0200 Subject: [PATCH 2/2] Merge branch 'master' into multi-score-multiplier-option --- .../MultiplayerAllPlayersQueueTests.cs | 56 +++++++++++++++---- .../ConfigureJwtBearerOptions.cs | 2 +- osu.Server.Spectator/Hubs/MultiplayerQueue.cs | 17 +++--- osu.Server.Spectator/StartupDevelopment.cs | 8 ++- .../osu.Server.Spectator.csproj | 2 +- 5 files changed, 61 insertions(+), 24 deletions(-) diff --git a/osu.Server.Spectator.Tests/Multiplayer/MultiplayerAllPlayersQueueTests.cs b/osu.Server.Spectator.Tests/Multiplayer/MultiplayerAllPlayersQueueTests.cs index 88b7652a..2e4a5eaf 100644 --- a/osu.Server.Spectator.Tests/Multiplayer/MultiplayerAllPlayersQueueTests.cs +++ b/osu.Server.Spectator.Tests/Multiplayer/MultiplayerAllPlayersQueueTests.cs @@ -179,7 +179,7 @@ public async Task OneNonExpiredItemExistsWhenChangingToHostOnlyMode() } [Fact] - public async Task UserMayOnlyAddLimitedNumberOfItems() + public async Task HostMayAddManyItems() { Database.Setup(d => d.GetBeatmapChecksumAsync(3333)).ReturnsAsync("3333"); @@ -189,29 +189,63 @@ public async Task UserMayOnlyAddLimitedNumberOfItems() for (int i = 1; i < MultiplayerQueue.PER_USER_LIMIT; i++) await addItem(); - // First user is not allowed to add more items. - await Assert.ThrowsAsync(addItem); + // Host should be allowed to add many items even in non-host-only queue modes. + await addItem(); + await addItem(); + await addItem(); + + async Task addItem() => await Hub.AddPlaylistItem(new MultiplayerPlaylistItem + { + BeatmapID = 3333, + BeatmapChecksum = "3333" + }); + } + + [Fact] + public async Task UserMayOnlyAddLimitedNumberOfItems() + { + Database.Setup(d => d.GetBeatmapChecksumAsync(3333)).ReturnsAsync("3333"); + + await Hub.JoinRoom(ROOM_ID); + await Hub.ChangeSettings(new MultiplayerRoomSettings { QueueMode = QueueMode.AllPlayers }); + + // Play initial beatmap to clear the queue. + await playBeatmap(); - // Second user should be able to add items. SetUserContext(ContextUser2); await Hub.JoinRoom(ROOM_ID); - await addItem(); + + // Non-host user should be able to add items up to a defined limit. + for (int i = 0; i < MultiplayerQueue.PER_USER_LIMIT; i++) + await addItem(); + + // User is not allowed to add more items. + await Assert.ThrowsAsync(addItem); // Play a single map from the first user. - SetUserContext(ContextUser); - await Hub.ChangeState(MultiplayerUserState.Ready); - await Hub.StartMatch(); - await LoadAndFinishGameplay(ContextUser); - await Hub.ChangeState(MultiplayerUserState.Idle); + await playBeatmap(); + + // User should now be able to add one more item. + SetUserContext(ContextUser2); - // The first user should now be able to add another item. await addItem(); + await Assert.ThrowsAsync(addItem); async Task addItem() => await Hub.AddPlaylistItem(new MultiplayerPlaylistItem { BeatmapID = 3333, BeatmapChecksum = "3333" }); + + async Task playBeatmap() + { + SetUserContext(ContextUser); + + await Hub.ChangeState(MultiplayerUserState.Ready); + await Hub.StartMatch(); + await LoadAndFinishGameplay(ContextUser); + await Hub.ChangeState(MultiplayerUserState.Idle); + } } } } diff --git a/osu.Server.Spectator/Authentication/ConfigureJwtBearerOptions.cs b/osu.Server.Spectator/Authentication/ConfigureJwtBearerOptions.cs index fa8ec12a..95113ed1 100644 --- a/osu.Server.Spectator/Authentication/ConfigureJwtBearerOptions.cs +++ b/osu.Server.Spectator/Authentication/ConfigureJwtBearerOptions.cs @@ -58,7 +58,7 @@ public void Configure(JwtBearerOptions options) }; } - public void Configure(string name, JwtBearerOptions options) + public void Configure(string? name, JwtBearerOptions options) => Configure(options); /// diff --git a/osu.Server.Spectator/Hubs/MultiplayerQueue.cs b/osu.Server.Spectator/Hubs/MultiplayerQueue.cs index 1f6a7cc5..b38737d9 100644 --- a/osu.Server.Spectator/Hubs/MultiplayerQueue.cs +++ b/osu.Server.Spectator/Hubs/MultiplayerQueue.cs @@ -109,16 +109,15 @@ public async Task AddItem(MultiplayerPlaylistItem item, MultiplayerRoomUser user bool isHostOnly = room.Settings.QueueMode == QueueMode.HostOnly; - if (isHostOnly) - { - if (!user.Equals(room.Host)) - throw new NotHostException(); + bool isHost = user.Equals(room.Host); - if (room.Playlist.Count(i => i.OwnerID == user.UserID && !i.Expired) >= HOST_LIMIT) - throw new InvalidStateException($"Can't enqueue more than {HOST_LIMIT} items at once."); - } - else if (room.Playlist.Count(i => i.OwnerID == user.UserID && !i.Expired) >= PER_USER_LIMIT) - throw new InvalidStateException($"Can't enqueue more than {PER_USER_LIMIT} items at once."); + if (isHostOnly && !isHost) + throw new NotHostException(); + + int limit = isHost ? HOST_LIMIT : PER_USER_LIMIT; + + if (room.Playlist.Count(i => i.OwnerID == user.UserID && !i.Expired) >= limit) + throw new InvalidStateException($"Can't enqueue more than {limit} items at once."); using (var db = dbFactory.GetInstance()) { diff --git a/osu.Server.Spectator/StartupDevelopment.cs b/osu.Server.Spectator/StartupDevelopment.cs index 0ce98dfb..dc237e35 100644 --- a/osu.Server.Spectator/StartupDevelopment.cs +++ b/osu.Server.Spectator/StartupDevelopment.cs @@ -45,8 +45,12 @@ public LocalAuthenticationHandler( /// protected override Task HandleAuthenticateAsync() { - if (!Context.Request.Headers.TryGetValue("user_id", out var userIdString)) - userIdString = Interlocked.Increment(ref userIDCounter).ToString(); + string? userIdString = null; + + if (Context.Request.Headers.TryGetValue("user_id", out var userIdValue)) + userIdString = userIdValue; + + userIdString ??= Interlocked.Increment(ref userIDCounter).ToString(); var claim = new Claim(ClaimTypes.NameIdentifier, userIdString); diff --git a/osu.Server.Spectator/osu.Server.Spectator.csproj b/osu.Server.Spectator/osu.Server.Spectator.csproj index 3d7659ed..a97e89c0 100644 --- a/osu.Server.Spectator/osu.Server.Spectator.csproj +++ b/osu.Server.Spectator/osu.Server.Spectator.csproj @@ -7,7 +7,7 @@ - +