From 56829717220ba6811084974f535dc5361c93d48e Mon Sep 17 00:00:00 2001 From: Egor Date: Thu, 25 Sep 2025 11:00:27 +0300 Subject: [PATCH] Revert "Hide Happ cryptolinks behind connect button" --- app/handlers/subscription.py | 276 +++++++++-------------------------- app/keyboards/inline.py | 14 +- 2 files changed, 70 insertions(+), 220 deletions(-) diff --git a/app/handlers/subscription.py b/app/handlers/subscription.py index feec20aa..8cc84fd3 100644 --- a/app/handlers/subscription.py +++ b/app/handlers/subscription.py @@ -6,7 +6,6 @@ from aiogram.fsm.context import FSMContext from sqlalchemy.ext.asyncio import AsyncSession import json import os -import html from typing import Dict, List, Any, Tuple, Optional from app.config import settings, PERIOD_PRICES, get_traffic_prices @@ -568,20 +567,14 @@ async def show_subscription_info( subscription_link = get_display_subscription_link(subscription) if subscription_link: if actual_status in ['trial_active', 'paid_active'] and not settings.HIDE_SUBSCRIPTION_LINK: - if settings.is_happ_cryptolink_mode(): - message += "\n\n" + texts.t( - "SUBSCRIPTION_CONNECT_LINK_SECTION_HAPP", - "πŸ”’ Бсылка для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ скрыта. НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ \"ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ\", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Ρ‘ Π² Happ.", - ) - else: - message += "\n\n" + texts.t( - "SUBSCRIPTION_CONNECT_LINK_SECTION", - "πŸ”— Бсылка для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:\n{subscription_url}", - ).format(subscription_url=subscription_link) - message += "\n\n" + texts.t( - "SUBSCRIPTION_CONNECT_LINK_PROMPT", - "πŸ“± Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ссылку ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² вашС VPN ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅", - ) + message += "\n\n" + texts.t( + "SUBSCRIPTION_CONNECT_LINK_SECTION", + "πŸ”— Бсылка для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:\n{subscription_url}", + ).format(subscription_url=subscription_link) + message += "\n\n" + texts.t( + "SUBSCRIPTION_CONNECT_LINK_PROMPT", + "πŸ“± Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ссылку ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² вашС VPN ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅", + ) await callback.message.edit_text( message, @@ -846,29 +839,17 @@ async def activate_trial( subscription_link = get_display_subscription_link(subscription) if remnawave_user and subscription_link: - if settings.is_happ_cryptolink_mode(): - subscription_import_link = texts.t( - "SUBSCRIPTION_IMPORT_LINK_SECTION_HAPP", - "πŸ”’ Бсылка Π½Π° подписку скрыта. НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ \"ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ\", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Ρ‘ Π² Happ.", - ) - else: - subscription_import_link = texts.t( - "SUBSCRIPTION_IMPORT_LINK_SECTION", - "πŸ”— Π’Π°ΡˆΠ° ссылка для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π² VPN ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:\\n{subscription_url}", - ).format(subscription_url=subscription_link) + subscription_import_link = texts.t( + "SUBSCRIPTION_IMPORT_LINK_SECTION", + "πŸ”— Π’Π°ΡˆΠ° ссылка для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π² VPN ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:\\n{subscription_url}", + ).format(subscription_url=subscription_link) - message_parts = [texts.TRIAL_ACTIVATED] - if subscription_import_link: - message_parts.append(subscription_import_link) - message_parts.append( - texts.t( - "SUBSCRIPTION_IMPORT_INSTRUCTION_PROMPT", - "πŸ“± НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½ΠΈΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎ настройкС VPN Π½Π° вашСм устройствС", - ) + trial_success_text = ( + f"{texts.TRIAL_ACTIVATED}\n\n" + f"{subscription_import_link}\n\n" + f"{texts.t('SUBSCRIPTION_IMPORT_INSTRUCTION_PROMPT', 'πŸ“± НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½ΠΈΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎ настройкС VPN Π½Π° вашСм устройствС')}" ) - trial_success_text = "\n\n".join(message_parts) - connect_mode = settings.CONNECT_BUTTON_MODE if connect_mode == "miniapp_subscription": @@ -901,33 +882,9 @@ async def activate_trial( ], [InlineKeyboardButton(text=texts.t("BACK_TO_MAIN_MENU_BUTTON", "⬅️ Π’ Π³Π»Π°Π²Π½ΠΎΠ΅ мСню"), callback_data="back_to_menu")], ]) - elif connect_mode == "link": + elif connect_mode in {"link", "happ_cryptolink"}: rows = [ - [ - InlineKeyboardButton( - text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), - url=subscription_link, - ) - ] - ] - happ_row = get_happ_download_button_row(texts) - if happ_row: - rows.append(happ_row) - rows.append([ - InlineKeyboardButton( - text=texts.t("BACK_TO_MAIN_MENU_BUTTON", "⬅️ Π’ Π³Π»Π°Π²Π½ΠΎΠ΅ мСню"), - callback_data="back_to_menu" - ) - ]) - connect_keyboard = InlineKeyboardMarkup(inline_keyboard=rows) - elif connect_mode == "happ_cryptolink": - rows = [ - [ - InlineKeyboardButton( - text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), - callback_data="open_subscription_link", - ) - ] + [InlineKeyboardButton(text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), url=subscription_link)] ] happ_row = get_happ_download_button_row(texts) if happ_row: @@ -3338,29 +3295,17 @@ async def confirm_purchase( subscription_link = get_display_subscription_link(subscription) if remnawave_user and subscription_link: - if settings.is_happ_cryptolink_mode(): - import_link_section = texts.t( - "SUBSCRIPTION_IMPORT_LINK_SECTION_HAPP", - "πŸ”’ Бсылка Π½Π° подписку скрыта. НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ \"ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ\", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Ρ‘ Π² Happ.", - ) - else: - import_link_section = texts.t( - "SUBSCRIPTION_IMPORT_LINK_SECTION", - "πŸ”— Π’Π°ΡˆΠ° ссылка для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π² VPN ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:\\n{subscription_url}", - ).format(subscription_url=subscription_link) + import_link_section = texts.t( + "SUBSCRIPTION_IMPORT_LINK_SECTION", + "πŸ”— Π’Π°ΡˆΠ° ссылка для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π² VPN ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:\\n{subscription_url}", + ).format(subscription_url=subscription_link) - message_parts = [texts.SUBSCRIPTION_PURCHASED] - if import_link_section: - message_parts.append(import_link_section) - message_parts.append( - texts.t( - 'SUBSCRIPTION_IMPORT_INSTRUCTION_PROMPT', - 'πŸ“± НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½ΠΈΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎ настройкС VPN Π½Π° вашСм устройствС' - ) + success_text = ( + f"{texts.SUBSCRIPTION_PURCHASED}\n\n" + f"{import_link_section}\n\n" + f"{texts.t('SUBSCRIPTION_IMPORT_INSTRUCTION_PROMPT', 'πŸ“± НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½ΠΈΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎ настройкС VPN Π½Π° вашСм устройствС')}" ) - success_text = "\n\n".join(message_parts) - connect_mode = settings.CONNECT_BUTTON_MODE if connect_mode == "miniapp_subscription": @@ -3393,43 +3338,14 @@ async def confirm_purchase( ], [InlineKeyboardButton(text=texts.t("BACK_TO_MAIN_MENU_BUTTON", "⬅️ Π’ Π³Π»Π°Π²Π½ΠΎΠ΅ мСню"), callback_data="back_to_menu")], ]) - elif connect_mode == "link": + elif connect_mode in {"link", "happ_cryptolink"}: rows = [ - [ - InlineKeyboardButton( - text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), - url=subscription_link, - ) - ] + [InlineKeyboardButton(text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), url=subscription_link)] ] happ_row = get_happ_download_button_row(texts) if happ_row: rows.append(happ_row) - rows.append([ - InlineKeyboardButton( - text=texts.t("BACK_TO_MAIN_MENU_BUTTON", "⬅️ Π’ Π³Π»Π°Π²Π½ΠΎΠ΅ мСню"), - callback_data="back_to_menu", - ) - ]) - connect_keyboard = InlineKeyboardMarkup(inline_keyboard=rows) - elif connect_mode == "happ_cryptolink": - rows = [ - [ - InlineKeyboardButton( - text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), - callback_data="open_subscription_link", - ) - ] - ] - happ_row = get_happ_download_button_row(texts) - if happ_row: - rows.append(happ_row) - rows.append([ - InlineKeyboardButton( - text=texts.t("BACK_TO_MAIN_MENU_BUTTON", "⬅️ Π’ Π³Π»Π°Π²Π½ΠΎΠ΅ мСню"), - callback_data="back_to_menu", - ) - ]) + rows.append([InlineKeyboardButton(text=texts.t("BACK_TO_MAIN_MENU_BUTTON", "⬅️ Π’ Π³Π»Π°Π²Π½ΠΎΠ΅ мСню"), callback_data="back_to_menu")]) connect_keyboard = InlineKeyboardMarkup(inline_keyboard=rows) else: connect_keyboard = InlineKeyboardMarkup(inline_keyboard=[ @@ -4269,7 +4185,7 @@ async def handle_connect_subscription( parse_mode="HTML" ) - elif connect_mode == "link": + elif connect_mode in {"link", "happ_cryptolink"}: rows = [ [ InlineKeyboardButton( @@ -4297,34 +4213,6 @@ async def handle_connect_subscription( reply_markup=keyboard, parse_mode="HTML" ) - elif connect_mode == "happ_cryptolink": - rows = [ - [ - InlineKeyboardButton( - text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), - callback_data="open_subscription_link" - ) - ] - ] - happ_row = get_happ_download_button_row(texts) - if happ_row: - rows.append(happ_row) - rows.append([ - InlineKeyboardButton(text=texts.BACK, callback_data="menu_subscription") - ]) - - keyboard = InlineKeyboardMarkup(inline_keyboard=rows) - - await callback.message.edit_text( - texts.t( - "SUBSCRIPTION_CONNECT_HAPP_MESSAGE", - """πŸš€ ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ подписку - -πŸ”’ Бсылка скрыта. НаТмитС Β«ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Ρ‘ Π² Happ.""", - ), - reply_markup=keyboard, - parse_mode="HTML" - ) else: device_text = texts.t( @@ -4626,77 +4514,49 @@ async def handle_open_subscription_link( ) return - escaped_link = html.escape(subscription_link) - - if settings.is_happ_cryptolink_mode(): - link_text = texts.t( - "SUBSCRIPTION_HAPP_LINK_DETAILS", - """πŸ”— ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ подписку Π² Happ: -НаТмитС здСсь, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Happ - -Если ссылка Π½Π΅ открываСтся автоматичСски, скопируйтС Π΅Ρ‘ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ: -{subscription_url_code}""", - ).format( - subscription_url=html.escape(subscription_link, quote=True), - subscription_url_code=escaped_link, + link_text = ( + texts.t("SUBSCRIPTION_DEVICE_LINK_TITLE", "πŸ”— Бсылка подписки:") + + "\n\n" + + f"{subscription_link}\n\n" + + texts.t("SUBSCRIPTION_LINK_USAGE_TITLE", "πŸ“± Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:") + + "\n" + + "\n".join( + [ + texts.t( + "SUBSCRIPTION_LINK_STEP1", + "1. НаТмитС Π½Π° ссылку Π²Ρ‹ΡˆΠ΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‘ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ", + ), + texts.t( + "SUBSCRIPTION_LINK_STEP2", + "2. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ вашС VPN ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅", + ), + texts.t( + "SUBSCRIPTION_LINK_STEP3", + "3. НайдитС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ \"Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ подписку\" ΠΈΠ»ΠΈ \"Import\"", + ), + texts.t( + "SUBSCRIPTION_LINK_STEP4", + "4. Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ссылку", + ), + ] ) - else: - link_text = ( - texts.t("SUBSCRIPTION_DEVICE_LINK_TITLE", "πŸ”— Бсылка подписки:") - + "\n\n" - + f"{escaped_link}\n\n" - + texts.t("SUBSCRIPTION_LINK_USAGE_TITLE", "πŸ“± Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:") - + "\n" - + "\n".join( - [ - texts.t( - "SUBSCRIPTION_LINK_STEP1", - "1. НаТмитС Π½Π° ссылку Π²Ρ‹ΡˆΠ΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‘ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ", - ), - texts.t( - "SUBSCRIPTION_LINK_STEP2", - "2. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ вашС VPN ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅", - ), - texts.t( - "SUBSCRIPTION_LINK_STEP3", - "3. НайдитС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ \"Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ подписку\" ΠΈΠ»ΠΈ \"Import\"", - ), - texts.t( - "SUBSCRIPTION_LINK_STEP4", - "4. Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ссылку", - ), - ] - ) - + "\n\n" - + texts.t( - "SUBSCRIPTION_LINK_HINT", - "πŸ’‘ Если ссылка Π½Π΅ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π»Π°ΡΡŒ, Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ Π΅Ρ‘ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈ скопируйтС.", - ) + + "\n\n" + + texts.t( + "SUBSCRIPTION_LINK_HINT", + "πŸ’‘ Если ссылка Π½Π΅ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π»Π°ΡΡŒ, Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ Π΅Ρ‘ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈ скопируйтС.", ) - - buttons = [] - if settings.is_happ_cryptolink_mode(): - buttons.append([ - InlineKeyboardButton( - text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), - callback_data="open_subscription_link", - ) - ]) - else: - buttons.append([ - InlineKeyboardButton( - text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), - callback_data="subscription_connect", - ) - ]) - - buttons.append([ - InlineKeyboardButton(text=texts.BACK, callback_data="menu_subscription") - ]) + ) await callback.message.edit_text( link_text, - reply_markup=InlineKeyboardMarkup(inline_keyboard=buttons), + reply_markup=InlineKeyboardMarkup(inline_keyboard=[ + [ + InlineKeyboardButton(text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), callback_data="subscription_connect") + ], + [ + InlineKeyboardButton(text=texts.BACK, callback_data="menu_subscription") + ] + ]), parse_mode="HTML" ) await callback.answer() diff --git a/app/keyboards/inline.py b/app/keyboards/inline.py index 115fdeb8..29a1262d 100644 --- a/app/keyboards/inline.py +++ b/app/keyboards/inline.py @@ -385,19 +385,9 @@ def get_subscription_keyboard( keyboard.append([ InlineKeyboardButton(text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), callback_data="subscription_connect") ]) - elif connect_mode == "link": + elif connect_mode in {"link", "happ_cryptolink"}: keyboard.append([ - InlineKeyboardButton( - text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), - url=subscription_link - ) - ]) - elif connect_mode == "happ_cryptolink": - keyboard.append([ - InlineKeyboardButton( - text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), - callback_data="open_subscription_link" - ) + InlineKeyboardButton(text=texts.t("CONNECT_BUTTON", "πŸ”— ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"), url=subscription_link) ]) else: keyboard.append([