fix: fix menus and modal views after payment providers refactor

This commit is contained in:
3252a8
2026-05-18 11:01:32 +03:00
parent 51c9c8b4f0
commit 960754c54e
13 changed files with 482 additions and 62 deletions
+80 -10
View File
@@ -11,6 +11,8 @@ from aiogram.utils.keyboard import InlineKeyboardBuilder
from sqlalchemy.ext.asyncio import AsyncSession
from bot.keyboards.inline.user_keyboards import (
callback_context_from_back_callback,
callback_suffix_for_context,
get_autorenew_confirm_keyboard,
get_back_to_main_menu_markup,
get_hwid_device_packages_keyboard,
@@ -19,6 +21,8 @@ from bot.keyboards.inline.user_keyboards import (
get_tariff_catalog_keyboard,
get_tariff_packages_keyboard,
get_tariff_periods_keyboard,
sale_mode_with_callback_context,
subscription_options_callback,
)
from bot.middlewares.i18n import JsonI18n
from bot.services.panel_api_service import PanelApiService
@@ -56,11 +60,30 @@ def _has_multiple_enabled_tariffs(settings: Settings) -> bool:
def _tariff_purchase_markup(
tariff, current_lang: str, i18n: JsonI18n, settings: Settings
tariff,
current_lang: str,
i18n: JsonI18n,
settings: Settings,
back_callback: str = "main_action:subscribe",
callback_context: Optional[str] = None,
) -> InlineKeyboardMarkup:
if tariff.billing_model == "period":
return get_tariff_periods_keyboard(tariff, current_lang, i18n, settings)
return get_tariff_packages_keyboard(tariff, tariff.traffic_packages.rub, current_lang, i18n)
return get_tariff_periods_keyboard(
tariff,
current_lang,
i18n,
settings,
back_callback=back_callback,
callback_context=callback_context,
)
return get_tariff_packages_keyboard(
tariff,
tariff.traffic_packages.rub,
current_lang,
i18n,
back_callback=back_callback,
callback_context=callback_context,
)
def _tariff_purchase_text(tariff, current_lang: str, i18n: JsonI18n, settings: Settings) -> str:
@@ -98,13 +121,27 @@ async def display_subscription_options(
tariffs_config = getattr(settings, "tariffs_config", None)
if tariffs_config:
enabled_tariffs = list(tariffs_config.enabled_tariffs)
callback_context = callback_context_from_back_callback(back_callback)
if len(enabled_tariffs) == 1:
tariff = enabled_tariffs[0]
text_content = _tariff_purchase_text(tariff, current_lang, i18n, settings)
reply_markup = _tariff_purchase_markup(tariff, current_lang, i18n, settings)
reply_markup = _tariff_purchase_markup(
tariff,
current_lang,
i18n,
settings,
back_callback=back_callback,
callback_context=callback_context,
)
else:
text_content = get_text("select_subscription_period")
reply_markup = get_tariff_catalog_keyboard(enabled_tariffs, current_lang, i18n)
reply_markup = get_tariff_catalog_keyboard(
enabled_tariffs,
current_lang,
i18n,
back_callback=back_callback,
callback_context=callback_context,
)
target_message_obj = event.message if isinstance(event, types.CallbackQuery) else event
if isinstance(event, types.CallbackQuery):
try:
@@ -144,6 +181,7 @@ async def display_subscription_options(
i18n,
traffic_mode=traffic_mode,
back_callback=back_callback,
callback_context=callback_context_from_back_callback(back_callback),
)
else:
text_content = get_text("no_subscription_options_available")
@@ -193,13 +231,22 @@ async def select_tariff_callback(
if not config or not callback.message:
await callback.answer(get_text("error_occurred_try_again"), show_alert=True)
return
tariff_key = callback.data.split(":", 2)[2]
parts = callback.data.split(":")
tariff_key = parts[2] if len(parts) > 2 else ""
callback_context = parts[3] if len(parts) > 3 else None
try:
tariff = config.require(tariff_key)
except Exception:
await callback.answer(get_text("error_try_again"), show_alert=True)
return
markup = _tariff_purchase_markup(tariff, current_lang, i18n, settings)
markup = _tariff_purchase_markup(
tariff,
current_lang,
i18n,
settings,
back_callback=subscription_options_callback(callback_context),
callback_context=callback_context,
)
text = _tariff_purchase_text(tariff, current_lang, i18n, settings)
await callback.message.edit_text(text, reply_markup=markup)
await callback.answer()
@@ -216,7 +263,12 @@ async def select_tariff_period_callback(
if not config or not callback.message:
await callback.answer(get_text("error_occurred_try_again"), show_alert=True)
return
_, _, tariff_key, months_raw = callback.data.split(":", 3)
parts = callback.data.split(":")
if len(parts) < 4:
await callback.answer(get_text("error_try_again"), show_alert=True)
return
tariff_key, months_raw = parts[2], parts[3]
callback_context = parts[4] if len(parts) > 4 else None
tariff = config.require(tariff_key)
months = int(months_raw)
price_rub = tariff.period_price(months, "rub")
@@ -232,7 +284,10 @@ async def select_tariff_period_callback(
current_lang,
i18n,
settings,
sale_mode=f"subscription@{tariff.key}",
sale_mode=sale_mode_with_callback_context(
f"subscription@{tariff.key}", callback_context
),
back_callback=f"tariff:select:{tariff.key}{callback_suffix_for_context(callback_context)}",
)
await callback.message.edit_text(get_text("choose_payment_method"), reply_markup=markup)
await callback.answer()
@@ -249,7 +304,12 @@ async def select_tariff_package_callback(
if not config or not callback.message:
await callback.answer(get_text("error_occurred_try_again"), show_alert=True)
return
_, _, tariff_key, gb_raw = callback.data.split(":", 3)
parts = callback.data.split(":")
if len(parts) < 4:
await callback.answer(get_text("error_try_again"), show_alert=True)
return
tariff_key, gb_raw = parts[2], parts[3]
callback_context = parts[4] if len(parts) > 4 else None
tariff = config.require(tariff_key)
gb = float(gb_raw)
packages = (
@@ -264,6 +324,12 @@ async def select_tariff_package_callback(
sale_mode = (
f"{'traffic_package' if tariff.billing_model == 'traffic' else 'topup'}@{tariff.key}"
)
sale_mode = sale_mode_with_callback_context(sale_mode, callback_context)
back_callback = (
f"tariff:select:{tariff.key}{callback_suffix_for_context(callback_context)}"
if tariff.billing_model == "traffic"
else "tariff_topup:list"
)
markup = get_payment_method_keyboard(
gb,
package.price,
@@ -273,6 +339,7 @@ async def select_tariff_package_callback(
i18n,
settings,
sale_mode=sale_mode,
back_callback=back_callback,
)
await callback.message.edit_text(get_text("choose_payment_method_traffic"), reply_markup=markup)
await callback.answer()
@@ -384,6 +451,7 @@ async def select_tariff_premium_package_callback(
i18n,
settings,
sale_mode=f"premium_topup@{tariff.key}",
back_callback="tariff_topup:list",
)
await callback.message.edit_text(get_text("choose_payment_method_traffic"), reply_markup=markup)
await callback.answer()
@@ -462,6 +530,7 @@ async def hwid_devices_package_callback(
i18n,
settings,
sale_mode=f"hwid_devices@{tariff.key}",
back_callback="hwid_devices:list",
)
await callback.message.edit_text(
get_text("choose_payment_method_hwid_devices"), reply_markup=markup
@@ -731,6 +800,7 @@ async def tariff_change_pay_callback(
i18n,
settings,
sale_mode=f"tariff_upgrade@{tariff_key}",
back_callback=f"tariff_change:confirm_pay:{tariff_key}:{amount_raw}",
)
await callback.message.edit_text("Выберите способ оплаты", reply_markup=markup)
await callback.answer()
@@ -4,7 +4,11 @@ from typing import Optional
from aiogram import F, Router, types
from sqlalchemy.ext.asyncio import AsyncSession
from bot.keyboards.inline.user_keyboards import get_payment_method_keyboard
from bot.keyboards.inline.user_keyboards import (
get_payment_method_keyboard,
sale_mode_with_callback_context,
subscription_options_callback,
)
from bot.middlewares.i18n import JsonI18n
from config.settings import Settings
@@ -32,8 +36,10 @@ async def select_subscription_period_callback_handler(
traffic_packages = getattr(settings, "traffic_packages", {}) or {}
stars_traffic_packages = getattr(settings, "stars_traffic_packages", {}) or {}
traffic_mode = bool(getattr(settings, "traffic_sale_mode", False) or stars_traffic_packages)
parts = callback.data.split(":")
callback_context = parts[2] if len(parts) > 2 else None
try:
months = float(callback.data.split(":")[-1])
months = float(parts[1])
except (ValueError, IndexError):
logging.error(f"Invalid subscription period in callback_data: {callback.data}")
try:
@@ -97,7 +103,10 @@ async def select_subscription_period_callback_handler(
current_lang,
i18n,
settings,
sale_mode="traffic" if traffic_mode else "subscription",
sale_mode=sale_mode_with_callback_context(
"traffic" if traffic_mode else "subscription", callback_context
),
back_callback=subscription_options_callback(callback_context),
)
try: