fix: distinguish player teams and correct recent player counts
This commit is contained in:
@@ -149,21 +149,35 @@ def list_materialized_rcon_matches(
|
||||
clauses: list[str] = []
|
||||
params: list[object] = []
|
||||
if target_key:
|
||||
clauses.append("(target_key = ? OR external_server_id = ?)")
|
||||
clauses.append("(m.target_key = ? OR m.external_server_id = ?)")
|
||||
params.extend([target_key, target_key])
|
||||
if only_ended:
|
||||
clauses.append("source_basis = ?")
|
||||
clauses.append("m.source_basis = ?")
|
||||
params.append(MATCH_RESULT_SOURCE)
|
||||
where = "WHERE " + " AND ".join(clauses) if clauses else ""
|
||||
params.append(limit)
|
||||
with closing(connect_sqlite_readonly(resolved_path)) as connection:
|
||||
rows = connection.execute(
|
||||
f"""
|
||||
SELECT *
|
||||
FROM rcon_materialized_matches
|
||||
SELECT
|
||||
m.*,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM rcon_match_player_stats AS stats
|
||||
WHERE stats.target_key = m.target_key
|
||||
AND stats.match_key = m.match_key
|
||||
) AS materialized_player_count,
|
||||
(
|
||||
SELECT COUNT(DISTINCT TRIM(stats.player_name))
|
||||
FROM rcon_match_player_stats AS stats
|
||||
WHERE stats.target_key = m.target_key
|
||||
AND stats.match_key = m.match_key
|
||||
AND TRIM(COALESCE(stats.player_name, '')) != ''
|
||||
) AS materialized_distinct_player_count
|
||||
FROM rcon_materialized_matches AS m
|
||||
{where}
|
||||
ORDER BY COALESCE(ended_at, started_at) DESC,
|
||||
COALESCE(ended_server_time, started_server_time) DESC
|
||||
ORDER BY COALESCE(m.ended_at, m.started_at) DESC,
|
||||
COALESCE(m.ended_server_time, m.started_server_time) DESC
|
||||
LIMIT ?
|
||||
""",
|
||||
params,
|
||||
|
||||
@@ -208,6 +208,7 @@ def _build_materialized_recent_item(item: dict[str, object]) -> dict[str, object
|
||||
server_slug = item.get("external_server_id") or item.get("target_key")
|
||||
timestamps = _build_materialized_timestamp_payload(item)
|
||||
correlation_window = _build_materialized_scoreboard_correlation_window(item, timestamps)
|
||||
player_count = _resolve_materialized_player_count(item)
|
||||
return {
|
||||
"server": {
|
||||
"slug": item.get("target_key"),
|
||||
@@ -232,7 +233,7 @@ def _build_materialized_recent_item(item: dict[str, object]) -> dict[str, object
|
||||
"winner": item.get("winner"),
|
||||
},
|
||||
"winner": item.get("winner"),
|
||||
"player_count": None,
|
||||
"player_count": player_count,
|
||||
"peak_players": None,
|
||||
"sample_count": None,
|
||||
"duration_seconds": _calculate_match_duration_seconds(item),
|
||||
@@ -273,6 +274,7 @@ def _build_materialized_detail_item(materialized: dict[str, object]) -> dict[str
|
||||
)
|
||||
for row in materialized["players"]
|
||||
]
|
||||
player_count = len(players) if players else recent_item.get("player_count")
|
||||
return {
|
||||
**recent_item,
|
||||
"match_id": match["match_key"],
|
||||
@@ -280,6 +282,7 @@ def _build_materialized_detail_item(materialized: dict[str, object]) -> dict[str
|
||||
"winner": match.get("winner"),
|
||||
"confidence": match.get("confidence_mode"),
|
||||
"source_basis": match.get("source_basis"),
|
||||
"player_count": player_count,
|
||||
"players": players,
|
||||
"timeline": {
|
||||
"event_counts": materialized.get("timeline", []),
|
||||
@@ -287,6 +290,18 @@ def _build_materialized_detail_item(materialized: dict[str, object]) -> dict[str
|
||||
}
|
||||
|
||||
|
||||
def _resolve_materialized_player_count(item: dict[str, object]) -> int | None:
|
||||
for key in (
|
||||
"player_count",
|
||||
"materialized_player_count",
|
||||
"materialized_distinct_player_count",
|
||||
):
|
||||
value = _coerce_optional_int(item.get(key))
|
||||
if value is not None and value > 0:
|
||||
return value
|
||||
return None
|
||||
|
||||
|
||||
def _build_player_row(
|
||||
row: dict[str, object],
|
||||
*,
|
||||
|
||||
Reference in New Issue
Block a user