diff --git a/GenOnlineService/Database/Database.MatchHistory.cs b/GenOnlineService/Database/Database.MatchHistory.cs index 3a703a1..1882552 100644 --- a/GenOnlineService/Database/Database.MatchHistory.cs +++ b/GenOnlineService/Database/Database.MatchHistory.cs @@ -290,15 +290,15 @@ private static Expression, SetPropertyC } - private static async Task _getMemberSlot(AppDbContext db, long matchId, int slotIndex) - { - if (slotIndex < 0 || slotIndex > 7) - return null; - - return await db.MatchHistory - .Where(m => m.MatchId == matchId) - .Select(_slotSelectors[slotIndex]) - .FirstOrDefaultAsync(); + private static async Task _getMemberSlot(AppDbContext db, long matchId, int slotIndex) + { + if (slotIndex < 0 || slotIndex > 7) + return null; + + return await db.MatchHistory + .Where(m => m.MatchId == matchId) + .Select(_slotSelectors[slotIndex]) + .FirstOrDefaultAsync(); } @@ -400,29 +400,32 @@ await db.MatchHistory } - private static string ComputeRosterType(int playersSeen, Dictionary playersPerTeam) + private static string ComputeRosterType(Dictionary playersPerTeam) { - // FFA check - bool isFFA = playersSeen > 2 && - playersPerTeam.All(kv => kv.Key == -1 || kv.Value == 1); + int noTeamCount = playersPerTeam.TryGetValue(-1, out int n) ? n : 0; - if (isFFA) - return $"{playersSeen} Player FFA"; + var teamedGroups = playersPerTeam + .Where(kv => kv.Key != -1) + .Select(kv => kv.Value) + .OrderBy(c => c) + .ToList(); - // Team roster type - string roster = ""; + int activePlayers = noTeamCount + teamedGroups.Sum(); - foreach (var kv in playersPerTeam) + if (activePlayers == 0) { - int count = kv.Value; + return "Unknown"; + } + + bool isFFA = activePlayers > 2 && + (noTeamCount == activePlayers || teamedGroups.All(c => c == 1)); - if (string.IsNullOrEmpty(roster)) - roster = count.ToString(); - else - roster += $"v{count}"; + if (isFFA) + { + return $"{activePlayers} Player FFA"; } - return roster; + return string.Join("v", teamedGroups); } @@ -439,7 +442,6 @@ public static async Task CreatePlaceholderMatchHistory( string?[] jsonSlots = new string?[8]; Dictionary playersPerTeam = new(); - int playersSeen = 0; foreach (var member in lobby.Members) { @@ -468,16 +470,22 @@ public static async Task CreatePlaceholderMatchHistory( jsonSlots[member.SlotIndex] = JsonSerializer.Serialize(model); - playersSeen++; - - if (playersPerTeam.ContainsKey(model.team)) - playersPerTeam[model.team]++; - else - playersPerTeam[model.team] = 1; + // Observers (side == -2) are not active players + if (model.side != -2) + { + if (playersPerTeam.ContainsKey(model.team)) + { + playersPerTeam[model.team]++; + } + else + { + playersPerTeam[model.team] = 1; + } + } } // Determine roster type - string rosterType = ComputeRosterType(playersSeen, playersPerTeam); + string rosterType = ComputeRosterType(playersPerTeam); // Build EF entity var entity = new MatchHistoryEntry @@ -1057,4 +1065,4 @@ await db.LeaderboardYearly } -} \ No newline at end of file +}