Commit Graph

37 Commits

Author SHA1 Message Date
deploy c0755ec243 fix: strip leading/trailing non-alphanumeric chars in _normalize_squadron_tag
The old regex [^A-Za-z0-9_-] whitelisted dashes and underscores, so
-DSPLA- and _APS_ passed through untouched. All downstream code that
reads team["squadron"] then saw the raw tag instead of the bare short
name, causing NULL clan_ids in player_games_hist/match_summary and
broken lookups throughout. Fixing at the source means every consumer
gets a clean name without individual patches.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:24:25 +00:00
deploy 74c56881fd fix: strip tag decorators from winner/loser before guild_squadron comparison
guild_squadron is the clean short name from SQUADRONS.json (e.g. DSPLA)
but winning_team_squadron in the replay is the raw tagged value (-DSPLA-).
They never matched for dash/underscore-tagged squads so bar_color was
always not_involved instead of win/loss on the guild's own scoreboard.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:18:11 +00:00
deploy 0154c41997 fix: strip tag decorators from squadron names in comp writer and /comp lookup
Squads with dash or underscore tags (e.g. -DSPLA-, _APS_) had their raw
replay team.squadron value written directly to COMPS filenames, producing
-DSPLA-.json / _APS_.json. The /comp autocomplete returns the clean DB
short_name (DSPLA) so the file lookup never matched.

Fix: strip leading/trailing non-alphanumeric characters and uppercase in
both the writer and the /comp command lookup. Also renamed the 8 existing
decorated COMPS files to their clean equivalents on disk.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:15:48 +00:00
deploy 1d5da8042c fix: use raw squadron tag for win/loss comparison, not resolved short name
My earlier change to use squadron_short (resolved clean name, e.g. DSPLA)
for display broke the win/loss header colour: winning_team is the raw
replay value (e.g. -DSPLA-) so the comparison never matched, rendering
both teams as losers. Split into squadron_raw (comparison) vs
squadron_short (display text) so each uses the right value.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 17:22:45 +00:00
deploy 2a143c360f fix: apply per-team resolution to process_session clan lookup
Same order-inversion bug as build_scoreboard_context existed in
process_session's resolve_clans call. The inverted squadron_long
caused the scoreboard renderer to find the opponent's diff entry
for a dash-tagged squad's players, producing ??? for every player
since their UIDs weren't in the wrong squad's points_diff dict.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 17:16:44 +00:00
deploy 606e174a97 fix: resolve each team independently to prevent squadron_long order inversion
When one team has a dash-tag (e.g. -DSPLA-) and the opponent has a normal
tag (e.g. ALUN2), batching both into resolve_clans caused the short-name
pass to place the normal team first in results and the tag pass to append
the dash-tagged team second — inverting the mapping vs. the teams array.
Each team's players were then looked up against the wrong squadron's API,
yielding curr=0 for everyone and diffs=0 on the scoreboard.

