Compare commits

...

3 Commits

Author SHA1 Message Date
AlacrisDevs
ae393f7c35 Last changes before full rewrite 2026-04-04 20:27:15 +03:00
TFT
fdb0e5eb5b add additional crime win and lose text 2026-03-21 11:18:23 +02:00
TFT
f95fc76b2c misc fixes 2026-03-21 11:17:17 +02:00
8 changed files with 11957 additions and 955 deletions

1
.gitignore vendored
View File

@@ -10,3 +10,4 @@ pocketbase.exe
pocketbase pocketbase
pb_data/ pb_data/
pb_migrations/ pb_migrations/
logs/

View File

@@ -11,8 +11,6 @@
| `sheets.py` | Google Sheets integration (member sync) | | `sheets.py` | Google Sheets integration (member sync) |
| `member_sync.py` | Birthday/member sync background task | | `member_sync.py` | Birthday/member sync background task |
| `config.py` | Environment variables (TOKEN, GUILD_ID, PB_URL, etc.) | | `config.py` | Environment variables (TOKEN, GUILD_ID, PB_URL, etc.) |
| `migrate_to_pb.py` | One-time utility: migrate `data/economy.json` → PocketBase |
| `add_stats_fields.py` | Schema migration: add new fields to `economy_users` PocketBase collection |
--- ---
@@ -23,18 +21,19 @@ Checklist - do all of these, in order:
1. **`economy.py`** - add the `do_<cmd>` async function with cooldown check, logic, `_commit`, and `_txn` logging 1. **`economy.py`** - add the `do_<cmd>` async function with cooldown check, logic, `_commit`, and `_txn` logging
2. **`economy.py`** - add the cooldown to `COOLDOWNS` dict if it has one 2. **`economy.py`** - add the cooldown to `COOLDOWNS` dict if it has one
3. **`economy.py`** - add the EXP reward to `EXP_REWARDS` dict 3. **`economy.py`** - add the EXP reward to `EXP_REWARDS` dict
3a. **PocketBase** - if the function stores new fields, add them as columns via `python scripts/add_stats_fields.py` (or manually in the PB admin UI at `http://127.0.0.1:8090/_/`). Fields not in the PB schema are silently dropped on PATCH. 4. **PocketBase** - if the function stores new fields, add them manually in the PB admin UI at `http://127.0.0.1:8090/_/`. Fields not in the PB schema are silently dropped on PATCH.
4. **`strings.py` `CMD`** - add the slash command description 5. **`strings.py` `CMD`** - add the slash command description
5. **`strings.py` `OPT`** - add any parameter descriptions 6. **`strings.py` `OPT`** - add any parameter descriptions
6. **`strings.py` `TITLE`** - add embed title(s) for success/fail states 7. **`strings.py` `TITLE`** - add embed title(s) for success/fail states
7. **`strings.py` `ERR`** - add any error messages (banned, cooldown uses `CD_MSG`, jailed uses `CD_MSG["jailed"]`) 8. **`strings.py` `ERR`** - add any error messages (banned, cooldown uses `CD_MSG`, jailed uses `CD_MSG["jailed"]`)
8. **`strings.py` `CD_MSG`** - add cooldown message if command has a cooldown 9. **`strings.py` `CD_MSG`** - add cooldown message if command has a cooldown
9. **`strings.py` `HELP_CATEGORIES["tipibot"]["fields"]`** - add the command to the help embed 10. **`strings.py` `HELP_CATEGORIES["tipibot"]["fields"]`** - add the command to the help embed
10. **`bot.py`** - implement the `cmd_<name>` function, handle all `res["reason"]` cases 11. **`bot.py`** - implement the `cmd_<name>` function, handle all `res["reason"]` cases
11. **`bot.py`** - call `_maybe_remind` if the command has a cooldown and reminders make sense 12. **`bot.py`** - call `_maybe_remind` if the command has a cooldown and reminders make sense
12. **`bot.py`** - call `_award_exp(interaction, economy.EXP_REWARDS["<cmd>"])` on success 13. **`bot.py`** - call `_award_exp(interaction, economy.EXP_REWARDS["<cmd>"])` on success
13. **`strings.py` `REMINDER_OPTS`** - add a reminder option if the command needs one 14. **`strings.py` `REMINDER_OPTS`** - add a reminder option if the command needs one
14. **`bot.py` `_maybe_remind`** - if the command has an item-modified cooldown, add an `elif` branch 15. **`bot.py` `_maybe_remind`** and **`_restore_reminders`** - if item-modified cooldown, add `elif` branch
16. **`bot.py` `_REMINDER_COOLDOWN_KEYS`** - add `"cmd": "last_cmd"` mapping if reminder-capable
--- ---
@@ -50,6 +49,7 @@ Checklist:
6. If the item modifies a cooldown: 6. If the item modifies a cooldown:
- **`economy.py`** - add the `if "item" in user["items"]` branch in the relevant `do_<cmd>` function - **`economy.py`** - add the `if "item" in user["items"]` branch in the relevant `do_<cmd>` function
- **`bot.py` `_maybe_remind`** - add `elif cmd == "<cmd>" and "<item>" in items:` branch with the new delay - **`bot.py` `_maybe_remind`** - add `elif cmd == "<cmd>" and "<item>" in items:` branch with the new delay
- **`bot.py` `_restore_reminders`** - add the same `elif` branch
- **`bot.py` `cmd_cooldowns`** - add the item annotation to the relevant status line - **`bot.py` `cmd_cooldowns`** - add the item annotation to the relevant status line
--- ---
@@ -65,8 +65,11 @@ Checklist:
## Adding a New Admin Command ## Adding a New Admin Command
1. **`strings.py` `CMD`** - add `"[Admin] ..."` description 1. **`strings.py` `CMD`** - add `"[Admin] ..."` description
2. **`strings.py` `HELP_CATEGORIES["admin"]["fields"]`** - add the entry 2. **`strings.py` `OPT`** - add parameter descriptions
3. **`bot.py`** - add `@app_commands.default_permissions(manage_guild=True)` and `@app_commands.guild_only()` 3. **`strings.py` `ADMIN`** - add response and DM strings
4. **`strings.py` `HELP_CATEGORIES["admin"]["fields"]`** - add the entry
5. **`economy.py`** - add `do_admin_<name>` function
6. **`bot.py`** - add command with `@app_commands.default_permissions(manage_guild=True)` and `@app_commands.guild_only()`
--- ---
@@ -80,16 +83,46 @@ All economy state is stored in **PocketBase** (`economy_users` collection). `pb_
| Command | Cooldown | Base Earn | Notes | | Command | Cooldown | Base Earn | Notes |
|---|---|---|---| |---|---|---|---|
| `/daily` | 20h (18h w/ korvaklapid) | 150⬡ | ×streak multiplier, ×2 w/ lan_pass, +5% interest w/ gaming_laptop | | `/daily` | 20h (18h w/ korvaklapid) | 150⬡ | ×streak multiplier, ×2 w/ lan_pass, +5% interest w/ gaming_laptop; prestige daily_plus adds +20% per level |
| `/work` | 1h (40min w/ monitor) | 15-75⬡ | ×1.5 w/ gaming_hiir, ×1.25 w/ reguleeritav_laud, ×3 30% chance w/ energiajook | | `/work` | 1h (40min w/ monitor) | 15-75⬡ | ×1.5 w/ gaming_hiir, ×1.25 w/ reguleeritav_laud, ×3 30% chance w/ energiajook; prestige work_plus +20%/level |
| `/beg` | 5min (3min w/ hiirematt) | 10-40⬡ | ×2 w/ klaviatuur | | `/beg` | 5min (3min w/ hiirematt) | 10-40⬡ | ×2 w/ klaviatuur |
| `/crime` | 2h | 200-500⬡ win | 60% success (75% w/ cat6), +30% w/ mikrofon; fail = fine + jail | | `/crime` | 2h | 200-500⬡ win | 60% success (75% w/ cat6), +30% w/ mikrofon; fail = fine + jail |
| `/rob` | 2h | 1025% of target | 45% success (60% w/ jellyfin); fail = fine; cannot rob TipiBOT | | `/rob` | 2h | 1025% of target | 45% success (60% w/ jellyfin); fail = fine; cannot rob TipiBOT directly |
| `/heist` | 4h personal + 1h global | 2055% of house / n players | solo allowed, max 8; 35%+5%/player success (cap 65%); fail = 3h jail + ~15% balance fine | | `/heist` | 4h personal + 1h global | 2055% of house / n players | solo allowed, max 8; 35%+5%/player success (cap 65%); fail = 3h jail + ~15% balance fine |
| `/slots` | - | varies | pair=+0.5× bet; triple tiered: heart×4, fire×5, troll×7, cry×10, skull×15, karikas×25 (jackpot); ×1.5 w/ monitor_360; miss=lose bet; house edge ~5% | | `/fish` | 2min (90s w/ ussipurk) | varies by fish rarity | Interactive minigame; catches go to inventory; sell with `/fishsell` |
| `/slots` | - | varies | pair=+0.5× bet; triple tiered; karikas jackpot ×25; ×1.5 w/ monitor_360; miss=lose bet |
| `/roulette` | - | 2× red/black, 14× green | 1/37 green chance | | `/roulette` | - | 2× red/black, 14× green | 1/37 green chance |
| `/blackjack` | - | 1:1 win, 3:2 BJ, 2:1 double | Dealer stands on 17+; double down on first action only | | `/blackjack` | - | 1:1 win, 3:2 BJ, 2:1 double | Dealer stands on 17+; double down on first action only |
### Fishing System
- `/fish` - interactive minigame: cast → wait 515s for bite → press button within 2s (3s w/ echolood) → keep or sell
- Fish stored in `fish_inventory` (list of `{fish_id, weight, value}` objects)
- `/fishbook` - paginated fish collection showing caught species and inventory counts
- `/fishsell` - sell all fish from inventory at once
- `fish_inventory` and `fish_book` **survive prestige resets**
- `kalavork` (T3, 5000⬡): bumps all caught fish up one rarity tier
- `ussipurk` (T2, 3500⬡): cooldown 2min → 90s
- `echolood` (T3, 8000⬡): bite window 2s → 3s
### Prestige System
- Requires level 30 (9000 EXP)
- Resets: balance, EXP, items, cooldowns, jail
- Preserves: fish_book, fish_inventory, lifetime stats, prestige_points, season_total_exp, prestige_upgrades
- Awards prestige_points = max(1, exp ÷ 1000) at time of prestige
- Each prestige increments `prestige_level` counter
- Prestige coin/exp multipliers apply to all earned values
**Prestige Shop** (`PRESTIGE_SHOP` in economy.py):
| Upgrade | Max Level | Cost/level | Effect |
|---|---|---|---|
| `coin_mult` | 5 | 5 PP | +8% coin multiplier per level |
| `exp_mult` | 5 | 5 PP | +8% EXP multiplier per level |
| `daily_plus` | 3 | 7 PP | +20% daily base reward per level |
| `work_plus` | 3 | 7 PP | +20% work earnings per level |
### "all" Keyword ### "all" Keyword
Commands that accept a coin amount (`/give`, `/roulette`, `/rps`, `/slots`, `/blackjack`) accept `"all"` to mean the user's full current balance. Parsed by `_parse_amount(value, balance)` in `bot.py`. Commands that accept a coin amount (`/give`, `/roulette`, `/rps`, `/slots`, `/blackjack`) accept `"all"` to mean the user's full current balance. Parsed by `_parse_amount(value, balance)` in `bot.py`.
@@ -102,13 +135,35 @@ Commands that accept a coin amount (`/give`, `/roulette`, `/rps`, `/slots`, `/bl
### Jail ### Jail
- Normal duration: 30 minutes (`JAIL_DURATION`) - Normal duration: 30 minutes (`JAIL_DURATION`)
- Heist fail duration: 3 hours (`HEIST_JAIL`) + fine 15% of balance (min 150, max 1000) - Heist fail duration: 3 hours (`HEIST_JAIL`) + fine 15% of balance (min 150, max 1000)
- `gaming_tool`: prevents jail on crime fail - `gaming_tool`: prevents jail on crime fail
- `/jailbreak`: 3 dice rolls, need doubles to escape free. On fail - bail = 20-30% of balance, min 350⬡. If balance < 350⬡, player stays jailed until timer. - `/jailbreak`: 3 single-button dice rolls (both dice at once), need doubles to escape free. Animated reveal with TipiDICE emoji. On fail after 3 tries - bail = 20-30% of balance, min 350⬡. If balance < 350⬡, stay jailed until timer.
### EXP Rewards (from `EXP_REWARDS` in economy.py) ### EXP Rewards (from `EXP_REWARDS` in economy.py)
EXP is awarded on every successful command use. Level formula: `floor(sqrt(exp / 10))`, so Level 5 = 250 EXP, Level 10 = 1000, Level 20 = 4000, Level 30 = 9000. EXP is awarded on every successful command use. Level formula: `floor(sqrt(exp / 10))`, so Level 5 = 250 EXP, Level 10 = 1000, Level 20 = 4000, Level 30 = 9000.
Fish EXP is awarded per catch (varies by rarity, defined in `FISH_CATALOGUE`). Prestige `exp_mult` upgrade applies to fish EXP.
---
## Admin Commands Reference
| Command | What it does |
|---|---|
| `/pause` | Toggle maintenance mode - blocks all non-admin commands |
| `/admincoins @user <amount> <reason>` | Give/take coins (positive/negative). DMs user. |
| `/adminexp @user <amount> <reason>` | Give/take EXP (positive/negative). Auto-applies level roles on change. DMs user. |
| `/adminitem @user <item_id> <anna\|eemalda>` | Give or remove any shop item for free. DMs user. |
| `/adminjail @user <minutes> <reason>` | Manually jail a user. DMs user. |
| `/adminunjail @user` | Remove jail from a user. |
| `/adminban @user <reason>` | Ban from all economy commands. DMs user. |
| `/adminunban @user` | Lift economy ban. |
| `/adminreset @user <reason>` | Wipe balance, EXP, items, streak. DMs user. |
| `/adminview @user` | Full profile: balance, EXP/level, streak, prestige, fish stats, items, timestamps. |
| `/adminseason <top_n>` | End season: DM top N players, reset all EXP. |
All admin commands require **Manage Guild** permission and work in any channel (bypass pause and channel restrictions).
--- ---
## Role Hierarchy (Discord) ## Role Hierarchy (Discord)
@@ -130,6 +185,7 @@ Run `/economysetup` to auto-create all roles and set their positions. The comman
Role assignment: Role assignment:
- **ECONOMY** role: given automatically on first EXP award (i.e. first successful economy command) - **ECONOMY** role: given automatically on first EXP award (i.e. first successful economy command)
- **Level roles**: given/swapped automatically on level-up; synced on `/rank` - **Level roles**: given/swapped automatically on level-up; synced on `/rank`
- **`/adminexp`**: automatically re-applies level roles if level changes
--- ---
@@ -138,8 +194,8 @@ Role assignment:
| Tier | Level Required | Items | | Tier | Level Required | Items |
|---|---|---| |---|---|---|
| T1 | 0 (any) | gaming_hiir, hiirematt, korvaklapid, lan_pass, anticheat, energiajook, gaming_laptop | | T1 | 0 (any) | gaming_hiir, hiirematt, korvaklapid, lan_pass, anticheat, energiajook, gaming_laptop |
| T2 | 10 | reguleeritav_laud, jellyfin, mikrofon, klaviatuur, monitor, cat6 | | T2 | 10 | reguleeritav_laud, jellyfin, mikrofon, klaviatuur, monitor, cat6, **ussipurk** |
| T3 | 20 | monitor_360, karikas, gaming_tool | | T3 | 20 | monitor_360, karikas, gaming_tool, **kalavork**, **echolood** |
Shop display is sorted by cost (ascending) within each tier. Shop display is sorted by cost (ascending) within each tier.
The `SHOP_LEVEL_REQ` dict in `economy.py` controls per-item lock thresholds. The `SHOP_LEVEL_REQ` dict in `economy.py` controls per-item lock thresholds.
@@ -162,6 +218,9 @@ The `SHOP_LEVEL_REQ` dict in `economy.py` controls per-item lock thresholds.
| Cooldown messages | `CD_MSG["cmd"].format(ts=_cd_ts(...))` | Cooldown responses | | Cooldown messages | `CD_MSG["cmd"].format(ts=_cd_ts(...))` | Cooldown responses |
| Shop UI | `SHOP_UI["key"]` | `_shop_embed` | | Shop UI | `SHOP_UI["key"]` | `_shop_embed` |
| Item descriptions | `ITEM_DESCRIPTIONS["item_key"]` | `economy.SHOP[key]["description"]` | | Item descriptions | `ITEM_DESCRIPTIONS["item_key"]` | `economy.SHOP[key]["description"]` |
| Fish UI | `FISH_UI["key"]` | `/fish`, `/fishbook`, `/fishsell` |
| Fish names | `FISH_NAMES["fish_id"]` | Fish display name |
| Admin responses | `ADMIN["key"]` | Admin command success/DM messages |
--- ---
@@ -177,6 +236,8 @@ The `SHOP_LEVEL_REQ` dict in `economy.py` controls per-item lock thresholds.
| `LEVEL_ROLES` | `economy.py` | `[(min_level, "RoleName"), ...]` highest first | | `LEVEL_ROLES` | `economy.py` | `[(min_level, "RoleName"), ...]` highest first |
| `ECONOMY_ROLE` | `economy.py` | Name of the base economy participation role | | `ECONOMY_ROLE` | `economy.py` | Name of the base economy participation role |
| `EXP_REWARDS` | `economy.py` | EXP per command | | `EXP_REWARDS` | `economy.py` | EXP per command |
| `FISH_CATALOGUE` | `economy.py` | All fish species (rarity, weight, coins, exp) |
| `PRESTIGE_SHOP` | `economy.py` | Prestige upgrade definitions |
| `HOUSE_ID` | `economy.py` | Bot's user ID (house account for /rob) | | `HOUSE_ID` | `economy.py` | Bot's user ID (house account for /rob) |
| `MIN_BAIL` | `economy.py` | Minimum bail payment (350⬡) | | `MIN_BAIL` | `economy.py` | Minimum bail payment (350⬡) |
| `COIN` | `economy.py` | The coin emoji string | | `COIN` | `economy.py` | The coin emoji string |
@@ -193,3 +254,4 @@ The `SHOP_LEVEL_REQ` dict in `economy.py` controls per-item lock thresholds.
- `anticheat` is consumable (2 uses) - only item that can be re-bought - `anticheat` is consumable (2 uses) - only item that can be re-bought
- `karikas` (T3) is the only item that preserves a daily streak across missed days - `karikas` (T3) is the only item that preserves a daily streak across missed days
- `reguleeritav_laud` (T2) stacks with `gaming_hiir`: combined ×1.5 × ×1.25 = ×1.875 - `reguleeritav_laud` (T2) stacks with `gaming_hiir`: combined ×1.5 × ×1.25 = ×1.875
- **Fishing** is a steady passive income; `kalavork` (T3) dramatically increases fish value by bumping rarity

View File

