diff --git a/handlers/subscriptions.py b/handlers/subscriptions.py index 2305ff1..246c43d 100644 --- a/handlers/subscriptions.py +++ b/handlers/subscriptions.py @@ -4,11 +4,18 @@ from instences.config import BASE_URL_FASTAPI import aiohttp from aiogram.enums.parse_mode import ParseMode from aiogram.filters import Command -from keyboard.keyboards import tarif_Lark_pro_keyboard, tarif_Lark_keyboard, tarif_confirm_keyboard,buy_keyboard +from keyboard.keyboards import ( + tarif_Lark_pro_keyboard, + tarif_Lark_keyboard, + tarif_Lark_family_keyboard, + tarif_confirm_keyboard, + buy_keyboard, +) router = Router() logger = logging.getLogger(__name__) + async def call_api(method, endpoint, data=None): """ Выполняет HTTP-запрос к FastAPI. @@ -19,22 +26,25 @@ async def call_api(method, endpoint, data=None): try: async with aiohttp.ClientSession() as session: async with session.request(method, url, json=data) as response: - logger.info(f"Получен ответ от {url}: статус {response.status}") + logger.info( + f"Получен ответ от {url}: статус {response.status}") if response.status in {200, 201}: result = await response.json() logger.debug(f"Ответ JSON: {result}") return result - if response.status in {404,400}: + if response.status in {404, 400}: result = await response.json() logger.debug(f"Код {response.status}, возвращаю {result}") return result - logger.error(f"Ошибка в запросе: статус {response.status}, причина {response.reason}") + logger.error( + f"Ошибка в запросе: статус {response.status}, причина {response.reason}") return "ERROR" except Exception as e: logger.exception(f"Исключение при выполнении запроса к {url}: {e}") return "ERROR" + def escape_markdown_v2(text: str) -> str: """ Экранирует специальные символы для Markdown_V2. @@ -45,7 +55,6 @@ def escape_markdown_v2(text: str) -> str: return text - @router.message(Command("subscriptions")) async def supp(message: types.Message): """ @@ -56,7 +65,8 @@ async def supp(message: types.Message): try: # Вызов API для получения URI result = await call_api("GET", f"/uri?telegram_id={message.from_user.id}") - uri = result.get('detail', "Error") # Получаем URI из ответа или "Error", если ключ отсутствует + # Получаем URI из ответа или "Error", если ключ отсутствует + uri = result.get('detail', "Error") # Проверка результата if uri == "Error": @@ -71,7 +81,8 @@ async def supp(message: types.Message): except Exception as e: # Логирование ошибок logger.error(f"Ошибка при вызове API для подписки: {e}") - text = escape_markdown_v2("Произошла неожиданная ошибка при получении подписки.") + text = escape_markdown_v2( + "Произошла неожиданная ошибка при получении подписки.") # Ответ пользователю await message.answer( @@ -79,36 +90,67 @@ async def supp(message: types.Message): parse_mode=ParseMode.MARKDOWN_V2 ) + @router.callback_query(lambda callback: callback.data == "buy_subscription") async def buy_subscription_callback_handler(callback: types.CallbackQuery): """ - Обработчик callback_query с data="buy_subscription". + Меню выбора тарифа: Basic / Pro / Family + показ баланса. """ - await callback.message.edit_text( - f"Ознакомься с условиями в вкладке \"О тарифах\" и выбери подходящий 🦅", - reply_markup=buy_keyboard() + # Тянем пользователя, чтобы показать баланс + user_data = await call_api("GET", f"/user/{callback.from_user.id}") + balance = user_data.get("balance", 0) if user_data else "?" + + text = ( + "➕ Подключить новую подписку\n\n" + "🐣 Lark Basic - 200 ₽ / мес\n" + "🦅 Lark Pro - 400 ₽ / мес\n" + "👨‍👩‍👧 Lark Family - 700 ₽ / мес\n\n" + f"💰 Баланс: {balance} ₽\n\n" + "Выбери тариф:" ) + await callback.message.edit_text( + text, + parse_mode=ParseMode.HTML, + reply_markup=buy_keyboard(), + ) + await callback.answer() + + @router.callback_query(lambda callback: callback.data == "subs") async def subs_callback_handler(callback: types.CallbackQuery): """ Обработчик callback_query с data="subs". - """ + """ await callback.message.edit_text( "Подписки птенчик", reply_markup=tarif_Lark_keyboard() ) + @router.callback_query(lambda callback: callback.data == "subs_pro") async def subs_pro_callback_handler(callback: types.CallbackQuery): """ Обработчик callback_query с data="subs_pro". - """ + """ await callback.message.edit_text( "Подписки птенчик ПРО", reply_markup=tarif_Lark_pro_keyboard() ) + +@router.callback_query(lambda callback: callback.data == "subs_family") +async def subs_family_callback_handler(callback: types.CallbackQuery): + """ + Обработчик callback_query с data="subs_family". + """ + await callback.message.edit_text( + "Подписки Lark Family", + reply_markup=tarif_Lark_family_keyboard(), + ) + await callback.answer() + + @router.callback_query(lambda callback: callback.data.startswith("Lark:")) async def lark_tariff_callback_handler(callback: types.CallbackQuery): """ @@ -128,11 +170,12 @@ async def lark_tariff_callback_handler(callback: types.CallbackQuery): months = f"{tariff_time} месяцев" text = f"Тариф {tariff_name} на {months}. Продолжите покупку..." - + # Рендеринг клавиатуры keyboard = tarif_confirm_keyboard(tariff_name, tariff_time, tariff_class) await callback.message.edit_text(text=text, reply_markup=keyboard) + @router.callback_query(lambda callback: callback.data.startswith("confirm:")) async def confirm_callback_handler(callback: types.CallbackQuery): """ @@ -164,5 +207,3 @@ async def confirm_callback_handler(callback: types.CallbackQuery): await callback.message.edit_text("Произошла ошибка при оформлении подписки.") finally: await callback.answer() - - diff --git a/keyboard/keyboards.py b/keyboard/keyboards.py index 0794bff..9af09ba 100644 --- a/keyboard/keyboards.py +++ b/keyboard/keyboards.py @@ -92,12 +92,11 @@ def ticket_keyboard(): def buy_keyboard(): """ Меню выбора тарифа. - Лейблы ближе к твоему стилю, но callback’и остаются старые. """ builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton( - text="🐣 Lark (Basic)", + text="🐣 Lark Basic", callback_data="subs", ) ) @@ -109,8 +108,8 @@ def buy_keyboard(): ) builder.row( InlineKeyboardButton( - text="ℹ️ О тарифах", - url="https://t.me/proxylark/19", + text="👨‍👩‍👧 Lark Family", + callback_data="subs_family", ) ) builder.row( @@ -136,51 +135,36 @@ def subhist_keyboard(): return builder.as_markup() -def popup_keyboard(): +def payment_methods_keyboard(amount: int): """ - Пополнение: суммы как в твоём топап-меню. + Способы оплаты для выбранной суммы. + ЛаркинсКоины убрал нахер """ builder = InlineKeyboardBuilder() - for amount in [200, 300, 600, 1000]: - builder.row( - InlineKeyboardButton( - text=f"{amount} ₽", - callback_data=f"popup:{amount}", - ) + builder.row( + InlineKeyboardButton( + text="⭐ Telegram Stars", + callback_data=f"method_stars_{amount}", ) + ) + builder.row( + InlineKeyboardButton( + text="💵 YooKassa", + callback_data=f"method_ykassa_{amount}", + ) + ) + builder.row( + InlineKeyboardButton( + text="🪙 CryptoBot", + callback_data=f"method_crypto_{amount}", + ) + ) builder.row( InlineKeyboardButton( text="🔙 Назад", - callback_data="profile", - ) - ) - return builder.as_markup() - - - -def balance_keyboard(): - """ - Баланс - """ - builder = InlineKeyboardBuilder() - builder.row( - InlineKeyboardButton( - text="🪙 Пополнить баланс", callback_data="popup", ) ) - builder.row( - InlineKeyboardButton( - text="🧾 История транзакций", - callback_data="tranhist", - ) - ) - builder.row( - InlineKeyboardButton( - text="🔙 Назад", - callback_data="profile", - ) - ) return builder.as_markup() @@ -248,6 +232,38 @@ def tarif_Lark_pro_keyboard(): return builder.as_markup() +def tarif_Lark_family_keyboard(): + """ + Тариф Lark Family. + """ + builder = InlineKeyboardBuilder() + builder.row( + InlineKeyboardButton( + text="👨‍👩‍👧 Lark Family 1 месяц", + callback_data="Lark:Family:1", + ) + ) + builder.row( + InlineKeyboardButton( + text="👨‍👩‍👧 Lark Family 6 месяцев", + callback_data="Lark:Family:6", + ) + ) + builder.row( + InlineKeyboardButton( + text="👨‍👩‍👧 Lark Family 12 месяцев", + callback_data="Lark:Family:12", + ) + ) + builder.row( + InlineKeyboardButton( + text="🔙 Назад", + callback_data="buy_subscription", + ) + ) + return builder.as_markup() + + def guide_keyboard(): """ Руководство по подключению