Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 25 additions & 29 deletions GenOnlineService/ExternalLeaderboardsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -176,42 +176,38 @@ await retryPolicy.ExecuteAsync(async () =>
return;
}

// Only QuickMatch responses are expected to carry a ratings body.
if (lobby.LobbyType == ELobbyType.QuickMatch)
string responseBody = await response.Content.ReadAsStringAsync();
var refreshResponse = JsonSerializer.Deserialize<EloRefreshResponse>(responseBody);
if (refreshResponse?.data == null)
{
string responseBody = await response.Content.ReadAsStringAsync();
var refreshResponse = JsonSerializer.Deserialize<EloRefreshResponse>(responseBody);
if (refreshResponse?.data == null)
{
Console.WriteLine($"[WARNING] External Match Ingest response body contains no data or could not be deserialized: {responseBody}");
return;
}
Console.WriteLine($"[WARNING] External Match Ingest response body contains no data or could not be deserialized: {responseBody}");
return;
}

// Only player IDs that were actually part of this match are valid recipients of an ELO update.
var expectedPlayerIds = new HashSet<long>(matchEntry.members.Where(m => m.HasValue).Select(m => m.Value.user_id));
// Only player IDs that were actually part of this match are valid recipients of an ELO update.
var expectedPlayerIds = new HashSet<long>(matchEntry.members.Where(m => m.HasValue).Select(m => m.Value.user_id));

foreach (var (userId, updatedPlayer) in refreshResponse.data)
foreach (var (userId, updatedPlayer) in refreshResponse.data)
{
if (!expectedPlayerIds.Contains(userId))
{
if (!expectedPlayerIds.Contains(userId))
{
Console.WriteLine($"[WARNING] External Match Ingest response for match {lobby.MatchID} contained unexpected player_id {userId}; skipping (ELO left unchanged).");
continue;
}

int newRating = updatedPlayer.rating;
int newMatches = updatedPlayer.matches;
Console.WriteLine($"[WARNING] External Match Ingest response for match {lobby.MatchID} contained unexpected player_id {userId}; skipping (ELO left unchanged).");
continue;
}

// Update in-memory session cache if the player is online
var sharedData = WebSocketManager.GetSharedDataForUser(userId);
if (sharedData?.GameStats != null)
{
sharedData.GameStats.EloRating = newRating;
sharedData.GameStats.EloMatches = newMatches;
}
int newRating = updatedPlayer.rating;
int newMatches = updatedPlayer.matches;

// Call SaveELOData to persist as fallback
await Database.Users.SaveELOData(db, userId, new EloData(newRating, newMatches));
// Update in-memory session cache if the player is online
var sharedData = WebSocketManager.GetSharedDataForUser(userId);
if (sharedData?.GameStats != null)
{
sharedData.GameStats.EloRating = newRating;
sharedData.GameStats.EloMatches = newMatches;
}

// Call SaveELOData to persist as fallback
await Database.Users.SaveELOData(db, userId, new EloData(newRating, newMatches));
}
}
catch (Exception ex)
Expand Down
Loading