* update homepage
* fix webhook missing restarts on PR merge (empty commits payload)
When GitHub fires a push event for a PR merge, the commits array is
sometimes empty, leaving changed_files as [] and skipping all restarts.
Fall back to git diff --name-only using the before/after SHAs from the
payload so changed files are always derived correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <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>
Raise websockets max_size to 32MB so zstd-compressed frames from Spectra
that exceed the 1MB default aren't rejected before decompression.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Per-squadron WeeklyBR reports are distinct from the global wildcard
report and should always send even when both point at the same channel.
Removed the dedup block that was silently dropping squadron-specific
embeds whenever the channel matched the wildcard channel.
Adds /resend-weekly-br (dev-only) to force-resend the most recently
ended BR window to all configured channels, clearing the idempotency
marker first.
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>
TSSBOT has no node_modules/ on the server (no package.json was ever
installed for it), so `require('dotenv').config()` crashes pm2 with
MODULE_NOT_FOUND when it loads the ecosystem file. The dotenv call was
already dead code: every spawned app loads its own .env in its own
process (botscript.py, server.js, web/server.js, webhook updater,
TSSBOT/start_bot.py all do load_dotenv / require('dotenv').config()
themselves). Remove the require from both ecosystem files.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Make .env the single source of truth for runtime config. Remove all
`env:` blocks from SREBOT/ecosystem.config.js and TSSBOT/ecosystem.config.js
so values can't silently shadow .env. Both ecosystem files load .env via
`require('dotenv').config()` and PM2 inherits the resolved environment.
- Rename SREBOT_STORAGE_VOL_PATH → STORAGE_VOL_PATH across all readers
(BOT/utils.py, BOT/receiver_bridge.py, BOT/render_recap.py, server.js,
web/server.js, dateindex.js, scripts/*, srebot.service, tests/, README,
and both .env files). STORAGE is shared between SREBOT and TSSBOT, so the
variable shouldn't carry one bot's prefix.
- Rename per-process PORT env vars to disambiguated names so .env can be
the source of truth without collisions:
PORT (api) → SREBOT_API_PORT (server.js)
PORT (web) → SREBOT_WEB_PORT (web/server.js)
WEBHOOK_PORT → SREBOT_WEBHOOK_PORT (github_webhook_updater.py)
SREBOT_EXTERNAL_HOST/PORT/UPSTREAM_URL were already uniquely named;
they just move from ecosystem env to .env.
- TSSBOT/.env: drop GITHUB_WEBHOOK_SECRET (only srebot-webhook consumes it)
and the stale SREBOT_DEPLOY_PATH. SREBOT/.env: also drop the obsolete
SREBOT_DEPLOY_PATH (ecosystem now hardcodes __dirname).
- ecosystem.config.js no longer references SREBOT_DEPLOY_PATH; deploy path
is always __dirname of the ecosystem file.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>