From 7f6f00286cd2123bd72e9582dc601bc2244ef7b1 Mon Sep 17 00:00:00 2001 From: Capybara-z Date: Sat, 7 Feb 2026 17:38:15 +0300 Subject: [PATCH] fix improve trial bonus timing / add coupon button toggle --- core/settings/buttons_config.py | 4 ++++ handlers/admin/settings/settings_config.py | 1 + handlers/notifications/special_notifications.py | 11 +++++------ handlers/payments/fast_payment_flow.py | 16 +++++++++++----- handlers/payments/pay.py | 3 ++- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/core/settings/buttons_config.py b/core/settings/buttons_config.py index 9feeb593..70ac97a3 100644 --- a/core/settings/buttons_config.py +++ b/core/settings/buttons_config.py @@ -8,6 +8,7 @@ from ..defaults import DEFAULT_BUTTONS_CONFIG BUTTONS_CONFIG: dict[str, bool] = DEFAULT_BUTTONS_CONFIG.copy() BUTTONS_CONFIG.setdefault("ANDROID_TV_BUTTON_ENABLE", False) +BUTTONS_CONFIG.setdefault("COUPON_BUTTON_ENABLE", True) async def load_buttons_config(session: AsyncSession) -> None: @@ -18,6 +19,7 @@ async def load_buttons_config(session: AsyncSession) -> None: if setting is None: buttons_config = DEFAULT_BUTTONS_CONFIG.copy() buttons_config.setdefault("ANDROID_TV_BUTTON_ENABLE", False) + buttons_config.setdefault("COUPON_BUTTON_ENABLE", True) setting = Setting( key="BUTTONS_CONFIG", value=buttons_config, @@ -29,6 +31,7 @@ async def load_buttons_config(session: AsyncSession) -> None: buttons_config = DEFAULT_BUTTONS_CONFIG.copy() buttons_config.update(stored) buttons_config.setdefault("ANDROID_TV_BUTTON_ENABLE", False) + buttons_config.setdefault("COUPON_BUTTON_ENABLE", True) setting.value = buttons_config BUTTONS_CONFIG.clear() @@ -56,6 +59,7 @@ async def update_buttons_config(session: AsyncSession, new_values: dict[str, boo buttons_config = DEFAULT_BUTTONS_CONFIG.copy() buttons_config.update(new_values) buttons_config.setdefault("ANDROID_TV_BUTTON_ENABLE", False) + buttons_config.setdefault("COUPON_BUTTON_ENABLE", True) BUTTONS_CONFIG.clear() BUTTONS_CONFIG.update(buttons_config) diff --git a/handlers/admin/settings/settings_config.py b/handlers/admin/settings/settings_config.py index c3996c82..8f315f43 100644 --- a/handlers/admin/settings/settings_config.py +++ b/handlers/admin/settings/settings_config.py @@ -15,6 +15,7 @@ BUTTON_TITLES: Final[dict[str, str]] = { "QRCODE_BUTTON_ENABLE": "QR подписки", "HWID_RESET_BUTTON_ENABLE": "Сброс HWID", "ANDROID_TV_BUTTON_ENABLE": "Android TV", + "COUPON_BUTTON_ENABLE": "Активировать купон", } NOTIFICATION_TITLES: Final[dict[str, str]] = { diff --git a/handlers/notifications/special_notifications.py b/handlers/notifications/special_notifications.py index e0d48b0b..e7d43db2 100644 --- a/handlers/notifications/special_notifications.py +++ b/handlers/notifications/special_notifications.py @@ -98,6 +98,11 @@ async def notify_inactive_trial_users(bot: Bot, session: AsyncSession): "notification_id": "inactive_trial", }) + if users_to_extend: + await session.execute(update(User).where(User.tg_id.in_(users_to_extend)).values(trial=-1)) + await session.commit() + logger.info(f"Bulk: отмечено {len(users_to_extend)} пользователей с расширенным триалом") + if messages: results = await send_messages_with_limit( bot, @@ -117,12 +122,6 @@ async def notify_inactive_trial_users(bot: Bot, session: AsyncSession): await add_notification(session, tg_id, "inactive_trial") logger.info(f"Отправлено {len(sent_tg_ids)} уведомлений неактивным пользователям.") - extend_ids = [tg_id for tg_id in users_to_extend if tg_id in sent_tg_ids] - if extend_ids: - await session.execute(update(User).where(User.tg_id.in_(extend_ids)).values(trial=-1)) - await session.commit() - logger.info(f"Bulk: отмечено {len(extend_ids)} пользователей с расширенным триалом") - logger.info("Проверка пользователей с неактивным пробным периодом завершена.") diff --git a/handlers/payments/fast_payment_flow.py b/handlers/payments/fast_payment_flow.py index 2e9b25f0..983e4ea4 100644 --- a/handlers/payments/fast_payment_flow.py +++ b/handlers/payments/fast_payment_flow.py @@ -10,6 +10,7 @@ from sqlalchemy import select from config import USE_NEW_PAYMENT_FLOW, TRIBUTE_LINK from core.bootstrap import PAYMENTS_CONFIG +from core.settings.buttons_config import BUTTONS_CONFIG from core.settings.money_config import get_currency_mode from database import ( check_coupon_usage, @@ -163,7 +164,8 @@ async def try_fast_payment_flow( for row in kept_rows: keyboard.row(*row) - keyboard.row(InlineKeyboardButton(text=btn.COUPON, callback_data="fastflow_coupon")) + if BUTTONS_CONFIG.get("COUPON_BUTTON_ENABLE", True): + keyboard.row(InlineKeyboardButton(text=btn.COUPON, callback_data="fastflow_coupon")) if profile_row: keyboard.row(*profile_row) @@ -225,7 +227,8 @@ async def try_fast_payment_flow( ) ) - keyboard.row(InlineKeyboardButton(text=btn.COUPON, callback_data="fastflow_coupon")) + if BUTTONS_CONFIG.get("COUPON_BUTTON_ENABLE", True): + keyboard.row(InlineKeyboardButton(text=btn.COUPON, callback_data="fastflow_coupon")) keyboard.row(InlineKeyboardButton(text=btn.MAIN_MENU, callback_data="profile")) lead_text = await shortfall_lead_text( @@ -481,7 +484,8 @@ async def fastflow_apply_coupon(message: Message, state: FSMContext, session: An for row in kept_rows: keyboard.row(*row) - keyboard.row(InlineKeyboardButton(text=btn.COUPON_RESTART, callback_data="fastflow_coupon")) + if BUTTONS_CONFIG.get("COUPON_BUTTON_ENABLE", True): + keyboard.row(InlineKeyboardButton(text=btn.COUPON_RESTART, callback_data="fastflow_coupon")) if profile_row: keyboard.row(*profile_row) @@ -521,7 +525,8 @@ async def fastflow_apply_coupon(message: Message, state: FSMContext, session: An ) ) - keyboard.row(InlineKeyboardButton(text=btn.COUPON_RESTART, callback_data="fastflow_coupon")) + if BUTTONS_CONFIG.get("COUPON_BUTTON_ENABLE", True): + keyboard.row(InlineKeyboardButton(text=btn.COUPON_RESTART, callback_data="fastflow_coupon")) keyboard.row(InlineKeyboardButton(text=btn.MAIN_MENU, callback_data="profile")) await message.answer( @@ -587,7 +592,8 @@ async def choose_payment_currency(callback_query: CallbackQuery, state: FSMConte ) ) - keyboard.row(InlineKeyboardButton(text=btn.COUPON, callback_data="fastflow_coupon")) + if BUTTONS_CONFIG.get("COUPON_BUTTON_ENABLE", True): + keyboard.row(InlineKeyboardButton(text=btn.COUPON, callback_data="fastflow_coupon")) keyboard.row(InlineKeyboardButton(text=btn.MAIN_MENU, callback_data="profile")) lead_text = await shortfall_lead_text( diff --git a/handlers/payments/pay.py b/handlers/payments/pay.py index d969910d..fa064a1c 100644 --- a/handlers/payments/pay.py +++ b/handlers/payments/pay.py @@ -185,7 +185,8 @@ async def balance_handler(callback_query: CallbackQuery, session: AsyncSession): builder = InlineKeyboardBuilder() builder.row(InlineKeyboardButton(text=btn.PAYMENT, callback_data="pay")) builder.row(InlineKeyboardButton(text=btn.BALANCE_HISTORY, callback_data="balance_history")) - builder.row(InlineKeyboardButton(text=btn.COUPON, callback_data="activate_coupon")) + if BUTTONS_CONFIG.get("COUPON_BUTTON_ENABLE", True): + builder.row(InlineKeyboardButton(text=btn.COUPON, callback_data="activate_coupon")) builder.row(InlineKeyboardButton(text=btn.MAIN_MENU, callback_data="profile")) text = BALANCE_MANAGEMENT_TEXT.format(balance=balance_text)