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')] ])