From 243a61ada1a54c0ae0d0058555a9b7998b274017 Mon Sep 17 00:00:00 2001 From: Alexa <53471801+Alexa-RR@users.noreply.github.com> Date: Sun, 14 Jun 2026 23:35:38 +0300 Subject: [PATCH] feat: Update presence data handling and notification structure to use NameWire property --- .../API/Rooms/V2/RoomsController.cs | 15 ++++++++- .../Match/MatchPlayerController.cs | 32 ++++++++++++------- .../Services/NotificationService.cs | 2 +- 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/DorkNet.Server/Controllers/API/Rooms/V2/RoomsController.cs b/DorkNet.Server/Controllers/API/Rooms/V2/RoomsController.cs index 8a59f69..e3b53db 100644 --- a/DorkNet.Server/Controllers/API/Rooms/V2/RoomsController.cs +++ b/DorkNet.Server/Controllers/API/Rooms/V2/RoomsController.cs @@ -532,6 +532,19 @@ public class RoomsController( logger.LogInformation( "[rooms-save] fanout room update player={PlayerId} room={RoomId} instance={InstanceId} blob={BlobName} recipients={RecipientCount}", pid, roomId, activeInstanceId, newBlob, playersInInstance.Length); + if (activeInstanceId != 0) + { + var updatedPrivateInstances = await db.PrivateInstances + .Where(instance => instance.Id == activeInstanceId && instance.RoomId == roomId) + .ExecuteUpdateAsync(setters => setters + .SetProperty(instance => instance.DataBlob, newBlob)); + if (updatedPrivateInstances > 0) + { + logger.LogInformation( + "[rooms-save] updated private instance blob room={RoomId} instance={InstanceId} blob={BlobName}", + roomId, activeInstanceId, newBlob); + } + } var updatedRoomInstances = new Dictionary(); foreach (var playerId in playersInInstance) @@ -594,7 +607,7 @@ public class RoomsController( roomCode = currentPresence.RoomCode, photonRegionId = currentPresence.PhotonRegionId, photonRoomId = currentPresence.PhotonRoomId, - name = currentPresence.Name, + name = currentPresence.NameWire, maxCapacity = currentPresence.MaxCapacity, isFull = currentPresence.IsFull, isPrivate = currentPresence.IsPrivate, diff --git a/DorkNet.Server/Controllers/Match/MatchPlayerController.cs b/DorkNet.Server/Controllers/Match/MatchPlayerController.cs index bd30b47..5ce2a09 100644 --- a/DorkNet.Server/Controllers/Match/MatchPlayerController.cs +++ b/DorkNet.Server/Controllers/Match/MatchPlayerController.cs @@ -285,17 +285,15 @@ public class MatchPlayerController( return null; } - if (string.IsNullOrWhiteSpace(room.DataBlob)) + var resolvedDataBlob = await ResolveDataBlobForPresenceAsync(room.RoomId, playerId, room.RoomInstanceId); + if (!string.IsNullOrWhiteSpace(resolvedDataBlob) + && !string.Equals(room.DataBlob, resolvedDataBlob, StringComparison.Ordinal)) { - var resolved = await ResolveDataBlobForPresenceAsync(room.RoomId, playerId); - if (!string.IsNullOrWhiteSpace(resolved)) - { - log.LogWarning( - "[player-heartbeat] repairing empty presence dataBlob player={PlayerId} room={RoomId} instance={InstanceId} resolved={DataBlob}", - playerId, room.RoomId, room.RoomInstanceId, resolved); - room.DataBlob = resolved; - presence.SetRoom(playerId, room); - } + log.LogWarning( + "[player-heartbeat] repairing stale presence dataBlob player={PlayerId} room={RoomId} instance={InstanceId} cached={CachedDataBlob} resolved={ResolvedDataBlob}", + playerId, room.RoomId, room.RoomInstanceId, room.DataBlob, resolvedDataBlob); + room.DataBlob = resolvedDataBlob; + presence.SetRoom(playerId, room); } presence.MarkActive(playerId); presence.TouchRoom(playerId); @@ -389,7 +387,10 @@ public class MatchPlayerController( return string.IsNullOrWhiteSpace(cleaned) ? $"Player{ownerPlayerId}_dorm" : $"{cleaned}_dorm"; } - private async Task ResolveDataBlobForPresenceAsync(long roomId, int playerId) + private async Task ResolveDataBlobForPresenceAsync( + long roomId, + int playerId, + long? roomInstanceId = null) { var room = await db.Rooms.AsNoTracking().FirstOrDefaultAsync(r => r.Id == roomId); if (room is null) return string.Empty; @@ -403,6 +404,15 @@ public class MatchPlayerController( if (!string.IsNullOrWhiteSpace(dormBlob)) return dormBlob; } + if (roomInstanceId is > 0) + { + var instanceBlob = await db.PrivateInstances.AsNoTracking() + .Where(instance => instance.Id == roomInstanceId && instance.RoomId == roomId) + .Select(instance => instance.DataBlob) + .FirstOrDefaultAsync(); + if (!string.IsNullOrWhiteSpace(instanceBlob)) return instanceBlob; + } + if (!string.IsNullOrWhiteSpace(room.CurrentDataBlobName)) return room.CurrentDataBlobName; var customisable = room.IsDormRoom || room.CreatorPlayerId != 1; diff --git a/DorkNet.Server/Services/NotificationService.cs b/DorkNet.Server/Services/NotificationService.cs index 030c796..95543b6 100644 --- a/DorkNet.Server/Services/NotificationService.cs +++ b/DorkNet.Server/Services/NotificationService.cs @@ -288,7 +288,7 @@ public class NotificationService( ["roomCode"] = redacted.RoomCode, ["photonRegionId"] = redacted.PhotonRegionId, ["photonRoomId"] = redacted.PhotonRoomId, - ["name"] = redacted.Name, + ["name"] = redacted.NameWire, ["maxCapacity"] = redacted.MaxCapacity, ["isFull"] = redacted.IsFull, ["isPrivate"] = redacted.IsPrivate,