Files
monitor-bot/bot_handlers.py
2025-12-14 22:45:11 +02:00

78 lines
2.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from aiogram import Router
from aiogram.filters import Command
from aiogram.types import Message
from activity import ChatActivityTracker
from status_service import MinecraftMonitor, ServerSnapshot
router = Router()
def format_snapshot(snapshot: ServerSnapshot) -> str:
if not snapshot.online:
return "⚠️ Сервер офлайн."
motd_line = f"Опис: {snapshot.motd}" if snapshot.motd else None
players_line = (
f"Гравців: {snapshot.players_online}/{snapshot.players_max}"
if snapshot.players_max
else f"Гравців онлайн: {snapshot.players_online}"
)
latency_line = (
f"Затримка: {round(snapshot.latency_ms, 1)} мс"
if snapshot.latency_ms is not None
else None
)
names_line = (
"Зараз на сервері: " + ", ".join(snapshot.player_names)
if snapshot.player_names
else "На сервері немає гравців."
)
lines = [
"✅ Сервер онлайн.",
motd_line,
f"Версія: {snapshot.version or 'невідомо'}",
players_line,
names_line,
latency_line,
]
return "\n".join([line for line in lines if line])
def setup_handlers(monitor: MinecraftMonitor, activity: ChatActivityTracker) -> Router:
@router.message(Command("start"))
async def handle_start(message: Message) -> None:
if not message.from_user or message.from_user.is_bot:
return
activity.record_user_activity()
await message.answer(
"Привіт! Я стежу за станом Minecraft сервера.\n"
"Використовуй /status, щоб отримати поточну інформацію."
)
@router.message(Command("status"))
async def handle_status(message: Message) -> None:
if message.from_user and not message.from_user.is_bot:
activity.record_user_activity()
snapshot = monitor.read_cached_snapshot()
if snapshot is None:
snapshot = await monitor.fetch_status()
if snapshot is None:
await message.answer("Дані недоступні.")
return
response = await message.answer(format_snapshot(snapshot))
activity.record_bot_message(response.message_id)
@router.message()
async def track_any_message(message: Message) -> None:
# Фиксируем любой трафик в чате, чтобы при следующем уведомлении не затирать историю.
if message.from_user and not message.from_user.is_bot:
activity.record_user_activity()
return router