fix improve trial bonus timing / add coupon button toggle

This commit is contained in:
Capybara-z
2026-02-07 17:38:15 +03:00
parent 5556bfc6c7
commit 7f6f00286c
5 changed files with 23 additions and 12 deletions
+4
View File
@@ -8,6 +8,7 @@ from ..defaults import DEFAULT_BUTTONS_CONFIG
BUTTONS_CONFIG: dict[str, bool] = DEFAULT_BUTTONS_CONFIG.copy() BUTTONS_CONFIG: dict[str, bool] = DEFAULT_BUTTONS_CONFIG.copy()
BUTTONS_CONFIG.setdefault("ANDROID_TV_BUTTON_ENABLE", False) BUTTONS_CONFIG.setdefault("ANDROID_TV_BUTTON_ENABLE", False)
BUTTONS_CONFIG.setdefault("COUPON_BUTTON_ENABLE", True)
async def load_buttons_config(session: AsyncSession) -> None: async def load_buttons_config(session: AsyncSession) -> None:
@@ -18,6 +19,7 @@ async def load_buttons_config(session: AsyncSession) -> None:
if setting is None: if setting is None:
buttons_config = DEFAULT_BUTTONS_CONFIG.copy() buttons_config = DEFAULT_BUTTONS_CONFIG.copy()
buttons_config.setdefault("ANDROID_TV_BUTTON_ENABLE", False) buttons_config.setdefault("ANDROID_TV_BUTTON_ENABLE", False)
buttons_config.setdefault("COUPON_BUTTON_ENABLE", True)
setting = Setting( setting = Setting(
key="BUTTONS_CONFIG", key="BUTTONS_CONFIG",
value=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 = DEFAULT_BUTTONS_CONFIG.copy()
buttons_config.update(stored) buttons_config.update(stored)
buttons_config.setdefault("ANDROID_TV_BUTTON_ENABLE", False) buttons_config.setdefault("ANDROID_TV_BUTTON_ENABLE", False)
buttons_config.setdefault("COUPON_BUTTON_ENABLE", True)
setting.value = buttons_config setting.value = buttons_config
BUTTONS_CONFIG.clear() 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 = DEFAULT_BUTTONS_CONFIG.copy()
buttons_config.update(new_values) buttons_config.update(new_values)
buttons_config.setdefault("ANDROID_TV_BUTTON_ENABLE", False) buttons_config.setdefault("ANDROID_TV_BUTTON_ENABLE", False)
buttons_config.setdefault("COUPON_BUTTON_ENABLE", True)
BUTTONS_CONFIG.clear() BUTTONS_CONFIG.clear()
BUTTONS_CONFIG.update(buttons_config) BUTTONS_CONFIG.update(buttons_config)
@@ -15,6 +15,7 @@ BUTTON_TITLES: Final[dict[str, str]] = {
"QRCODE_BUTTON_ENABLE": "QR подписки", "QRCODE_BUTTON_ENABLE": "QR подписки",
"HWID_RESET_BUTTON_ENABLE": "Сброс HWID", "HWID_RESET_BUTTON_ENABLE": "Сброс HWID",
"ANDROID_TV_BUTTON_ENABLE": "Android TV", "ANDROID_TV_BUTTON_ENABLE": "Android TV",
"COUPON_BUTTON_ENABLE": "Активировать купон",
} }
NOTIFICATION_TITLES: Final[dict[str, str]] = { NOTIFICATION_TITLES: Final[dict[str, str]] = {
@@ -98,6 +98,11 @@ async def notify_inactive_trial_users(bot: Bot, session: AsyncSession):
"notification_id": "inactive_trial", "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: if messages:
results = await send_messages_with_limit( results = await send_messages_with_limit(
bot, bot,
@@ -117,12 +122,6 @@ async def notify_inactive_trial_users(bot: Bot, session: AsyncSession):
await add_notification(session, tg_id, "inactive_trial") await add_notification(session, tg_id, "inactive_trial")
logger.info(f"Отправлено {len(sent_tg_ids)} уведомлений неактивным пользователям.") 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("Проверка пользователей с неактивным пробным периодом завершена.") logger.info("Проверка пользователей с неактивным пробным периодом завершена.")
+11 -5
View File
@@ -10,6 +10,7 @@ from sqlalchemy import select
from config import USE_NEW_PAYMENT_FLOW, TRIBUTE_LINK from config import USE_NEW_PAYMENT_FLOW, TRIBUTE_LINK
from core.bootstrap import PAYMENTS_CONFIG from core.bootstrap import PAYMENTS_CONFIG
from core.settings.buttons_config import BUTTONS_CONFIG
from core.settings.money_config import get_currency_mode from core.settings.money_config import get_currency_mode
from database import ( from database import (
check_coupon_usage, check_coupon_usage,
@@ -163,7 +164,8 @@ async def try_fast_payment_flow(
for row in kept_rows: for row in kept_rows:
keyboard.row(*row) 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: if profile_row:
keyboard.row(*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")) keyboard.row(InlineKeyboardButton(text=btn.MAIN_MENU, callback_data="profile"))
lead_text = await shortfall_lead_text( 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: for row in kept_rows:
keyboard.row(*row) 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: if profile_row:
keyboard.row(*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")) keyboard.row(InlineKeyboardButton(text=btn.MAIN_MENU, callback_data="profile"))
await message.answer( 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")) keyboard.row(InlineKeyboardButton(text=btn.MAIN_MENU, callback_data="profile"))
lead_text = await shortfall_lead_text( lead_text = await shortfall_lead_text(
+2 -1
View File
@@ -185,7 +185,8 @@ async def balance_handler(callback_query: CallbackQuery, session: AsyncSession):
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text=btn.PAYMENT, callback_data="pay")) 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.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")) builder.row(InlineKeyboardButton(text=btn.MAIN_MENU, callback_data="profile"))
text = BALANCE_MANAGEMENT_TEXT.format(balance=balance_text) text = BALANCE_MANAGEMENT_TEXT.format(balance=balance_text)