diff --git a/handlers/__pycache__/keys.cpython-310.pyc b/handlers/__pycache__/keys.cpython-310.pyc
index bcefdc3a..49d6cd33 100644
Binary files a/handlers/__pycache__/keys.cpython-310.pyc and b/handlers/__pycache__/keys.cpython-310.pyc differ
diff --git a/handlers/__pycache__/notifications.cpython-310.pyc b/handlers/__pycache__/notifications.cpython-310.pyc
index 09464cdf..b0a30e75 100644
Binary files a/handlers/__pycache__/notifications.cpython-310.pyc and b/handlers/__pycache__/notifications.cpython-310.pyc differ
diff --git a/handlers/keys.py b/handlers/keys.py
index b244c00d..3c5d0b0f 100644
--- a/handlers/keys.py
+++ b/handlers/keys.py
@@ -254,7 +254,6 @@ async def process_callback_confirm_delete(callback_query: types.CallbackQuery):
await callback_query.answer()
-# Обработка выбора плана продления
@router.callback_query(lambda c: c.data.startswith('renew_plan|'))
async def process_callback_renew_plan(callback_query: types.CallbackQuery):
tg_id = callback_query.from_user.id
@@ -271,13 +270,15 @@ async def process_callback_renew_plan(callback_query: types.CallbackQuery):
expiry_time = record['expiry_time']
current_time = datetime.utcnow().timestamp() * 1000 # Текущее время в миллисекундах
+ # Проверяем, если ключ истек, то продлеваем от текущей даты, иначе продлеваем от текущей даты истечения
if expiry_time <= current_time:
- # Если ключ уже истек, он не может быть продлен
- await bot.edit_message_text("Ваш ключ уже истек и не может быть продлен.", chat_id=tg_id, message_id=callback_query.message.message_id)
- return
+ # Ключ истек, начинаем отсчет от текущего времени
+ new_expiry_time = int(current_time + timedelta(days=days_to_extend).total_seconds() * 1000)
+ else:
+ # Ключ активен, продлеваем от текущей даты истечения
+ new_expiry_time = int(expiry_time + timedelta(days=days_to_extend).total_seconds() * 1000)
- # Рассчитываем новую дату истечения
- new_expiry_time = int(expiry_time + timedelta(days=days_to_extend).total_seconds() * 1000)
+ # Стоимость продления в зависимости от выбранного плана
cost = 100 if plan == '1' else 250
balance = await get_balance(tg_id)
diff --git a/handlers/notifications.py b/handlers/notifications.py
index b8df99b2..52dbaf86 100644
--- a/handlers/notifications.py
+++ b/handlers/notifications.py
@@ -15,6 +15,16 @@ router = Router()
class NotificationStates(StatesGroup):
waiting_for_notification_text = State()
+import asyncpg
+from datetime import datetime, timedelta
+from aiogram import Bot
+from aiogram import Router, types
+from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
+from bot import bot
+from config import DATABASE_URL
+
+router = Router()
+
async def notify_expiring_keys(bot: Bot):
try:
conn = await asyncpg.connect(DATABASE_URL)
@@ -22,7 +32,7 @@ async def notify_expiring_keys(bot: Bot):
# Получаем все ключи, которые истекают в течение следующих 10 часов
threshold_time = (datetime.utcnow() + timedelta(hours=10)).timestamp() * 1000 # В миллисекундах
records = await conn.fetch('''
- SELECT tg_id, email, expiry_time FROM keys
+ SELECT tg_id, email, expiry_time, client_id FROM keys
WHERE expiry_time <= $1 AND expiry_time > $2
''', threshold_time, datetime.utcnow().timestamp() * 1000)
@@ -30,17 +40,24 @@ async def notify_expiring_keys(bot: Bot):
tg_id = record['tg_id']
email = record['email']
expiry_time = record['expiry_time']
+
+ # Рассчитываем оставшееся время и уменьшаем его на 3 часа
+ time_left = (expiry_time / 1000) - datetime.utcnow().timestamp()
+ hours_left = max(0, int(time_left // 3600) - 3)
+
expiry_date = datetime.utcfromtimestamp(expiry_time / 1000).strftime('%Y-%m-%d %H:%M:%S')
-
- # Создаем клавиатуру с кнопкой "Пополнить баланс"
+
+ # Создаем клавиатуру с выбором тарифов
keyboard = InlineKeyboardMarkup(inline_keyboard=[
+ [InlineKeyboardButton(text='1 месяц (100 руб.)', callback_data=f'renew_plan|1|{record["client_id"]}')],
+ [InlineKeyboardButton(text='3 месяца (250 руб.)', callback_data=f'renew_plan|3|{record["client_id"]}')],
[InlineKeyboardButton(text='Пополнить баланс', callback_data='replenish_balance')]
])
- message = f"Ваш ключ {email} истечет {expiry_date}. Пожалуйста, продлите его."
+ message = f"Ваш ключ {email} истечет через {hours_left} часов ({expiry_date}). Пожалуйста, продлите его."
await bot.send_message(chat_id=tg_id, text=message, parse_mode='HTML', reply_markup=keyboard)
- # Получаем все истекшие ключи
+ # Обрабатываем истекшие ключи
expired_records = await conn.fetch('''
SELECT tg_id, email FROM keys
WHERE expiry_time <= $1
@@ -49,9 +66,10 @@ async def notify_expiring_keys(bot: Bot):
for record in expired_records:
tg_id = record['tg_id']
email = record['email']
-
- # Создаем клавиатуру с кнопкой "Пополнить баланс"
+
keyboard = InlineKeyboardMarkup(inline_keyboard=[
+ [InlineKeyboardButton(text='1 месяц (100 руб.)', callback_data=f'renew_plan|1|{record["client_id"]}')],
+ [InlineKeyboardButton(text='3 месяца (250 руб.)', callback_data=f'renew_plan|3|{record["client_id"]}')],
[InlineKeyboardButton(text='Пополнить баланс', callback_data='replenish_balance')]
])