Commit Graph

146 Commits

Author SHA1 Message Date
deploy-migration 9aa6db5b58 sync server.js from production (roster-vs-game-history freshness comparison for squadron identity, replacing the older per-request fallback approach) 2026-07-02 14:59:33 +00:00
deploy-migration 1d9562105c add native Dockerfile for the discord bot process (replacing nixpacks) 2026-07-02 14:38:38 +00:00
deploy-migration 10b3294f1e add native Dockerfile for srebot-api (replacing nixpacks) 2026-07-02 14:19:22 +00:00
deploy-migration cf25f28cb9 force python provider (repo also has package.json for the Node API component, which made nixpacks misdetect this as a Node app) 2026-07-02 13:31:41 +00:00
deploy-migration e5cecda625 add requirements.txt so nixpacks can build a standalone python env 2026-07-02 13:27:52 +00:00
clxud 246a29f695 Extract website to SREBOT-web repo: remove web/, move seasons/locales/constants to repo root, fix imports 2026-07-02 02:45:22 +00:00
deploy c0214eaaae fix(recap): speed up /card lookup, fix stale completed-season cache, add Place Finished
- /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>
2026-07-01 19:20:26 +00:00
deploy 61236a8267 fix: tolerate season-reset payloads in /sq-info and stop duplicate error embeds
obtain_clan_new_points treated a missing `astat` or `member_ratings` block as
"squadron unavailable or deleted". After a season reset the game API omits those
blocks for inactive/unranked squadrons even though the clan and its roster still
exist, so /sq-info wrongly reported real squadrons (e.g. DSPL, 513th) as
nonexistent. Require a `members` roster to consider the payload valid (genuinely
deleted clans return CLAN_IS_NOT_EXISTS JSON handled upstream) and default both
stat blocks to zero, so the squadron renders at 0 points instead of erroring.

