forked from sass/tipibot
fix(economy): handle db_error in commands, dedupe cooldowns, single leaderboard scan
Three robustness/perf fixes from the review:
1. db_error UX: economy core returns {"ok": False, "reason": "db_error"} on a
PocketBase outage, but no handler expected it - deferred commands hung on
"thinking..." and others showed a misleading "you're broke". Added a shared
reply_db_error helper (commands/_replies.py) + S.ERR["db_error"], and wired a
db_error branch into every handler that can receive it (daily/work/beg/crime/
rob/give/buy/roulette/slots/blackjack/heist/fish/prestige/vanity/consumables/
request-funding). Also fixed a latent KeyError in vs-bot RPS that read
res["balance"] without checking res["ok"].
2. Deduped the item->cooldown mapping that was copied in do_daily/do_work/do_beg,
do_fish_start, _maybe_remind and _restore_reminders. Single source of truth:
store.ITEM_COOLDOWNS + effective_cooldown(cmd, items).
3. /leaderboard did six full-collection scans (one per tab). Added
get_all_leaderboards() which scans once and builds all six views in memory.
Tests: effective_cooldown cases, and get_all_leaderboards matches the individual
queries + scans the collection exactly once.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013VbAVsrZuYesea99mPMmPT
This commit is contained in:
24
bot.py
24
bot.py
@@ -772,17 +772,7 @@ async def _restore_reminders() -> None:
|
||||
last_str = user.get(last_key)
|
||||
if not last_str:
|
||||
continue
|
||||
items = user.get("items", [])
|
||||
if cmd == "work" and "monitor" in items:
|
||||
cooldown = datetime.timedelta(minutes=40)
|
||||
elif cmd == "beg" and "hiirematt" in items:
|
||||
cooldown = datetime.timedelta(minutes=3)
|
||||
elif cmd == "daily" and "korvaklapid" in items:
|
||||
cooldown = datetime.timedelta(hours=18)
|
||||
elif cmd == "fish" and "ussipurk" in items:
|
||||
cooldown = datetime.timedelta(seconds=90)
|
||||
else:
|
||||
cooldown = economy.COOLDOWNS.get(cmd)
|
||||
cooldown = economy.effective_cooldown(cmd, user.get("items", []))
|
||||
if not cooldown:
|
||||
continue
|
||||
last_dt = datetime.datetime.fromisoformat(last_str)
|
||||
@@ -801,17 +791,7 @@ async def _maybe_remind(user_id: int, cmd: str) -> None:
|
||||
user_data = await economy.get_user(user_id)
|
||||
if cmd not in user_data.get("reminders", []):
|
||||
return
|
||||
items = set(user_data.get("items", []))
|
||||
if cmd == "work" and "monitor" in items:
|
||||
delay = datetime.timedelta(minutes=40)
|
||||
elif cmd == "beg" and "hiirematt" in items:
|
||||
delay = datetime.timedelta(minutes=3)
|
||||
elif cmd == "daily" and "korvaklapid" in items:
|
||||
delay = datetime.timedelta(hours=18)
|
||||
elif cmd == "fish" and "ussipurk" in items:
|
||||
delay = datetime.timedelta(seconds=90)
|
||||
else:
|
||||
delay = economy.COOLDOWNS.get(cmd, datetime.timedelta(hours=1))
|
||||
delay = economy.effective_cooldown(cmd, user_data.get("items", [])) or datetime.timedelta(hours=1)
|
||||
_schedule_reminder(user_id, cmd, delay)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user