Spectra sends events.kills[].offended_unit with uppercase roman
numerals (V/VI) while players[].units[].unit uses lowercase (v/vi).
85% of TSS games are affected — dead-vehicle strikethrough on the
Discord scoreboard never triggered because was
case-sensitive.
Normalize both sides to lowercase before comparing.
* fix: don't freeze tournament brackets that overrun their scheduled end
date_end (TSS dateEndTournament) is only the *scheduled* end; tournaments
overrun it. compute_status now trusts in_active (GetActiveTournaments
presence) over date_end, and needs_scan no longer disables re-scans past
date_end + buffer. Fixes brackets stuck while their final was still pending.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* refactor: split _store_scan_sync into reusable upsert helpers
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: store_schedule writes meta/matches/standings without wiping battles
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* refactor: extract gather_structure_sync; add fetch_schedule_sync (no battles)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: reconcile_battles gap-fills replay links for played matches only
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: debounced schedule refresh coalesces game bursts into one TSS call
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: maybe_link_battle links replays from game match_id with zero TSS calls
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: route received games through maybe_link_battle (fast-path bracket link)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* tss_tournaments: three small final-review cleanups
- link_battle_sync: drop unused team_a_name/team_b_name from SELECT and
fix status index from r[3] to r[1]
- _replace_battles: add clarifying comment about fast-path caveat and
that schedule refresh deliberately skips this function
- store_scan / store_schedule: dispatch sqlite writes off the event loop
via run_in_thread instead of calling sync writers directly
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* feat(gateway): hashed key store with grant + hot reload
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(gateway): channel registry + aiohttp app (keyed auth, whoami, per-channel ws/proxy)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(gateway): manage_keys CLI (add/list/revoke)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(gateway): retire srebot_external, run relay-gateway under PM2
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(gateway): point ecosystem + README at relay-gateway
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(tss): replay outbox producer for relay gateway
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(tss): forward processed games to relay outbox
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(tss-api): db helpers, app skeleton, info endpoint, fixtures
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(tss-api): player, games, history, search endpoints
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(tss-api): live, match, scoreboard, matches-search, maps
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(tss-api): filter-required leaderboards (players/vehicles/stats)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(tss-api): tournament list/detail/standings/matches
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: wire tss upstream through gateway + tssbot-api PM2 app
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
teams_data and team_name_history used long_name (an SRE concept for
teams with both a long and short name). TSS teams have one name only.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds /api/tss/teams/* and /api/tss/leaderboard/teams to SREBOT/server.js,
reading tss_battles.db and tss_teams.db with queries adapted to the
team_id / team_name / teams_data schema. Mirrors the existing
/api/squadrons/* endpoints. SREBOT/web/server.js gains matching proxy
routes so the frontend can reach them via the website host.
TSSBOT/BOT/storage.py picks up the columns and table the endpoints need
to return meaningful data: teams_data.clanrating, team_members.points,
and a new teams_points history table. All idempotent under the existing
init_tss_dbs() call.
Co-authored-by: Heidi <clippii@protonmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PR #1223 only staged the deletions of the old paths because the new
top-level directories were still untracked when the commit was authored.
This commit adds the actual restructured tree: SREBOT/ (existing bot),
SHARED/ (vromfs, data_parser, ICONS/MAPS/FONTS, DAGOR_FILES,
update_game_files), and TSSBOT/ (skeleton).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>