From 54f71cc52d36cbda9f61e3b5d436333174274736 Mon Sep 17 00:00:00 2001 From: jvyden Date: Tue, 2 Jan 2024 16:56:20 -0500 Subject: [PATCH] Make RandomLevelsCategory use seed from game --- .../Database/GameDatabaseContext.Levels.cs | 12 +++++--- .../FilterSettings/LevelFilterSettings.cs | 13 ++++++++ .../Tests/Levels/LevelTests.cs | 30 ++++++++++++++----- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/Refresh.GameServer/Database/GameDatabaseContext.Levels.cs b/Refresh.GameServer/Database/GameDatabaseContext.Levels.cs index 83878379..b4b4623b 100644 --- a/Refresh.GameServer/Database/GameDatabaseContext.Levels.cs +++ b/Refresh.GameServer/Database/GameDatabaseContext.Levels.cs @@ -192,12 +192,16 @@ public DatabaseList GetNewestLevels(int count, int skip, GameUser? us .OrderByDescending(l => l.PublishDate), skip, count); [Pure] - public DatabaseList GetRandomLevels(int count, int skip, GameUser? user, LevelFilterSettings levelFilterSettings) => - new(this.GetLevelsByGameVersion(levelFilterSettings.GameVersion) + public DatabaseList GetRandomLevels(int count, int skip, GameUser? user, LevelFilterSettings levelFilterSettings) + { + Random random = new(levelFilterSettings.Seed ?? 0); + + return new DatabaseList(this.GetLevelsByGameVersion(levelFilterSettings.GameVersion) .FilterByLevelFilterSettings(user, levelFilterSettings) .AsEnumerable() - .OrderBy(_ => Random.Shared.Next()), skip, count); - + .OrderBy(_ => random.Next()), skip, count); + } + // TODO: reduce code duplication for getting most of x [Pure] public DatabaseList GetMostHeartedLevels(int count, int skip, GameUser? user, LevelFilterSettings levelFilterSettings) diff --git a/Refresh.GameServer/Endpoints/Game/Levels/FilterSettings/LevelFilterSettings.cs b/Refresh.GameServer/Endpoints/Game/Levels/FilterSettings/LevelFilterSettings.cs index 50798222..052670b6 100644 --- a/Refresh.GameServer/Endpoints/Game/Levels/FilterSettings/LevelFilterSettings.cs +++ b/Refresh.GameServer/Endpoints/Game/Levels/FilterSettings/LevelFilterSettings.cs @@ -2,6 +2,7 @@ using Refresh.GameServer.Authentication; using Refresh.GameServer.Extensions; using Refresh.GameServer.Services; +using Refresh.GameServer.Types.Levels.Categories; namespace Refresh.GameServer.Endpoints.Game.Levels.FilterSettings; @@ -45,6 +46,12 @@ public class LevelFilterSettings /// public TokenGame GameVersion; + /// + /// The seed used for lucky dip/random levels. + /// + /// + public int? Seed; + public LevelFilterSettings(TokenGame game) { this.GameVersion = game; @@ -126,5 +133,11 @@ public LevelFilterSettings(RequestContext context, TokenGame game) : this(game) this.Labels ??= new string[1]; this.Labels[0] = labelFilter0; } + + string? seedStr = context.QueryString.Get("seed"); + if (seedStr != null && int.TryParse(seedStr, out int seed)) + { + this.Seed = seed; + } } } \ No newline at end of file diff --git a/RefreshTests.GameServer/Tests/Levels/LevelTests.cs b/RefreshTests.GameServer/Tests/Levels/LevelTests.cs index 4d7afc2b..3f890613 100644 --- a/RefreshTests.GameServer/Tests/Levels/LevelTests.cs +++ b/RefreshTests.GameServer/Tests/Levels/LevelTests.cs @@ -40,16 +40,32 @@ public void SlotsRandom() { using TestContext context = this.GetServer(); GameUser user = context.CreateUser(); - GameLevel level = context.CreateLevel(user); + + // 3 levels to test with + GameLevel level1 = context.CreateLevel(user); + GameLevel level2 = context.CreateLevel(user); + GameLevel level3 = context.CreateLevel(user); using HttpClient client = context.GetAuthenticatedClient(TokenType.Game, user); - - HttpResponseMessage message = client.GetAsync($"/lbp/slots/lbp2luckydip").Result; - Assert.That(message.StatusCode, Is.EqualTo(OK)); - SerializedMinimalLevelList result = message.Content.ReadAsXML(); - Assert.That(result.Items, Has.Count.EqualTo(1)); - Assert.That(result.Items.First().LevelId, Is.EqualTo(level.LevelId)); + void TestSeed(GameLevel expectedLevel, int seed) + { + // Iterate through a bunch of times to ensure it's deterministic + for (int i = 0; i < 10; i++) + { + HttpResponseMessage message = client.GetAsync($"/lbp/slots/lbp2luckydip?seed={seed}").Result; + Assert.That(message.StatusCode, Is.EqualTo(OK)); + + SerializedMinimalLevelList result = message.Content.ReadAsXML(); + Assert.That(result.Items, Has.Count.EqualTo(3)); + Assert.That(result.Items.First().LevelId, Is.EqualTo(expectedLevel.LevelId)); + } + } + + TestSeed(level1, 69420); + TestSeed(level2, 1); + TestSeed(level3, 2); + TestSeed(level3, -2); } [Test]