Files
tipibot/strings/__init__.py
Rene Arumetsa 037628d24f feat(economy): add vanity shop and harden economy money-safety
Vanity shop (/vanity): cosmetic badges/titles as a pure whale coin sink -
purchases burn coins (not credited to the house) and equip a badge shown on
/profile. New vanity_owned/vanity_active fields, schema sync, and tests.

Money-safety and robustness fixes from a codebase review:

- _parse_amount now rejects negative amounts. Every bet/give/request flows
  through it, so a negative value can no longer mint coins on a loss/transfer
  path that trusts the caller's sign (all call sites already guarded <= 0;
  this closes the source).
- do_blackjack_payout no longer raises on a DB failure. The stake was already
  deducted in do_blackjack_bet, so it now logs critical with the owed amount
  (for admin reconciliation) and returns db_error; all payout call sites render
  a clear "payout failed" notice instead of crashing the interaction.
- Instant "kohv" consumable now cancels the pending reminder DMs for the
  cooldowns it wipes (via new INSTANT_RESET_COMMANDS), so no stale/duplicate
  reminders fire.
- Renamed the misleadingly-named _refund_user_safe -> _debit_house_safe (it
  debits the house) and dropped its ignored first arg.
- Added __all__ to vanity.py and consumables.py so `import *` no longer leaks
  incidental imports into the economy namespace.
- Documented Kõrvaklapid's +25 coin daily bonus in README and DEV_NOTES.

Tests: blackjack payout DB-failure safety and INSTANT_RESET_COMMANDS lockstep.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013VbAVsrZuYesea99mPMmPT
2026-09-04 02:09:25 +03:00

193 lines
3.3 KiB
Python

"""All user-facing text for TipiLAN Bot.
Strings live in domain submodules (common, commands, member, economy, admin,
games, fishing) and are re-exported here, so ``import strings`` and
``strings.NAME`` keep working unchanged. Edit the relevant submodule to change
any message, description, or flavour text without touching any logic code."""
from .common import (
MSG_BANNED,
MSG_SPAM_JAIL,
MSG_PONG,
MSG_RESTART_DONE,
MSG_RESTARTING,
MSG_SHUTTING_DOWN,
MSG_PAUSED,
MSG_UNPAUSED,
MSG_MAINTENANCE,
MSG_SYNC_DONE,
MSG_REMINDER,
MSG_LEVELUP,
MSG_LEVELUP_ROLE,
REMINDER_OPTS,
TITLE,
ERR,
CD_MSG,
REMINDERS_UI,
SEND_UI,
PATCHNOTES_UI,
STATUS_UI,
)
from .commands import (
CMD,
OPT,
HELP_CATEGORIES,
HELP_UI,
)
from .member import (
MEMBER_UI,
MEMBER_FIELDS,
ECONOMYSETUP_UI,
CHANNEL_UI,
BIRTHDAY_UI,
BIRTHDAY_MONTHS,
CHECK_UI,
)
from .economy import (
WORK_JOBS,
BEG_LINES,
BEG_JAIL_LINES,
CRIME_WIN,
CRIME_LOSE,
QUEST_UI,
QUEST_DESCRIPTIONS,
SHOP_UI,
ITEM_DESCRIPTIONS,
CONSUMABLES_UI,
CONSUMABLE_DESCRIPTIONS,
VANITY_UI,
JAILED_UI,
SHOP_BTN,
DAILY_UI,
STATS_UI,
PROFILE_UI,
BALANCE_UI,
COOLDOWNS_UI,
RANK_UI,
WORK_UI,
BEG_UI,
CRIME_UI,
ROB_UI,
GIVE_UI,
BUY_UI,
LEADERBOARD_UI,
REQUEST_UI,
)
from .admin import (
ADMINVIEW_UI,
ADMIN,
SEASON,
PRESTIGE_SHOP_NAMES,
PRESTIGE_SHOP_DESCRIPTIONS,
PRESTIGE_UI,
)
from .games import (
SLOTS_TIERS,
ROULETTE,
HEIST_STORY,
HEIST_UI,
BJ,
JAILBREAK_UI,
SLOTS_UI,
RPS_UI,
RPS_CHOICES,
BJ_UI,
)
from .fishing import (
FISH_NAMES,
FISH_RARITY_NAMES,
FISH_RARITY_EMOJI,
FISH_JUNK_LINES,
FISH_UI,
)
__all__ = [
'MSG_BANNED',
'MSG_SPAM_JAIL',
'MSG_PONG',
'MSG_RESTART_DONE',
'MSG_RESTARTING',
'MSG_SHUTTING_DOWN',
'MSG_PAUSED',
'MSG_UNPAUSED',
'MSG_MAINTENANCE',
'MSG_SYNC_DONE',
'MSG_REMINDER',
'MSG_LEVELUP',
'MSG_LEVELUP_ROLE',
'REMINDER_OPTS',
'TITLE',
'ERR',
'CD_MSG',
'REMINDERS_UI',
'SEND_UI',
'PATCHNOTES_UI',
'STATUS_UI',
'CMD',
'OPT',
'HELP_CATEGORIES',
'HELP_UI',
'MEMBER_UI',
'MEMBER_FIELDS',
'ECONOMYSETUP_UI',
'CHANNEL_UI',
'BIRTHDAY_UI',
'BIRTHDAY_MONTHS',
'CHECK_UI',
'WORK_JOBS',
'BEG_LINES',
'BEG_JAIL_LINES',
'CRIME_WIN',
'CRIME_LOSE',
'QUEST_UI',
'QUEST_DESCRIPTIONS',
'SHOP_UI',
'ITEM_DESCRIPTIONS',
'CONSUMABLES_UI',
'CONSUMABLE_DESCRIPTIONS',
'VANITY_UI',
'JAILED_UI',
'SHOP_BTN',
'DAILY_UI',
'STATS_UI',
'PROFILE_UI',
'BALANCE_UI',
'COOLDOWNS_UI',
'RANK_UI',
'WORK_UI',
'BEG_UI',
'CRIME_UI',
'ROB_UI',
'GIVE_UI',
'BUY_UI',
'LEADERBOARD_UI',
'REQUEST_UI',
'ADMINVIEW_UI',
'ADMIN',
'SEASON',
'PRESTIGE_SHOP_NAMES',
'PRESTIGE_SHOP_DESCRIPTIONS',
'PRESTIGE_UI',
'SLOTS_TIERS',
'ROULETTE',
'HEIST_STORY',
'HEIST_UI',
'BJ',
'JAILBREAK_UI',
'SLOTS_UI',
'RPS_UI',
'RPS_CHOICES',
'BJ_UI',
'FISH_NAMES',
'FISH_RARITY_NAMES',
'FISH_RARITY_EMOJI',
'FISH_JUNK_LINES',
'FISH_UI',
]