ORM update and lots of improvements

This commit is contained in:
Vladless
2025-05-24 19:30:23 +03:00
parent d2d6ba1be9
commit d4d2ff1867
106 changed files with 7634 additions and 5279 deletions
+21 -10
View File
@@ -1,11 +1,11 @@
import asyncio
import re
from datetime import datetime, timedelta
from aiogram.types import InlineKeyboardButton
from aiogram.utils.keyboard import InlineKeyboardBuilder
from ping3 import ping
from sqlalchemy.ext.asyncio import AsyncSession
from bot import bot
from config import ADMIN_ID, PING_TIME
@@ -13,7 +13,6 @@ from database import get_servers
from handlers.admin.servers.keyboard import AdminServerCallback
from logger import logger
last_ping_times = {}
last_down_times = {}
notified_servers = set()
@@ -63,17 +62,19 @@ async def notify_admin(server_name: str, status: str, down_duration: timedelta =
message = f"✅ <b>Сервер '{server_name}' снова в сети!</b>\n\n⏳ Время простоя: {downtime}."
for admin_id in ADMIN_ID:
logger.info(f"📨 Отправляем уведомление '{status}' администратору {admin_id} о сервере {server_name}")
logger.info(
f"📨 Отправляем уведомление '{status}' администратору {admin_id} о сервере {server_name}"
)
await bot.send_message(admin_id, message, reply_markup=builder.as_markup())
async def check_servers():
async def check_servers(session: AsyncSession):
"""
Периодическая проверка серверов.
Использует asyncio.gather() для ускорения.
"""
while True:
servers = await get_servers()
servers = await get_servers(session=session)
current_time = datetime.now()
tasks = []
@@ -96,7 +97,9 @@ async def check_servers():
restored_servers = set()
online_servers = set()
for (server_name, server_host), result in zip(server_info_list, results, strict=False):
for (server_name, server_host), result in zip(
server_info_list, results, strict=False
):
is_online = bool(result) if not isinstance(result, Exception) else False
if is_online:
@@ -118,7 +121,9 @@ async def check_servers():
last_ping_times[server_name] = current_time
last_down_times[server_name] = current_time
if last_ping_time and (current_time - last_ping_time > timedelta(seconds=PING_TIME * 3)):
if last_ping_time and (
current_time - last_ping_time > timedelta(seconds=PING_TIME * 3)
):
if server_name not in notified_servers:
logger.warning(
f"🚨 Уведомление: сервер {server_name} не отвечает более {PING_TIME * 3} секунд!"
@@ -131,12 +136,18 @@ async def check_servers():
all_servers = {name for name, _ in server_info_list}
true_offline_servers = all_servers - online_servers
logger.info(f"✅ Доступно серверов: {len(online_servers)}, ❌ Недоступно: {len(true_offline_servers)}")
logger.info(
f"✅ Доступно серверов: {len(online_servers)}, ❌ Недоступно: {len(true_offline_servers)}"
)
if true_offline_servers:
logger.warning(f"🚨 Не отвечает {len(true_offline_servers)} серверов: {', '.join(true_offline_servers)}")
logger.warning(
f"🚨 Не отвечает {len(true_offline_servers)} серверов: {', '.join(true_offline_servers)}"
)
if restored_servers:
logger.info(f"✅ Восстановились {len(restored_servers)} серверов: {', '.join(restored_servers)}")
logger.info(
f"✅ Восстановились {len(restored_servers)} серверов: {', '.join(restored_servers)}"
)
await asyncio.sleep(PING_TIME)