Skip to content

Commit e68920d

Browse files
Felix Haffkclaude
andcommitted
feat: kidnapping system, fishing animations, fix isort
- /kidnap (reply) — kidnap children from other families - /ransom — pay ransom to get child back - /release — kidnapper releases child - /kidnaps — view active kidnapping status - Fishing now has step-by-step animation (cast → wait → bite → pull) - Rare fish get special rarity labels - Fixed isort import ordering in bot.py and models.py Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent b5fad9c commit e68920d

File tree

5 files changed

+366
-16
lines changed

5 files changed

+366
-16
lines changed

app/bot.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,25 @@
1313
from app.handlers.blackjack import register_blackjack_handlers
1414
from app.handlers.business import register_business_handlers
1515
from app.handlers.casino import register_casino_handlers
16-
from app.handlers.daily import register_daily_handlers
1716
from app.handlers.children import register_children_handlers
17+
from app.handlers.coinflip import register_coinflip_handlers
18+
from app.handlers.daily import register_daily_handlers
1819
from app.handlers.duel import register_duel_handlers
1920
from app.handlers.economy import register_economy_handlers
20-
from app.handlers.giftbox import register_giftbox_handlers
2121
from app.handlers.feedback import register_feedback_handlers
2222
from app.handlers.fishing import register_fishing_handlers
23-
from app.handlers.insurance import register_insurance_handlers
23+
from app.handlers.giftbox import register_giftbox_handlers
2424
from app.handlers.house import register_house_handlers
25+
from app.handlers.insurance import register_insurance_handlers
26+
from app.handlers.kidnap import register_kidnap_handlers
2527
from app.handlers.lottery import register_lottery_handlers
2628
from app.handlers.marriage import register_marriage_handlers
2729
from app.handlers.menu import register_menu_handlers
2830
from app.handlers.mine import register_mine_handlers
29-
from app.handlers.coinflip import register_coinflip_handlers
3031
from app.handlers.pet import register_pet_handlers
3132
from app.handlers.prestige import register_prestige_handlers
32-
from app.handlers.rob import register_rob_handlers
3333
from app.handlers.quest import initialize_quests, register_quest_handlers
34+
from app.handlers.rob import register_rob_handlers
3435
from app.handlers.scratch import register_scratch_handlers
3536
from app.handlers.shop import register_shop_handlers
3637
from app.handlers.social import register_social_handlers
@@ -111,6 +112,7 @@ def create_bot() -> Application:
111112
register_rob_handlers(application)
112113
register_insurance_handlers(application)
113114
register_fishing_handlers(application)
115+
register_kidnap_handlers(application)
114116
register_feedback_handlers(application)
115117
register_admin_handlers(application)
116118

app/database/models.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
String,
1212
UniqueConstraint,
1313
)
14-
from sqlalchemy.orm import declarative_base
15-
from sqlalchemy.orm import relationship
14+
from sqlalchemy.orm import declarative_base, relationship
1615
from sqlalchemy.sql import func
1716

1817
Base = declarative_base()

app/handlers/fishing.py

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
"""Fishing minigame handler — catch fish, sell or collect."""
22

3+
import asyncio
34
import random
45
from datetime import datetime, timedelta
56

67
import structlog
78
from telegram import Update
9+
from telegram.error import BadRequest
810
from telegram.ext import CommandHandler, ContextTypes
911

1012
from app.database.connection import get_db
@@ -36,6 +38,15 @@
3638
]
3739
# Total: 25+20+15+10+8+7+5+4+3+2+1 = 100%
3840

41+
# Animation frames
42+
CAST_ANIMATIONS = [
43+
"🎣 Забрасываешь удочку...",
44+
"🎣 Удочка в воде...\n🌊 ~~ ~~ ~~",
45+
"🎣 Ждёшь...\n🌊 ~~ 🐟? ~~ ~~",
46+
"🎣 Что-то клюёт!\n🌊 ~~ ‼️ ~~ ~~",
47+
"🎣 Тянешь!\n💪 ~~ ~~ ~~",
48+
]
49+
3950

4051
def catch_fish():
4152
"""Roll for a fish catch based on probability weights."""
@@ -49,6 +60,16 @@ def catch_fish():
4960
return FISH[0][0], FISH[0][1], FISH[0][2]
5061

5162

63+
async def animate_fishing(msg):
64+
"""Play fishing animation by editing message."""
65+
for frame in CAST_ANIMATIONS:
66+
await asyncio.sleep(0.8)
67+
try:
68+
await msg.edit_text(frame)
69+
except BadRequest:
70+
pass
71+
72+
5273
@require_registered
5374
async def fishing_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
5475
"""Handle /fish command."""
@@ -101,13 +122,15 @@ async def fishing_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
101122

102123
balance = user.balance
103124

104-
# Build message
125+
# Send initial message and animate
126+
msg = await update.message.reply_text("🎣 Готовишь наживку...")
127+
await animate_fishing(msg)
128+
129+
# Build result message
105130
if sell_price == 0:
106-
# Caught junk
107131
text = (
108132
f"🎣 <b>Рыбалка</b>\n\n"
109-
f"Ты закинул удочку...\n\n"
110-
f"{fish_emoji} Поймал: {fish_name}\n\n"
133+
f"{fish_emoji} Поймал: <b>{fish_name}</b>\n\n"
111134
f"Наживка потрачена зря!\n"
112135
f"💸 -{format_diamonds(BAIT_COST)}\n"
113136
f"💰 Баланс: {format_diamonds(balance)}"
@@ -116,24 +139,30 @@ async def fishing_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
116139
profit = sell_price - BAIT_COST
117140
text = (
118141
f"🎣 <b>Рыбалка</b>\n\n"
119-
f"Ты закинул удочку...\n\n"
120142
f"{fish_emoji} Поймал: <b>{fish_name}</b>\n"
121143
f"💰 Продано за {format_diamonds(sell_price)}\n\n"
122144
f"📉 Итого: {profit} (наживка {format_diamonds(BAIT_COST)})\n"
123145
f"💰 Баланс: {format_diamonds(balance)}"
124146
)
125147
else:
126148
profit = sell_price - BAIT_COST
149+
rarity = ""
150+
if sell_price >= 100:
151+
rarity = " 🌟 ЛЕГЕНДА!"
152+
elif sell_price >= 50:
153+
rarity = " ✨ Редкий улов!"
127154
text = (
128155
f"🎣 <b>Рыбалка</b>\n\n"
129-
f"Ты закинул удочку...\n\n"
130-
f"{fish_emoji} Поймал: <b>{fish_name}</b>!\n"
156+
f"{fish_emoji} Поймал: <b>{fish_name}</b>!{rarity}\n"
131157
f"💰 Продано за {format_diamonds(sell_price)}\n\n"
132158
f"📈 Профит: +{format_diamonds(profit)} (наживка {format_diamonds(BAIT_COST)})\n"
133159
f"💰 Баланс: {format_diamonds(balance)}"
134160
)
135161

136-
await update.message.reply_text(text, parse_mode="HTML")
162+
try:
163+
await msg.edit_text(text, parse_mode="HTML")
164+
except BadRequest:
165+
await update.message.reply_text(text, parse_mode="HTML")
137166

138167
try:
139168
update_quest_progress(user_id, "casino")

0 commit comments

Comments
 (0)