From 479ea273eac33d041c2b46b3b83d8322c3a5231c Mon Sep 17 00:00:00 2001 From: Alexa <53471801+Alexa-RR@users.noreply.github.com> Date: Wed, 8 Jul 2026 20:33:39 +0300 Subject: [PATCH] fix: Revert room-details DTO extras that broke room parsing af0d7b6 added RankingContext/DataBlob/MaxPlayers/ToxmodEnabled to the shared BuildRoomServerDetails (and DataBlobHash/Description to BuildStudioSaveWire) to try to satisfy the 2023 SaveRoom commit-response Dispose walk. The invented RankingContext object shape is rejected by the strict room-details mapper, so GET rooms/{id} (and every room list that shares the builder) failed with "Malformed Response" -> rooms broke. The 2023 mappers validate value SHAPES, not just key presence, so bolting unverified keys onto the shared room DTO is unsafe. Reverts af0d7b6 code changes. Room saving remains functionally correct (blob persists, fanout delivers); the SaveRoom success toast is left for a separately-verified fix. --- DorkNet.Server.Tests/RoomSave2023Tests.cs | 16 ++++++------ .../API/Rooms/V2/RoomsController.cs | 26 ------------------- 2 files changed, 8 insertions(+), 34 deletions(-) diff --git a/DorkNet.Server.Tests/RoomSave2023Tests.cs b/DorkNet.Server.Tests/RoomSave2023Tests.cs index 373f5f1..2b486aa 100644 --- a/DorkNet.Server.Tests/RoomSave2023Tests.cs +++ b/DorkNet.Server.Tests/RoomSave2023Tests.cs @@ -76,21 +76,21 @@ public sealed class RoomSave2023Tests : IClassFixture using var json = JsonDocument.Parse(responseText); Assert.True(json.RootElement.GetProperty("success").GetBoolean(), responseText); - // 2023 commit-response contract (NEOPBOMGIOG): value must carry - // BOTH a Room and a SubRoomDataSave or the client's post-parse - // Dispose walk NREs and the watch shows "Failed to save room". + // 2023 commit-response contract (NEOPBOMGIOG): value carries a + // Room and a SubRoomDataSave. The Room reuses the exact GET + // rooms/{id} shape (BuildRoomServerDetails) — do NOT bolt extra + // keys onto it: the room-details mapper is strict about value + // shapes and an invented RankingContext object broke every + // room-details parse ("Malformed Response"). See befd590 revert. var value = json.RootElement.GetProperty("value"); var roomDto = value.GetProperty("Room"); Assert.Equal(JsonValueKind.Object, roomDto.ValueKind); - // Keys the FGCPNAACHIK mapper reads and its Dispose walk derefs. - foreach (var key in new[] { "RoomId", "DataBlob", "MaxPlayers", "ToxmodEnabled", "RankingContext", "SubRooms", "Roles", "Tags", "Stats" }) + foreach (var key in new[] { "RoomId", "SubRooms", "Roles", "Tags", "Stats" }) Assert.True(roomDto.TryGetProperty(key, out _), $"Room missing '{key}': {responseText}"); - Assert.Equal(JsonValueKind.Object, roomDto.GetProperty("RankingContext").ValueKind); var save = value.GetProperty("SubRoomDataSave"); Assert.Equal(blobName, save.GetProperty("DataBlob").GetString()); - // Keys the JKIFFPPAJNK save mapper reads. - foreach (var key in new[] { "SubRoomDataSaveId", "SubRoomId", "UnityAssetId", "DataBlobHash", "SavedByAccountId", "Description", "CreatedAt" }) + foreach (var key in new[] { "SubRoomDataSaveId", "SubRoomId", "UnityAssetId", "SavedByAccountId", "CreatedAt" }) Assert.True(save.TryGetProperty(key, out _), $"SubRoomDataSave missing '{key}': {responseText}"); await using (var scope = _factory.Services.CreateAsyncScope()) diff --git a/DorkNet.Server/Controllers/API/Rooms/V2/RoomsController.cs b/DorkNet.Server/Controllers/API/Rooms/V2/RoomsController.cs index 6be4c55..99584c5 100644 --- a/DorkNet.Server/Controllers/API/Rooms/V2/RoomsController.cs +++ b/DorkNet.Server/Controllers/API/Rooms/V2/RoomsController.cs @@ -700,12 +700,6 @@ public class RoomsController( ReferencedUnityAssetIds = Array.Empty(), DataBlob = dataBlob, DataBlobName = dataBlob, - // DataBlobHash + Description are read by the save mapper - // (JKIFFPPAJNK / PELEHJLMKJO) that the SaveRoom commit - // response deserializes; omitting them leaves nulls the - // response Dispose walk trips on. - DataBlobHash = (string?)null, - Description = string.Empty, PersistenceVersion = 41, OMVersion = 0, SavedByAccountId = room.CreatorPlayerId, @@ -1984,26 +1978,6 @@ public class RoomsController( }, PublishState = 0, MaxPlayerCalculationMode = room.MaxPlayerCalculationMode, - // 2023's room-details mapper (FGCPNAACHIK / GLEGPFFPDBE) reads - // these top-level keys and its Dispose walk (NEOPBOMGIOG. - // FKDDCNLJOLF, reached via the SaveRoom commit response) - // dereferences them — a missing RankingContext object or the - // DataBlob/MaxPlayers/ToxmodEnabled scalars leaves a null the - // walk NREs on ("Failed to save room" toast despite a - // persisted save). Emit them so the room DTO round-trips - // through the strict save-response path, not just the - // include-masked GET rooms/{id} path. - DataBlob = dataBlobName, - DataBlobHash = (string?)null, - MaxPlayers = sceneRows is { Count: > 0 } ? sceneRows[0].MaxPlayers : room.MaxCapacity, - ToxmodEnabled = false, - RankingContext = new - { - RoomId = room.Id, - Score = 0.0, - Rank = 0, - RankingType = 0, - }, SubRooms = subRooms, Roles = wireRoles, LoadScreens = JsonArrayOrEmpty(room.LoadScreensJson),