Mechanical `gofmt -w ./internal ./cmd`. Mostly struct-field realignment that
had drifted, plus a few trailing-newline fixes. No behaviour change — gofmt is
semantics-preserving, and build/vet/test are green either side.
Split out from the code-review fixes that follow so those stay reviewable
instead of hiding inside a wall of realignment.
- Co-op: when a run wipes or completes, clear the 99-sentinel combat
lock for participants and pin combat_actions_used to maxCombatActions.
Previously the lock only released on the next midnight reset, so
members were stuck unable to combat for the rest of the day after
their run ended.
- Holidays: !holidays now prints the full list. Previously it called
the same featured-only formatter as TwinBee's morning auto-post,
so users saw the same truncated message twice with a misleading
"Use !holidays for the full list" hint that pointed at itself.
- Forex: add currency conversion. Auto-detects when the first arg is
numeric (`!fx 1500 USD EUR`) and also accepts an explicit `convert`
subcommand. Tolerant parsing: "to"/"into"/"in"/"=" filters, comma
and k/m suffix support, and any of `1500 USD EUR`, `1500 USD/EUR`,
`USD/EUR 1500` orderings. Includes parser + comma-formatter tests.
- Lottery: drop 2-match prize tier. At 1/16 odds × €25 it was +EV per
ticket on its own and bled the community pot (~€775/wk recently),
preventing jackpot rollover from accumulating. Removed from scoring,
payout loops, draw announcement, !lottery odds, and !lottery history.
Match2Winners DB column kept (history rows preserved); always written
as 0 going forward.
- Lottery: shift week boundary so Sat/Sun return next Monday. Friday's
23:59 draw used to leave players locked at their 100-ticket cap until
next Monday rolled in; now the cap resets immediately after the draw.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
All scheduled post dedup keys (wotd, holidays, gaming, anime, movies,
concerts, birthdays) were global — after posting to the first room,
the job was marked complete and the second room was skipped. Fixed by
including the room ID in each dedup key so posts go to all broadcast
rooms. Birthday XP grants and DMs remain once-per-user-per-year.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Complete rewrite of the Freebee Matrix bot as GogoBee using mautrix-go.
- E2EE with goolm (pure Go, no CGo/libolm) and cross-signing bootstrap
- 35+ plugins with dependency injection and ordered registration
- SQLite storage via modernc.org/sqlite (no CGo)
- Scheduler via robfig/cron for WOTD, holidays, birthdays, releases, etc.
- Optional LLM integration (Ollama) for sentiment, profanity, roasts, vibes
- Threaded trivia, three-tier profanity tracking, WOTD usage verification
- Multi-country holiday support with deduplication
- Quadratic XP curve, configurable bot display name, encrypted DMs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>