Commit graph

12 commits

Author SHA1 Message Date
01d2cae282 Send GM status update email on every attendance change
When a player's attendance is updated — either via email (awp-cli check)
or via the web toggle — an email is sent to the GM with:
  - who changed, what they changed to, and how (email or the site)
  - a summary count of attending/not attending/no response
  - the full current player status list

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 19:07:51 -04:00
3426d5ad3d Log partial email body read errors instead of silently ignoring
io.ReadAll errors are unlikely for short yes/no replies but worth
logging for diagnosability. Processing continues with whatever bytes
were read to remain resilient.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 18:44:33 -04:00
e6e8d255bd Return IMAP search error instead of swallowing it
A search failure was logged but execution continued, silently returning
'no emails' to the caller. This masked the most likely cause of the
polling not working. Error now propagates so the caller can log and
handle it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 18:34:27 -04:00
c39bd3ec53 Add mutex to protect players.json and fix URL-encode player names
Concurrent HTTP requests and the cron job could race on the file,
causing lost updates or torn writes. A package-level RWMutex now
guards all reads and writes.

Also URL-encodes player names in ToggleUrl to prevent query-parameter
injection from names containing '&' or '='.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 18:31:18 -04:00
3684baa2f5 Replace log.Fatal in IMAP fetch goroutine with error channel
log.Fatal called os.Exit from a goroutine, bypassing deferred cleanup
and crashing the process on any transient fetch error. Errors now
propagate back to the caller via a buffered channel. Also adds a drain
defer so the goroutine can always exit if the consumer returns early.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 18:30:27 -04:00
c509641f59 Guard against empty From header in IMAP message fetch
Bounce messages and MAILER-DAEMON notices can have no From address,
causing a panic on the bare [0] index access.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 18:29:05 -04:00
07e67d4684 Make godotenv.Load() best-effort to support containerized deployments
A missing .env file no longer causes a fatal error. Env vars can now
come from the container environment (Docker/systemd) or a .env file
interchangeably.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 18:22:37 -04:00
6371d5136f Rename USERNAME/PASSWORD env vars to EMAIL_USERNAME/EMAIL_PASSWORD
Avoids collision with standard Linux shell variables that would cause
silent authentication failures against the IMAP server.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 16:56:13 -04:00
713a96501d Add error logging to awp-cli with configurable log file
- Route all log output to AWP_LOG_FILE (from .env) if set, else stderr
- Log errors explicitly before returning so they appear in the log file
- Replace log.Fatal in fetch.go with proper error return so callers control logging
- Remove chatty success/no-op log lines that would bloat cron log files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 16:45:56 -04:00
04f687a278 Fix build errors and upgrade templ to v0.3.1020
- Add missing bcc argument to NewEmail call in pkg/email/fetch.go
- Upgrade github.com/a-h/templ from v0.3.833 to v0.3.1020 to match generator
- Add player management routes (add/delete/edit) and playershandler
- Update templates and loaddata with pending changes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 20:05:53 -04:00
4a778b1dc0 Add uncommitted changes before migration 2025-12-21 12:25:17 -05:00
9f894671b0 Full app, v1.0. Contains web app and cli. 2024-01-20 21:45:53 -05:00