permission_fail was invoked twice per error because discord.py dispatches to
both the command-local `@cmd.error` handler and the global `@tree.error`
handler. Combined with a public defer, this produced a duplicated error message
(one public, one ephemeral). Guard on interaction.extras so the embed is sent
at most once per interaction.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 12:28:22 +00:00
NotSoToothless 3af950b464 update schedule and icons and vromfs (#1365) 2026-07-01 04:57:03 -07:00
deploy 659785f8f3 perf: leaderboard SWR cache + threadpool fix for season-III stalls
- Fix 1: UV_THREADPOOL_SIZE=24 via start_server.sh wrapper (libuv reads OS
  environ; process.env and PM2 env blocks don't propagate on this system)
- Fix 2: Stale-while-revalidate for leaderboards — serve cached/stale data
  instantly, refresh in background; dedicated aggregateCache isolated from
  the 100-entry responseCache; single-flight dedup for concurrent computes
- Fix 3: Background warmer precomputes current + last-completed season
  leaderboards at +20s boot and every 4 min
- Fix 5: Adaptive TTL (5 min live, 24 h completed) via aggregateCacheTtl
- Fixes 1+2 combined: player page stall 95s -> 3.6s under concurrent heavy
  leaderboard load; warm hits served in 1-4ms (was 13-53s)
2026-06-30 12:08:02 +00:00
NotSoToothless 0f8f22df29 update for spectra changes (#1363) 2026-06-29 11:05:51 -07:00
deploy 010e356dc8 pm2: add crash-loop governor to all apps; lower srebot max_memory_restart to 12000M
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 12:58:56 +00:00
FURRO404 a58a4e5c42 webhook: restart relay-gateway on SHARED/relay_gateway changes, tssbot-api on TSSBOT/web changes 2026-06-28 07:13:03 -07:00
FURRO404 0b3c6f478e fix: proxy without channel prefix for SREBOT, revert server.js rewrite 2026-06-28 06:51:33 -07:00
FURRO404 820073f95c add rewrite debug script 2026-06-28 06:50:43 -07:00
NotSoToothless 18faa665ec fix sre rewrite slice offset: /api/sre is 8 chars, not 9 (#1359) 2026-06-28 06:43:39 -07:00
NotSoToothless c1acafe65a fix sre rewrite: strip prefix before appending /api (#1358) 2026-06-28 06:31:54 -07:00
NotSoToothless ffb31f3bb1 holy meow (#1357) 2026-06-28 06:20:20 -07:00
NotSoToothless 377f7b8397 meow (#1355) 2026-06-28 05:01:33 -07:00
NotSoToothless 0f3943c8bd meow (#1354) 2026-06-28 04:57:09 -07:00
NotSoToothless cbb532a711 Auto merge dev → main (#1353)
* 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>
2026-06-28 03:38:20 -07:00
NotSoToothless ea5494bce0 add 3d to srebot (#1351) 2026-06-21 08:06:30 -07:00
NotSoToothless 8a084fb644 add 3d to srebot (#1350) 2026-06-21 07:54:35 -07:00
deploy 28a635438d feat(tally): fix live VC status updates and add permission pre-flight check
- Move tally hook from process_session (per-guild, gated by Logs subs)
  to process_ws_replays (once per game, all guilds) via on_game_finished
- Add set_voice_channel_status permission check at /tally-claim time so
  failures are immediate and visible rather than silent on every game
- Remove entitlement gate from tally_claim and tally_transfer
- Add VC tally permission section to /diagnose-perms when run in a VC
- Add 5 new locale keys to en.json for the permission messages

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 08:02:53 +00:00
deploy 661a71649a feat(locales): add tally VC-permission keys to all non-English locales
Adds no_vc_perm, no_vc_perm_diagnose, vc_perm_ok, vc_perm_header, and
vc_perm_not_in_vc to cs, de, es, fr, it, pl, pt, ru, uk, zh-CN.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 08:00:06 +00:00
NotSoToothless 062a9e2bdf meow (#1344) 2026-06-19 18:47:44 -07:00
deploy ac7c318899 fix(player): pick most-recent squadron_members row when uid has duplicates
A player who changed squadrons could end up with two rows in
squadron_members (old + new clan). Without ORDER BY, LIMIT 1
returned whichever row the primary-key B-tree (clan_id, uid) put
first — i.e. the lowest clan_id, which was the stale entry. This
caused the player page to show the old squadron while the homepage
search (which only reads player_games_hist) showed the correct one.

Fix: add ORDER BY updated_at DESC to both the API roster lookup in
server.js and the web fallback lookup in web/server.js, so the most
recently synced membership always wins.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 10:48:44 +00:00
NotSoToothless 25990c361f docs(tally): add tally to /help + website docs; translate to all locales (#1342)
- 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>
2026-06-19 01:56:32 -07:00
NotSoToothless 3590b1f42f Auto merge dev → main (#1341)
* chore(tally): remove /dev-tally testing command

Feature is verified working; drop the dev-only manual win/loss command and its now-unused apply_manual_result helper and test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* refactor(tally): rename /tally-wipe to /tally-clear

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 01:33:29 -07:00
NotSoToothless db7c546a24 feat(tally): friendlier option labels + dev-tally only counts matching target (#1340)
Rename /tally-claim and /tally-transfer options to username/squadron with
clearer descriptions. Fix /dev-tally to only apply a win/loss when the
passed username/squadron actually matches what the VC is tracking, instead
of bumping any active tally.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 01:27:08 -07:00
NotSoToothless 9222f7c53f Auto merge dev → main (#1339)
* feat(tally): /tally-claim, /tally-transfer, /tally-wipe commands

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(tally): idle sweep, startup load, and empty-VC expiry

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* style(tally): parenthesize voice-state guard for clarity

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(tally): update live tallies when sessions finish

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(tally): robust winner matching + cleanup of deleted-VC tallies

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(tally): /dev-tally to manually attribute a win/loss in your VC

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 01:19:19 -07:00
NotSoToothless 732595433a feat(tally): registry, JSON persistence, voice-status HTTP, session hook (#1338)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:20:31 -07:00
NotSoToothless 74c59eb139 feat(tally): core model, evaluation and status formatting (#1337)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:15:43 -07:00
NotSoToothless 76844c1c6f -am (#1335) 2026-06-18 20:11:22 -07:00
NotSoToothless 48f96ca8ff Auto merge dev → main (#1332)
* feat(tssbot): build_match_logs + match_logs persistence

* feat(tssbot): create match_logs table and write logs at ingest

* feat(tssbot): one-time match_logs backfill script

* feat(srebot): persist chat/battle logs to match_logs (parity, no backfill)

* feat(tssbot): Battle/Chat Log buttons on Discord scoreboards
2026-06-18 01:02:59 -07:00
NotSoToothless a70e7e0d74 meow (#1328) 2026-06-14 22:58:26 -07:00
NotSoToothless 7b22e70714 cache bruh (#1327) 2026-06-14 22:53:26 -07:00
NotSoToothless 186cd49649 update canvas winning team glow effect (#1326) 2026-06-14 22:47:37 -07:00
NotSoToothless deb4e0fb12 update renderer to have cap status also tickets (#1325) 2026-06-14 22:36:06 -07:00
NotSoToothless 4b75ce1533 Auto merge dev → main (#1324)
* update game files

* update files and capture raw spectra payload
2026-06-14 21:11:57 -07:00
NotSoToothless 931b6f0be0 please (#1323) 2026-06-07 21:03:36 -07:00
NotSoToothless 763fadcaf4 please (#1322) 2026-06-07 21:02:09 -07:00
NotSoToothless a3776ec038 please (#1321) 2026-06-07 20:53:30 -07:00
NotSoToothless 28ce4f0541 please (#1320) 2026-06-07 20:44:44 -07:00
NotSoToothless b88f41c14c please (#1319) 2026-06-07 20:33:49 -07:00
NotSoToothless eaddb61b19 please (#1318) 2026-06-07 20:22:46 -07:00
NotSoToothless 80a6960681 please (#1317) 2026-06-07 20:16:59 -07:00
NotSoToothless d0c3abd79a please (#1316) 2026-06-07 20:11:16 -07:00
NotSoToothless cd9ed02902 please (#1315) 2026-06-07 20:04:27 -07:00
NotSoToothless a5fa8054c2 I HATE AI WEBSITE SLOPS (#1314) 2026-06-07 19:47:38 -07:00