diff --git a/database.py b/database.py index 4565250f..b50d1896 100644 --- a/database.py +++ b/database.py @@ -160,6 +160,12 @@ async def handle_referral_on_balance_update(tg_id: int, amount: float): # Начисляем бонус (25% от платежа) пригласившему bonus = amount * 0.25 # 25% от платежа + + # Проверяем, чтобы бонус не был отрицательным + if bonus < 0: + bonus = 0 + + # Обновляем баланс пригласившего await update_balance(referrer_tg_id, bonus) # Обновляем статус бонуса для пригласившего diff --git a/handlers/notifications.py b/handlers/notifications.py index bf4a8db6..c5f9b4ee 100644 --- a/handlers/notifications.py +++ b/handlers/notifications.py @@ -8,9 +8,9 @@ from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup from auth import login_with_credentials from bot import bot -from client import delete_client +from client import delete_client, extend_client_key from config import ADMIN_ID, ADMIN_PASSWORD, ADMIN_USERNAME, DATABASE_URL -from database import get_balance +from database import get_balance, update_balance router = Router() @@ -34,7 +34,7 @@ async def notify_expiring_keys(bot: Bot): server_id = record['server_id'] time_left = (expiry_time / 1000) - datetime.utcnow().timestamp() - hours_left = max(0, int(time_left // 3600) - 3) + 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) @@ -76,24 +76,48 @@ async def notify_expiring_keys(bot: Bot): client_id = record['client_id'] server_id = record['server_id'] - await conn.execute('DELETE FROM keys WHERE client_id = $1', client_id) + balance = await get_balance(tg_id) - session = await login_with_credentials(server_id, ADMIN_USERNAME, ADMIN_PASSWORD) - await delete_client(session, server_id, client_id) + if balance >= 100: + # Продлеваем ключ на 1 месяц и списываем 100 рублей + new_expiry_time = datetime.utcnow() + timedelta(days=30) + await conn.execute(''' + UPDATE keys SET expiry_time = $1 WHERE client_id = $2 + ''', new_expiry_time.timestamp() * 1000, client_id) - keyboard = InlineKeyboardMarkup(inline_keyboard=[ - [InlineKeyboardButton(text='В профиль', callback_data='view_profile')] - ]) + # Списываем 100 рублей с баланса + await update_balance(tg_id, -100) - message = f"Ваш ключ {email} истек , через 3 часа будет удалён." + session = await login_with_credentials(server_id, ADMIN_USERNAME, ADMIN_PASSWORD) + await extend_client_key(session, server_id, client_id, 30) - try: - await bot.send_message(chat_id=tg_id, text=message, parse_mode='HTML', reply_markup=keyboard) - except Exception as e: - print(f"Ошибка при отправке сообщения пользователю {tg_id}: {e}. Пропускаем этого пользователя.") + message = (f"Ваш ключ {email} был автоматически продлен на 1 месяц, так как у вас на балансе было достаточно средств. " + f"Новый срок истечения: {new_expiry_time.strftime('%Y-%m-%d %H:%M:%S')}.\n" + f"Ваш новый баланс: {balance - 100:.2f} руб.") + + try: + await bot.send_message(chat_id=tg_id, text=message, parse_mode='HTML') + except Exception as e: + print(f"Ошибка при отправке сообщения пользователю {tg_id}: {e}. Пропускаем этого пользователя.") + else: + # Удаляем ключ, если баланс недостаточный + await conn.execute('DELETE FROM keys WHERE client_id = $1', client_id) + + session = await login_with_credentials(server_id, ADMIN_USERNAME, ADMIN_PASSWORD) + await delete_client(session, server_id, client_id) + + keyboard = InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text='В профиль', callback_data='view_profile')] + ]) + + message = f"Ваш ключ {email} истек, и был удален." + + try: + await bot.send_message(chat_id=tg_id, text=message, parse_mode='HTML', reply_markup=keyboard) + except Exception as e: + print(f"Ошибка при отправке сообщения пользователю {tg_id}: {e}. Пропускаем этого пользователя.") finally: await conn.close() except Exception as e: print(f"Ошибка при отправке уведомлений: {e}") - # Импортируйте функцию, которая возвращает все соединения