diff --git a/handlers/notifications.py b/handlers/notifications.py index 280fb145..ba6438e0 100644 --- a/handlers/notifications.py +++ b/handlers/notifications.py @@ -6,7 +6,7 @@ import asyncpg from py3xui import AsyncApi from client import delete_client -from config import ADMIN_PASSWORD, ADMIN_USERNAME, CLUSTERS, DATABASE_URL, TOTAL_GB +from config import ADMIN_PASSWORD, ADMIN_USERNAME, CLUSTERS, DATABASE_URL, TOTAL_GB, TRIAL_TIME from database import delete_key, get_balance, update_balance, update_key_expiry from handlers.keys.key_utils import renew_key_in_cluster from handlers.texts import KEY_EXPIRY_10H, KEY_EXPIRY_24H, KEY_RENEWED, RENEWAL_PLANS @@ -27,6 +27,8 @@ async def notify_expiring_keys(bot: Bot): logger.info("Начало обработки уведомлений.") + await notify_inactive_trial_users(bot, conn) + await asyncio.sleep(1) await notify_10h_keys(bot, conn, current_time, threshold_time_10h) await asyncio.sleep(1) await notify_24h_keys(bot, conn, current_time, threshold_time_24h) @@ -212,6 +214,51 @@ async def notify_24h_keys( await asyncio.sleep(1) +async def notify_inactive_trial_users(bot: Bot, conn: asyncpg.Connection): + logger.info("Проверка пользователей, не активировавших пробный период...") + + inactive_trial_users = await conn.fetch( + """ + SELECT tg_id, username FROM users + WHERE tg_id IN ( + SELECT tg_id FROM connections + WHERE trial = 0 + ) AND tg_id NOT IN ( + SELECT DISTINCT tg_id FROM keys + ) + """ + ) + logger.info(f"Найдено {len(inactive_trial_users)} неактивных пользователей.") + + for user in inactive_trial_users: + tg_id = user['tg_id'] + username = user.get('username', 'Пользователь') + + try: + if not await is_bot_blocked(bot, tg_id): + keyboard = types.InlineKeyboardMarkup( + inline_keyboard=[ + [types.InlineKeyboardButton(text="🚀 Активировать пробный период", callback_data="create_key")], + [types.InlineKeyboardButton(text="👤 Личный кабинет", callback_data="profile")], + ] + ) + + message = ( + f"👋 Привет, {username}!\n\n" + f"🎉 У тебя есть бесплатный пробный период на {TRIAL_TIME} дней!\n" + "🕒 Не упусти возможность попробовать наш VPN прямо сейчас.\n\n" + "💡 Нажми на кнопку ниже, чтобы активировать пробный доступ." + ) + + await bot.send_message(tg_id, message, reply_markup=keyboard) + logger.info(f"Отправлено уведомление неактивному пользователю {tg_id}.") + + except Exception as e: + logger.error(f"Ошибка при отправке уведомления неактивному пользователю {tg_id}: {e}") + + await asyncio.sleep(1) # Небольшая задержка между отправками + + async def handle_expired_keys(bot: Bot, conn: asyncpg.Connection, current_time: float): logger.info("Проверка истекших ключей...")