feat: auto delete server if it is inactive for more than 5 minutes, minor fix

This commit is contained in:
2025-07-18 20:34:11 +05:00
parent 7e4e2c0bad
commit 259e3c373b
7 changed files with 126 additions and 5 deletions

View File

@ -20,6 +20,10 @@ class CommandService:
}
print(f"[{datetime.now()}] Добавлена команда: {command_data.command} "
f"для сервера {command_data.server_ip}")
# Обновляем last_activity для сервера
await self._update_server_activity(command_data.server_ip)
return {"status": "success", "command_id": command_id}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
@ -47,3 +51,14 @@ class CommandService:
return {"status": "success", "commands": commands}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
async def _update_server_activity(self, server_ip):
"""Обновляет время последней активности для сервера"""
from app.db.database import db
game_servers_collection = db.game_servers
await game_servers_collection.update_one(
{"ip": server_ip},
{"$set": {"last_activity": datetime.utcnow()}},
upsert=False # Не создаем новый сервер, только обновляем существующий
)

View File

@ -101,11 +101,18 @@ class EventService:
"port": 25565, # Стандартный порт Minecraft
"description": f"Minecraft server {server_ip}",
"max_players": 100,
"registered_at": datetime.utcnow()
"registered_at": datetime.utcnow(),
"last_activity": datetime.utcnow() # Добавляем поле last_activity
}
await game_servers_collection.insert_one(server_data)
print(f"[{datetime.utcnow()}] Зарегистрирован новый сервер: {server_ip}")
else:
# Обновляем активность существующего сервера
await game_servers_collection.update_one(
{"ip": server_ip},
{"$set": {"last_activity": datetime.utcnow()}}
)
return existing_server or await game_servers_collection.find_one({"ip": server_ip})
@ -114,11 +121,18 @@ class EventService:
from app.db.database import db
online_players_collection = db.online_players
game_servers_collection = db.game_servers
# Получаем ID сервера
server = await self._register_server(server_ip, {})
server_id = server["id"]
# Обновляем время активности сервера
await game_servers_collection.update_one(
{"id": server_id},
{"$set": {"last_activity": datetime.utcnow()}}
)
# Помечаем всех игроков как оффлайн на этом сервере
await online_players_collection.update_many(
{"server_id": server_id},

View File

@ -1,7 +1,7 @@
from fastapi import HTTPException
from app.db.database import db, users_collection
from app.models.server.prank import PrankCommand, PrankCommandUpdate
from datetime import datetime
from datetime import datetime, timedelta
import uuid
from app.services.server.command import CommandService
@ -124,6 +124,29 @@ class PrankService:
async def get_all_servers(self):
"""Получение списка всех доступных серверов"""
# Проверяем и удаляем неактивные серверы (более 5 минут без данных)
current_time = datetime.utcnow()
inactive_threshold = 5 * 60 # 5 минут в секундах
# Находим серверы, которые не отправляли данные больше 5 минут
# Учитываем, что у некоторых серверов может не быть поля last_activity
inactive_servers = await game_servers_collection.find({
"last_activity": {
"$exists": True,
"$lt": current_time - timedelta(seconds=inactive_threshold)
}
}).to_list(100)
# Удаляем неактивные серверы
if inactive_servers:
server_ids = [server["id"] for server in inactive_servers]
await game_servers_collection.delete_many({"id": {"$in": server_ids}})
# Опционально: логирование удаленных серверов
for server in inactive_servers:
print(f"Удален неактивный сервер: {server['name']} (ID: {server['id']})")
# Получаем актуальный список серверов
servers = await game_servers_collection.find().to_list(100)
# Если нет зарегистрированных серверов, вернем пустой список
@ -144,7 +167,8 @@ class PrankService:
"port": server.get("port"),
"description": server.get("description", ""),
"online_players": online_count,
"max_players": server.get("max_players", 0)
"max_players": server.get("max_players", 0),
"last_activity": server.get("last_activity")
})
return result