From 38eeeab300e2ea18022b2a3dbfef99569ca0d075 Mon Sep 17 00:00:00 2001 From: Capybara-z Date: Fri, 4 Jul 2025 17:34:21 +0300 Subject: [PATCH] Add subscription purchase command/Add subscription renewal command/Improve bot version update message --- bot.py | 2 +- handlers/keys/key_mode/key_create.py | 13 +++- handlers/keys/key_view.py | 93 ++++++++++++++++------------ 3 files changed, 63 insertions(+), 45 deletions(-) diff --git a/bot.py b/bot.py index c29b5f20..4a592b9c 100644 --- a/bot.py +++ b/bot.py @@ -67,7 +67,7 @@ def get_git_commit_number() -> str: branch = "dev" except Exception as e: - return f"\n(Требуется обновление через CLI: {e})" + return f"\n(Требуется обновление через CLI (команда sudo solobot): {e})" try: remote_commit = subprocess.check_output( diff --git a/handlers/keys/key_mode/key_create.py b/handlers/keys/key_mode/key_create.py index ca6772c0..40cd9046 100644 --- a/handlers/keys/key_mode/key_create.py +++ b/handlers/keys/key_mode/key_create.py @@ -53,11 +53,18 @@ class Form(FSMContext): @router.callback_query(F.data == "create_key") +@router.message(F.text == "/buy") async def confirm_create_new_key( - callback_query: CallbackQuery, state: FSMContext, session: Any + callback_query_or_message: CallbackQuery | Message, state: FSMContext, session: Any ): - tg_id = callback_query.message.chat.id - await handle_key_creation(tg_id, state, session, callback_query) + if isinstance(callback_query_or_message, CallbackQuery): + tg_id = callback_query_or_message.message.chat.id + message_or_query = callback_query_or_message + else: + tg_id = callback_query_or_message.chat.id + message_or_query = callback_query_or_message + + await handle_key_creation(tg_id, state, session, message_or_query) async def handle_key_creation( diff --git a/handlers/keys/key_view.py b/handlers/keys/key_view.py index 3d8b8df5..50a2e20f 100644 --- a/handlers/keys/key_view.py +++ b/handlers/keys/key_view.py @@ -446,46 +446,57 @@ async def handle_reset_hwid(callback_query: CallbackQuery, session: Any): @router.callback_query(F.data == "renew_menu") -async def process_renew_menu(callback_query: CallbackQuery, session: Any): - tg_id = callback_query.from_user.id - records = await get_keys(session, tg_id) - servers_dict = await get_servers(session) - all_server_names = set() - for servers in servers_dict.values(): - for s in servers: - all_server_names.add(s["server_name"]) - builder = InlineKeyboardBuilder() - moscow_tz = pytz.timezone("Europe/Moscow") - if records: - for record in records: - if getattr(record, 'is_frozen', False): - continue - alias = record.alias - email = record.email - expiry_time = record.expiry_time - server_id = record.server_id - key_display = alias.strip() if alias else email +@router.message(F.text == "/extend") +async def process_renew_menu(callback_query_or_message: CallbackQuery | Message, session: Any): + try: + if isinstance(callback_query_or_message, CallbackQuery): + target_message = callback_query_or_message.message + tg_id = callback_query_or_message.from_user.id + else: + target_message = callback_query_or_message + tg_id = callback_query_or_message.from_user.id + + records = await get_keys(session, tg_id) + servers_dict = await get_servers(session) + all_server_names = set() + for servers in servers_dict.values(): + for s in servers: + all_server_names.add(s["server_name"]) + builder = InlineKeyboardBuilder() + moscow_tz = pytz.timezone("Europe/Moscow") + if records: + for record in records: + if getattr(record, 'is_frozen', False): + continue + alias = record.alias + email = record.email + expiry_time = record.expiry_time + server_id = record.server_id + key_display = alias.strip() if alias else email - if expiry_time: - expiry_date_full = datetime.fromtimestamp(expiry_time / 1000, tz=moscow_tz) - now = datetime.now(moscow_tz) - days_left = (expiry_date_full - now).days - if (expiry_date_full - now).total_seconds() <= 0: - days_text = "🔴 Истекла" + if expiry_time: + expiry_date_full = datetime.fromtimestamp(expiry_time / 1000, tz=moscow_tz) + now = datetime.now(moscow_tz) + days_left = (expiry_date_full - now).days + if (expiry_date_full - now).total_seconds() <= 0: + days_text = "🔴 Истекла" + else: + days_text = format_days(days_left) else: - days_text = format_days(days_left) - else: - days_text = "истекла" - server_info = f" ({server_id})" if server_id in all_server_names else "" - btn_text = f"🔑 {key_display} (⏳{days_text}) {server_info}" - builder.row(InlineKeyboardButton(text=btn_text, callback_data=f"renew_key|{email}")) - text = "Выберите подписку для продления или купите новую" - builder.row(InlineKeyboardButton(text=ADD_SUB, callback_data="create_key")) - builder.row(InlineKeyboardButton(text=MAIN_MENU, callback_data="profile")) - image_path = os.path.join("img", "pic_view.jpg") - await edit_or_send_message( - target_message=callback_query.message, - text=text, - reply_markup=builder.as_markup(), - media_path=image_path, - ) + days_text = "истекла" + server_info = f" ({server_id})" if server_id in all_server_names else "" + btn_text = f"🔑 {key_display} (⏳{days_text}) {server_info}" + builder.row(InlineKeyboardButton(text=btn_text, callback_data=f"renew_key|{email}")) + text = "Выберите подписку для продления или купите новую" + builder.row(InlineKeyboardButton(text=ADD_SUB, callback_data="create_key")) + builder.row(InlineKeyboardButton(text=MAIN_MENU, callback_data="profile")) + image_path = os.path.join("img", "pic_view.jpg") + await edit_or_send_message( + target_message=target_message, + text=text, + reply_markup=builder.as_markup(), + media_path=image_path, + ) + except Exception as e: + error_message = f"Ошибка при получении подписок для продления: {e}" + await target_message.answer(text=error_message)