next-release #42

Merged
cal merged 8 commits from next-release into main 2026-02-20 20:28:16 +00:00
Owner

Release Notes

Live Scorebug Fixes

  • Scorecard publishing now works reliably — Publishing a new scorecard (or replacing an existing one) is now picked up by the live scores
    tracker immediately. Previously, #live-sba-scores could get stuck showing an old game until the bot restarted.
  • Win probability is no longer stuck at 50% — The win probability bar now correctly reflects the actual game state. When the sheet can't
    provide a value, it shows "unavailable" instead of a misleading 50/50 split.
  • Win probability shows the right team — Fixed a bug where the win percentage was attributed to the wrong team (e.g., showing 95% MKE when
    DEN was actually winning).
  • Live scores channel is more resilient — A temporary Google Sheets error will no longer cause #live-sba-scores to disappear. The channel
    only hides when all games are confirmed final.

Security Improvements

  • API keys are no longer hardcoded in config files
  • User-facing error messages no longer leak internal details
  • Query parameters are properly encoded to prevent injection
  • Command hash detection upgraded from MD5 to SHA-256

Bug Fixes

  • Fixed config.testing defaulting to True, which was masking production behavior
  • Replaced deprecated asyncio.get_event_loop() calls
  • All timestamps are now timezone-aware (UTC), preventing subtle date/time bugs
  • Cleaned up 226 unused imports across the codebase

Internal

  • Added local deploy script for production deploys
  • Removed obsolete test stubs
Release Notes Live Scorebug Fixes - Scorecard publishing now works reliably — Publishing a new scorecard (or replacing an existing one) is now picked up by the live scores tracker immediately. Previously, #live-sba-scores could get stuck showing an old game until the bot restarted. - Win probability is no longer stuck at 50% — The win probability bar now correctly reflects the actual game state. When the sheet can't provide a value, it shows "unavailable" instead of a misleading 50/50 split. - Win probability shows the right team — Fixed a bug where the win percentage was attributed to the wrong team (e.g., showing 95% MKE when DEN was actually winning). - Live scores channel is more resilient — A temporary Google Sheets error will no longer cause #live-sba-scores to disappear. The channel only hides when all games are confirmed final. Security Improvements - API keys are no longer hardcoded in config files - User-facing error messages no longer leak internal details - Query parameters are properly encoded to prevent injection - Command hash detection upgraded from MD5 to SHA-256 Bug Fixes - Fixed config.testing defaulting to True, which was masking production behavior - Replaced deprecated asyncio.get_event_loop() calls - All timestamps are now timezone-aware (UTC), preventing subtle date/time bugs - Cleaned up 226 unused imports across the codebase Internal - Added local deploy script for production deploys - Removed obsolete test stubs
cal added 8 commits 2026-02-20 20:24:52 +00:00
feat: add local deploy script for production deploys
All checks were successful
Build Docker Image / build (pull_request) Successful in 1m13s
9e43ffa1c1
Automates the SSH-to-akamai deploy workflow: pulls latest image,
restarts the container, and verifies health. Includes pre-deploy
checks (dirty git warning, confirmation prompt) and prints a
rollback command if the image changed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Closes #16

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove hardcoded Giphy API key from config.py, load from env var (#19)
- URL-encode query parameters in APIClient._add_params (#20)
- URL-encode Giphy search phrases before building request URLs (#21)
- Replace internal exception details with generic messages to users (#22)
- Replace all bare except: with except Exception: (#23)
- Guard interaction.guild access in has_player_role (#24)
- Replace MD5 with SHA-256 for command change detection hash (#32)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ran `ruff check --select F401 --fix` to auto-remove 221 unused imports,
manually removed 4 unused `import discord` from package __init__.py files,
and fixed test import for DISAPPOINTMENT_TIERS to reference canonical location.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- #37: Fix stale comment in transaction_freeze.py referencing wrong moveid format
- #27: Change config.testing default from True to False (was masking prod behavior)
- #25: Replace deprecated asyncio.get_event_loop() with get_running_loop()
- #38: Replace naive datetime.now() with timezone-aware datetime.now(UTC) across
  7 source files and 4 test files to prevent subtle timezone bugs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: scorebug stale data, win probability parsing, and read-failure tolerance (closes #39, #40)
All checks were successful
Build Docker Image / build (pull_request) Successful in 1m14s
d1a6b57ccd
#40: ScorecardTracker cached data in memory at startup — background task never
saw newly published scorecards. Fixed by reloading from disk on every read.

#39: Win percentage defaulted to 50% when unavailable, showing a misleading
50/50 bar. Now defaults to None with "unavailable" message in embed. Parsing
handles decimal (0.75), percentage string, and empty values. Also fixed
orientation bug where win% was always shown as home team's even when the
sheet reports the away team as the leader.

Additionally: live scorebug tracker now distinguishes between "all games
confirmed final" and "sheet read failures" — transient Google Sheets errors
no longer hide the live scores channel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
cal merged commit 12fe600e83 into main 2026-02-20 20:28:16 +00:00
Sign in to join this conversation.
No reviewers
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: cal/major-domo-v2#42
No description provided.