feat: Update presence data handling and notification structure to use NameWire property

This commit is contained in:
Alexa
2026-06-14 23:35:38 +03:00
parent 02b26c872d
commit 243a61ada1
3 changed files with 36 additions and 13 deletions
@@ -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<long, RoomInstanceDto>();
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,
@@ -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<string> ResolveDataBlobForPresenceAsync(long roomId, int playerId)
private async Task<string> 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;