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( logger.LogInformation(
"[rooms-save] fanout room update player={PlayerId} room={RoomId} instance={InstanceId} blob={BlobName} recipients={RecipientCount}", "[rooms-save] fanout room update player={PlayerId} room={RoomId} instance={InstanceId} blob={BlobName} recipients={RecipientCount}",
pid, roomId, activeInstanceId, newBlob, playersInInstance.Length); 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>(); var updatedRoomInstances = new Dictionary<long, RoomInstanceDto>();
foreach (var playerId in playersInInstance) foreach (var playerId in playersInInstance)
@@ -594,7 +607,7 @@ public class RoomsController(
roomCode = currentPresence.RoomCode, roomCode = currentPresence.RoomCode,
photonRegionId = currentPresence.PhotonRegionId, photonRegionId = currentPresence.PhotonRegionId,
photonRoomId = currentPresence.PhotonRoomId, photonRoomId = currentPresence.PhotonRoomId,
name = currentPresence.Name, name = currentPresence.NameWire,
maxCapacity = currentPresence.MaxCapacity, maxCapacity = currentPresence.MaxCapacity,
isFull = currentPresence.IsFull, isFull = currentPresence.IsFull,
isPrivate = currentPresence.IsPrivate, isPrivate = currentPresence.IsPrivate,
@@ -285,18 +285,16 @@ public class MatchPlayerController(
return null; return null;
} }
if (string.IsNullOrWhiteSpace(room.DataBlob)) var resolvedDataBlob = await ResolveDataBlobForPresenceAsync(room.RoomId, playerId, room.RoomInstanceId);
{ if (!string.IsNullOrWhiteSpace(resolvedDataBlob)
var resolved = await ResolveDataBlobForPresenceAsync(room.RoomId, playerId); && !string.Equals(room.DataBlob, resolvedDataBlob, StringComparison.Ordinal))
if (!string.IsNullOrWhiteSpace(resolved))
{ {
log.LogWarning( log.LogWarning(
"[player-heartbeat] repairing empty presence dataBlob player={PlayerId} room={RoomId} instance={InstanceId} resolved={DataBlob}", "[player-heartbeat] repairing stale presence dataBlob player={PlayerId} room={RoomId} instance={InstanceId} cached={CachedDataBlob} resolved={ResolvedDataBlob}",
playerId, room.RoomId, room.RoomInstanceId, resolved); playerId, room.RoomId, room.RoomInstanceId, room.DataBlob, resolvedDataBlob);
room.DataBlob = resolved; room.DataBlob = resolvedDataBlob;
presence.SetRoom(playerId, room); presence.SetRoom(playerId, room);
} }
}
presence.MarkActive(playerId); presence.MarkActive(playerId);
presence.TouchRoom(playerId); presence.TouchRoom(playerId);
@@ -389,7 +387,10 @@ public class MatchPlayerController(
return string.IsNullOrWhiteSpace(cleaned) ? $"Player{ownerPlayerId}_dorm" : $"{cleaned}_dorm"; 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); var room = await db.Rooms.AsNoTracking().FirstOrDefaultAsync(r => r.Id == roomId);
if (room is null) return string.Empty; if (room is null) return string.Empty;
@@ -403,6 +404,15 @@ public class MatchPlayerController(
if (!string.IsNullOrWhiteSpace(dormBlob)) return dormBlob; 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; if (!string.IsNullOrWhiteSpace(room.CurrentDataBlobName)) return room.CurrentDataBlobName;
var customisable = room.IsDormRoom || room.CreatorPlayerId != 1; var customisable = room.IsDormRoom || room.CreatorPlayerId != 1;
@@ -288,7 +288,7 @@ public class NotificationService(
["roomCode"] = redacted.RoomCode, ["roomCode"] = redacted.RoomCode,
["photonRegionId"] = redacted.PhotonRegionId, ["photonRegionId"] = redacted.PhotonRegionId,
["photonRoomId"] = redacted.PhotonRoomId, ["photonRoomId"] = redacted.PhotonRoomId,
["name"] = redacted.Name, ["name"] = redacted.NameWire,
["maxCapacity"] = redacted.MaxCapacity, ["maxCapacity"] = redacted.MaxCapacity,
["isFull"] = redacted.IsFull, ["isFull"] = redacted.IsFull,
["isPrivate"] = redacted.IsPrivate, ["isPrivate"] = redacted.IsPrivate,