forked from sass/tipibot
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
26 lines
840 B
Python
26 lines
840 B
Python
"""Shared reply helpers for command handlers."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import discord
|
|
|
|
import strings as S
|
|
|
|
|
|
async def reply_db_error(interaction: discord.Interaction) -> None:
|
|
"""Tell the user the database is unavailable.
|
|
|
|
Economy core functions return {"ok": False, "reason": "db_error"} on a
|
|
PocketBase outage. Without this, handlers either fall through silently (a
|
|
deferred interaction hangs on "thinking...") or show a misleading "you're
|
|
broke" message. Works whether or not the interaction was already deferred.
|
|
"""
|
|
msg = S.ERR["db_error"]
|
|
try:
|
|
if interaction.response.is_done():
|
|
await interaction.followup.send(msg, ephemeral=True)
|
|
else:
|
|
await interaction.response.send_message(msg, ephemeral=True)
|
|
except discord.HTTPException:
|
|
pass
|