ORM update and lots of improvements
This commit is contained in:
+21
-10
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user