82 lines
4.0 KiB
Python
82 lines
4.0 KiB
Python
from datetime import datetime, timedelta
|
|
import asyncpg
|
|
from aiogram import Bot, Router, types
|
|
from aiogram.filters import Command
|
|
from aiogram.fsm.state import State, StatesGroup
|
|
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
|
from auth import login_with_credentials
|
|
from bot import bot
|
|
from client import delete_client, extend_client_key
|
|
from config import ADMIN_ID, ADMIN_PASSWORD, ADMIN_USERNAME, DATABASE_URL
|
|
from database import get_balance, update_balance
|
|
|
|
router = Router()
|
|
|
|
class NotificationStates(StatesGroup):
|
|
waiting_for_notification_text = State()
|
|
|
|
async def notify_expiring_keys(bot: Bot):
|
|
try:
|
|
conn = await asyncpg.connect(DATABASE_URL)
|
|
try:
|
|
current_time = datetime.utcnow().timestamp() * 1000
|
|
threshold_time_10h = (datetime.utcnow() + timedelta(hours=10)).timestamp() * 1000
|
|
threshold_time_24h = (datetime.utcnow() + timedelta(days=1)).timestamp() * 1000
|
|
|
|
# Уведомления за 10 часов
|
|
records = 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_10h, current_time)
|
|
|
|
for record in records:
|
|
tg_id = record['tg_id']
|
|
email = record['email']
|
|
expiry_time = record['expiry_time']
|
|
server_id = record['server_id']
|
|
|
|
# Логика формирования и отправки сообщения для уведомлений за 10 часов
|
|
message = f"🔔 Уведомление: Ваш ключ для сервера {server_id} истекает через 10 часов.\n" \
|
|
f"Email: {email}\n" \
|
|
f"Дата истечения: {datetime.utcfromtimestamp(expiry_time / 1000).strftime('%Y-%m-%d %H:%M:%S')}"
|
|
|
|
await bot.send_message(tg_id, message)
|
|
|
|
# Обновление статуса уведомления
|
|
await conn.execute('UPDATE keys SET notified = TRUE WHERE client_id = $1', record['client_id'])
|
|
|
|
# Уведомления за 24 часа
|
|
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, current_time)
|
|
|
|
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)
|
|
|
|
# Логика формирования и отправки сообщения для уведомлений за 24 часа
|
|
message_24h = f"⏳ Уведомление: Ваш ключ для сервера {server_id} истекает через 24 часа.\n" \
|
|
f"Email: {email}\n" \
|
|
f"Осталось времени: {hours_left} часов\n" \
|
|
f"Дата истечения: {expiry_date}\n" \
|
|
f"Баланс: {balance:.2f} руб."
|
|
|
|
await bot.send_message(tg_id, message_24h)
|
|
|
|
# Обновление статуса уведомления за 24 часа
|
|
await conn.execute('UPDATE keys SET notified_24h = TRUE WHERE client_id = $1', record['client_id'])
|
|
|
|
finally:
|
|
await conn.close()
|
|
except Exception as e:
|
|
print(f"Ошибка при отправке уведомлений: {e}")
|