- 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>
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>
- 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>
* 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>
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>
* 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>