@@ -154,16 +154,18 @@ Admins (bot lacks permission to modify them) are silently skipped and still mark
| `/sync` | Manage Guild | Re-registers slash commands with Discord | | `/sync` | Manage Guild | Re-registers slash commands with Discord |
| `/restart` | Manage Guild | Gracefully restarts the bot process; posts ✅ in the same channel when back up | | `/restart` | Manage Guild | Gracefully restarts the bot process; posts ✅ in the same channel when back up |
| `/shutdown` | Manage Guild | Shuts the bot down cleanly without restarting | | `/shutdown` | Manage Guild | Shuts the bot down cleanly without restarting |
| `/pause` | Manage Guild | Toggles maintenance mode blocks all non-admin commands; calling again unpauses | | `/pause` | Manage Guild | Toggles maintenance mode - blocks all non-admin commands; calling again unpauses |
| `/send #channel message` | Manage Guild | Sends a message to any channel as the bot | | `/send #channel message` | Manage Guild | Sends a message to any channel as the bot |
| `/status` | Manage Guild | Bot uptime, RAM, CPU, latency, cache stats, economy user count | | `/status` | Manage Guild | Bot uptime, RAM, CPU, latency, cache stats, economy user count |
| `/admincoins @user <kogus> <põhjus>` | Manage Guild | Give (positive) or take (negative) TipiCOINi. Balance floored at 0. User gets a DM with reason. | | `/admincoins @user <kogus> <põhjus>` | Manage Guild | Give (positive) or take (negative) TipiCOINi. Balance floored at 0. User gets a DM with reason. |
| `/adminexp @user <kogus> <põhjus>` | Manage Guild | Give (positive) or take (negative) EXP. Level roles auto-updated. User gets a DM. |
| `/adminitem @user <ese> <anna\|eemalda>` | Manage Guild | Give or remove any shop item for free. `ese` is the internal item ID (e.g. `anticheat`). User gets a DM. |
| `/adminjail @user <minutid> <põhjus>` | Manage Guild | Manually jail a user for N minutes. User gets a DM. | | `/adminjail @user <minutid> <põhjus>` | Manage Guild | Manually jail a user for N minutes. User gets a DM. |
| `/adminunjail @user` | Manage Guild | Release a user from jail immediately. | | `/adminunjail @user` | Manage Guild | Release a user from jail immediately. |
| `/adminban @user <põhjus>` | Manage Guild | Ban a user from all economy commands. User gets a DM. | | `/adminban @user <põhjus>` | Manage Guild | Ban a user from all economy commands. User gets a DM. |
| `/adminunban @user` | Manage Guild | Lift an economy ban. | | `/adminunban @user` | Manage Guild | Lift an economy ban. |
| `/adminreset @user <põhjus>` | Manage Guild | Wipe a user's balance, items, and streak to zero. User gets a DM. | | `/adminreset @user <põhjus>` | Manage Guild | Wipe a user's balance, items, and streak to zero. User gets a DM. |
| `/adminview @user` | Manage Guild | Inspect a user's full economy profile: balance, streak, items, jail status, ban status. | | `/adminview @user` | Manage Guild | Full profile: balance, EXP/level, streak, prestige, fish stats, items, ban/jail, all timestamps. |
### `/check` output example ### `/check` output example
``` ```
@@ -226,10 +228,11 @@ The house is listed at **#0** on the leaderboard. Players can attempt to rob it
| Command | Cooldown | Base payout | Notes | | Command | Cooldown | Base payout | Notes |
|---|---|---|---| |---|---|---|---|
| `/daily` | 20h | 150 ⬡ | Streak multiplier applied (see below). Kõrvaklapid reduces cooldown to 18h. LAN Pilet doubles the reward. Botikoobas adds 5% interest on your balance (capped at 500 ⬡/day). | | `/daily` | 20h | 150 ⬡ | Streak multiplier applied (see below). Kõrvaklapid reduces cooldown to 18h. LAN Pilet doubles the reward. Botikoobas adds 5% interest on your balance (capped at 500 ⬡/day). Prestige daily_plus adds +20% base per upgrade level. |
| `/work` | 1h | 1575 ⬡ | Random job flavour text. Mängurihiir +50%, Reguleeritav laud +25% (stacks). Red Bull: 30% chance of ×3. Ultralai monitor reduces cooldown to 40min. | | `/work` | 1h | 1575 ⬡ | Random job flavour text. Mängurihiir +50%, Reguleeritav laud +25% (stacks). Red Bull: 30% chance of ×3. Ultralai monitor reduces cooldown to 40min. Prestige work_plus adds +20% per upgrade level. |
| `/beg` | 5min | 1040 ⬡ | XL hiirematt reduces cooldown to 3min. Mehhaaniline klaviatuur multiplies earnings ×2. | | `/beg` | 5min | 1040 ⬡ | XL hiirematt reduces cooldown to 3min. Mehhaaniline klaviatuur multiplies earnings ×2. |
| `/crime` | 2h | 200500 ⬡ | 60% success rate (75% with CAT6). +30% earnings with Mikrofon on win. Fail = fine + 30min jail. Mänguritool skips jail on fail. | | `/crime` | 2h | 200500 ⬡ | 60% success rate (75% with CAT6). +30% earnings with Mikrofon on win. Fail = fine + 30min jail. Mänguritool skips jail on fail. |
| `/fish` | 2min | varies | Interactive minigame. Cast → wait for bite → press button within 2s → keep in inventory or sell immediately. Ussipurk reduces cooldown to 90s. |
### Daily streak ### Daily streak
@@ -254,10 +257,12 @@ Every successful economy action awards EXP:
|---|---| |---|---|
| `/daily` claimed | +50 | | `/daily` claimed | +50 |
| `/work` completed | +25 | | `/work` completed | +25 |
| `/heist` win | +25 |
| `/crime` success | +15 | | `/crime` success | +15 |
| `/rob` success | +15 | | `/rob` success | +15 |
| Gambling win (`/roulette`, `/slots`, `/blackjack`) | Scaled by bet: <10⬡ = 0, 1099⬡ = +5, 100999⬡ = +10, 1 0009 999⬡ = +15, 10 00099 999⬡ = +20, 100 000+⬡ = +25 | | Gambling win (`/roulette`, `/slots`, `/blackjack`) | Scaled by bet: <10⬡ = 0, 1099⬡ = +5, 100999⬡ = +10, 1 0009 999⬡ = +15, 10 00099 999⬡ = +20, 100 000+⬡ = +25 |
| `/beg` completed | +5 | | `/beg` completed | +5 |
| `/fish` catch | +3 to +15 (varies by rarity) |
**Level formula:** `level = floor(√(total_exp ÷ 10))` **Level formula:** `level = floor(√(total_exp ÷ 10))`
@@ -314,10 +319,16 @@ The **ECONOMY** role is granted on your first EXP award (i.e. first successful e
| `/rank [@user]` | EXP total, current level, progress bar to next level, leaderboard rank. | | `/rank [@user]` | EXP total, current level, progress bar to next level, leaderboard rank. |
| `/stats [@user]` | Lifetime statistics: economy totals, work/beg counts, gambling records, crime/heist history, social totals, best streak. | | `/stats [@user]` | Lifetime statistics: economy totals, work/beg counts, gambling records, crime/heist history, social totals, best streak. |
| `/cooldowns` | All cooldowns at a glance with live Discord timestamps. Shows jail timer if jailed. | | `/cooldowns` | All cooldowns at a glance with live Discord timestamps. Shows jail timer if jailed. |
| `/leaderboard` | Paginated coin leaderboard (10/page). House pinned at #0. ◀/▶ to browse; 📍 **Mina** jumps to your page. Has a separate EXP/level tab. | | `/leaderboard` | Paginated leaderboard with 6 tabs: 🪙 Coins, 📊 EXP, 🏆 Season EXP, 🔥 Prestige, 🎲 Wagered, 🎣 Fish caught. House pinned at #0 on coins tab. |
| `/shop` | Browse all items by tier. Shows owned status, Anticheat charges remaining, and level lock for T2/T3. | | `/shop` | Browse all items by tier. Shows owned status, Anticheat charges remaining, and level lock for T2/T3. |
| `/buy <item>` | Purchase an item by name (partial match accepted). | | `/buy <item>` | Purchase an item by name (partial match accepted). |
| `/reminders` | Toggle per-command DM notifications. **All reminders are on by default.** Bot DMs you the moment each cooldown expires. | | `/reminders` | Toggle per-command DM notifications. Bot DMs you the moment each cooldown expires. |
| `/fish` | Interactive fishing minigame. Cast, wait for bite, pull, then keep or sell. 2min cooldown (90s with Ussipurk). |
| `/fishbook` | View your fish collection - all caught species, rarity, count, and current inventory amounts. |
| `/fishsell` | Sell all fish currently in your inventory at once. |
| `/prestige` | Reset your balance/EXP/items at level 30 in exchange for Prestige Points. Fishing collection preserved. |
| `/prestigeshop` | View available prestige upgrades and their current levels. |
| `/prestigebuy <upgrade>` | Purchase a prestige upgrade using Prestige Points. |
--- ---
@@ -326,7 +337,7 @@ The **ECONOMY** role is granted on your first EXP award (i.e. first successful e
`/crime` fail (without Mänguritool) jails you for **30 minutes**. While jailed, `/work`, `/beg`, `/crime`, `/rob`, and `/give` are blocked. `/crime` fail (without Mänguritool) jails you for **30 minutes**. While jailed, `/work`, `/beg`, `/crime`, `/rob`, and `/give` are blocked.
#### `/jailbreak` #### `/jailbreak`
Roll two dice - matching values (doubles) free you instantly. **3 attempts** per jail sentence. If all 3 fail you pay bail: Press the roll button - both dice are rolled simultaneously with an animated reveal. **3 attempts** per sentence. Matching values (doubles) = free instantly. If all 3 fail you pay bail:
- **2030% of your current balance** (scales with wealth) - **2030% of your current balance** (scales with wealth)
- **Minimum 350 ⬡** - if your balance is below this you stay jailed until the timer runs out - **Minimum 350 ⬡** - if your balance is below this you stay jailed until the timer runs out
@@ -335,6 +346,41 @@ Cooldowns and jail release times display as live Discord relative timestamps.
--- ---
### Prestige
Once you reach **level 30** (9 000 EXP), you can `/prestige`. This resets your balance, EXP, and items in exchange for **Prestige Points** (PP = floor(exp ÷ 1000), min 1).
**What survives a prestige reset:** fish book, fish inventory, lifetime economy stats, prestige upgrades, season EXP.
Spend PP in `/prestigeshop`:
| Upgrade | Max Level | Cost/level | Effect |
|---|---|---|---|
| Coin multiplier | 5 | 5 PP | +8% to all coin earnings per level |
| EXP multiplier | 5 | 5 PP | +8% to all EXP per level |
| Daily bonus | 3 | 7 PP | +20% to daily base payout per level |
| Work bonus | 3 | 7 PP | +20% to work earnings per level |
---
### Fishing
`/fish` is an interactive minigame with a **2-minute cooldown** (90s with Ussipurk):
1. Cast the line - a button appears
2. Wait 515 seconds for the bite
3. Press **TÕMBA!** within the 2s window (3s with Echolood)
4. Choose: **sell immediately** or **keep in inventory**
Caught fish go to your `fish_inventory` and persist through prestige resets.
| Command | Notes |
|---|---|
| `/fishbook` | View your fish collection: caught species, rarity, count, how many in inventory. |
| `/fishsell` | Sell all fish in your inventory at once. |
---
### Shop items ### Shop items
All items are **permanent** once purchased **except Anticheat**, which expires after 2 uses and can be repurchased. All items are **permanent** once purchased **except Anticheat**, which expires after 2 uses and can be repurchased.
@@ -362,6 +408,12 @@ All items are **permanent** once purchased **except Anticheat**, which expires a
| CAT6 netikaabel | 3 500 ⬡ | `/crime` success rate 60% → 75% | | CAT6 netikaabel | 3 500 ⬡ | `/crime` success rate 60% → 75% |
| Jellyfin server | 4 000 ⬡ | `/rob` success rate 45% → 60% | | Jellyfin server | 4 000 ⬡ | `/rob` success rate 45% → 60% |
#### Tier 2 - level 10 required (TipiHUSTLER+) - continued
| Item | Cost | Effect |
|---|---|---|
| Ussipurk | 3 500 ⬡ | `/fish` cooldown 2min → 90s |
#### Tier 3 - level 20 required (TipiCHAD+) #### Tier 3 - level 20 required (TipiCHAD+)
| Item | Cost | Effect | | Item | Cost | Effect |
@@ -369,6 +421,8 @@ All items are **permanent** once purchased **except Anticheat**, which expires a
| TipiLAN trofee | 6 000 ⬡ | Daily streak survives missed days | | TipiLAN trofee | 6 000 ⬡ | Daily streak survives missed days |
| 360hz monitor | 7 500 ⬡ | Slots jackpot 10× → 15×, triple 4× → 6× | | 360hz monitor | 7 500 ⬡ | Slots jackpot 10× → 15×, triple 4× → 6× |
| Mänguritool | 9 000 ⬡ | `/crime` fail never sends you to jail | | Mänguritool | 9 000 ⬡ | `/crime` fail never sends you to jail |
| Kalavõrk | 5 000 ⬡ | All fish caught are bumped up one rarity tier |
| Echolood | 8 000 ⬡ | Fishing bite window 2s → 3s |
--- ---

1141
bot.py

File diff suppressed because it is too large Load Diff

View File

@@ -31,6 +31,9 @@ def _txn(event: str, **fields) -> None:
# COIN = "<:tipicoin:1234567890123456789>" # COIN = "<:tipicoin:1234567890123456789>"
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
COIN = "<:TipiCOIN:1483000209188589628>" COIN = "<:TipiCOIN:1483000209188589628>"
PP_EMOJI = "<:TipiFIRE:1483431381668335687>"
PRESTIGE_ROLE = "TipiPRESTIGE"
PRESTIGE_MIN_LEVEL = 30 # minimum level required to prestige
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Shop catalogue # Shop catalogue
@@ -141,13 +144,32 @@ SHOP: dict[str, ShopItem] = {
"cost": 9000, "cost": 9000,
"description": strings.ITEM_DESCRIPTIONS["gaming_tool"], "description": strings.ITEM_DESCRIPTIONS["gaming_tool"],
}, },
# ----- Fishing items -----
"ussipurk": {
"name": "Ussipurk",
"emoji": "🪣",
"cost": 3500,
"description": strings.ITEM_DESCRIPTIONS["ussipurk"],
},
"kalavork": {
"name": "Kalavõrk",
"emoji": "🪝",
"cost": 5000,
"description": strings.ITEM_DESCRIPTIONS["kalavork"],
},
"echolood": {
"name": "Echolood",
"emoji": "📡",
"cost": 8000,
"description": strings.ITEM_DESCRIPTIONS["echolood"],
},
} }
# Tier grouping (used by /shop pagination) # Tier grouping (used by /shop pagination)
SHOP_TIERS: dict[int, list[str]] = { SHOP_TIERS: dict[int, list[str]] = {
1: ["gaming_hiir", "hiirematt", "korvaklapid", "lan_pass", "energiajook", "anticheat", "gaming_laptop"], 1: ["gaming_hiir", "hiirematt", "korvaklapid", "lan_pass", "energiajook", "anticheat", "gaming_laptop"],
2: ["reguleeritav_laud", "jellyfin", "mikrofon", "klaviatuur", "monitor", "cat6"], 2: ["reguleeritav_laud", "jellyfin", "mikrofon", "klaviatuur", "monitor", "cat6", "ussipurk"],
3: ["monitor_360", "karikas", "gaming_tool"], 3: ["monitor_360", "karikas", "gaming_tool", "kalavork", "echolood"],
} }
# Minimum level required to purchase Tier 2 / Tier 3 shop items # Minimum level required to purchase Tier 2 / Tier 3 shop items
@@ -158,11 +180,104 @@ SHOP_LEVEL_REQ: dict[str, int] = {
"klaviatuur": 10, "klaviatuur": 10,
"monitor": 10, "monitor": 10,
"cat6": 10, "cat6": 10,
"ussipurk": 10,
"monitor_360": 20, "monitor_360": 20,
"karikas": 20, "karikas": 20,
"gaming_tool": 20, "gaming_tool": 20,
"kalavork": 20,
"echolood": 20,
} }
# ---------------------------------------------------------------------------
# Prestige shop catalogue
# ---------------------------------------------------------------------------
class PrestigeItem(TypedDict):
emoji: str
max_level: int
pp_cost: int
effect: float
PRESTIGE_SHOP: dict[str, PrestigeItem] = {
"coin_mult": {
"emoji": "<:TipiCOIN:1483000209188589628>",
"max_level": 5,
"pp_cost": 5,
"effect": 0.08,
},
"exp_mult": {
"emoji": "",
"max_level": 5,
"pp_cost": 5,
"effect": 0.08,
},
"daily_plus": {
"emoji": "📅",
"max_level": 3,
"pp_cost": 7,
"effect": 0.20,
},
"work_plus": {
"emoji": "💼",
"max_level": 3,
"pp_cost": 7,
"effect": 0.20,
},
}
# ---------------------------------------------------------------------------
# Fish catalogue
# ---------------------------------------------------------------------------
FISH_CATALOGUE: dict[str, dict] = {
# id: { rarity, weight=(min_g, max_g), coins=(min, max), exp }
"sarj": {"rarity": "common", "weight": (50, 500), "coins": (3, 18), "exp": 3},
"ahven": {"rarity": "common", "weight": (80, 700), "coins": (5, 22), "exp": 3},
"koger": {"rarity": "common", "weight": (100, 800), "coins": (5, 20), "exp": 3},
"viidikas": {"rarity": "common", "weight": (10, 120), "coins": (2, 8), "exp": 2},
"latikas": {"rarity": "uncommon", "weight": (300, 2500), "coins": (20, 70), "exp": 6},
"karpkala": {"rarity": "uncommon", "weight": (500, 4000), "coins": (25, 80), "exp": 7},
"linask": {"rarity": "uncommon", "weight": (200, 2000), "coins": (18, 60), "exp": 6},
"haug": {"rarity": "rare", "weight": (500, 6000), "coins": (50, 180), "exp": 10},
"angerjas": {"rarity": "rare", "weight": (200, 1800), "coins": (40, 120), "exp": 10},
"siig": {"rarity": "rare", "weight": (200, 2000), "coins": (45, 130), "exp": 10},
"forell": {"rarity": "epic", "weight": (400, 4500), "coins": (100, 280), "exp": 15},
"koha": {"rarity": "epic", "weight": (600, 7000), "coins": (120, 300), "exp": 15},
"tougjas": {"rarity": "epic", "weight": (400, 4000), "coins": (90, 250), "exp": 14},
"lohe": {"rarity": "legendary","weight": (1500, 12000), "coins": (250, 700), "exp": 25},
"vimb": {"rarity": "legendary","weight": (200, 1200), "coins": (200, 600), "exp": 25},
}
FISH_RARITY_WEIGHTS: dict[str, int] = {
"junk": 15,
"common": 45,
"uncommon": 22,
"rare": 12,
"epic": 5,
"legendary": 1,
}
def roll_fish(rarity_bump: bool = False) -> tuple[str, int]:
"""Roll a random fish. Returns (fish_id, weight_grams) or ('junk', 0).
rarity_bump=True (kalavork item) shifts each catch one tier up.
"""
rarity_pool = list(FISH_RARITY_WEIGHTS.keys())
weights = list(FISH_RARITY_WEIGHTS.values())
chosen_rarity = random.choices(rarity_pool, weights=weights)[0]
if chosen_rarity == "junk":
return ("junk", 0)
if rarity_bump:
order = ["common", "uncommon", "rare", "epic", "legendary"]
idx = order.index(chosen_rarity) if chosen_rarity in order else 0
chosen_rarity = order[min(idx + 1, len(order) - 1)]
fish_of_rarity = [k for k, v in FISH_CATALOGUE.items() if v["rarity"] == chosen_rarity]
if not fish_of_rarity:
return ("junk", 0)
fish_id = random.choice(fish_of_rarity)
fish = FISH_CATALOGUE[fish_id]
weight = random.randint(fish["weight"][0], fish["weight"][1])
return (fish_id, weight)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# EXP / Level system # EXP / Level system
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -227,6 +342,7 @@ COOLDOWNS: dict[str, timedelta] = {
"beg": timedelta(minutes=5), "beg": timedelta(minutes=5),
"crime": timedelta(hours=2), "crime": timedelta(hours=2),
"rob": timedelta(hours=2), "rob": timedelta(hours=2),
"fish": timedelta(minutes=2),
} }
JAIL_DURATION = timedelta(minutes=30) JAIL_DURATION = timedelta(minutes=30)
@@ -272,6 +388,16 @@ class UserData(TypedDict, total=False):
total_received: int total_received: int
best_daily_streak: int best_daily_streak: int
heist_global_cd_until: float heist_global_cd_until: float
# Prestige system
prestige_level: int
prestige_points: int
season_total_exp: int # cumulative EXP this season (survives prestige resets)
prestige_upgrades: dict # {upgrade_id: level}
# Fishing system
last_fish: str | None
fish_book: dict # {fish_id: times_caught}
total_fish_caught: int
fish_inventory: list # [{fish_id, weight, value}] - survives prestige
def _default_user() -> UserData: def _default_user() -> UserData:
@@ -312,6 +438,16 @@ def _default_user() -> UserData:
"total_received": 0, "total_received": 0,
"best_daily_streak": 0, "best_daily_streak": 0,
"heist_global_cd_until": 0.0, "heist_global_cd_until": 0.0,
# ── Prestige ─────────────────────────────────────────────────────────
"prestige_level": 0,
"prestige_points": 0,
"season_total_exp": 0,
"prestige_upgrades": {},
# ── Fishing ──────────────────────────────────────────────────────────
"last_fish": None,
"fish_book": {},
"total_fish_caught": 0,
"fish_inventory": [],
} }
@@ -388,33 +524,6 @@ async def get_all_users_raw() -> dict[str, "UserData"]:
return result return result
async def migrate_anticheat_uses() -> int:
"""One-time migration: users who own anticheat but have no item_uses entry get 2 uses."""
records = await pb_client.list_all_records()
changed = 0
for record in records:
items = record.get("items") or []
item_uses = record.get("item_uses") or {}
if "anticheat" in items and "anticheat" not in item_uses:
item_uses["anticheat"] = 2
await pb_client.update_record(record["id"], {"item_uses": item_uses})
changed += 1
return changed
async def migrate_reminders_default() -> int:
"""One-time migration: enable all reminders for users who have an empty list."""
_ALL_REMINDERS = ["daily", "work", "beg", "crime", "rob"]
records = await pb_client.list_all_records()
changed = 0
for record in records:
reminders = record.get("reminders")
if not reminders:
await pb_client.update_record(record["id"], {"reminders": _ALL_REMINDERS})
changed += 1
return changed
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Internal helpers # Internal helpers
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -498,6 +607,17 @@ async def get_leaderboard(top_n: int | None = 10) -> list[tuple[str, int]]:
return result if top_n is None else result[:top_n] return result if top_n is None else result[:top_n]
def _prestige_mult(user: UserData) -> tuple[float, float]:
"""Return (coin_mult, exp_mult) based on prestige upgrades. Both ≥1.0."""
upgrades: dict = user.get("prestige_upgrades") or {} # type: ignore[assignment]
coin_level = upgrades.get("coin_mult", 0)
exp_level = upgrades.get("exp_mult", 0)
return (
1.0 + coin_level * PRESTIGE_SHOP["coin_mult"]["effect"],
1.0 + exp_level * PRESTIGE_SHOP["exp_mult"]["effect"],
)
async def get_leaderboard_exp(top_n: int | None = 10) -> list[tuple[str, int, int]]: async def get_leaderboard_exp(top_n: int | None = 10) -> list[tuple[str, int, int]]:
"""Return top_n (user_id_str, exp, level) sorted by EXP descending.""" """Return top_n (user_id_str, exp, level) sorted by EXP descending."""
records = await pb_client.list_all_records() records = await pb_client.list_all_records()
@@ -511,15 +631,18 @@ async def get_leaderboard_exp(top_n: int | None = 10) -> list[tuple[str, int, in
async def award_exp(user_id: int, amount: int) -> dict: async def award_exp(user_id: int, amount: int) -> dict:
"""Add EXP to a user. Returns old_level, new_level, total exp.""" """Add EXP to a user. Applies prestige exp_mult. Returns old_level, new_level, total exp."""
user = await get_user(user_id) user = await get_user(user_id)
_, exp_mult = _prestige_mult(user)
gained = max(1, int(amount * exp_mult))
old_exp = user.get("exp", 0) old_exp = user.get("exp", 0)
new_exp = old_exp + amount new_exp = old_exp + gained
old_level = get_level(old_exp) old_level = get_level(old_exp)
new_level = get_level(new_exp) new_level = get_level(new_exp)
user["exp"] = new_exp user["exp"] = new_exp
user["season_total_exp"] = user.get("season_total_exp", 0) + gained
await _commit(user_id, user) await _commit(user_id, user)
return {"old_level": old_level, "new_level": new_level, "exp": new_exp} return {"old_level": old_level, "new_level": new_level, "exp": new_exp, "gained": gained}
async def do_season_reset(top_n: int = 10) -> list[tuple[str, int, int]]: async def do_season_reset(top_n: int = 10) -> list[tuple[str, int, int]]:
@@ -541,8 +664,10 @@ async def do_season_reset(top_n: int = 10) -> list[tuple[str, int, int]]:
"last_beg": None, "last_beg": None,
"last_crime": None, "last_crime": None,
"last_rob": None, "last_rob": None,
"last_fish": None,
"daily_streak": 0, "daily_streak": 0,
"last_streak_date": None, "last_streak_date": None,
"season_total_exp": 0,
} }
for record in records: for record in records:
await pb_client.update_record(record["id"], reset_fields) await pb_client.update_record(record["id"], reset_fields)
@@ -605,8 +730,13 @@ async def do_daily(user_id: int) -> dict:
vip = "lan_pass" in user["items"] vip = "lan_pass" in user["items"]
vip_mult = 2.0 if vip else 1.0 vip_mult = 2.0 if vip else 1.0
base = 150 daily_plus_level = (user.get("prestige_upgrades") or {}).get("daily_plus", 0)
base = int(150 * (1.0 + daily_plus_level * PRESTIGE_SHOP["daily_plus"]["effect"]))
earned = int(base * streak_mult * vip_mult) earned = int(base * streak_mult * vip_mult)
if "korvaklapid" in user["items"]:
earned += 25
coin_mult, _ = _prestige_mult(user)
earned = int(earned * coin_mult)
# Investor interest (capped at 500/day to prevent runaway wealth) # Investor interest (capped at 500/day to prevent runaway wealth)
interest = 0 interest = 0
@@ -661,7 +791,10 @@ async def do_work(user_id: int) -> dict:
if "energiajook" in user["items"] and random.random() < 0.30: if "energiajook" in user["items"] and random.random() < 0.30:
lucky = True lucky = True
earned = int(base * job_mult * worker_mult * desk_mult * (3.0 if lucky else 1.0)) work_plus_level = (user.get("prestige_upgrades") or {}).get("work_plus", 0)
work_plus_mult = 1.0 + work_plus_level * PRESTIGE_SHOP["work_plus"]["effect"]
coin_mult, _ = _prestige_mult(user)
earned = int(base * job_mult * worker_mult * desk_mult * (3.0 if lucky else 1.0) * work_plus_mult * coin_mult)
user["balance"] += earned user["balance"] += earned
user["last_work"] = _now().isoformat() user["last_work"] = _now().isoformat()
user["work_count"] = user.get("work_count", 0) + 1 user["work_count"] = user.get("work_count", 0) + 1
@@ -699,7 +832,8 @@ async def do_beg(user_id: int) -> dict:
jailed = bool(_is_jailed(user)) jailed = bool(_is_jailed(user))
beg_mult = 2 if "klaviatuur" in user["items"] else 1 beg_mult = 2 if "klaviatuur" in user["items"] else 1
earned = random.randint(10, 40) * beg_mult coin_mult, _ = _prestige_mult(user)
earned = int(random.randint(10, 40) * beg_mult * coin_mult)
user["balance"] += earned user["balance"] += earned
user["last_beg"] = _now().isoformat() user["last_beg"] = _now().isoformat()
user["beg_count"] = user.get("beg_count", 0) + 1 user["beg_count"] = user.get("beg_count", 0) + 1
@@ -718,6 +852,262 @@ async def do_beg(user_id: int) -> dict:
} }
# ---------------------------------------------------------------------------
# /fish
# ---------------------------------------------------------------------------
async def do_fish_start(user_id: int) -> dict:
"""Check cooldown + jail, set cooldown. Call before starting the fishing minigame."""
user = await get_user(user_id)
if user.get("eco_banned"):
return {"ok": False, "reason": "banned"}
if jail := _is_jailed(user):
return {"ok": False, "reason": "jailed", "remaining": jail}
fish_cd = timedelta(seconds=90) if "ussipurk" in user["items"] else COOLDOWNS["fish"]
if cd := _cooldown_remaining(user, "fish", override_cd=fish_cd):
return {"ok": False, "reason": "cooldown", "remaining": cd}
user["last_fish"] = _now().isoformat()
await _commit(user_id, user)
return {"ok": True}
async def do_fish_resolve(user_id: int, fish_id: str, weight: int) -> dict:
"""Add catch to inventory + update fish_book. Returns catch info incl. pre-calculated value."""
user = await get_user(user_id)
if fish_id == "junk":
_txn("FISH_JUNK", user=user_id)
return {"ok": True, "type": "junk", "coins": 0, "exp": 0}
if fish_id not in FISH_CATALOGUE:
return {"ok": False, "reason": "invalid_fish"}
fish = FISH_CATALOGUE[fish_id]
min_c, max_c = fish["coins"]
w_min, w_max = fish["weight"]
weight_ratio = (weight - w_min) / max(1, w_max - w_min)
base_coins = int(min_c + weight_ratio * (max_c - min_c))
coin_mult, _ = _prestige_mult(user)
value = int(base_coins * coin_mult)
exp = fish["exp"]
book: dict = user.get("fish_book") or {}
prev_count = book.get(fish_id, 0)
book[fish_id] = prev_count + 1
user["fish_book"] = book
user["total_fish_caught"] = user.get("total_fish_caught", 0) + 1
inv: list = list(user.get("fish_inventory") or [])
inv.append({"fish_id": fish_id, "weight": weight, "value": value})
user["fish_inventory"] = inv
await _commit(user_id, user)
_txn("FISH", user=user_id, fish=fish_id, weight=weight, value=value)
return {
"ok": True,
"type": "fish",
"fish_id": fish_id,
"weight": weight,
"value": value,
"exp": exp,
"is_new": prev_count == 0,
"total_caught": book[fish_id],
}
async def do_fish_sell(user_id: int, indices: list[int] | None = None) -> dict:
"""Sell fish from inventory. indices=None sells all. Returns coins earned."""
user = await get_user(user_id)
inv: list = list(user.get("fish_inventory") or [])
if not inv:
return {"ok": False, "reason": "empty"}
if indices is None:
to_sell = inv
remaining = []
else:
to_sell = [inv[i] for i in sorted(set(indices)) if 0 <= i < len(inv)]
keep_idx = set(range(len(inv))) - set(indices)
remaining = [inv[i] for i in sorted(keep_idx)]
if not to_sell:
return {"ok": False, "reason": "empty"}
total_coins = sum(entry["value"] for entry in to_sell)
user["fish_inventory"] = remaining
user["balance"] = user.get("balance", 0) + total_coins
user["lifetime_earned"] = user.get("lifetime_earned", 0) + total_coins
user["peak_balance"] = max(user.get("peak_balance", 0), user["balance"])
await _commit(user_id, user)
_txn("FISH_SELL", user=user_id, count=len(to_sell), coins=f"+{total_coins}", bal=user["balance"])
return {
"ok": True,
"coins": total_coins,
"count": len(to_sell),
"balance": user["balance"],
}
async def do_fishbook(user_id: int) -> dict:
"""Return the user's fish book data including per-species inventory counts."""
user = await get_user(user_id)
book: dict = user.get("fish_book") or {}
inv: list = user.get("fish_inventory") or []
inv_counts: dict[str, int] = {}
for entry in inv:
fid = entry.get("fish_id", "")
inv_counts[fid] = inv_counts.get(fid, 0) + 1
return {
"ok": True,
"book": book,
"inv_counts": inv_counts,
"total_fish_caught": user.get("total_fish_caught", 0),
"unique_caught": len(book),
"total_species": len(FISH_CATALOGUE),
}
# ---------------------------------------------------------------------------
# /prestige
# ---------------------------------------------------------------------------
async def do_prestige(user_id: int) -> dict:
"""Prestige: requires level 30, earns PP, resets balance/exp/items/cooldowns."""
user = await get_user(user_id)
if user.get("eco_banned"):
return {"ok": False, "reason": "banned"}
exp = user.get("exp", 0)
level = get_level(exp)
if level < PRESTIGE_MIN_LEVEL:
return {"ok": False, "reason": "level_too_low", "level": level, "required": PRESTIGE_MIN_LEVEL}
pp_earned = max(1, exp // 1000)
new_prestige_level = user.get("prestige_level", 0) + 1
# Preserve: fish_book, fish_inventory, lifetime stats, prestige_points, season_total_exp, prestige_upgrades
user["balance"] = 0
user["exp"] = 0
user["items"] = []
user["item_uses"] = {}
user["last_daily"] = None
user["last_work"] = None
user["last_beg"] = None
user["last_crime"] = None
user["last_rob"] = None
user["last_fish"] = None
user["last_heist"] = None
user["daily_streak"] = 0
user["last_streak_date"] = None
user["jailed_until"] = None
user["jailbreak_used"] = False
user["prestige_level"] = new_prestige_level
user["prestige_points"] = user.get("prestige_points", 0) + pp_earned
await _commit(user_id, user)
_txn("PRESTIGE", user=user_id, pp_earned=pp_earned, prestige=new_prestige_level, old_exp=exp)
return {
"ok": True,
"pp_earned": pp_earned,
"prestige_level": new_prestige_level,
"prestige_points": user["prestige_points"],
"old_exp": exp,
}
async def do_prestige_buy(user_id: int, upgrade_id: str) -> dict:
"""Spend PP to buy a prestige upgrade level."""
if upgrade_id not in PRESTIGE_SHOP:
return {"ok": False, "reason": "not_found"}
user = await get_user(user_id)
if user.get("eco_banned"):
return {"ok": False, "reason": "banned"}
upgrade = PRESTIGE_SHOP[upgrade_id]
upgrades: dict = user.get("prestige_upgrades") or {}
current_level = upgrades.get(upgrade_id, 0)
if current_level >= upgrade["max_level"]:
return {"ok": False, "reason": "maxed", "max": upgrade["max_level"]}
pp = user.get("prestige_points", 0)
cost = upgrade["pp_cost"]
if pp < cost:
return {"ok": False, "reason": "insufficient_pp", "have": pp, "need": cost}
upgrades[upgrade_id] = current_level + 1
user["prestige_upgrades"] = upgrades
user["prestige_points"] = pp - cost
await _commit(user_id, user)
_txn("PRESTIGE_BUY", user=user_id, upgrade=upgrade_id,
new_level=upgrades[upgrade_id], pp_left=user["prestige_points"])
return {
"ok": True,
"upgrade_id": upgrade_id,
"new_level": upgrades[upgrade_id],
"max_level": upgrade["max_level"],
"pp_remaining": user["prestige_points"],
}
# ---------------------------------------------------------------------------
# Extended leaderboards
# ---------------------------------------------------------------------------
async def get_leaderboard_season_exp(top_n: int | None = 10) -> list[tuple[str, int, int]]:
"""Return (user_id, season_total_exp, prestige_level) sorted by season EXP."""
records = await pb_client.list_all_records()
result = sorted(
(
(r["user_id"], r.get("season_total_exp", 0), r.get("prestige_level", 0))
for r in records if r.get("user_id")
),
key=lambda x: x[1],
reverse=True,
)
return result if top_n is None else result[:top_n]
async def get_leaderboard_prestige(top_n: int | None = 10) -> list[tuple[str, int, int]]:
"""Return (user_id, prestige_level, prestige_points) sorted by prestige_level then PP."""
records = await pb_client.list_all_records()
result = sorted(
(
(r["user_id"], r.get("prestige_level", 0), r.get("prestige_points", 0))
for r in records if r.get("user_id")
),
key=lambda x: (x[1], x[2]),
reverse=True,
)
return result if top_n is None else result[:top_n]
async def get_leaderboard_wagered(top_n: int | None = 10) -> list[tuple[str, int]]:
"""Return (user_id, total_wagered) sorted descending."""
records = await pb_client.list_all_records()
result = sorted(
((r["user_id"], r.get("total_wagered", 0)) for r in records if r.get("user_id")),
key=lambda x: x[1],
reverse=True,
)
return result if top_n is None else result[:top_n]
async def get_leaderboard_fish(top_n: int | None = 10) -> list[tuple[str, int]]:
"""Return (user_id, total_fish_caught) sorted descending."""
records = await pb_client.list_all_records()
result = sorted(
((r["user_id"], r.get("total_fish_caught", 0)) for r in records if r.get("user_id")),
key=lambda x: x[1],
reverse=True,
)
return result if top_n is None else result[:top_n]
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# /crime # /crime
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -1171,6 +1561,57 @@ async def do_admin_inspect(target_id: int) -> dict:
return {"ok": True, "data": dict(user)} return {"ok": True, "data": dict(user)}
async def do_admin_exp(target_id: int, amount: int, admin_id: int, reason: str) -> dict:
"""Give (positive) or take (negative) EXP from a user. EXP is floored at 0."""
user = await get_user(target_id)
old_exp = user.get("exp", 0)
old_level = get_level(old_exp)
user["exp"] = max(0, old_exp + amount)
user["season_total_exp"] = max(0, user.get("season_total_exp", 0) + amount)
new_level = get_level(user["exp"])
await _commit(target_id, user)
verb = f"+{amount}" if amount >= 0 else str(amount)
_txn("ADMIN_EXP", admin=admin_id, target=target_id, amount=verb, reason=reason, exp=user["exp"])
return {
"ok": True,
"exp": user["exp"],
"change": amount,
"old_level": old_level,
"new_level": new_level,
"level_changed": new_level != old_level,
}
async def do_admin_item(target_id: int, item_id: str, action: str, admin_id: int) -> dict:
"""Give or remove an item. action='give'|'remove'. Returns ok/reason."""
if item_id not in SHOP:
return {"ok": False, "reason": "invalid_item"}
user = await get_user(target_id)
items: list = list(user.get("items") or [])
item_uses: dict = dict(user.get("item_uses") or {})
if action == "give":
if item_id not in items:
items.append(item_id)
if item_id == "anticheat":
item_uses["anticheat"] = 2
user["items"] = items
user["item_uses"] = item_uses
await _commit(target_id, user)
_txn("ADMIN_ITEM_GIVE", admin=admin_id, target=target_id, item=item_id)
return {"ok": True, "action": "given", "item_id": item_id}
elif action == "remove":
if item_id not in items:
return {"ok": False, "reason": "not_owned"}
items.remove(item_id)
item_uses.pop(item_id, None)
user["items"] = items
user["item_uses"] = item_uses
await _commit(target_id, user)
_txn("ADMIN_ITEM_REMOVE", admin=admin_id, target=target_id, item=item_id)
return {"ok": True, "action": "removed", "item_id": item_id}
return {"ok": False, "reason": "invalid_action"}
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# /reminders # /reminders
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

File diff suppressed because it is too large Load Diff

View File

@@ -1,714 +1,108 @@
2026-03-20 01:34:58 | WORK user=340451525799182357 earned=+123 lucky=False bal=27988 2026-04-01 18:44:29 | WORK user=272518654715887618 earned=+54 lucky=False bal=24077
2026-03-20 01:35:02 | BEG user=340451525799182357 earned=+24 jailed=False bal=28012 2026-04-01 20:02:11 | BEG user=272518654715887618 earned=+23 jailed=False bal=24100
2026-03-20 01:35:39 | ROB_FAIL robber=340451525799182357 victim=218972931701735424 fine=-120 robber_bal=27892 2026-04-01 20:02:53 | ROULETTE_WIN user=178852380018868224 bet=15214708 colour=punane result=punane mult=1 bal=30429416
2026-03-20 01:35:56 | SLOTS_MISS user=340451525799182357 bet=100 change=-100 bal=27792 2026-04-01 20:03:42 | ROULETTE_WIN user=178852380018868224 bet=30429416 colour=must result=must mult=1 bal=60858832
2026-03-20 01:36:04 | SLOTS_PAIR user=340451525799182357 bet=100 change=50 bal=27842 2026-04-01 20:04:16 | ROULETTE_LOSE user=178852380018868224 bet=60858832 colour=punane result=must mult=1 bal=0
2026-03-20 01:36:11 | SLOTS_MISS user=340451525799182357 bet=100 change=-100 bal=27742 2026-04-01 20:06:37 | BEG user=401373976431165449 earned=+52 jailed=False bal=8446
2026-03-20 01:36:19 | SLOTS_PAIR user=340451525799182357 bet=100 change=50 bal=27792 2026-04-01 20:06:39 | WORK user=401373976431165449 earned=+60 lucky=False bal=8506
2026-03-20 01:37:38 | BLACKJACK user=340451525799182357 payout=+400 net=+200 bal=27992 2026-04-01 20:06:52 | DAILY user=401373976431165449 earned=+750 streak=1 bal=9256
2026-03-20 01:38:07 | BEG user=340451525799182357 earned=+30 jailed=False bal=28022 2026-04-01 20:07:07 | DAILY user=272518654715887618 earned=+825 streak=1 bal=24925
2026-03-20 01:38:23 | BLACKJACK user=340451525799182357 payout=+0 net=-100 bal=27922 2026-04-01 20:07:12 | CRIME_WIN user=272518654715887618 earned=+331 bal=25256
2026-03-20 01:38:43 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=26922 2026-04-01 20:07:38 | CRIME_WIN user=401373976431165449 earned=+391 bal=9647
2026-03-20 01:39:15 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=27922 2026-04-01 20:07:49 | BUY user=401373976431165449 item=echolood cost=-8000 bal=1647
2026-03-20 01:39:36 | BLACKJACK user=340451525799182357 payout=+4000 net=+2000 bal=29922 2026-04-01 20:09:16 | ROB_BLOCKED robber=824516445382901800 victim=340451525799182357 fine=-118 robber_bal=891 ac_uses_left=1
2026-03-20 01:39:49 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=30922 2026-04-01 20:09:23 | ROB_BLOCKED robber=401373976431165449 victim=340451525799182357 fine=-175 robber_bal=1472 ac_uses_left=0
2026-03-20 01:40:02 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=31922 2026-04-01 20:09:52 | ROB_WIN robber=178852380018868224 victim=340451525799182357 stolen=+34868 jackpot=False robber_bal=34868 victim_bal=140238
2026-03-20 01:40:12 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=30922 2026-04-01 20:10:48 | DAILY user=367347301322326016 earned=+712 streak=1 bal=8462
2026-03-20 01:40:26 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=29922 2026-04-01 20:10:55 | WORK user=367347301322326016 earned=+25 lucky=False bal=8487
2026-03-20 01:40:40 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=30922 2026-04-01 20:11:00 | BEG user=367347301322326016 earned=+15 jailed=False bal=8502
2026-03-20 01:40:54 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=31922 2026-04-01 20:11:37 | ROB_FAIL robber=272518654715887618 victim=340451525799182357 fine=-140 robber_bal=25116
2026-03-20 01:41:05 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=30922 2026-04-01 20:15:19 | HEIST_FAIL user=178852380018868224 fine=-1000 jailed_until=2026-04-01T18:45:19.705842+00:00 bal=33868
2026-03-20 01:41:26 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=29922 2026-04-01 20:15:19 | HEIST_FAIL user=340451525799182357 fine=-1000 jailed_until=2026-04-01T18:45:19.705842+00:00 bal=139238
2026-03-20 01:41:35 | BLACKJACK user=340451525799182357 payout=+2500 net=+1500 bal=31422 2026-04-01 20:15:19 | HEIST_FAIL user=272518654715887618 fine=-1000 jailed_until=2026-04-01T18:45:19.705842+00:00 bal=24116
2026-03-20 01:42:32 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=32422 2026-04-01 20:15:19 | HEIST_FAIL user=209554152584380420 fine=-1000 jailed_until=2026-04-01T18:45:19.705842+00:00 bal=20112
2026-03-20 01:42:46 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=31422 2026-04-01 20:15:19 | HEIST_FAIL user=401373976431165449 fine=-220 jailed_until=2026-04-01T18:45:19.705842+00:00 bal=1252
2026-03-20 01:43:34 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=30422 2026-04-01 20:15:19 | HEIST_FAIL user=344531774518591498 fine=-1000 jailed_until=2026-04-01T18:45:19.705842+00:00 bal=112701
2026-03-20 01:43:48 | BLACKJACK user=340451525799182357 payout=+4000 net=+2000 bal=32422 2026-04-01 20:15:19 | HEIST_FAIL user=367347301322326016 fine=-1000 jailed_until=2026-04-01T18:45:19.705842+00:00 bal=7502
2026-03-20 01:44:00 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=31422 2026-04-01 20:15:45 | JAIL_FREE user=272518654715887618 method=doubles
2026-03-20 01:44:11 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=32422 2026-04-01 20:20:07 | JAIL_FREE user=344531774518591498 method=doubles
2026-03-20 01:44:22 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=33422 2026-04-01 20:20:14 | DAILY user=344531774518591498 earned=+825 streak=1 bal=113526
2026-03-20 01:44:47 | BLACKJACK user=340451525799182357 payout=+4000 net=+2000 bal=35422 2026-04-01 20:20:16 | WORK user=344531774518591498 earned=+45 lucky=False bal=113571
2026-03-20 01:45:02 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=36422 2026-04-01 20:20:19 | WORK user=272518654715887618 earned=+55 lucky=False bal=24171
2026-03-20 01:45:17 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=35422 2026-04-01 20:20:19 | BEG user=344531774518591498 earned=+22 jailed=False bal=113593
2026-03-20 01:45:28 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=36422 2026-04-01 20:20:36 | BLACKJACK user=272518654715887618 payout=+0 net=-24171 bal=0
2026-03-20 01:45:42 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=37422 2026-04-01 20:21:03 | CRIME_FAIL user=344531774518591498 fine=-90 jailed=True bal=113503
2026-03-20 01:45:55 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=38422 2026-04-01 20:21:11 | FISH user=272518654715887618 fish=koger weight=590 value=15
2026-03-20 01:46:15 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=39422 2026-04-01 20:21:45 | ROB_WIN robber=344531774518591498 victim=340451525799182357 stolen=+15566 jackpot=False robber_bal=129069 victim_bal=123672
2026-03-20 01:46:27 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=38422 2026-04-01 20:25:40 | BAIL_PAID user=178852380018868224 fine=-8760 pct=26% bal=25108
2026-03-20 01:46:38 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=37422 2026-04-01 20:28:28 | BEG user=178852380018868224 earned=+28 jailed=False bal=25136
2026-03-20 01:46:54 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=38422 2026-04-01 20:28:30 | WORK user=178852380018868224 earned=+92 lucky=False bal=25228
2026-03-20 01:47:05 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=37422 2026-04-01 20:28:33 | DAILY user=178852380018868224 earned=+825 streak=1 bal=26053
2026-03-20 01:47:15 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=36422 2026-04-01 20:28:38 | CRIME_WIN user=178852380018868224 earned=+640 bal=26693
2026-03-20 01:47:46 | BLACKJACK user=340451525799182357 payout=+4000 net=+2000 bal=38422 2026-04-01 20:35:35 | BEG user=401373976431165449 earned=+56 jailed=True bal=1308
2026-03-20 01:47:59 | BLACKJACK user=340451525799182357 payout=+4000 net=+2000 bal=40422 2026-04-01 20:36:20 | JAIL_FREE user=401373976431165449 method=doubles
2026-03-20 01:48:11 | BLACKJACK user=340451525799182357 payout=+2000 net=+0 bal=40422 2026-04-01 20:37:47 | FISH user=401373976431165449 fish=angerjas weight=989 value=79
2026-03-20 01:48:23 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=41422 2026-04-01 20:46:02 | DAILY user=338622999127261185 earned=+300 streak=1 bal=300
2026-03-20 01:48:39 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=40422 2026-04-01 20:56:03 | BEG user=344531774518591498 earned=+60 jailed=False bal=129129
2026-03-20 01:48:54 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=41422 2026-04-01 20:56:29 | ROULETTE_LOSE user=344531774518591498 bet=1000 colour=punane result=must mult=1 bal=128129
2026-03-20 01:49:12 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=42422 2026-04-01 21:01:23 | BEG user=272518654715887618 earned=+33 jailed=False bal=33
2026-03-20 01:49:25 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=43422 2026-04-01 21:01:42 | FISH user=272518654715887618 fish=sarj weight=151 value=6
2026-03-20 01:49:36 | BLACKJACK user=340451525799182357 payout=+1000 net=+0 bal=43422 2026-04-01 21:02:38 | FISH user=344531774518591498 fish=viidikas weight=98 value=6
2026-03-20 01:49:51 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=44422 2026-04-01 21:02:57 | FISH_SELL user=344531774518591498 count=2 coins=+13 bal=128142
2026-03-20 01:50:06 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=45422 2026-04-01 21:03:10 | BEG user=401373976431165449 earned=+54 jailed=False bal=1362
2026-03-20 01:50:16 | BLACKJACK user=340451525799182357 payout=+1000 net=+0 bal=45422 2026-04-01 21:03:31 | FISH user=401373976431165449 fish=siig weight=584 value=63
2026-03-20 01:50:28 | BLACKJACK user=340451525799182357 payout=+0 net=-2000 bal=43422 2026-04-01 21:05:19 | WORK user=401373976431165449 earned=+131 lucky=False bal=1493
2026-03-20 01:50:38 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=42422 2026-04-01 21:05:38 | FISH user=401373976431165449 fish=siig weight=1624 value=112
2026-03-20 01:50:53 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=41422 2026-04-01 21:05:48 | FISH_SELL user=401373976431165449 count=3 coins=+254 bal=1747
2026-03-20 01:51:04 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=40422 2026-04-01 21:08:31 | BEG user=401373976431165449 earned=+32 jailed=False bal=1779
2026-03-20 01:51:20 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=39422 2026-04-01 21:08:45 | FISH user=401373976431165449 fish=tougjas weight=3051 value=207
2026-03-20 01:51:31 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=40422 2026-04-01 21:09:01 | ROULETTE_WIN user=401373976431165449 bet=1000 colour=punane result=punane mult=1 bal=2779
2026-03-20 01:51:44 | BLACKJACK user=340451525799182357 payout=+1000 net=+0 bal=40422 2026-04-01 21:09:35 | BLACKJACK user=401373976431165449 payout=+3000 net=+1500 bal=4279
2026-03-20 01:51:54 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=39422 2026-04-01 21:09:35 | ROULETTE_LOSE user=344531774518591498 bet=1000 colour=punane result=must mult=1 bal=127142
2026-03-20 01:52:07 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=38422 2026-04-01 21:10:05 | ROULETTE_WIN user=401373976431165449 bet=1000 colour=punane result=punane mult=1 bal=5279
2026-03-20 01:52:20 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=39422 2026-04-01 21:10:46 | ROULETTE_WIN user=344531774518591498 bet=1000 colour=punane result=punane mult=1 bal=128142
2026-03-20 01:52:33 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=38422 2026-04-01 21:11:03 | ROULETTE_LOSE user=401373976431165449 bet=1000 colour=must result=punane mult=1 bal=4279
2026-03-20 01:52:43 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=39422 2026-04-01 21:11:24 | ROULETTE_LOSE user=344531774518591498 bet=1000 colour=punane result=roheline mult=1 bal=127142
2026-03-20 01:52:58 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=40422 2026-04-01 21:15:50 | WORK user=338622999127261185 earned=+15 lucky=False bal=315
2026-03-20 01:54:04 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=41422 2026-04-01 21:15:54 | CRIME_WIN user=338622999127261185 earned=+453 bal=768
2026-03-20 01:54:20 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=42422 2026-04-01 21:16:00 | BEG user=338622999127261185 earned=+20 jailed=False bal=788
2026-03-20 01:55:01 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=41422 2026-04-01 21:16:13 | FISH user=338622999127261185 fish=ahven weight=422 value=14
2026-03-20 01:55:12 | BLACKJACK user=340451525799182357 payout=+1000 net=+0 bal=41422 2026-04-01 21:18:36 | BEG user=401373976431165449 earned=+20 jailed=False bal=4299
2026-03-20 01:55:20 | BLACKJACK user=340451525799182357 payout=+2500 net=+1500 bal=42922 2026-04-01 21:18:52 | FISH user=401373976431165449 fish=karpkala weight=1920 value=47
2026-03-20 01:55:42 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=43922 2026-04-01 21:20:58 | SLOTS_TRIPLE user=344531774518591498 bet=1000 change=4000 bal=131142
2026-03-20 01:55:54 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=44922 2026-04-01 21:21:39 | SLOTS_MISS user=344531774518591498 bet=1000 change=-1000 bal=130142
2026-03-20 01:56:02 | BLACKJACK user=340451525799182357 payout=+2500 net=+1500 bal=46422 2026-04-01 21:28:25 | ROULETTE_LOSE user=401373976431165449 bet=1000 colour=punane result=must mult=1 bal=3299
2026-03-20 01:56:16 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=45422 2026-04-01 21:29:10 | SLOTS_PAIR user=344531774518591498 bet=1000 change=500 bal=130642
2026-03-20 01:56:27 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=44422 2026-04-01 21:29:28 | ROULETTE_LOSE user=401373976431165449 bet=1000 colour=punane result=must mult=1 bal=2299
2026-03-20 01:56:39 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=45422 2026-04-01 21:30:49 | SLOTS_PAIR user=344531774518591498 bet=1000 change=500 bal=131142
2026-03-20 01:56:49 | BLACKJACK user=340451525799182357 payout=+1000 net=+0 bal=45422 2026-04-01 21:31:30 | SLOTS_PAIR user=344531774518591498 bet=1000 change=500 bal=131642
2026-03-20 01:57:01 | BLACKJACK user=340451525799182357 payout=+1000 net=+0 bal=45422 2026-04-01 21:31:33 | ROULETTE_WIN user=401373976431165449 bet=1000 colour=punane result=punane mult=1 bal=3299
2026-03-20 01:58:03 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=44422 2026-04-01 21:31:37 | BEG user=401373976431165449 earned=+68 jailed=False bal=3367
2026-03-20 01:58:19 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=43422 2026-04-01 21:32:05 | FISH user=401373976431165449 fish=latikas weight=2351 value=66
2026-03-20 01:59:08 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=42422 2026-04-01 21:33:14 | ROULETTE_LOSE user=401373976431165449 bet=1000 colour=punane result=must mult=1 bal=2367
2026-03-20 01:59:22 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=43422 2026-04-01 21:35:09 | SLOTS_MISS user=344531774518591498 bet=1000 change=-1000 bal=130642
2026-03-20 01:59:37 | BLACKJACK user=340451525799182357 payout=+2500 net=+1500 bal=44922 2026-04-01 21:35:14 | ROULETTE_LOSE user=401373976431165449 bet=1000 colour=punane result=must mult=1 bal=1367
2026-03-20 01:59:56 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=43922 2026-04-01 21:48:35 | ROB_FAIL robber=338622999127261185 victim=340451525799182357 fine=-237 robber_bal=551
2026-03-20 02:00:14 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=42922 2026-04-01 21:49:59 | BEG user=401373976431165449 earned=+56 jailed=False bal=1423
2026-03-20 02:00:37 | BLACKJACK user=340451525799182357 payout=+2500 net=+1500 bal=44422 2026-04-01 21:50:15 | FISH user=401373976431165449 fish=vimb weight=856 value=462
2026-03-20 02:00:57 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=45422 2026-04-01 22:11:02 | BEG user=401373976431165449 earned=+52 jailed=False bal=1475
2026-03-20 02:01:08 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=44422 2026-04-01 22:11:13 | WORK user=401373976431165449 earned=+73 lucky=False bal=1548
2026-03-20 02:01:38 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=43422 2026-04-01 22:11:27 | ROB_WIN robber=401373976431165449 victim=367347301322326016 stolen=+1818 jackpot=False robber_bal=3366 victim_bal=5684
2026-03-20 02:01:56 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=42422 2026-04-01 22:11:44 | FISH user=401373976431165449 fish=lohe weight=2973 value=313
2026-03-20 02:02:15 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=43422 2026-04-01 22:13:30 | ROULETTE_LOSE user=401373976431165449 bet=2000 colour=punane result=roheline mult=1 bal=1366
2026-03-20 02:02:30 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=44422 2026-04-01 22:14:33 | ROULETTE_LOSE user=401373976431165449 bet=1366 colour=punane result=must mult=1 bal=0
2026-03-20 02:02:43 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=45422 2026-04-01 22:40:19 | WORK user=367347301322326016 earned=+82 lucky=False bal=5766
2026-03-20 02:02:55 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=44422 2026-04-01 22:40:23 | CRIME_FAIL user=367347301322326016 fine=-100 jailed=True bal=5666
2026-03-20 02:03:07 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=43422 2026-04-01 22:46:27 | WORK user=344531774518591498 earned=+116 lucky=False bal=130758
2026-03-20 02:03:32 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=44422 2026-04-01 22:46:30 | BEG user=344531774518591498 earned=+58 jailed=False bal=130816
2026-03-20 02:03:48 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=45422 2026-04-01 22:46:35 | CRIME_WIN user=344531774518591498 earned=+419 bal=131235
2026-03-20 02:04:01 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=44422 2026-04-01 22:46:44 | ROB_FAIL robber=344531774518591498 victim=340451525799182357 fine=-246 robber_bal=130989
2026-03-20 02:04:20 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=43422 2026-04-01 22:47:01 | FISH user=344531774518591498 fish=viidikas weight=80 value=5
2026-03-20 02:04:32 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=44422 2026-04-01 22:48:58 | WORK user=178852380018868224 earned=+106 lucky=True bal=26799
2026-03-20 02:04:45 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=43422 2026-04-01 22:49:03 | CRIME_WIN user=178852380018868224 earned=+486 bal=27285
2026-03-20 02:04:57 | BLACKJACK user=340451525799182357 payout=+4000 net=+2000 bal=45422 2026-04-01 22:49:05 | BEG user=178852380018868224 earned=+76 jailed=False bal=27361
2026-03-20 02:05:17 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=46422 2026-04-01 22:52:25 | BEG user=401373976431165449 earned=+44 jailed=False bal=44
2026-03-20 02:09:33 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=47422 2026-04-01 22:52:29 | WORK user=401373976431165449 earned=+103 lucky=False bal=147
2026-03-20 02:09:46 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=48422 2026-04-01 22:52:39 | CRIME_FAIL user=401373976431165449 fine=-125 jailed=False bal=22
2026-03-20 02:10:00 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=49422 2026-04-01 22:53:01 | FISH user=401373976431165449 fish=latikas weight=1217 value=40
2026-03-20 02:10:17 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=48422 2026-04-01 22:57:11 | SLOTS_PAIR user=344531774518591498 bet=10000 change=5000 bal=135989
2026-03-20 02:10:27 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=47422
2026-03-20 02:10:41 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=48422
2026-03-20 02:11:43 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=49422
2026-03-20 02:20:03 | ROB_BLOCKED robber=178852380018868224 victim=340451525799182357 fine=-198 robber_bal=237 ac_uses_left=1
2026-03-20 02:50:48 | BEG user=178852380018868224 earned=+64 jailed=False bal=301
2026-03-20 02:50:50 | WORK user=178852380018868224 earned=+92 lucky=False bal=393
2026-03-20 02:50:53 | CRIME_WIN user=178852380018868224 earned=+414 bal=807
2026-03-20 03:11:24 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=48422
2026-03-20 04:25:19 | HEIST_HOUSE change=-79803 house_bal=123830
2026-03-20 04:25:19 | HEIST_WIN user=340451525799182357 change=+39901 bal=88323
2026-03-20 04:25:19 | HEIST_WIN user=178852380018868224 change=+39901 bal=40708
2026-03-20 04:26:00 | DAILY user=178852380018868224 earned=+950 streak=5 bal=41658
2026-03-20 04:28:21 | WORK user=340451525799182357 earned=+114 lucky=False bal=88437
2026-03-20 04:28:26 | BEG user=340451525799182357 earned=+72 jailed=False bal=88509
2026-03-20 04:29:11 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=89509
2026-03-20 04:30:44 | BLACKJACK user=340451525799182357 payout=+2500 net=+1500 bal=91009
2026-03-20 04:31:09 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=90009
2026-03-20 04:31:28 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=91009
2026-03-20 04:31:45 | BLACKJACK user=340451525799182357 payout=+2000 net=+1000 bal=92009
2026-03-20 04:32:10 | BLACKJACK user=340451525799182357 payout=+1000 net=+0 bal=92009
2026-03-20 04:32:30 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=91009
2026-03-20 04:32:52 | BLACKJACK user=340451525799182357 payout=+4000 net=+2000 bal=93009
2026-03-20 04:33:11 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=92009
2026-03-20 04:33:32 | BLACKJACK user=340451525799182357 payout=+1000 net=+0 bal=92009
2026-03-20 04:33:48 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=91009
2026-03-20 04:34:07 | BLACKJACK user=340451525799182357 payout=+0 net=-1000 bal=90009
2026-03-20 04:34:26 | BLACKJACK user=340451525799182357 payout=+0 net=-3000 bal=87009
2026-03-20 04:34:51 | BLACKJACK user=340451525799182357 payout=+0 net=-10000 bal=77009
2026-03-20 04:35:14 | BLACKJACK user=340451525799182357 payout=+0 net=-20000 bal=57009
2026-03-20 04:35:33 | BLACKJACK user=340451525799182357 payout=+0 net=-57009 bal=0
2026-03-20 06:12:01 | DAILY user=272518654715887618 earned=+225 streak=5 bal=930
2026-03-20 06:43:11 | BEG user=338622999127261185 earned=+78 jailed=False bal=751
2026-03-20 06:43:13 | WORK user=338622999127261185 earned=+102 lucky=False bal=853
2026-03-20 06:43:17 | CRIME_WIN user=338622999127261185 earned=+331 bal=1184
2026-03-20 06:44:17 | ROB_FAIL robber=338622999127261185 victim=218972931701735424 fine=-111 robber_bal=1073
2026-03-20 06:46:27 | BEG user=338622999127261185 earned=+30 jailed=False bal=1103
2026-03-20 07:00:53 | DAILY user=824516445382901800 earned=+491 streak=5 bal=1328
2026-03-20 07:03:25 | BEG user=338622999127261185 earned=+24 jailed=False bal=1127
2026-03-20 07:03:29 | DAILY user=338622999127261185 earned=+450 streak=5 bal=1577
2026-03-20 07:03:37 | ROULETTE_LOSE user=338622999127261185 bet=1577 colour=punane result=roheline mult=1 bal=0
2026-03-20 07:06:42 | BEG user=338622999127261185 earned=+58 jailed=False bal=58
2026-03-20 07:17:30 | CRIME_WIN user=401373976431165449 earned=+461 bal=10256
2026-03-20 07:17:46 | ROB_WIN robber=401373976431165449 victim=218972931701735424 stolen=+703 jackpot=False robber_bal=10959 victim_bal=2816
2026-03-20 07:17:52 | WORK user=401373976431165449 earned=+174 lucky=True bal=11133
2026-03-20 07:17:54 | BEG user=401373976431165449 earned=+58 jailed=False bal=11191
2026-03-20 07:18:00 | DAILY user=401373976431165449 earned=+950 streak=5 bal=12141
2026-03-20 07:25:09 | WORK user=338622999127261185 earned=+36 lucky=False bal=94
2026-03-20 07:25:11 | BEG user=338622999127261185 earned=+38 jailed=False bal=132
2026-03-20 07:28:30 | BEG user=401373976431165449 earned=+32 jailed=False bal=12173
2026-03-20 07:41:15 | BEG user=401373976431165449 earned=+38 jailed=False bal=12211
2026-03-20 07:51:21 | DAILY user=344531774518591498 earned=+500 streak=5 bal=1518
2026-03-20 07:51:27 | WORK user=344531774518591498 earned=+275 lucky=True bal=1793
2026-03-20 07:51:29 | BEG user=344531774518591498 earned=+42 jailed=False bal=1835
2026-03-20 07:51:39 | ROB_BLOCKED robber=344531774518591498 victim=178852380018868224 fine=-130 robber_bal=1705 ac_uses_left=0
2026-03-20 07:51:47 | CRIME_WIN user=344531774518591498 earned=+456 bal=2161
2026-03-20 07:55:18 | BLACKJACK user=344531774518591498 payout=+2000 net=+1000 bal=3161
2026-03-20 07:55:34 | BLACKJACK user=344531774518591498 payout=+0 net=-1000 bal=2161
2026-03-20 07:55:48 | BLACKJACK user=344531774518591498 payout=+0 net=-1000 bal=1161
2026-03-20 07:56:02 | BLACKJACK user=344531774518591498 payout=+1161 net=+0 bal=1161
2026-03-20 07:56:15 | BLACKJACK user=344531774518591498 payout=+0 net=-1161 bal=0
2026-03-20 08:08:09 | BEG user=401373976431165449 earned=+26 jailed=False bal=12237
2026-03-20 08:08:19 | WORK user=401373976431165449 earned=+205 lucky=False bal=12442
2026-03-20 08:25:18 | BEG user=401373976431165449 earned=+44 jailed=False bal=12486
2026-03-20 08:30:56 | HEIST_FAIL user=401373976431165449 fine=-1000 jailed_until=2026-03-20T08:00:56.238832+00:00 bal=11486
2026-03-20 08:30:56 | HEIST_FAIL user=824516445382901800 fine=-199 jailed_until=2026-03-20T08:00:56.238832+00:00 bal=1129
2026-03-20 08:31:23 | JAIL_FREE user=824516445382901800 method=doubles
2026-03-20 08:31:46 | JAIL_FREE user=401373976431165449 method=doubles
2026-03-20 08:32:25 | BEG user=401373976431165449 earned=+64 jailed=False bal=11550
2026-03-20 08:32:31 | BEG user=338622999127261185 earned=+52 jailed=False bal=184
2026-03-20 08:34:19 | WORK user=344531774518591498 earned=+258 lucky=True bal=258
2026-03-20 08:35:58 | BEG user=401373976431165449 earned=+72 jailed=False bal=11622
2026-03-20 08:46:55 | BEG user=401373976431165449 earned=+42 jailed=False bal=11664
2026-03-20 09:04:17 | WORK user=272518654715887618 earned=+83 lucky=False bal=1013
2026-03-20 09:06:05 | BEG user=401373976431165449 earned=+72 jailed=False bal=11736
2026-03-20 09:06:07 | WORK user=401373976431165449 earned=+54 lucky=False bal=11790
2026-03-20 09:17:49 | BEG user=401373976431165449 earned=+64 jailed=False bal=11854
2026-03-20 09:17:50 | CRIME_WIN user=401373976431165449 earned=+456 bal=12310
2026-03-20 09:18:22 | ROB_WIN robber=401373976431165449 victim=272518654715887618 stolen=+214 jackpot=False robber_bal=12524 victim_bal=799
2026-03-20 09:18:25 | WORK user=344531774518591498 earned=+61 lucky=False bal=319
2026-03-20 09:18:27 | BEG user=344531774518591498 earned=+28 jailed=False bal=347
2026-03-20 09:21:07 | BUY user=178852380018868224 item=anticheat cost=-1000 bal=40658
2026-03-20 09:28:45 | BEG user=401373976431165449 earned=+56 jailed=False bal=12580
2026-03-20 09:31:49 | BEG user=824516445382901800 earned=+80 jailed=False bal=1209
2026-03-20 09:32:13 | WORK user=824516445382901800 earned=+116 lucky=False bal=1325
2026-03-20 09:32:17 | CRIME_WIN user=824516445382901800 earned=+412 bal=1737
2026-03-20 09:32:24 | ROB_BLOCKED robber=824516445382901800 victim=323906492073771019 fine=-200 robber_bal=1537 ac_uses_left=1
2026-03-20 09:49:18 | BEG user=401373976431165449 earned=+68 jailed=False bal=12648
2026-03-20 09:49:23 | WORK user=401373976431165449 earned=+123 lucky=True bal=12771
2026-03-20 10:00:53 | BEG user=344531774518591498 earned=+54 jailed=False bal=401
2026-03-20 10:01:11 | CRIME_WIN user=344531774518591498 earned=+492 bal=893
2026-03-20 10:01:31 | ROB_BLOCKED robber=344531774518591498 victim=323906492073771019 fine=-110 robber_bal=783 ac_uses_left=0
2026-03-20 10:01:44 | WORK user=344531774518591498 earned=+168 lucky=False bal=951
2026-03-20 10:05:58 | BEG user=344531774518591498 earned=+54 jailed=False bal=1005
2026-03-20 10:10:28 | BEG user=344531774518591498 earned=+42 jailed=False bal=1047
2026-03-20 10:12:31 | BUY user=323906492073771019 item=anticheat cost=-1000 bal=42624
2026-03-20 10:14:15 | BEG user=323906492073771019 earned=+36 jailed=False bal=42660
2026-03-20 10:14:23 | WORK user=323906492073771019 earned=+101 lucky=False bal=42761
2026-03-20 10:17:56 | BEG user=338622999127261185 earned=+78 jailed=False bal=262
2026-03-20 10:17:58 | WORK user=338622999127261185 earned=+83 lucky=False bal=345
2026-03-20 10:18:01 | CRIME_WIN user=338622999127261185 earned=+290 bal=635
2026-03-20 10:18:44 | ROB_FAIL robber=338622999127261185 victim=209554152584380420 fine=-136 robber_bal=499
2026-03-20 10:24:36 | BEG user=344531774518591498 earned=+58 jailed=False bal=1105
2026-03-20 10:27:33 | BEG user=401373976431165449 earned=+32 jailed=False bal=12803
2026-03-20 10:28:15 | BLACKJACK user=401373976431165449 payout=+0 net=-100 bal=12703
2026-03-20 10:28:27 | BEG user=344531774518591498 earned=+78 jailed=False bal=1183
2026-03-20 10:28:38 | BLACKJACK user=401373976431165449 payout=+200 net=+100 bal=12803
2026-03-20 10:28:56 | GIVE from_=401373976431165449 to=344531774518591498 amount=500 from_bal=12203 to_bal=1683
2026-03-20 10:29:04 | BLACKJACK user=401373976431165449 payout=+200 net=+100 bal=12403
2026-03-20 10:29:15 | BLACKJACK user=401373976431165449 payout=+250 net=+150 bal=12553
2026-03-20 10:29:36 | BLACKJACK user=401373976431165449 payout=+400 net=+200 bal=12753
2026-03-20 10:29:58 | BLACKJACK user=401373976431165449 payout=+100 net=+0 bal=12753
2026-03-20 10:30:11 | BLACKJACK user=401373976431165449 payout=+1250 net=+750 bal=13503
2026-03-20 10:30:28 | BLACKJACK user=401373976431165449 payout=+0 net=-100 bal=13403
2026-03-20 10:30:37 | WORK user=401373976431165449 earned=+371 lucky=True bal=13674
2026-03-20 10:31:05 | BLACKJACK user=401373976431165449 payout=+0 net=-200 bal=13574
2026-03-20 10:31:20 | BLACKJACK user=401373976431165449 payout=+0 net=-100 bal=13474
2026-03-20 10:31:35 | BLACKJACK user=401373976431165449 payout=+200 net=+100 bal=13574
2026-03-20 10:31:47 | BLACKJACK user=401373976431165449 payout=+200 net=+100 bal=13674
2026-03-20 10:32:03 | BLACKJACK user=401373976431165449 payout=+0 net=-100 bal=13574
2026-03-20 10:32:13 | BLACKJACK user=401373976431165449 payout=+250 net=+150 bal=13724
2026-03-20 10:38:41 | BEG user=401373976431165449 earned=+28 jailed=False bal=13752
2026-03-20 10:39:06 | BEG user=344531774518591498 earned=+28 jailed=False bal=1711
2026-03-20 10:39:57 | BLACKJACK user=401373976431165449 payout=+400 net=+200 bal=13952
2026-03-20 10:40:24 | BLACKJACK user=401373976431165449 payout=+200 net=+100 bal=14052
2026-03-20 10:40:41 | BLACKJACK user=401373976431165449 payout=+0 net=-100 bal=13952
2026-03-20 10:40:52 | BLACKJACK user=401373976431165449 payout=+0 net=-100 bal=13852
2026-03-20 10:41:06 | BLACKJACK user=401373976431165449 payout=+200 net=+100 bal=13952
2026-03-20 10:41:21 | BLACKJACK user=401373976431165449 payout=+0 net=-100 bal=13852
2026-03-20 10:41:36 | BLACKJACK user=401373976431165449 payout=+0 net=-100 bal=13752
2026-03-20 10:41:49 | BLACKJACK user=401373976431165449 payout=+200 net=+100 bal=13852
2026-03-20 10:41:50 | BEG user=401373976431165449 earned=+62 jailed=False bal=13914
2026-03-20 10:41:58 | SLOTS_MISS user=401373976431165449 bet=100 change=-100 bal=13814
2026-03-20 10:42:22 | SLOTS_MISS user=401373976431165449 bet=100 change=-100 bal=13714
2026-03-20 10:43:45 | BLACKJACK user=401373976431165449 payout=+400 net=+200 bal=13914
2026-03-20 10:44:21 | BEG user=344531774518591498 earned=+36 jailed=False bal=1747
2026-03-20 10:44:22 | WORK user=344531774518591498 earned=+84 lucky=False bal=1831
2026-03-20 10:44:34 | BLACKJACK user=344531774518591498 payout=+3662 net=+1831 bal=3662
2026-03-20 10:44:46 | BLACKJACK user=344531774518591498 payout=+0 net=-3662 bal=0
2026-03-20 10:45:43 | BEG user=401373976431165449 earned=+56 jailed=False bal=13970
2026-03-20 10:47:55 | BLACKJACK user=401373976431165449 payout=+200 net=+100 bal=14070
2026-03-20 10:48:06 | BLACKJACK user=401373976431165449 payout=+0 net=-100 bal=13970
2026-03-20 10:48:14 | BLACKJACK user=401373976431165449 payout=+250 net=+150 bal=14120
2026-03-20 10:48:25 | BLACKJACK user=401373976431165449 payout=+0 net=-100 bal=14020
2026-03-20 10:48:49 | BEG user=401373976431165449 earned=+22 jailed=False bal=14042
2026-03-20 10:56:47 | BEG user=272518654715887618 earned=+13 jailed=False bal=812
2026-03-20 10:56:49 | WORK user=272518654715887618 earned=+105 lucky=False bal=917
2026-03-20 10:56:59 | CRIME_WIN user=272518654715887618 earned=+237 bal=1154
2026-03-20 10:57:12 | BEG user=344531774518591498 earned=+36 jailed=False bal=36
2026-03-20 10:58:57 | WORK user=338622999127261185 earned=+117 lucky=True bal=616
2026-03-20 10:59:29 | BEG user=401373976431165449 earned=+58 jailed=False bal=14100
2026-03-20 11:02:04 | BLACKJACK user=401373976431165449 payout=+0 net=-1000 bal=13100
2026-03-20 11:02:27 | BLACKJACK user=401373976431165449 payout=+200 net=+100 bal=13200
2026-03-20 11:02:43 | BEG user=344531774518591498 earned=+36 jailed=False bal=72
2026-03-20 11:05:34 | BEG user=401373976431165449 earned=+52 jailed=False bal=13252
2026-03-20 11:12:14 | WORK user=401373976431165449 earned=+230 lucky=True bal=13482
2026-03-20 11:12:25 | BEG user=401373976431165449 earned=+62 jailed=False bal=13544
2026-03-20 11:16:03 | BEG user=401373976431165449 earned=+48 jailed=False bal=13592
2026-03-20 11:16:45 | BEG user=824516445382901800 earned=+72 jailed=False bal=1609
2026-03-20 11:16:49 | WORK user=824516445382901800 earned=+71 lucky=False bal=1680
2026-03-20 11:17:03 | ROULETTE_LOSE user=824516445382901800 bet=1680 colour=punane result=must mult=1 bal=0
2026-03-20 11:20:45 | GIVE from_=401373976431165449 to=824516445382901800 amount=1000 from_bal=12592 to_bal=1000
2026-03-20 11:20:50 | BEG user=344531774518591498 earned=+80 jailed=False bal=152
2026-03-20 11:21:33 | ROULETTE_LOSE user=824516445382901800 bet=1000 colour=punane result=must mult=1 bal=0
2026-03-20 11:22:53 | BLACKJACK user=344531774518591498 payout=+304 net=+152 bal=304
2026-03-20 11:23:06 | BLACKJACK user=344531774518591498 payout=+0 net=-304 bal=0
2026-03-20 11:23:18 | BEG user=401373976431165449 earned=+38 jailed=False bal=12630
2026-03-20 11:23:28 | CRIME_WIN user=401373976431165449 earned=+347 bal=12977
2026-03-20 11:23:42 | ROB_FAIL robber=401373976431165449 victim=218972931701735424 fine=-205 robber_bal=12772
2026-03-20 11:24:13 | BEG user=344531774518591498 earned=+70 jailed=False bal=70
2026-03-20 11:24:43 | WORK user=344531774518591498 earned=+118 lucky=False bal=188
2026-03-20 11:24:57 | BLACKJACK user=344531774518591498 payout=+0 net=-188 bal=0
2026-03-20 11:38:51 | BEG user=272518654715887618 earned=+40 jailed=False bal=1194
2026-03-20 11:38:58 | BEG user=344531774518591498 earned=+80 jailed=False bal=80
2026-03-20 11:42:01 | WORK user=338622999127261185 earned=+27 lucky=False bal=643
2026-03-20 11:42:38 | BEG user=272518654715887618 earned=+21 jailed=False bal=1215
2026-03-20 11:42:41 | BEG user=344531774518591498 earned=+24 jailed=False bal=104
2026-03-20 11:47:54 | BEG user=338622999127261185 earned=+44 jailed=False bal=687
2026-03-20 11:50:32 | BEG user=272518654715887618 earned=+23 jailed=False bal=1238
2026-03-20 11:54:20 | WORK user=401373976431165449 earned=+56 lucky=False bal=12828
2026-03-20 11:54:26 | BEG user=401373976431165449 earned=+40 jailed=False bal=12868
2026-03-20 12:01:29 | BEG user=401373976431165449 earned=+56 jailed=False bal=12924
2026-03-20 12:04:36 | BEG user=401373976431165449 earned=+50 jailed=False bal=12974
2026-03-20 12:07:25 | ROB_BLOCKED robber=344531774518591498 victim=401373976431165449 fine=-169 robber_bal=0 ac_uses_left=1
2026-03-20 12:07:28 | BEG user=344531774518591498 earned=+34 jailed=False bal=34
2026-03-20 12:07:31 | CRIME_WIN user=344531774518591498 earned=+399 bal=433
2026-03-20 12:07:33 | WORK user=344531774518591498 earned=+90 lucky=True bal=523
2026-03-20 12:08:33 | BEG user=401373976431165449 earned=+34 jailed=False bal=13008
2026-03-20 12:11:44 | BEG user=401373976431165449 earned=+28 jailed=False bal=13036
2026-03-20 12:16:46 | BEG user=401373976431165449 earned=+66 jailed=False bal=13102
2026-03-20 12:17:10 | WORK user=824516445382901800 earned=+84 lucky=False bal=84
2026-03-20 12:17:11 | BEG user=824516445382901800 earned=+32 jailed=False bal=116
2026-03-20 12:17:13 | CRIME_WIN user=824516445382901800 earned=+501 bal=617
2026-03-20 12:17:22 | ROB_BLOCKED robber=824516445382901800 victim=344531774518591498 fine=-170 robber_bal=447 ac_uses_left=1
2026-03-20 12:17:37 | BEG user=344531774518591498 earned=+26 jailed=False bal=549
2026-03-20 12:19:11 | WORK user=178852380018868224 earned=+41 lucky=False bal=40699
2026-03-20 12:19:15 | BEG user=178852380018868224 earned=+32 jailed=False bal=40731
2026-03-20 12:19:18 | CRIME_WIN user=178852380018868224 earned=+460 bal=41191
2026-03-20 12:19:37 | ROULETTE_LOSE user=824516445382901800 bet=447 colour=punane result=must mult=1 bal=0
2026-03-20 12:23:18 | SLOTS_PAIR user=178852380018868224 bet=10000 change=5000 bal=46191
2026-03-20 12:23:28 | SLOTS_MISS user=178852380018868224 bet=10000 change=-10000 bal=36191
2026-03-20 12:26:00 | BEG user=344531774518591498 earned=+40 jailed=False bal=589
2026-03-20 12:34:38 | BEG user=401373976431165449 earned=+74 jailed=False bal=13176
2026-03-20 12:34:41 | WORK user=401373976431165449 earned=+105 lucky=False bal=13281
2026-03-20 12:35:44 | HEIST_HOUSE change=-479646 house_bal=529905
2026-03-20 12:35:44 | HEIST_WIN user=824516445382901800 change=+59955 bal=59955
2026-03-20 12:35:44 | HEIST_WIN user=401373976431165449 change=+59955 bal=73236
2026-03-20 12:35:44 | HEIST_WIN user=178852380018868224 change=+59955 bal=96146
2026-03-20 12:35:44 | HEIST_WIN user=338622999127261185 change=+59955 bal=60642
2026-03-20 12:35:44 | HEIST_WIN user=340451525799182357 change=+59955 bal=59955
2026-03-20 12:35:44 | HEIST_WIN user=218972931701735424 change=+59955 bal=62771
2026-03-20 12:35:44 | HEIST_WIN user=344531774518591498 change=+59955 bal=60544
2026-03-20 12:35:44 | HEIST_WIN user=272518654715887618 change=+59955 bal=61193
2026-03-20 12:36:08 | ROULETTE_WIN user=178852380018868224 bet=96146 colour=punane result=punane mult=1 bal=192292
2026-03-20 12:36:25 | ROULETTE_WIN user=178852380018868224 bet=192292 colour=punane result=punane mult=1 bal=384584
2026-03-20 12:36:26 | ROULETTE_WIN user=824516445382901800 bet=59955 colour=punane result=punane mult=1 bal=119910
2026-03-20 12:36:33 | BUY user=344531774518591498 item=karikas cost=-6000 bal=54544
2026-03-20 12:36:37 | BUY user=344531774518591498 item=monitor_360 cost=-7500 bal=47044
2026-03-20 12:36:50 | BLACKJACK user=344531774518591498 payout=+0 net=-47044 bal=0
2026-03-20 12:37:18 | ROULETTE_WIN user=178852380018868224 bet=384584 colour=punane result=punane mult=1 bal=769168
2026-03-20 12:37:48 | ROULETTE_WIN user=178852380018868224 bet=769168 colour=punane result=punane mult=1 bal=1538336
2026-03-20 12:37:52 | ROULETTE_LOSE user=824516445382901800 bet=119910 colour=punane result=must mult=1 bal=0
2026-03-20 12:39:40 | BUY user=272518654715887618 item=gaming_laptop cost=-1500 bal=59693
2026-03-20 12:39:51 | ROB_BLOCKED robber=824516445382901800 victim=178852380018868224 fine=-167 robber_bal=0 ac_uses_left=1
2026-03-20 12:39:51 | BUY user=272518654715887618 item=cat6 cost=-3500 bal=56193
2026-03-20 12:39:55 | ROB_BLOCKED robber=824516445382901800 victim=178852380018868224 fine=-100 robber_bal=0 ac_uses_left=0
2026-03-20 12:40:01 | ROB_WIN robber=401373976431165449 victim=178852380018868224 stolen=+162541 jackpot=False robber_bal=235777 victim_bal=1375795
2026-03-20 12:40:02 | ROB_WIN robber=824516445382901800 victim=178852380018868224 stolen=+340819 jackpot=False robber_bal=340819 victim_bal=1034976
2026-03-20 12:40:03 | BUY user=178852380018868224 item=anticheat cost=-1000 bal=1033976
2026-03-20 12:40:07 | ROB_BLOCKED robber=824516445382901800 victim=178852380018868224 fine=-109 robber_bal=340710 ac_uses_left=1
2026-03-20 12:40:09 | ROB_BLOCKED robber=824516445382901800 victim=178852380018868224 fine=-128 robber_bal=340582 ac_uses_left=0
2026-03-20 12:40:11 | ROB_FAIL robber=824516445382901800 victim=178852380018868224 fine=-188 robber_bal=340394
2026-03-20 12:40:12 | ROB_FAIL robber=824516445382901800 victim=178852380018868224 fine=-232 robber_bal=340162
2026-03-20 12:40:12 | BUY user=178852380018868224 item=anticheat cost=-1000 bal=1032976
2026-03-20 12:40:15 | ROB_BLOCKED robber=824516445382901800 victim=178852380018868224 fine=-103 robber_bal=340059 ac_uses_left=1
2026-03-20 12:40:17 | BUY user=272518654715887618 item=lan_pass cost=-1200 bal=54993
2026-03-20 12:40:18 | ROB_BLOCKED robber=824516445382901800 victim=178852380018868224 fine=-199 robber_bal=339860 ac_uses_left=0
2026-03-20 12:40:19 | BUY user=178852380018868224 item=anticheat cost=-1000 bal=1031976
2026-03-20 12:40:20 | ROB_BLOCKED robber=824516445382901800 victim=178852380018868224 fine=-100 robber_bal=339760 ac_uses_left=1
2026-03-20 12:40:23 | ROULETTE_LOSE user=178852380018868224 bet=1031976 colour=punane result=must mult=1 bal=0
2026-03-20 12:40:27 | BUY user=272518654715887618 item=anticheat cost=-1000 bal=53993
2026-03-20 12:40:34 | BUY user=272518654715887618 item=reguleeritav_laud cost=-3500 bal=50493
2026-03-20 12:40:42 | BUY user=272518654715887618 item=jellyfin cost=-4000 bal=46493
2026-03-20 12:40:55 | BUY user=272518654715887618 item=monitor cost=-2500 bal=43993
2026-03-20 12:41:00 | ROB_BLOCKED robber=824516445382901800 victim=401373976431165449 fine=-139 robber_bal=339621 ac_uses_left=0
2026-03-20 12:41:02 | ROB_FAIL robber=824516445382901800 victim=401373976431165449 fine=-131 robber_bal=339490
2026-03-20 12:41:02 | WORK user=272518654715887618 earned=+97 lucky=False bal=44090
2026-03-20 12:41:04 | ROB_WIN robber=824516445382901800 victim=401373976431165449 stolen=+51444 jackpot=False robber_bal=390934 victim_bal=184333
2026-03-20 12:41:05 | ROB_BLOCKED robber=178852380018868224 victim=824516445382901800 fine=-179 robber_bal=0 ac_uses_left=0
2026-03-20 12:41:05 | ROB_WIN robber=824516445382901800 victim=401373976431165449 stolen=+41097 jackpot=False robber_bal=432031 victim_bal=143236
2026-03-20 12:41:05 | ROB_WIN robber=401373976431165449 victim=824516445382901800 stolen=+67489 jackpot=False robber_bal=210725 victim_bal=364542
2026-03-20 12:41:07 | ROB_WIN robber=178852380018868224 victim=824516445382901800 stolen=+76500 jackpot=False robber_bal=76500 victim_bal=288042
2026-03-20 12:41:08 | ROB_FAIL robber=178852380018868224 victim=824516445382901800 fine=-136 robber_bal=76364
2026-03-20 12:41:08 | ROB_WIN robber=824516445382901800 victim=401373976431165449 stolen=+50641 jackpot=False robber_bal=338683 victim_bal=160084
2026-03-20 12:41:10 | BUY user=401373976431165449 item=anticheat cost=-1000 bal=159084
2026-03-20 12:41:11 | ROB_WIN robber=178852380018868224 victim=824516445382901800 stolen=+41788 jackpot=False robber_bal=118152 victim_bal=296895
2026-03-20 12:41:11 | ROB_BLOCKED robber=824516445382901800 victim=401373976431165449 fine=-103 robber_bal=296792 ac_uses_left=1
2026-03-20 12:41:13 | ROULETTE_WIN user=178852380018868224 bet=118152 colour=punane result=punane mult=1 bal=236304
2026-03-20 12:41:13 | ROB_BLOCKED robber=824516445382901800 victim=401373976431165449 fine=-125 robber_bal=296667 ac_uses_left=0
2026-03-20 12:41:24 | BUY user=401373976431165449 item=anticheat cost=-1000 bal=158084
2026-03-20 12:41:24 | BEG user=272518654715887618 earned=+38 jailed=False bal=44128
2026-03-20 12:41:35 | BEG user=401373976431165449 earned=+74 jailed=False bal=158158
2026-03-20 12:41:54 | ROULETTE_WIN user=178852380018868224 bet=236304 colour=punane result=punane mult=1 bal=472608
2026-03-20 12:41:59 | BLACKJACK user=272518654715887618 payout=+40000 net=+20000 bal=64128
2026-03-20 12:42:01 | SLOTS_PAIR user=824516445382901800 bet=296667 change=148333 bal=445000
2026-03-20 12:42:43 | ROULETTE_LOSE user=178852380018868224 bet=472608 colour=punane result=must mult=1 bal=0
2026-03-20 12:43:11 | SLOTS_PAIR user=338622999127261185 bet=60642 change=30321 bal=90963
2026-03-20 12:43:21 | BUY user=824516445382901800 item=anticheat cost=-1000 bal=444000
2026-03-20 12:43:28 | ROULETTE_WIN user=338622999127261185 bet=90963 colour=must result=must mult=1 bal=181926
2026-03-20 12:43:43 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=449000
2026-03-20 12:43:49 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=439000
2026-03-20 12:43:53 | WORK user=338622999127261185 earned=+61 lucky=False bal=181987
2026-03-20 12:43:54 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=444000
2026-03-20 12:43:55 | CRIME_FAIL user=338622999127261185 fine=-111 jailed=True bal=181876
2026-03-20 12:43:59 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=434000
2026-03-20 12:44:05 | SLOTS_TRIPLE user=824516445382901800 bet=10000 change=30000 bal=464000
2026-03-20 12:44:10 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=469000
2026-03-20 12:44:17 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=459000
2026-03-20 12:44:17 | BAIL_PAID user=338622999127261185 fine=-46087 pct=25% bal=135789
2026-03-20 12:44:22 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=449000
2026-03-20 12:44:25 | SLOTS_MISS user=338622999127261185 bet=135789 change=-135789 bal=0
2026-03-20 12:44:27 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=454000
2026-03-20 12:44:33 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=444000
2026-03-20 12:44:49 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=434000
2026-03-20 12:44:55 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=424000
2026-03-20 12:44:56 | BEG user=401373976431165449 earned=+20 jailed=False bal=158178
2026-03-20 12:45:02 | SLOTS_TRIPLE user=824516445382901800 bet=10000 change=30000 bal=454000
2026-03-20 12:45:08 | SLOTS_TRIPLE user=824516445382901800 bet=10000 change=60000 bal=514000
2026-03-20 12:45:13 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=519000
2026-03-20 12:45:20 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=509000
2026-03-20 12:45:25 | SLOTS_TRIPLE user=824516445382901800 bet=10000 change=30000 bal=539000
2026-03-20 12:45:30 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=544000
2026-03-20 12:45:35 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=534000
2026-03-20 12:45:42 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=524000
2026-03-20 12:45:47 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=514000
2026-03-20 12:45:57 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=504000
2026-03-20 12:46:02 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=494000
2026-03-20 12:46:07 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=499000
2026-03-20 12:46:12 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=504000
2026-03-20 12:46:18 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=509000
2026-03-20 12:46:22 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=499000
2026-03-20 12:46:28 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=489000
2026-03-20 12:46:33 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=494000
2026-03-20 12:46:40 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=484000
2026-03-20 12:46:45 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=489000
2026-03-20 12:46:50 | SLOTS_TRIPLE user=824516445382901800 bet=10000 change=30000 bal=519000
2026-03-20 12:46:56 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=509000
2026-03-20 12:47:02 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=514000
2026-03-20 12:47:07 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=519000
2026-03-20 12:47:13 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=509000
2026-03-20 12:47:21 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=514000
2026-03-20 12:47:27 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=504000
2026-03-20 12:47:33 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=494000
2026-03-20 12:47:38 | SLOTS_TRIPLE user=824516445382901800 bet=10000 change=90000 bal=584000
2026-03-20 12:47:43 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=589000
2026-03-20 12:47:48 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=594000
2026-03-20 12:47:55 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=584000
2026-03-20 12:48:00 | SLOTS_TRIPLE user=824516445382901800 bet=10000 change=40000 bal=624000
2026-03-20 12:48:06 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=614000
2026-03-20 12:48:12 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=619000
2026-03-20 12:48:18 | SLOTS_TRIPLE user=824516445382901800 bet=10000 change=40000 bal=659000
2026-03-20 12:48:20 | BEG user=401373976431165449 earned=+68 jailed=False bal=158246
2026-03-20 12:48:25 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=664000
2026-03-20 12:48:30 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=669000
2026-03-20 12:48:36 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=674000
2026-03-20 12:48:42 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=679000
2026-03-20 12:48:48 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=669000
2026-03-20 12:49:37 | ADMIN_JAIL admin=272518654715887618 target=401373976431165449 minutes=100 reason=Omavoliliselt
2026-03-20 12:51:31 | ADMIN_UNJAIL admin=272518654715887618 target=401373976431165449
2026-03-20 13:01:40 | BEG user=272518654715887618 earned=+10 jailed=False bal=64138
2026-03-20 13:02:01 | BLACKJACK user=272518654715887618 payout=+40000 net=+20000 bal=84138
2026-03-20 13:03:15 | BEG user=344531774518591498 earned=+78 jailed=False bal=78
2026-03-20 13:03:16 | WORK user=344531774518591498 earned=+120 lucky=False bal=198
2026-03-20 13:14:55 | BEG user=401373976431165449 earned=+70 jailed=False bal=158316
2026-03-20 13:14:58 | WORK user=401373976431165449 earned=+56 lucky=False bal=158372
2026-03-20 13:24:03 | BEG user=272518654715887618 earned=+40 jailed=False bal=84178
2026-03-20 13:24:12 | WORK user=272518654715887618 earned=+121 lucky=False bal=84299
2026-03-20 13:24:24 | BUY user=272518654715887618 item=energiajook cost=-800 bal=83499
2026-03-20 13:24:46 | BUY user=272518654715887618 item=mikrofon cost=-2800 bal=80699
2026-03-20 13:24:56 | BUY user=272518654715887618 item=klaviatuur cost=-1800 bal=78899
2026-03-20 13:25:12 | CRIME_FAIL user=272518654715887618 fine=-101 jailed=True bal=78798
2026-03-20 13:30:43 | BEG user=338622999127261185 earned=+70 jailed=False bal=70
2026-03-20 13:30:45 | WORK user=338622999127261185 earned=+109 lucky=False bal=179
2026-03-20 13:42:46 | CRIME_WIN user=401373976431165449 earned=+453 bal=158825
2026-03-20 13:44:12 | WORK user=344531774518591498 earned=+33 lucky=False bal=231
2026-03-20 13:44:14 | BEG user=344531774518591498 earned=+26 jailed=False bal=257
2026-03-20 14:45:12 | ROB_WIN robber=401373976431165449 victim=218972931701735424 stolen=+14535 jackpot=False robber_bal=173360 victim_bal=48236
2026-03-20 14:45:19 | WORK user=344531774518591498 earned=+88 lucky=False bal=345
2026-03-20 14:46:36 | ROB_BLOCKED robber=178852380018868224 victim=824516445382901800 fine=-142 robber_bal=0 ac_uses_left=1
2026-03-20 14:52:26 | WORK user=272518654715887618 earned=+88 lucky=False bal=78886
2026-03-20 14:52:30 | BEG user=272518654715887618 earned=+52 jailed=False bal=78938
2026-03-20 14:57:12 | BEG user=272518654715887618 earned=+80 jailed=False bal=79018
2026-03-20 15:17:52 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=679000
2026-03-20 15:17:58 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=659000
2026-03-20 15:18:05 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=639000
2026-03-20 15:18:10 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=649000
2026-03-20 15:18:15 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=659000
2026-03-20 15:18:21 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=639000
2026-03-20 15:18:27 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=649000
2026-03-20 15:18:33 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=659000
2026-03-20 15:18:38 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=669000
2026-03-20 15:18:45 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=649000
2026-03-20 15:18:50 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=659000
2026-03-20 15:18:55 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=669000
2026-03-20 15:19:03 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=649000
2026-03-20 15:19:08 | SLOTS_TRIPLE user=824516445382901800 bet=20000 change=60000 bal=709000
2026-03-20 15:19:13 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=689000
2026-03-20 15:19:18 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=669000
2026-03-20 15:19:23 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=679000
2026-03-20 15:19:30 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=689000
2026-03-20 15:19:47 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=669000
2026-03-20 15:19:53 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=649000
2026-03-20 15:19:58 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=629000
2026-03-20 15:20:03 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=639000
2026-03-20 15:20:08 | SLOTS_TRIPLE user=824516445382901800 bet=20000 change=80000 bal=719000
2026-03-20 15:20:13 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=699000
2026-03-20 15:20:20 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=679000
2026-03-20 15:20:25 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=659000
2026-03-20 15:20:30 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=669000
2026-03-20 15:20:35 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=649000
2026-03-20 15:20:40 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=659000
2026-03-20 15:20:47 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=669000
2026-03-20 15:20:53 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=679000
2026-03-20 15:20:58 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=689000
2026-03-20 15:21:03 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=669000
2026-03-20 15:21:10 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=649000
2026-03-20 15:21:16 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=659000
2026-03-20 15:21:23 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=669000
2026-03-20 15:21:32 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=679000
2026-03-20 15:21:37 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=689000
2026-03-20 15:21:43 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=669000
2026-03-20 15:21:48 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=649000
2026-03-20 15:21:53 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=659000
2026-03-20 15:22:00 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=669000
2026-03-20 15:22:05 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=649000
2026-03-20 15:22:10 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=629000
2026-03-20 15:22:15 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=609000
2026-03-20 15:22:20 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=589000
2026-03-20 15:22:25 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=569000
2026-03-20 15:22:31 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=549000
2026-03-20 15:22:36 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=559000
2026-03-20 15:22:41 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=539000
2026-03-20 15:23:15 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=529000
2026-03-20 15:23:20 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=519000
2026-03-20 15:23:26 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=524000
2026-03-20 15:23:31 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=514000
2026-03-20 15:23:36 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=519000
2026-03-20 15:23:41 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=509000
2026-03-20 15:23:48 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=514000
2026-03-20 15:23:53 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=519000
2026-03-20 15:23:58 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=524000
2026-03-20 15:24:03 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=514000
2026-03-20 15:24:10 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=504000
2026-03-20 15:24:18 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=494000
2026-03-20 15:24:23 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=484000
2026-03-20 15:24:30 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=489000
2026-03-20 15:24:35 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=479000
2026-03-20 15:24:40 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=469000
2026-03-20 15:24:46 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=459000
2026-03-20 15:24:51 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=464000
2026-03-20 15:24:56 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=454000
2026-03-20 15:25:03 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=444000
2026-03-20 15:25:09 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=434000
2026-03-20 15:25:16 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=424000
2026-03-20 15:25:21 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=414000
2026-03-20 15:25:28 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=419000
2026-03-20 15:25:35 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=409000
2026-03-20 15:25:40 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=414000
2026-03-20 15:25:46 | SLOTS_JACKPOT user=824516445382901800 bet=10000 change=240000 bal=654000
2026-03-20 15:25:53 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=659000
2026-03-20 15:25:58 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=664000
2026-03-20 15:26:03 | SLOTS_TRIPLE user=824516445382901800 bet=10000 change=140000 bal=804000
2026-03-20 15:28:09 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=809000
2026-03-20 15:28:14 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=799000
2026-03-20 15:28:19 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=804000
2026-03-20 15:28:25 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=794000
2026-03-20 15:28:32 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=799000
2026-03-20 15:29:08 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=804000
2026-03-20 15:29:14 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=794000
2026-03-20 15:29:21 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=799000
2026-03-20 15:29:26 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=789000
2026-03-20 15:29:31 | SLOTS_TRIPLE user=824516445382901800 bet=10000 change=40000 bal=829000
2026-03-20 15:29:36 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=819000
2026-03-20 15:29:41 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=824000
2026-03-20 15:29:47 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=829000
2026-03-20 15:29:56 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=834000
2026-03-20 15:30:02 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=839000
2026-03-20 15:30:07 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=844000
2026-03-20 15:30:15 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=834000
2026-03-20 15:30:32 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=839000
2026-03-20 15:30:38 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=829000
2026-03-20 15:30:43 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=834000
2026-03-20 15:31:35 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=839000
2026-03-20 15:31:40 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=844000
2026-03-20 15:31:46 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=849000
2026-03-20 15:31:53 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=839000
2026-03-20 15:31:58 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=844000
2026-03-20 15:32:03 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=834000
2026-03-20 15:32:09 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=824000
2026-03-20 15:32:14 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=814000
2026-03-20 15:32:20 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=804000
2026-03-20 15:32:26 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=794000
2026-03-20 15:32:31 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=799000
2026-03-20 15:32:36 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=804000
2026-03-20 15:32:41 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=794000
2026-03-20 15:32:48 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=784000
2026-03-20 15:32:53 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=774000
2026-03-20 15:33:09 | BUY user=824516445382901800 item=karikas cost=-6000 bal=768000
2026-03-20 15:33:13 | BUY user=824516445382901800 item=monitor_360 cost=-7500 bal=760500
2026-03-20 15:33:16 | BUY user=824516445382901800 item=gaming_tool cost=-9000 bal=751500
2026-03-20 15:35:01 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=761500
2026-03-20 15:35:08 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=771500
2026-03-20 15:35:14 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=781500
2026-03-20 15:35:20 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=761500
2026-03-20 15:35:25 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=771500
2026-03-20 15:35:30 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=751500
2026-03-20 15:35:35 | SLOTS_PAIR user=824516445382901800 bet=20000 change=10000 bal=761500
2026-03-20 15:35:42 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=741500
2026-03-20 15:35:47 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=721500
2026-03-20 15:35:52 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=701500
2026-03-20 15:35:57 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=681500
2026-03-20 15:36:02 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=661500
2026-03-20 15:36:07 | SLOTS_MISS user=824516445382901800 bet=20000 change=-20000 bal=641500
2026-03-20 15:36:12 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=646500
2026-03-20 15:36:17 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=651500
2026-03-20 15:36:22 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=641500
2026-03-20 15:36:28 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=631500
2026-03-20 15:36:33 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=621500
2026-03-20 15:36:40 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=626500
2026-03-20 15:36:45 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=616500
2026-03-20 15:36:53 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=621500
2026-03-20 15:36:58 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=611500
2026-03-20 15:37:03 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=601500
2026-03-20 15:37:09 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=606500
2026-03-20 15:37:14 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=611500
2026-03-20 15:37:20 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=601500
2026-03-20 15:37:27 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=606500
2026-03-20 15:37:32 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=611500
2026-03-20 15:37:40 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=601500
2026-03-20 15:37:47 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=591500
2026-03-20 15:37:52 | SLOTS_TRIPLE user=824516445382901800 bet=10000 change=60000 bal=651500
2026-03-20 15:37:57 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=641500
2026-03-20 15:38:06 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=631500
2026-03-20 15:38:12 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=636500
2026-03-20 15:38:18 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=626500
2026-03-20 15:38:24 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=616500
2026-03-20 15:38:29 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=621500
2026-03-20 15:38:35 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=611500
2026-03-20 15:38:40 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=616500
2026-03-20 15:42:05 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=606500
2026-03-20 15:42:12 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=596500
2026-03-20 15:42:18 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=586500
2026-03-20 15:42:24 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=576500
2026-03-20 15:42:29 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=566500
2026-03-20 15:42:36 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=556500
2026-03-20 15:42:41 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=546500
2026-03-20 15:42:46 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=551500
2026-03-20 15:42:51 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=556500
2026-03-20 15:42:57 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=561500
2026-03-20 15:46:36 | CRIME_WIN user=401373976431165449 earned=+304 bal=173664
2026-03-20 15:46:48 | WORK user=401373976431165449 earned=+410 lucky=True bal=174074
2026-03-20 15:46:50 | BEG user=401373976431165449 earned=+52 jailed=False bal=174126
2026-03-20 15:48:44 | WORK user=272518654715887618 earned=+93 lucky=False bal=79111
2026-03-20 15:49:06 | BLACKJACK user=272518654715887618 payout=+80000 net=+40000 bal=119111
2026-03-20 16:24:32 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=551500
2026-03-20 16:24:38 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=541500
2026-03-20 16:24:42 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=546500
2026-03-20 16:24:47 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=536500
2026-03-20 16:24:55 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=541500
2026-03-20 16:25:02 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=546500
2026-03-20 16:25:08 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=551500
2026-03-20 16:25:13 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=541500
2026-03-20 16:25:20 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=531500
2026-03-20 16:25:28 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=521500
2026-03-20 16:25:35 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=526500
2026-03-20 16:25:41 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=531500
2026-03-20 16:25:47 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=536500
2026-03-20 16:25:53 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=541500
2026-03-20 16:26:00 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=546500
2026-03-20 16:26:05 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=536500
2026-03-20 16:26:10 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=541500
2026-03-20 16:28:22 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=546500
2026-03-20 16:28:28 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=536500
2026-03-20 16:28:35 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=541500
2026-03-20 16:28:40 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=531500
2026-03-20 16:28:45 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=536500
2026-03-20 16:28:50 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=541500
2026-03-20 16:28:57 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=531500
2026-03-20 16:29:05 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=521500
2026-03-20 16:29:10 | SLOTS_MISS user=824516445382901800 bet=10000 change=-10000 bal=511500
2026-03-20 16:29:15 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=516500
2026-03-20 16:29:21 | SLOTS_PAIR user=824516445382901800 bet=10000 change=5000 bal=521500
2026-03-20 16:30:49 | WORK user=824516445382901800 earned=+140 lucky=False bal=521640
2026-03-20 16:30:50 | BEG user=824516445382901800 earned=+60 jailed=False bal=521700
2026-03-20 16:30:53 | CRIME_WIN user=824516445382901800 earned=+260 bal=521960
2026-03-20 16:31:06 | ROB_BLOCKED robber=824516445382901800 victim=272518654715887618 fine=-174 robber_bal=521786 ac_uses_left=1
2026-03-20 16:34:38 | BEG user=367347301322326016 earned=+15 jailed=False bal=217
2026-03-20 16:34:40 | WORK user=367347301322326016 earned=+43 lucky=False bal=260
2026-03-20 16:34:43 | CRIME_WIN user=367347301322326016 earned=+392 bal=652
2026-03-20 16:46:10 | BEG user=401373976431165449 earned=+62 jailed=False bal=174188
2026-03-20 16:46:12 | WORK user=401373976431165449 earned=+95 lucky=False bal=174283
2026-03-20 16:46:25 | ROB_BLOCKED robber=401373976431165449 victim=824516445382901800 fine=-197 robber_bal=174086 ac_uses_left=0
2026-03-20 16:46:35 | BUY user=824516445382901800 item=anticheat cost=-1000 bal=520786
2026-03-20 16:47:16 | GIVE from_=824516445382901800 to=450392724169031680 amount=520786 from_bal=0 to_bal=520786
2026-03-20 16:48:04 | HEIST_FAIL user=401373976431165449 fine=-1000 jailed_until=2026-03-20T16:18:04.449345+00:00 bal=173086
2026-03-20 16:48:04 | HEIST_FAIL user=824516445382901800 fine=-150 jailed_until=2026-03-20T16:18:04.449345+00:00 bal=0
2026-03-20 16:49:17 | BEG user=401373976431165449 earned=+26 jailed=True bal=173112
2026-03-20 16:49:59 | GIVE from_=450392724169031680 to=824516445382901800 amount=520786 from_bal=0 to_bal=520786
2026-03-20 16:52:08 | GIVE from_=824516445382901800 to=450392724169031680 amount=519786 from_bal=1000 to_bal=519786
2026-03-20 16:52:19 | BAIL_PAID user=824516445382901800 fine=-350 pct=24% bal=650
2026-03-20 16:54:04 | GIVE from_=450392724169031680 to=824516445382901800 amount=519786 from_bal=0 to_bal=520436
2026-03-20 16:56:31 | ROB_BLOCKED robber=178852380018868224 victim=824516445382901800 fine=-188 robber_bal=0 ac_uses_left=1
2026-03-20 16:57:43 | GIVE from_=824516445382901800 to=401373976431165449 amount=20000 from_bal=500436 to_bal=193112
2026-03-20 16:57:47 | GIVE from_=824516445382901800 to=272518654715887618 amount=20000 from_bal=480436 to_bal=139111
2026-03-20 16:57:54 | GIVE from_=824516445382901800 to=340451525799182357 amount=20000 from_bal=460436 to_bal=79955
2026-03-20 16:58:02 | GIVE from_=824516445382901800 to=218972931701735424 amount=20000 from_bal=440436 to_bal=68236
2026-03-20 16:58:18 | GIVE from_=824516445382901800 to=323906492073771019 amount=20000 from_bal=420436 to_bal=62761
2026-03-20 16:58:22 | GIVE from_=824516445382901800 to=367347301322326016 amount=20000 from_bal=400436 to_bal=20652
2026-03-20 16:58:31 | GIVE from_=824516445382901800 to=344531774518591498 amount=20000 from_bal=380436 to_bal=20345
2026-03-20 16:58:35 | GIVE from_=824516445382901800 to=209554152584380420 amount=20000 from_bal=360436 to_bal=20309
2026-03-20 16:58:42 | GIVE from_=824516445382901800 to=338622999127261185 amount=20000 from_bal=340436 to_bal=20179
2026-03-20 16:58:46 | ROULETTE_LOSE user=344531774518591498 bet=20345 colour=punane result=must mult=1 bal=0
2026-03-20 16:59:01 | GIVE from_=824516445382901800 to=344531774518591498 amount=20000 from_bal=320436 to_bal=20000
2026-03-20 16:59:05 | GIVE from_=824516445382901800 to=240454469668569088 amount=20000 from_bal=300436 to_bal=20044
2026-03-20 16:59:09 | GIVE from_=824516445382901800 to=311132892795371520 amount=20000 from_bal=280436 to_bal=20000
2026-03-20 16:59:12 | GIVE from_=824516445382901800 to=178852380018868224 amount=20000 from_bal=260436 to_bal=20000
2026-03-20 16:59:24 | GIVE from_=824516445382901800 to=296322817941569537 amount=20000 from_bal=240436 to_bal=20000
2026-03-20 16:59:29 | GIVE from_=824516445382901800 to=485760228508565504 amount=20000 from_bal=220436 to_bal=20000
2026-03-20 16:59:34 | GIVE from_=824516445382901800 to=450392724169031680 amount=20000 from_bal=200436 to_bal=20000
2026-03-20 17:00:10 | ROULETTE_LOSE user=344531774518591498 bet=10000 colour=punane result=must mult=1 bal=10000
2026-03-20 17:00:34 | ROULETTE_WIN user=344531774518591498 bet=10000 colour=punane result=punane mult=1 bal=20000
2026-03-20 17:00:58 | ROULETTE_LOSE user=344531774518591498 bet=10000 colour=punane result=must mult=1 bal=10000
2026-03-20 17:01:14 | ROULETTE_LOSE user=344531774518591498 bet=10000 colour=punane result=must mult=1 bal=0
2026-03-20 17:06:54 | BEG user=272518654715887618 earned=+20 jailed=False bal=139131
2026-03-20 17:06:56 | WORK user=272518654715887618 earned=+393 lucky=True bal=139524
2026-03-20 17:07:23 | BLACKJACK user=272518654715887618 payout=+0 net=-50000 bal=89524
2026-03-20 17:10:34 | BEG user=272518654715887618 earned=+30 jailed=False bal=89554
2026-03-20 17:10:40 | CRIME_FAIL user=272518654715887618 fine=-90 jailed=True bal=89464
2026-03-20 17:10:53 | JAIL_FREE user=272518654715887618 method=doubles
2026-03-20 17:16:58 | BEG user=272518654715887618 earned=+78 jailed=False bal=89542
2026-03-20 17:17:49 | ROULETTE_LOSE user=824516445382901800 bet=200436 colour=punane result=must mult=1 bal=0
2026-03-20 17:18:09 | BLACKJACK user=272518654715887618 payout=+179084 net=+89542 bal=179084
2026-03-20 17:18:37 | BLACKJACK user=272518654715887618 payout=+0 net=-179084 bal=0
2026-03-20 17:21:54 | BEG user=344531774518591498 earned=+14 jailed=False bal=14
2026-03-20 17:21:57 | WORK user=344531774518591498 earned=+56 lucky=False bal=70
2026-03-20 17:21:59 | BEG user=272518654715887618 earned=+39 jailed=False bal=39
2026-03-20 17:22:02 | DAILY user=344531774518591498 earned=+150 streak=1 bal=220

View File

@@ -93,6 +93,7 @@ CRIME_WIN: list[str] = [
"phishisid kellegi Steami konto", "phishisid kellegi Steami konto",
"varastasid prize pooli raha", "varastasid prize pooli raha",
"ühendasid enda krüptokaevandaja serverisse", "ühendasid enda krüptokaevandaja serverisse",
"tegid petukõnesid"
] ]
CRIME_LOSE: list[str] = [ CRIME_LOSE: list[str] = [
@@ -108,6 +109,7 @@ CRIME_LOSE: list[str] = [
"sinu krüptokaevandaja süttis põlema", "sinu krüptokaevandaja süttis põlema",
"flashisid tervet oma tiimi", "flashisid tervet oma tiimi",
"avastasid, et Windows otsustas keset mängu uuendama hakata", "avastasid, et Windows otsustas keset mängu uuendama hakata",
"jäid politseile petukõnedega vahele"
] ]
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -126,6 +128,7 @@ CMD: dict[str, str] = {
"shutdown": "Lülita bot välja (ilma taaskäivituseta)", "shutdown": "Lülita bot välja (ilma taaskäivituseta)",
"pause": "Peata / jätka kõik käsklused (hooldusrežiim)", "pause": "Peata / jätka kõik käsklused (hooldusrežiim)",
"send": "Saada sõnum valitud kanalisse", "send": "Saada sõnum valitud kanalisse",
"profile": "Vaata oma profiili: saldo, tase, esemed, statistika ja kalakogu",
"balance": "Vaata enda (või kellegi teise) TipiCOINide saldot", "balance": "Vaata enda (või kellegi teise) TipiCOINide saldot",
"daily": "Võta enda päevane TipiCOINi boonus", "daily": "Võta enda päevane TipiCOINi boonus",
"work": "Tööta ja teeni TipiCOINe (1h ooteaeg)", "work": "Tööta ja teeni TipiCOINe (1h ooteaeg)",
@@ -155,11 +158,19 @@ CMD: dict[str, str] = {
"adminunban": "[Admin] Eemalda majandussüsteemi keeld kasutajalt", "adminunban": "[Admin] Eemalda majandussüsteemi keeld kasutajalt",
"adminreset": "[Admin] Lähtesta kasutaja majandusandmed", "adminreset": "[Admin] Lähtesta kasutaja majandusandmed",
"adminview": "[Admin] Vaata kasutaja majandusandmeid", "adminview": "[Admin] Vaata kasutaja majandusandmeid",
"adminexp": "[Admin] Anna v\u00f5i v\u00f5ta EXP kasutajalt",
"adminitem": "[Admin] Anna v\u00f5i eemalda ese kasutajalt (tasuta)",
"allowchannel": "[Admin] Lisa kanal, kus bot võib vastata käsklustele", "allowchannel": "[Admin] Lisa kanal, kus bot võib vastata käsklustele",
"denychannel": "[Admin] Eemalda kanal lubatud kanalite nimekirjast", "denychannel": "[Admin] Eemalda kanal lubatud kanalite nimekirjast",
"channels": "[Admin] Näita lubatud kanalite nimekirja", "channels": "[Admin] Näita lubatud kanalite nimekirja",
"economysetup": "[Admin] Loo ja sea korda majandussüsteemi rollid", "economysetup": "[Admin] Loo ja sea korda majandussüsteemi rollid",
"blackjack": "Mängi blackjacki TipiBOTi vastu", "blackjack": "Mängi blackjacki TipiBOTi vastu",
"prestige": "Prestiiži (nõuab taset 30) ja teeni Prestiižipunkte",
"prestigeshop": "Vaata prestiižipoodi ja sinu uuenduste taset",
"prestigebuy": "Osta prestiižiuuendus Prestiižipunktide eest",
"fish": "Mine kalastama (interaktiivne mäng, 2min ooteaeg)",
"fishbook": "Vaata oma kalakogu ja kogutud kalaliike",
"fishsell": "Müü kalu oma inventarist",
} }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -193,6 +204,12 @@ OPT: dict[str, str] = {
"stats_kasutaja": "Mängija, kelle statistikat tahad vaadata (vaikimisi sina)", "stats_kasutaja": "Mängija, kelle statistikat tahad vaadata (vaikimisi sina)",
"adminseason_top_n": "Kui palju mängijaid võitis (vaikimisi 10)", "adminseason_top_n": "Kui palju mängijaid võitis (vaikimisi 10)",
"blackjack_panus": "Panus TipiCOINides ('all' = kogu saldo)", "blackjack_panus": "Panus TipiCOINides ('all' = kogu saldo)",
"prestigebuy_upgrade": "Uuenduse ID (vaata /prestigeshop)",
"fishbook_kasutaja": "Mängija, kelle kalakogu vaadata (vaikimisi sina)",
"profile_kasutaja": "Mängija, kelle profiili vaadata (vaikimisi sina)",
"adminexp_kogus": "Positiivne = anna, negatiivne = võta",
"adminitem_ese": "Eseme ID (kasutatav sisse, vaata /shop)",
"adminitem_tegevus": "'anna' või 'eemalda'",
} }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -216,8 +233,7 @@ HELP_CATEGORIES: dict[str, dict] = {
"description": "TipiCOIN majandus", "description": "TipiCOIN majandus",
"color": 0xF4C430, "color": 0xF4C430,
"fields": [ "fields": [
("/balance [@user]", "Vaata enda (või kellegi teise) TipiCOINide saldot"), ("/profile [@user]", "Saldo, tase, EXP progress, prestiiz - kõik ühes kohas. Nupud: Esemed · Statistika · Kalakogu."),
("/rank [@user]", "Vaata oma EXP, taset, progressi ja edetabeli positsiooni. T2 pood avaneb tasemel 10, T3 tasemel 20."),
("/cooldowns", "Vaata kõikide käskude ooteaegu. Näitab ka vangla ooteaega."), ("/cooldowns", "Vaata kõikide käskude ooteaegu. Näitab ka vangla ooteaega."),
("/daily", "Võta enda päevane TipiCOINide boonus. 20h ooteaeg. Streak'i boonus: 3d=+50%, 7d=+100%, 14d=+200%."), ("/daily", "Võta enda päevane TipiCOINide boonus. 20h ooteaeg. Streak'i boonus: 3d=+50%, 7d=+100%, 14d=+200%."),
("/work", "Tööta ja teeni TipiCOINe (1h ooteaeg)"), ("/work", "Tööta ja teeni TipiCOINe (1h ooteaeg)"),
@@ -322,6 +338,7 @@ REMINDER_OPTS: list[tuple[str, str, str]] = [
("beg", "🙏 /beg", "Kerjamine (5min ooteaeg)"), ("beg", "🙏 /beg", "Kerjamine (5min ooteaeg)"),
("crime", "🦹 /crime", "Kuritegu (2t ooteaeg)"), ("crime", "🦹 /crime", "Kuritegu (2t ooteaeg)"),
("rob", "🔫 /rob", "Rööv (2t ooteaeg)"), ("rob", "🔫 /rob", "Rööv (2t ooteaeg)"),
("fish", "🎣 /fish", "Kalapüük (2min ooteaeg)"),
] ]
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -530,6 +547,10 @@ TITLE: dict[str, str] = {
"stats": "📊 Mängustatistika", "stats": "📊 Mängustatistika",
"leaderboard_coins": "🪙 TipiBOTi edetabel - Mündid", "leaderboard_coins": "🪙 TipiBOTi edetabel - Mündid",
"leaderboard_exp": "📊 TipiBOTi edetabel - EXP / Tase", "leaderboard_exp": "📊 TipiBOTi edetabel - EXP / Tase",
"leaderboard_season": "🏆 TipiBOTi edetabel - Hooaja EXP",
"leaderboard_prestige": "<:TipiFIRE:1483431381668335687> TipiBOTi edetabel - Prestiiž",
"leaderboard_wagered": "🎲 TipiBOTi edetabel - Hasartmängud",
"leaderboard_fish": "🎣 TipiBOTi edetabel - Kalapüük",
"rps": "⚔️ Kivi, Paber, Käärid", "rps": "⚔️ Kivi, Paber, Käärid",
"rps_duel": "⚔️ KPK duell", "rps_duel": "⚔️ KPK duell",
"rps_duel_active": "⚔️ KPK duell - käimas", "rps_duel_active": "⚔️ KPK duell - käimas",
@@ -554,6 +575,16 @@ TITLE: dict[str, str] = {
"blackjack_push": "🤝 Viik!", "blackjack_push": "🤝 Viik!",
"blackjack_dbust": "<:TipiSKULL:1483431378929451028> Üle 21 - mõlemad kaotasid!", "blackjack_dbust": "<:TipiSKULL:1483431378929451028> Üle 21 - mõlemad kaotasid!",
"blackjack_dwin": "<:TipiFIRE:1483431381668335687> Topeltpanus võitis!", "blackjack_dwin": "<:TipiFIRE:1483431381668335687> Topeltpanus võitis!",
"prestige_confirm": "🔥 Prestiiž - kinnita",
"prestige_success": "<:TipiFIRE:1483431381668335687> Prestiiž {level} saavutatud!",
"prestige_too_low": "❌ Prestiiž pole saadaval",
"prestige_shop": "<:TipiFIRE:1483431381668335687> Prestiižipood",
"prestige_buy_ok": "✅ Uuendus ostetud!",
"fish_cast": "🎣 Otsid kala...",
"fish_bite": "🐟 KALA NÄKKAB!",
"fish_escape": "🎣 Kala pääses!",
"fish_junk": "🗑️ Ai ai ai...",
"fishbook": "📖 Kalakogu",
} }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -577,26 +608,27 @@ ERR: dict[str, str] = {
"heist_active": "❌ Serveris on juba aktiivne grupirööv käimas! Oota, kuni see lõpeb.", "heist_active": "❌ Serveris on juba aktiivne grupirööv käimas! Oota, kuni see lõpeb.",
"heist_full": "❌ Grupirööv on täis!", "heist_full": "❌ Grupirööv on täis!",
"heist_min_players": "❌ Grupiröövi alustamiseks on vaja vähemalt **{min}** osalejat.", "heist_min_players": "❌ Grupiröövi alustamiseks on vaja vähemalt **{min}** osalejat.",
"broke": "<:TipICRY:1483431288852709387> Sul pole piisavalt TipiCOINi. Saldo: {bal}", "broke": "<:TipICRY:1483431288852709387> Sul pole piisavalt TipiCOINe. Saldo: {bal}",
"broke_need": "<:TipICRY:1483431288852709387> Sul pole piisavalt TipiCOINi. Vajad veel {need}.", "broke_need": "<:TipICRY:1483431288852709387> Sul pole piisavalt TipiCOINe. Vajad veel {need}.",
"item_owned": "❌ Sul on see ese juba olemas.", "item_owned": "❌ Sul on see ese juba olemas.",
"item_not_found": "❌ Eset ei leitud.", "item_not_found": "❌ Eset ei leitud.",
"item_level_req": "🔒 Selle eseme ostmiseks vajad **taset {min_level}** (sul on tase {user_level}). Teeni EXP-id kõiki käske kasutades.", "item_level_req": "🔒 Selle eseme ostmiseks vajad **taset {min_level}** (sul on tase {user_level}). Teeni EXP-id kõiki käske kasutades.",
"not_your_game": "❌ See pole sinu mäng!", "not_your_game": "❌ See pole sinu mäng!",
"game_in_progress": "❌ Sul on juba mäng käimas! Lõpeta see enne.",
"not_your_challenge":"❌ See väljakutse pole sulle!", "not_your_challenge":"❌ See väljakutse pole sulle!",
"not_your_menu": "❌ See ei ole sinu menüü.", "not_your_menu": "❌ See ei ole sinu menüü.",
"give_self": "❌ Sa ei saa endale TipiCOINi anda.", "give_self": "❌ Sa ei saa iseendale TipiCOINe anda.",
"give_bot": "❌ Botile ei saa TipiCOINi anda.", "give_bot": "❌ Botile ei saa TipiCOINe anda.",
"give_jailed": "❌ Oled vangis - vanglas ei saa TipiCOINi anda. Pääsed välja {ts}.", "give_jailed": "❌ Oled vangis - vanglas ei saa TipiCOINe anda. Pääsed välja {ts}.",
"rps_self": "❌ Sa ei saa iseendale väljakutse esitada.", "rps_self": "❌ Sa ei saa iseendale väljakutset esitada.",
"rps_bot": "❌ Botid on KPK-is liiga head.", "rps_bot": "❌ Botid on KPK-is liiga head.",
"not_jailed": "❌ Sa pole praegu vangis.", "not_jailed": "❌ Sa pole praegu vangis.",
"not_in_leaderboard":"❌ Sind pole veel edetabelis.", "not_in_leaderboard":"❌ Sind pole veel edetabelis.",
"admin_ban_bot": "❌ Botti ei saa keelata.", "admin_ban_bot": "❌ Botti ei saa bannida.",
"admin_reset_bot": "❌ Kassa andmeid ei saa lähtestada.", "admin_reset_bot": "❌ Kassa andmeid ei saa lähtestada.",
"member_not_found": "❌ **{name}** ei leitud tabelist.", "member_not_found": "❌ **{name}** ei leitud tabelist.",
"request_self_fund": "❌ Sa ei saa oma taotlust ise rahastada.", "request_self_fund": "❌ Sa ei saa oma taotlust ise rahastada.",
"request_self": "❌ Sa ei saa iseendalt paluda.", "request_self": "❌ Sa ei saa iseendalt anuda.",
"request_bot": "❌ Botid on teatavasti kitsid.", "request_bot": "❌ Botid on teatavasti kitsid.",
"request_targeted": "❌ See taotlus on suunatud kasutajale **{name}**.", "request_targeted": "❌ See taotlus on suunatud kasutajale **{name}**.",
"already_in_game": "❌ Sul on juba aktiivne mäng käimas!", "already_in_game": "❌ Sul on juba aktiivne mäng käimas!",
@@ -605,6 +637,7 @@ ERR: dict[str, str] = {
"channel_only": "❌ Boti käske saab kasutada ainult nendes kanalites: {channels}", "channel_only": "❌ Boti käske saab kasutada ainult nendes kanalites: {channels}",
"guild_only": "Seda käsku saab kasutada ainult serveris.", "guild_only": "Seda käsku saab kasutada ainult serveris.",
"sheet_error": "❌ Tabeli laadimine ebaõnnestus: ```{error}```", "sheet_error": "❌ Tabeli laadimine ebaõnnestus: ```{error}```",
"gamble_cooldown": "🎰 Oled just mänginud! Saad uuesti mängida {ts}.",
} }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -620,6 +653,7 @@ CD_MSG: dict[str, str] = {
"heist": "⏳ Saad uuesti heisti teha {ts}.", "heist": "⏳ Saad uuesti heisti teha {ts}.",
"heist_global": "⏳ Pangahoidla alles kosub eelmisest röövist. Järgmine heist võimalik {ts}.", "heist_global": "⏳ Pangahoidla alles kosub eelmisest röövist. Järgmine heist võimalik {ts}.",
"jailed": "<:TipiTROLL:1483431380166774895> Oled vangis! Pääsed välja {ts}. Kasuta `/jailbreak`, et varem välja pääseda.", "jailed": "<:TipiTROLL:1483431380166774895> Oled vangis! Pääsed välja {ts}. Kasuta `/jailbreak`, et varem välja pääseda.",
"fish": "🎣 Saad uuesti kalastada {ts}.",
} }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -657,22 +691,25 @@ BJ: dict[str, str] = {
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
ITEM_DESCRIPTIONS: dict[str, str] = { ITEM_DESCRIPTIONS: dict[str, str] = {
"gaming_hiir": "400 DPI? ei, 3200 DPI. Teeni töötades 50% rohkem TipiCOINe.", "gaming_hiir": "Koolist varastatud hiir? Ei, see on mängurihiir. Teeni töötades 50% rohkem TipiCOINe.",
"hiirematt": "XXL formaat, ainult parimast kummist. Kerjamise ooteaeg 5min → 3min.", "hiirematt": "XXL suuruses, ainult parimast materjalist. Kerjamise ooteaeg 5min → 3min.",
"korvaklapid": "Noise-cancelling - kuuled ainult TipiCOINide kõlinat. Päevase boonuse ooteaeg 20h → 18h.", "korvaklapid": "Noise-cancelling - kuuled ainult TipiCOINide kõlinat. Päevase boonuse ooteaeg 20h → 18h + 25⬡ boonust.",
"lan_pass": "Ametlik TipiLANi pilet (2025). Päevane boonus on duubeldatud.", "lan_pass": "Ametlik TipiLANi pilet (2025). Päevane boonus on duubeldatud.",
"energiajook": "Kolm Red Bulli järjest. 30% tõenäosus, et teenid töötades 3x rohkem.", "energiajook": "Kolm Red Bulli järjest. 30% tõenäosus, et teenid töötades 3x rohkem.",
"gaming_laptop": "RTX 4090 jooksutab botte 24/7. Päevane boonus genereerib 5% intressi sinu saldo pealt.", "gaming_laptop": "RTX 5090 jooksutab botte 24/7. Päevane boonus genereerib 5% intressi sinu saldo pealt.",
"anticheat": "VAC, EAC ja BattlEye korraga. Röövimine sinu vastu ebaõnnestub. **2 kasutust**, siis pead ostma uue.", "anticheat": "VAC, EAC, Faceit AC ja BattlEye korraga. Röövimine sinu vastu ebaõnnestub. **2 kasutust**, siis pead ostma uue.",
"reguleeritav_laud": "Seisad, istud, võidad. /work teenib 25% rohkem (stackib mängurihiirega).", "reguleeritav_laud": "Võid nii seista kui istuda - alati võidad. /work teenib 25% rohkem (stackib mängurihiirega).",
"jellyfin": "Isehostitav meediaserver - pähkli eest filme. Röövimise edu tõenäosus 45% → 60%.", "jellyfin": "Self-hosted meediaserver - oled suurfirmadest sõltumatu. Röövimise edu 45% → 60%. Grupiröövi õnnestumisele +5%.",
"mikrofon": "Parem helikvaliteet teeb sind usutavamaks. Teeni 30% rohkem eduka /crime puhul.", "mikrofon": "Parem helikvaliteet teeb sind usutavamaks. Teeni 30% rohkem eduka /crime puhul.",
"klaviatuur": "Klõbinad kostuvad üle kogu saali. /beg teenib 2x rohkem.", "klaviatuur": "Klõbinad kostuvad üle kogu saali. /beg teenib 2x rohkem.",
"monitor": "240Hz ja 49 tolli. /work ooteaeg: 1h → 40min.", "monitor": "240Hz ja 27 tolli. /work ooteaeg: 1h → 40min.",
"cat6": "Gigabit ping = ideaalne häkkimiskiirus. /crime edu tõenäosus tõuseb 60% → 75%.", "cat6": "Gigabitine internet = ideaalne piraatluseks. /crime edu tõenäosus tõuseb 60% → 75%.",
"monitor_360": "360Hz, 1ms, 4K. Mänguautomaadi jackpot 10x → 15x, kolmik 4x → 6x.", "monitor_360": "360Hz, 1ms. Mänguautomaadi jackpot 10x → 15x, kolmik 4x → 6x. Hasartmängude ooteaeg 30s → 25s.",
"karikas": "Ainult legendidele. Streak ei nulli, kui sa mõne päeva vahele jätad.", "karikas": "Ainult legendidele. Streak ei nulli, kui sa mõne päeva vahele jätad.",
"gaming_tool": "Nii mugav, et isegi admin ei saa sind üles. /crime ebaõnnestumine ei saada sind vanglasse.", "gaming_tool": "Nii mugav, et isegi admin ei saa sind üles. /crime ebaõnnestumine ei saada sind vanglasse.",
"ussipurk": "Lakkumatu toiduga ussipurk - kalad ei saa vastu. Kalapyygi ooteaeg 2min → 90s.",
"kalavork": "Suurem võrk = suuremad kalad. Kõigi kalade haruldus tõuseb ühe astme võrra.",
"echolood": "Täpne ehholood näitab kala täpset asukohta. Haukamise aken 2s → 3s.",
} }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -744,15 +781,22 @@ ADMINVIEW_UI: dict[str, str] = {
"banned_yes": "🚫 JAH", "banned_yes": "🚫 JAH",
"banned_no": "✅ Ei", "banned_no": "✅ Ei",
"f_balance": "💰 Saldo", "f_balance": "💰 Saldo",
"f_exp": "📊 EXP / Tase",
"f_streak": "🔥 Streak", "f_streak": "🔥 Streak",
"f_banned": "🚫 Keelatud", "f_banned": "🚫 Keelatud",
"f_jailed": "🚔 Vangis kuni", "f_jailed": "🚔 Vangis kuni",
"f_prestige": "🔥 Prestiiž",
"f_items": "🎒 Esemed", "f_items": "🎒 Esemed",
"f_uses": "🔢 Kasutused", "f_uses": "🔢 Kasutused",
"f_fish": "🎣 Kala",
"f_last_daily": "⏱️ Viimati daily", "f_last_daily": "⏱️ Viimati daily",
"f_last_work": "⏱️ Viimati work", "f_last_work": "⏱️ Viimati work",
"f_last_crime": "⏱️ Viimati crime", "f_last_crime": "⏱️ Viimati crime",
"f_last_fish": "⏱️ Viimati fish",
"footer": "ID: {uid}", "footer": "ID: {uid}",
"exp_val": "{exp} EXP (Tase {level})",
"prestige_val": "Prestiiž {level} · {pp} PP",
"fish_val": "{caught} püütud · {inv} inventaris",
} }
ECONOMYSETUP_UI: dict[str, str] = { ECONOMYSETUP_UI: dict[str, str] = {
@@ -779,7 +823,7 @@ CHANNEL_UI: dict[str, str] = {
DAILY_UI: dict[str, str] = { DAILY_UI: dict[str, str] = {
"earned": "✅ Said {earned}!", "earned": "✅ Said {earned}!",
"interest": "<:TipiLAP:1483004307161874566> Bot Farm tootis: +{interest}", "interest": "<:TipiLAP:1483004307161874566> Bot Farm tootis: +{interest}",
"vip": "<:TipiPILET:1483004308353060904> LAN pilet boonus rakendus!", "vip": "<:TipiPILET:1483004308353060904> LAN pileti boonus rakendus!",
"footer": "Streak: {streak_str} · Saldo: {balance}", "footer": "Streak: {streak_str} · Saldo: {balance}",
} }
@@ -793,7 +837,7 @@ STATS_UI: dict[str, str] = {
"work_field": "🛠️ Töö & Kerja", "work_field": "🛠️ Töö & Kerja",
"work_val": "Töötanud: **{work}** korda\nKerjanud: **{beg}** korda", "work_val": "Töötanud: **{work}** korda\nKerjanud: **{beg}** korda",
"gamble_field": "🎲 Hasartmängud", "gamble_field": "🎲 Hasartmängud",
"gamble_val": "Panustatud kokku: {wagered}\nSuurim võit: {win}\nSuurim kaotus: {loss}\nSlotsi džekpotid: **{jackpots}** korda", "gamble_val": "Panustatud kokku: {wagered}\nSuurim võit: {win}\nSuurim kaotus: {loss}\nSlotsi jackpotid: **{jackpots}** korda",
"crime_field": "🦹 Kuritegevus", "crime_field": "🦹 Kuritegevus",
"crime_val": "Kuriteod: **{crimes}** ({succeeded} õnnestus)\nHeistid: **{heists}** ({heists_won} võideti)\nVangi sattunud: **{jailed}** korda\nKautsjon makstud: {bail}", "crime_val": "Kuriteod: **{crimes}** ({succeeded} õnnestus)\nHeistid: **{heists}** ({heists_won} võideti)\nVangi sattunud: **{jailed}** korda\nKautsjon makstud: {bail}",
"social_field": "🤝 Sotsiaalne", "social_field": "🤝 Sotsiaalne",
@@ -843,17 +887,25 @@ CHECK_UI: dict[str, str] = {
ADMIN: dict[str, str] = { ADMIN: dict[str, str] = {
"coins_done": "{emoji} **{name}**: {verb} {coin} → saldo **{balance}**\n📝 Põhjus: {reason}", "coins_done": "{emoji} **{name}**: {verb} {coin} → saldo **{balance}**\n📝 Põhjus: {reason}",
"coins_dm": "{emoji} Admin muutis sinu TipiCOINi saldot: **{verb} {coin}**\n📝 Põhjus: *{reason}*\nUus saldo: **{balance} {coin}**", "coins_dm": "{emoji} Admin muutis sinu TipiCOINide saldot: **{verb} {coin}**\n📝 Põhjus: *{reason}*\nUus saldo: **{balance} {coin}**",
"jail_done": "🚔 **{name}** on vangistatud {minutes} minutiks (vabaneb {ts}).\n📝 Põhjus: {reason}", "jail_done": "🚔 **{name}** on vangistatud {minutes} minutiks (vabaneb {ts}).\n📝 Põhjus: {reason}",
"jail_dm": "🚔 Admin saatis sind vanglasse **{minutes} minutiks**.\n📝 Põhjus: *{reason}*\nVabaneb {ts}.", "jail_dm": "🚔 Admin saatis sind vanglasse **{minutes} minutiks**.\n📝 Põhjus: *{reason}*\nVabaneb {ts}.",
"unjail_done": "✅ **{name}** on vanglast vabastatud.", "unjail_done": "✅ **{name}** on vanglast vabastatud.",
"unjail_dm": "✅ Admin vabastas sind vanglast.", "unjail_dm": "✅ Admin vabastas sind vanglast.",
"ban_done": "🚫 **{name}** on majandussüsteemist keelustatud.\n📝 Põhjus: {reason}", "ban_done": "🚫 **{name}** keelati majandussüsteemis osaleda.\n📝 Põhjus: {reason}",
"ban_dm": "🚫 Sind on TipiBOTi majandussüsteemist keelustatud.\n📝 Põhjus: *{reason}*", "ban_dm": "🚫 Sul keelati TipiBOTi majandussüsteemis osalemine.\n📝 Põhjus: *{reason}*",
"unban_done": "✅ **{name}** on majandussüsteemi keelust eemaldatud.", "unban_done": "✅ **{name}** on majandussüsteemi osalemise keelust eemaldatud.",
"unban_dm": "✅ Sinu TipiBOTi majandussüsteemi keeld on tühistatud. Saad taas käske kasutada.", "unban_dm": "✅ Sinu TipiBOTi majandussüsteemis osalemise keeld on tühistatud. Saad taas käske kasutada.",
"reset_done": "🗑️ **{name}** majandusandmed on lähtestatud.\n📝 Põhjus: {reason}", "reset_done": "🗑️ **{name}** majandusandmed on lähtestatud.\n📝 Põhjus: {reason}",
"reset_dm": "🗑️ Admin lähtestas sinu TipiBOTi majandusandmed (saldo, esemed, streak).\n📝 Põhjus: *{reason}*", "reset_dm": "🗑️ Admin lähtestas sinu TipiBOTi majandusandmed (saldo, esemed, streak).\n📝 Põhjus: *{reason}*",
"exp_done": "{emoji} **{name}**: {verb} EXP → kokku **{exp} EXP** (Tase {level}).\n📝 Põhjus: {reason}",
"exp_dm": "{emoji} Admin muutis sinu EXP-i: **{verb} EXP**\n📝 Põhjus: *{reason}*\nUus EXP: **{exp}** (Tase {level})",
"item_given": "✅ **{item}** antud kasutajale **{name}** (tasuta).",
"item_removed":"🗑️ **{item}** eemaldatud kasutajalt **{name}**.",
"item_invalid":"❌ Tundmatu ese: `{item_id}`. Kontrolli `/shop` eseme ID-d.",
"item_not_owned": "❌ **{name}** ei oma eset `{item_id}`.",
"item_dm_given": "✅ Admin andis sulle eseme: **{item}**.",
"item_dm_removed":"🗑️ Admin eemaldas sult eseme: **{item}**.",
} }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -868,6 +920,34 @@ SEASON: dict[str, str] = {
"done": "✅ Hooaeg lõpetatud - EXP, mündid ja esemed lähtestatud.", "done": "✅ Hooaeg lõpetatud - EXP, mündid ja esemed lähtestatud.",
} }
# ---------------------------------------------------------------------------
# /profile tabbed view
# ---------------------------------------------------------------------------
PROFILE_UI: dict[str, str] = {
"btn_profile": "💰 Profiil",
"btn_items": "🎒 Esemed",
"btn_stats": "📊 Statistika",
"btn_fish": "🎣 Kalakogu",
"main_title": "💰 {name}",
"items_title": "🎒 {name} - Esemed",
"stats_title": "📊 {name} - Statistika",
"fish_title": "🎣 {name} - Kalakogu",
"items_empty": "Sul pole ühtegi eset.",
"f_balance": "💰 Saldo",
"f_level": "📊 Tase",
"f_streak": "🔥 Streak",
"f_prestige": "⭐ Prestiiz",
"f_jail": "🚔 Vangis kuni",
"f_progress": "→ Tase {next}",
"progress_bar": "`{bar}` {done}/{needed} EXP",
"level_val": "Tase {level} - {role}",
"prestige_val":"⭐ P{level} · {pp} PP",
"footer_t1": "Tase 10 avab T2 poe · Tase 20 avab T3 poe",
"footer_t2": "T2 pood avatud · Tase 20 avab T3 poe",
"footer_t3": "T2 ja T3 pood avatud",
}
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# /balance embed strings # /balance embed strings
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -893,10 +973,12 @@ COOLDOWNS_UI: dict[str, str] = {
"beg_line": "🙏 **/beg** {status}{note}", "beg_line": "🙏 **/beg** {status}{note}",
"crime_line": "🦹 **/crime** {status}", "crime_line": "🦹 **/crime** {status}",
"rob_line": "🔫 **/rob** {status}", "rob_line": "🔫 **/rob** {status}",
"note_korvak": " *(korvaklapid: 18t)*", "fish_line": "🎣 **/fish** {status}{note}",
"note_korvak": " *(kõrvaklapid: 18t)*",
"note_monitor": " *(monitor: 40min)*", "note_monitor": " *(monitor: 40min)*",
"note_hiirematt": " *(hiirematt: 3min)*", "note_hiirematt": " *(hiirematt: 3min)*",
"jailed": "\n🚔 **Vanglas** - vabaneb <t:{ts}:R>", "note_ussipurk": " *(ussipurk: 90s)*",
"jailed": "\n<EFBFBD> **Vanglas** - vabaneb <t:{ts}:R>",
"jail_expired": "\n🔓 Vangla lõppes", "jail_expired": "\n🔓 Vangla lõppes",
} }
@@ -956,10 +1038,11 @@ CRIME_UI: dict[str, str] = {
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
ROB_UI: dict[str, str] = { ROB_UI: dict[str, str] = {
"jackpot_desc": "💥 **JACKPOT!** Tegid TipiBOTi kassasse sisse ja varastasid {stolen}!\nSaldo: {balance}", "jackpot_desc": "💥 **JACKPOT!** Murdsid TipiBOTi kassasse sisse ja varastasid {stolen}!\nSaldo: {balance}",
"win_desc": "Varastasid {stolen} kasutajalt **{name}**!\nSaldo: {balance}", "win_desc": "Varastasid {stolen} kasutajalt **{name}**!\nSaldo: {balance}",
"anticheat_desc": "**{name}** kaitseb end Anticheati'ga - said trahvi {fine}.", "anticheat_desc": "**{name}** kaitseb end Anticheati'ga - said trahvi {fine}.",
"anticheat_worn": "⚠️ Sinu **Anticheat** on kulunud! Osta uus `/buy` käsuga.", "anticheat_worn": "⚠️ Sinu **Anticheat** on kulunud! Osta uus `/buy` käsuga.",
"victim_dm": "💸 **{robber}** varastas sinult **{stolen}** münti!",
"fail_desc": "Jäid vahele! Trahv: {fine}.\nSaldo: {balance}", "fail_desc": "Jäid vahele! Trahv: {fine}.\nSaldo: {balance}",
} }
@@ -985,12 +1068,11 @@ BUY_UI: dict[str, str] = {
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
JAILBREAK_UI: dict[str, str] = { JAILBREAK_UI: dict[str, str] = {
"btn_die1": "🎲 Viska 1. täring ({try_}/{max})", "btn_roll": "🎲 Viska täringud ({try_}/{max})",
"btn_die2": "🎲 Viska 2. täring", "rolling_desc": "<:TipiDICE:1485923107108556950> *Täringud lendavad...*",
"die1_desc": "1. täring: **{die}**\n\nNüüd viska 2. täring!",
"free_desc": "{d1} {d2}\n\n✅ Viskasid duubli - pääsesid vanglast!", "free_desc": "{d1} {d2}\n\n✅ Viskasid duubli - pääsesid vanglast!",
"miss_desc": "{d1} {d2}\n\n{left} katset jäänud. Proovi uuesti!", "miss_desc": "{d1} {d2}\n\n{left} katset jäänud. Proovi uuesti!",
"intro_desc": "Oled vangis kuni {ts}.\n\nViska täringuid ja proovi **duublit** saada - siis pääsed tasuta vabaks!\nSul on **{tries} katset**. Ebaõnnestumisel saad valida - maksa kautsjon **(2030% saldost, min 350 ⬡)** või jää vanglasse kuni aja lõpuni.", "intro_desc": "Oled vangis kuni {ts}.\n\nViska täringuid ja proovi **duublit** saada - siis pääsed tasuta vabaks!\nSul on **{tries} katset**. Ebaõnnestumisel saad valida: maksa kautsjon **(2030% saldost, min 350 ⬡)** või jää vanglasse kuni aja lõpuni.",
"already_bail": "Oled juba täringuid visanud. Ainuke väljapääs on kautsjon.\n\n💰 **Kautsjon: {min} {max}** (2030% saldost)\nSaldo: {bal} Väljas: {ts}", "already_bail": "Oled juba täringuid visanud. Ainuke väljapääs on kautsjon.\n\n💰 **Kautsjon: {min} {max}** (2030% saldost)\nSaldo: {bal} Väljas: {ts}",
"already_broke": "Oled juba täringuid visanud. Sul pole piisavalt raha kautsjoni maksmiseks.\n\n💰 Kautsjoni miinimum: **{min}** - sul on ainult {bal}\nVäljas: {ts}", "already_broke": "Oled juba täringuid visanud. Sul pole piisavalt raha kautsjoni maksmiseks.\n\n💰 Kautsjoni miinimum: **{min}** - sul on ainult {bal}\nVäljas: {ts}",
"bail_btn": "💸 Maksa kautsjon", "bail_btn": "💸 Maksa kautsjon",
@@ -1014,6 +1096,14 @@ LEADERBOARD_UI: dict[str, str] = {
"btn_find_me": "📍 Mina", "btn_find_me": "📍 Mina",
"exp_entry": "{prefix} {name} - {exp} EXP *(Tase {level})*", "exp_entry": "{prefix} {name} - {exp} EXP *(Tase {level})*",
"unknown_user": "Kasutaja {uid}", "unknown_user": "Kasutaja {uid}",
"btn_season": "🏆 Hooaeg",
"btn_prestige": "🔥 Prestiiž",
"btn_wagered": "🎲 Hasartmäng",
"btn_fish": "🎣 Kalapyyk",
"season_entry": "{prefix} {name} - {exp} EXP *(Prestiiž {prestige})*",
"prestige_entry": "{prefix} {name} - Prestiiž **{prestige}** · {pp} PP",
"wagered_entry": "{prefix} {name} - {wagered} panustatud",
"fish_entry": "{prefix} {name} - {caught} kala",
} }
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -1104,3 +1194,131 @@ BJ_UI: dict[str, str] = {
"bust": " 💥", "bust": " 💥",
"balance_line": " · Saldo: {balance}", "balance_line": " · Saldo: {balance}",
} }
# ---------------------------------------------------------------------------
# Prestige system strings
# ---------------------------------------------------------------------------
PRESTIGE_SHOP_NAMES: dict[str, str] = {
"coin_mult": "Mündiboost",
"exp_mult": "EXP-boost",
"daily_plus": "Päevabonus+",
"work_plus": "Töötaja+",
}
PRESTIGE_SHOP_DESCRIPTIONS: dict[str, str] = {
"coin_mult": "Kõik TipiCOINide teenimisallikad (daily, töö, kerja, kala) teenivad +8% rohkem iga taseme kohta. Max 5 taset → +40%.",
"exp_mult": "Kõik EXP allikad teenivad +8% rohkem iga taseme kohta. Max 5 taset → +40%.",
"daily_plus": "Päevase boonuse alussumma tõuseb +20% iga taseme kohta. Max 3 taset → +60%.",
"work_plus": "/work teenib +20% rohkem iga taseme kohta. Max 3 taset → +60%.",
}
PRESTIGE_UI: dict[str, str] = {
"confirm_desc": (
"Oled tasemel **{level}** ({exp} EXP).\n\n"
"Prestiiži korral saad **{pp}** <:TipiFIRE:1483431381668335687> ja kõik lähtestub:\n"
"• Saldo, EXP, esemed, ooteajad\n\n"
"**Kalakogu jääb alles!**\n\nKas oled kindel?"
),
"btn_confirm": "🔥 Jah, prestiiži!",
"btn_cancel": "❌ Tühista",
"btn_tab_status": "⭐ Prestiiz",
"btn_tab_shop": "🛍️ Uuendused",
"success_desc": (
"Said **{pp}** <:TipiFIRE:1483431381668335687>\n"
"Prestiiži tase: **{level}**\n"
"Kogutud PP: **{total_pp}** <:TipiFIRE:1483431381668335687>\n\n"
"*Kõik lähtestati. Alusta otsast!*"
),
"too_low_desc": "Prestiiži jaoks vajad taset **{required}** (sul on tase {level}).",
"shop_desc": "Sul on **{pp}** <:TipiFIRE:1483431381668335687> · Vajuta nuppu uuenduse ostmiseks",
"shop_maxed": "✅ Max",
"shop_level_fmt": "Tase {cur}/{max}",
"shop_cost_fmt": "{cost} <:TipiFIRE:1483431381668335687>",
"buy_success_desc":"**{name}** uuendatud tasemele **{new_level}/{max_level}**!\nPP alles: **{pp}** <:TipiFIRE:1483431381668335687>",
"buy_no_pp": "<:TipICRY:1483431288852709387> Sul pole piisavalt PP. Sul on **{have}**, vajad **{need}** <:TipiFIRE:1483431381668335687>.",
"buy_maxed": "❌ See uuendus on juba maksimumtasemel.",
"buy_not_found": "❌ Sellist uuendust ei leitud. Vaata `/prestigeshop`.",
"rank_line": "<:TipiFIRE:1483431381668335687> Prestiiž **{level}** · {pp} PP",
"rank_season": "🏆 Hooaja EXP: **{exp}**",
"btn_buy_upgrade": "{emoji} {name} +1 ({cost} PP)",
"status_footer": "⭐ Prestiiž {level} · {pp} PP",
}
# ---------------------------------------------------------------------------
# Fishing system strings
# ---------------------------------------------------------------------------
FISH_NAMES: dict[str, str] = {
"sarj": "Särg",
"ahven": "Ahven",
"koger": "Koger",
"viidikas": "Viidikas",
"latikas": "Latikas",
"karpkala": "Karpkala",
"linask": "Linask",
"haug": "Haug",
"angerjas": "Angerjas",
"siig": "Siig",
"forell": "Forell",
"koha": "Koha",
"tougjas": "Tõugjas",
"lohe": "Lõhe",
"vimb": "Vimb",
}
FISH_RARITY_NAMES: dict[str, str] = {
"common": "Tavaline",
"uncommon": "Ebatavaline",
"rare": "Haruldane",
"epic": "Eepiline",
"legendary": "Legendaarne",
}
FISH_RARITY_EMOJI: dict[str, str] = {
"common": "🐟",
"uncommon": "🐠",
"rare": "🎣",
"epic": "",
"legendary": "🌟",
}
FISH_JUNK_LINES: list[str] = [
"Sa saad... **vana saabas**. Klassika.",
"Õnnitlused, leidsid **kasutatud autorehvi**. Keskkond tänab sind... mitte.",
"Taas üks **klaaspudel** rohkem jões.",
"**Vana poes käimise kott**! Hoidis aega hästi.",
"**Roostes konserv** - ilma sildita. Parem mitte teada, mis sees on.",
"**Ummistunud drenaažitoru**. Keegi oli hoolimatu.",
"**Tühi rahakott**. Kellegi päev läks halvemaks kui sinu oma.",
"**Vana CD-plaat** - Evanescence, 2003. Heas seisukorras.",
"Sa said **kivikese**. Ilus kivikene. Aga siiski kivikene.",
"**Kaotsi läinud droon**. GPS ei tööta, aku tühi.",
]
FISH_UI: dict[str, str] = {
"btn_wait": "🎣 Oota näkkamist...",
"btn_bite": "🐟 TÕMBA!",
"btn_sell": "💰 Müü",
"btn_keep": "🎒 Hoia",
"cast_desc": "Viskad õnge vette. Oota, kuni kala näkkab...\n\n-# Vajuta nuppu, kui kala näkkab!",
"bite_desc": "**KALA NÄKKAB!** Tõmba kiiresti! ⚡\n\n-# Sul on 2 sekundit!",
"escape_desc": "Liiga hilja - kala lipsas minema. Proovi järgmine kord kiiremini!",
"junk_desc": "{text}\n\n-# Saldo: {balance}",
"catch_desc": "**{name}** · {weight}g · +{exp} EXP\n-# Kas müüd kohe ({value}) või hoiad inventaris?",
"catch_sold": "**{name}** · {weight}g\n\n+{coins} · +{exp} EXP\nSaldo: {balance}",
"catch_kept": "**{name}** · {weight}g lisatud inventarisse. *(+{exp} EXP)*",
"new_fish": "\n✨ **Uus kala kalakogusse lisatud!**",
"too_early": "❌ Kala pole veel näkkanud! Oota...",
"book_caught": "Püütud kalaliike: **{caught}/{total}**",
"book_yes": "{emoji} **{name}** *({rarity})* · {count}×{inv}",
"book_inv": " *(inventaris: {n})*",
"book_no": "❓ **???** *({rarity})*",
"book_footer": "Lehekülg {page}/{total_pages} · {caught}/{total} liiki",
"book_empty": "Sa pole veel ühtegi kala püüdnud! Kasuta `/fish`.",
"inv_empty": "Sinu kalainventaar on tühi! Kasuta `/fish` kala püüdmiseks.",
"inv_header": "Sul on **{count}** kala inventaris *(kokku väärt {total_value})*",
"inv_entry": "{emoji} **{name}** · {weight}g · {value}",
"inv_sold_all": "Müüsid **{count}** kala kokku {coins} eest!\nSaldo: {balance}",
"inv_none": "Inventaaris pole midagi müüa.",
}