- /card player lookup was a leading-wildcard substring match with a Python
ulower() UDF over 6.16M player_games_hist rows — a full scan measured at
27s live before the ~2s render. Add a prefix fast-path
(nick LIKE 'name%' COLLATE NOCASE) that uses the existing NOCASE index
(~1ms), falling back to the ulower substring scan only when the prefix
finds nothing. Same fix applied to _resolve_player_uids_batch (compare/stats).
Lookup: 27,205ms -> 1ms.
- Completed-season recap cache served ANY cached PNG forever, including files
rendered mid-season (frozen at whatever point they were last viewed). Only
serve from cache when the file's mtime is after season end; otherwise
re-render. Fixed in both BOT/utils.py and web/server.js (shared cache).
- Replace squadron card "Rating change" with "Place finished" (#rank / total),
derived by ranking clans by final total_score among those active in-season.
- Add (CARD)/(RECAP) timing logs for prod observability.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Add a 'Voice channel tally' group to /help with the three commands.
- Add a Voice Channel Tally section to the website docs (docs.ejs).
- Translate the commands.tally bot strings + help_group_tally into all 10
other bot locales, and the new docs.* web strings into all 10 web locales.
- Fix stale need_one_input string (ign/squadron_short -> username/squadron).
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Shows paying squadrons as pill links (SHORT // LONG → /squadrons/<short>) above the footer, with a 15-min server-side cache backed by entitlements DB + SQUADRONS.json.
Co-Authored-By: Claude Sonnet 4.6 <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>