7.6 KiB
Historical CRCON Source Discovery
Objective
Documentar la fuente historica real y mas estable para los 2 servidores de la comunidad a partir de sus scoreboards publicos basados en CRCON, dejando claro que el historico reutilizable debe venir de esa capa y no de A2S ni de una implementacion previa ya descartada.
Discovery Date
- Verificado el 2026-03-20 contra:
https://scoreboard.comunidadhll.es/gameshttps://scoreboard.comunidadhll.es:5443/games
Main Finding
La fuente historica reutilizable mas estable disponible hoy es una API JSON publica expuesta por cada scoreboard, no el HTML renderizado de /games.
Las dos URLs de historial cargan una SPA con el mismo bundle frontend. Ese bundle usa axios con baseURL: "/api" y consulta endpoints JSON concretos:
GET /api/get_public_infoGET /api/get_live_scoreboardGET /api/get_live_game_statsGET /api/get_scoreboard_maps?page={page}&limit={limit}GET /api/get_map_scoreboard?map_id={map_id}
Por tanto, la estrategia recomendada no es parsear HTML de /games, sino consumir la capa JSON que alimenta ese frontend.
Server Mapping
Cada scoreboard representa un servidor distinto:
https://scoreboard.comunidadhll.esGET /api/get_public_infoidentifica#01 [ESP] Comunidad Hispana - discord.comunidadhll.es - Spa Onlpublic_stats_port:7010public_stats_port_https:7011
https://scoreboard.comunidadhll.es:5443GET /api/get_public_infoidentifica#02 [ESP] Comunidad Hispana - discord.comunidadhll.es - Spa Onlpublic_stats_port:7012public_stats_port_https:7013
https://scoreboard.comunidadhll.es:3443- tercer scoreboard comunitario reservado para la identidad estable
comunidad-hispana-03 - la capa de backend ya debe tratarlo como otra fuente CRCON independiente de las de
#01y#02
- tercer scoreboard comunitario reservado para la identidad estable
How Historical Data Is Loaded
1. History list
GET /api/get_scoreboard_maps?page=1&limit=5
Devuelve una lista paginada de partidas finalizadas con estructura JSON. Campos verificados:
pagepage_sizetotalmaps[]
Cada item de maps[] incluye al menos:
idcreation_timestartendserver_numbermap.idmap.pretty_namemap.image_namemap.game_moderesult.axisresult.allied
Observacion importante:
player_statsaparece vacio en la lista. Para metricas de jugadores hay que ir al endpoint de detalle.
2. Match detail
GET /api/get_map_scoreboard?map_id={map_id}
Devuelve el detalle historico de una partida concreta. Ejemplos verificados:
- servidor
#01:map_id=1561077 - servidor
#02:map_id=1561076
Campos verificados a nivel de partida:
idcreation_timestartendserver_numbermap_namemap.pretty_nameresult.axisresult.alliedplayer_stats[]
Campos verificados a nivel de jugador dentro de player_stats[]:
idplayer_idplayersteaminfo.idsteaminfo.profile.steamidcuando existemap_idkillskills_by_typekills_streakdeathsdeaths_by_typeteamkillstime_secondskills_per_minutedeaths_per_minutekill_death_ratiolongest_life_secsshortest_life_secscombatoffensedefensesupportmost_killeddeath_byweaponsdeath_by_weaponsteam.sidelevel
Esto confirma que el scoreboard ya expone la base necesaria para rankings semanales por servidor como "top kills", junto con otras metricas reutilizables.
Detail URLs And IDs
- La UI publica usa rutas tipo
/games/{id}. GET https://scoreboard.comunidadhll.es/games/1561077responde200.GET https://scoreboard.comunidadhll.es:5443/games/1561076responde200.
Inferencia razonable:
/games/{id}es la URL publica de detalle de partida.- el dato real se resuelve desde frontend llamando a
GET /api/get_map_scoreboard?map_id={id}.
Stable Historical Data Actually Available
A dia 2026-03-20, la capa JSON permite obtener de forma estable:
- servidor
- por host del scoreboard
- por
server_number - por
get_public_info.name
- partida
idstartendcreation_time
- mapa
map.idmap.pretty_namegame_modeenvironment
- jugador
player_idplayersteaminfoparcial cuando existe
- metricas
killsdeathsteamkillskills_per_minutekill_death_ratiocombatoffensedefensesupport- desglose por armas y tipos cuando aparece
Pagination And Historical Depth
- La lista historica es paginada mediante
pageylimit. - El bundle observado usa por defecto
page=1ylimit=50. - En la verificacion:
- servidor
#01reportototal: 23027 - servidor
#02reportototal: 18219
- servidor
Esto sugiere una profundidad historica amplia y apta para ingesta incremental paginada.
Risks And Limits
- La fuente es publica, pero no hay contrato formal versionado publicado; sigue siendo una API no documentada externamente.
- El frontend depende de rutas
/api/...observadas en el bundle actualv11.9.0; una actualizacion futura podria renombrarlas. player_idno parece homogeneo al 100%:- a veces coincide con SteamID
- a veces aparece como hash o identificador alternativo
steaminfopuede venir completo, parcial onull; no debe asumirse como obligatorio.- Existen valores de calidad irregular en algunas partidas:
shortest_life_secsnegativos- jugadores con tiempos atipicos
- campos vacios o
unknown
- El HTML de
/gamesno debe tomarse como base tecnica porque solo sirve la SPA shell y es mas fragil que consumir el JSON directo. - A2S sigue siendo util para estado actual, no para reconstruir historico de partidas ni ranking semanal retroactivo.
Recommended Strategy For Following Tasks
Ideal historical source
Usar directamente la API JSON publica de cada scoreboard CRCON:
- listar partidas con
GET /api/get_scoreboard_maps - obtener detalle por partida con
GET /api/get_map_scoreboard
Realistic initial operating plan
- Mantener separados los 2 orígenes:
https://scoreboard.comunidadhll.es/apihttps://scoreboard.comunidadhll.es:5443/api
- Registrar por servidor:
- host base del scoreboard
- nombre publico devuelto por
get_public_info server_number
- Ingerir paginas historicas de forma incremental.
- Persistir una entidad de partida externa con
match_id = id. - Persistir filas de estadistica por jugador asociadas a
match_idy servidor. - Calcular agregados semanales desde esos datos persistidos, no consultando el scoreboard en cada request de frontend.
Fallback if the JSON layer changes
- primer fallback: revalidar el bundle SPA para localizar las nuevas rutas
/api - segundo fallback: parsear HTML solo como ultimo recurso y solo si el JSON deja de ser accesible
Explicitly Not Recommended
- No basar el historico en A2S.
- No reutilizar como base de arquitectura una implementacion historica previa ya descartada.
- No tomar el HTML de
/gamescomo fuente principal. - No disenar todavia la UI historica final.
Repository Impact
El repositorio ya tenia una pista correcta en la landing al enlazar ambos scoreboards, pero no existia documentacion tecnica del origen real de historico.
Tambien se detecto un rastro de implementacion previa no reutilizable:
backend/app/payloads.pyimporta.historical_storagepara un flujo deweekly_top_kills- el archivo
backend/app/historical_storage.pyno existe
Ese estado confirma que cualquier intento previo de ranking historico no debe considerarse base valida para la siguiente fase. La nueva fase debe reconstruirse desde la fuente CRCON JSON documentada aqui.