Fix: resolve each team concurrently and independently so results are always
index-aligned with the teams list regardless of which resolution path fires.
Also propagates squadron_short to the scoreboard renderer so display names
are clean (DSPLA not -DSPLA-).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 17:04:40 +00:00
NotSoToothless cc4bc14193 fix schedule (#1286) 2026-05-29 09:45:37 -07:00
deploy 5d972d7314 fix: resolve_clans drops unresolved placeholders to allow tag fallback
Squads with dash-wrapped tags (e.g. -DSPLA-) store the full tag in the
replay's team.squadron field rather than the bare short name. The short
lookup fails and returns a placeholder whose short_name blocks the tag
lookup, leaving squadron_long as "<unresolved>" and producing no point
diffs on scoreboards. Fix: only include successfully resolved clans
(clan_id is not None) in results and resolved_shorts so the tag pass
still runs for any failed short lookup. Affects all 186 dash-tagged squads.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 16:42:23 +00:00
NotSoToothless 96aa75be57 fuck u (#1283) 2026-05-28 06:37:08 -07:00
NotSoToothless a489d7d04b fix schedule (#1282) 2026-05-28 06:03:52 -07:00
NotSoToothless 4984ba4f6c fix schedule (#1280) 2026-05-27 07:22:53 -07:00
NotSoToothless 45b1b334c4 update bumass command, and bad wording (#1279) 2026-05-27 07:08:28 -07:00
NotSoToothless 0c99a911e0 whoops (#1271) 2026-05-27 04:29:57 -07:00
NotSoToothless 8760c63759 update tss and sre replay area (#1269) 2026-05-25 21:24:56 -07:00
NotSoToothless c4693e498c fixed (#1268) 2026-05-24 19:47:37 -07:00
NotSoToothless 9c6ca3bcd7 compress the mf (#1267) 2026-05-24 19:44:12 -07:00
Clippii 99a43e398e fix ws dropping replays due to 1MB max_size limit
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>
2026-05-24 16:36:24 +00:00
NotSoToothless f6f4e33a65 update to handle new structure from spectra, no more gobs (#1266) 2026-05-23 17:16:53 -07:00
NotSoToothless 2d5adfcbe0 fix leave alarm (#1265) 2026-05-21 23:22:10 -07:00
NotSoToothless cd909bc858 add leave option and wire up (#1264) 2026-05-19 22:24:03 -07:00
NotSoToothless b36886425b fix again (#1263) 2026-05-19 18:06:30 -07:00
NotSoToothless f511cdc083 maybeeee fix more stuff for gob videos (#1262) 2026-05-19 17:37:41 -07:00
NotSoToothless 2c9e89eee2 update renderer and web viewer to correctly cut map and show caps (#1261) 2026-05-19 15:37:19 -07:00
NotSoToothless 47ae8b92f7 Auto merge dev → main (#1258)
* meow

* updated it

* meow

* add avg TTL footer to /comp + extend freshness window to 90m when servers slow

---------

Co-authored-by: Clippii <clippii@protonmail.com>
2026-05-17 12:58:48 -07:00
Heidi 5148a0c7bb fix 2026-05-17 17:01:07 +01:00
Clippii d316d8fd61 added feat 2026-05-17 12:11:11 +01:00
NotSoToothless ff379c7843 move some commands to standard (#1256) 2026-05-16 16:04:37 -07:00
NotSoToothless 55ab213e76 limit by UID and server (#1252) 2026-05-15 03:05:48 -07:00
NotSoToothless 311ae875fb limit by UID and server (#1251) 2026-05-15 02:56:55 -07:00
NotSoToothless 0c3fc27832 mrrrp (#1250) 2026-05-15 02:27:26 -07:00
NotSoToothless de78c90033 fix weekly br selector (#1249) 2026-05-15 02:23:30 -07:00
NotSoToothless 6303285425 fix weekly BR dedup + add /resend-weekly-br dev command
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>
2026-05-15 09:19:33 +00:00
NotSoToothless 39c42ab635 remove old links (#1243) 2026-05-14 16:17:30 -07:00
NotSoToothless 3fb15d6282 consolidate runtime env into .env, drop ecosystem env blocks (#1229)
- 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>
2026-05-14 00:07:34 -07:00
NotSoToothless 39ef90b3fd Auto merge dev → main (#1225)
* fix BOT.data_parser import in render_recap.py

render_recap.py runs as a subprocess (Path(__file__).parent.parent on
sys.path) and used `from BOT.data_parser import ...`. After the SHARED
move, data_parser is no longer in the BOT package. Add BOTS/SHARED to
sys.path and switch to the absolute `from data_parser import ...`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* centralize SHARED sys.path bootstrap in BOT/__init__.py

Drop per-file `sys.path.insert(SHARED)` bandaids from BOT/scoreboard.py,
gob.py, utils.py, and game_api.py. The bootstrap now happens exactly
once when the BOT package is imported (via BOT/__init__.py), which is
implicit for any `from BOT.X import …` / `import BOT.X` and any
`python -m BOT.x` invocation.

`SHARED_DIR` is exposed as a public name on the BOT package; siblings
import it via `from . import SHARED_DIR` for building asset paths
(MAPS, ICONS, FONTS, vromfs) instead of recomputing the location.

render_recap.py is the one subprocess entry point that runs as
__main__, so it keeps a minimal bootstrap: add SREBOT to sys.path
then `import BOT` to fire the package init once.

Also move pyrightconfig.json to the BOTS monorepo root so pyright
resolves data_parser and third-party imports regardless of which
subproject the editor opens from.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:42:47 -07:00
NotSoToothless ff420e131f fix relative .data_parser imports in BOT/* after SHARED move (#1224)
PR #1223 + fixup moved data_parser into BOTS/SHARED, but five BOT modules
(analytics, autologging, botscript, lux_apis, meta_manager) still used
`from .data_parser import ...`. That relative form looks inside the BOT
package, which no longer contains data_parser, so the bot crashed at
startup with ModuleNotFoundError.

Add BOT/__init__.py to put BOTS/SHARED on sys.path at package import,
then switch all five files to absolute `from data_parser import ...`.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 23:30:15 -07:00
FURRO404 2b399fdb81 add SREBOT, SHARED, TSSBOT contents (fixup for #1223)
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>
2026-05-13 23:17:02 -07:00