- 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>
- Version system: per-plugin versions via Versioned interface, crash_log and
version_history DB tables, !version command, crash stats in !botinfo
- Tax tracking: tax_ledger table, trackTaxPaid across all communityTax and
communityPotAdd sites, tax paid display in !stats and !superstatsexplusalpha
- Lottery: DM winners with winning ticket details and matched numbers bolded
- fmtEuro: generic currency formatter with thousand separators across all
economy display paths
- Audit fixes: streak_decayed column for Streak Survivor achievement,
combat_narrative empty-phase guard, crafting success rate integer division,
RecordCrash nil-DB guard
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Streak grace now checks LastDeathDate instead of LastActionDate (was
suppressing streak updates for all active players)
- UNO single-player earnings use net payout (minus wager) not gross
- Hospital sends error message on save failure instead of silent no-op
- Wordle total_earned update moved into stats transaction
- Lottery ticket inserts + community pot add wrapped in single transaction
with euro refund on failure
- Lottery fixed-tier ticket prize updated with actual prorated amount
- Added last_death_date column to adventure_characters
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Blacksmith: equipment repair with tier-based pricing, DM confirmation flow,
masterwork/arena surcharges, full flavor text pools. Added to main adventure
menu as option 6 (rest bumped to 7).
Lottery: weekly draw (Friday 23:59 UTC), ticket purchases with 100/week cap,
Fisher-Yates number generation, fixed+jackpot prize tiers, community pot
funding, Thursday reminders, draw history.
Audit fixes: TOCTOU in blacksmith repair costs (recompute from fresh equipment),
user lock in DM slot selection, partial repair refund tracking, error logging
on save failures, Fisher-Yates bias correction, communityPotDebit return value
checks in draw execution.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>