diff --git a/handlers/notifications.py b/handlers/notifications.py
index a80e37ab..8d829a29 100644
--- a/handlers/notifications.py
+++ b/handlers/notifications.py
@@ -21,13 +21,14 @@ async def notify_expiring_keys(bot: Bot):
try:
conn = await asyncpg.connect(DATABASE_URL)
try:
- threshold_time = (datetime.utcnow() + timedelta(hours=10)).timestamp() * 1000
- records = await conn.fetch('''
+ # Напоминание за 10 часов
+ threshold_time_10h = (datetime.utcnow() + timedelta(hours=10)).timestamp() * 1000
+ records_10h = await conn.fetch('''
SELECT tg_id, email, expiry_time, client_id, server_id FROM keys
WHERE expiry_time <= $1 AND expiry_time > $2 AND notified = FALSE
- ''', threshold_time, datetime.utcnow().timestamp() * 1000)
+ ''', threshold_time_10h, datetime.utcnow().timestamp() * 1000)
- for record in records:
+ for record in records_10h:
tg_id = record['tg_id']
email = record['email']
expiry_time = record['expiry_time']
@@ -65,6 +66,52 @@ async def notify_expiring_keys(bot: Bot):
except Exception as e:
print(f"Ошибка при отправке сообщения пользователю {tg_id}: {e}. Пропускаем этого пользователя.")
+ # Напоминание за 24 часа
+ threshold_time_24h = (datetime.utcnow() + timedelta(days=1)).timestamp() * 1000
+ records_24h = await conn.fetch('''
+ SELECT tg_id, email, expiry_time, client_id, server_id FROM keys
+ WHERE expiry_time <= $1 AND expiry_time > $2 AND notified_24h = FALSE
+ ''', threshold_time_24h, datetime.utcnow().timestamp() * 1000)
+
+ for record in records_24h:
+ tg_id = record['tg_id']
+ email = record['email']
+ expiry_time = record['expiry_time']
+ server_id = record['server_id']
+
+ time_left = (expiry_time / 1000) - datetime.utcnow().timestamp()
+ hours_left = max(0, int(time_left // 3600))
+
+ expiry_date = datetime.utcfromtimestamp(expiry_time / 1000).strftime('%Y-%m-%d %H:%M:%S')
+ balance = await get_balance(tg_id)
+
+ keyboard = InlineKeyboardMarkup(inline_keyboard=[
+ [
+ InlineKeyboardButton(text='1 месяц (100 руб.)', callback_data=f'renew_plan|1|{record["client_id"]}'),
+ InlineKeyboardButton(text='3 месяца (285 руб.)', callback_data=f'renew_plan|3|{record["client_id"]}')
+ ],
+ [
+ InlineKeyboardButton(text='6 месяцев (540 руб.)', callback_data=f'renew_plan|6|{record["client_id"]}'),
+ InlineKeyboardButton(text='1 год (1000 руб.)', callback_data=f'renew_plan|12|{record["client_id"]}')
+ ],
+ [
+ InlineKeyboardButton(text='Пополнить баланс', callback_data='replenish_balance'),
+ InlineKeyboardButton(text='Назад', callback_data='back_to_main')
+ ]
+ ])
+
+ message = (f"Ваш ключ {email} истечет через {hours_left} часов "
+ f"({expiry_date}). Пожалуйста, продлите его.\n"
+ f"Ваш текущий баланс: {balance:.2f} руб.")
+
+ try:
+ await bot.send_message(chat_id=tg_id, text=message, parse_mode='HTML', reply_markup=keyboard)
+
+ await conn.execute('UPDATE keys SET notified_24h = TRUE WHERE client_id = $1', record['client_id'])
+ except Exception as e:
+ print(f"Ошибка при отправке сообщения пользователю {tg_id}: {e}. Пропускаем этого пользователя.")
+
+ # Обработка истекших ключей
expired_records = await conn.fetch('''
SELECT tg_id, email, client_id, server_id FROM keys
WHERE expiry_time <= $1
@@ -120,4 +167,4 @@ async def notify_expiring_keys(bot: Bot):
finally:
await conn.close()
except Exception as e:
- print(f"Ошибка при отправке уведомлений: {e}")
\ No newline at end of file
+ print(f"Ошибка при отправке уведомлений: {e}")