I am ashamed of what i have done but I got hl2dm to render properly with the gamestats and everything. It's for the best as it made me realize some of the things im not accounting for Signed-off-by: Pratyush Desai <pratyush.desai@liberta.casa>
95 lines
4.4 KiB
Python
95 lines
4.4 KiB
Python
from django.shortcuts import render, get_object_or_404
|
|
from .models import Game, Server
|
|
from .utils import a2s_query
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
PROTOCOL_FUNCTION_MAP = {
|
|
'a2s': a2s_query,
|
|
# Add other protocols here -> 'quake2': query_quake2, etc.
|
|
}
|
|
|
|
|
|
def home(request):
|
|
"""Display the home page with links to other views."""
|
|
games = Game.objects.all() # Fetch all games
|
|
return render(request, 'webpanel/home.html', {'games': games})
|
|
|
|
def games(request):
|
|
games = Game.objects.all()
|
|
return render(request, 'webpanel/games.html', {'games': games})
|
|
|
|
def game_detail(request, game_name):
|
|
logger.info(f"Accessing game detail for: {game_name}") # Use logger.info or logger.debug
|
|
game = get_object_or_404(Game, name__iexact=game_name) # Use iexact for case-insensitivity
|
|
|
|
query_protocol = getattr(game, 'query_protocol', 'none') # Safely get protocol
|
|
query_function = PROTOCOL_FUNCTION_MAP.get(query_protocol)
|
|
default_port_key = getattr(game, 'default_query_port_key', None) # Safely get port key
|
|
|
|
if not query_function:
|
|
logger.debug(f"Live query disabled for game '{game.name}' (protocol '{query_protocol}' not mapped or 'none').")
|
|
elif not default_port_key:
|
|
logger.warning(f"Live query configured for '{game.name}' (protocol '{query_protocol}') but 'Default query port key' is not set in Game model.")
|
|
else:
|
|
logger.debug(f"Live query configured for '{game.name}': Protocol='{query_protocol}', Port Key='{default_port_key}'")
|
|
servers_queryset = Server.objects.filter(game=game)
|
|
|
|
active_server_list = []
|
|
dormant_server_list = []
|
|
|
|
for server in servers_queryset:
|
|
server.sync_status()
|
|
server.live_stats = None
|
|
|
|
if server.status == 'online' and a2s_query and default_port_key:
|
|
logger.debug(f"Server '{server.name}' is online, attempting query using protocol '{query_protocol}'.")
|
|
|
|
query_port_host = None
|
|
port_keys_to_try = [default_port_key]
|
|
if '/' in default_port_key:
|
|
port_keys_to_try.append(default_port_key.split('/')[0]) # Try without /udp suffix
|
|
|
|
for key in port_keys_to_try:
|
|
if isinstance(server.port, dict) and key in server.port: # Check if server.port is a dict
|
|
try:
|
|
query_port_host = int(server.port[key])
|
|
logger.debug(f"Found host query port {query_port_host} using key '{key}'.")
|
|
break
|
|
except (ValueError, TypeError):
|
|
logger.warning(f"Invalid port value '{server.port[key]}' for key '{key}' in server '{server.name}'.")
|
|
query_port_host = None
|
|
|
|
if query_port_host is None:
|
|
logger.warning(f"Could not find host port for key '{default_port_key}' (or fallback) in server '{server.name}'. Port data: {server.port}")
|
|
|
|
ip_to_query = server.ip_address
|
|
if not ip_to_query or ip_to_query in ["0.0.0.0", "::"]:
|
|
ip_to_query = "127.0.0.1" # Default to localhost
|
|
logger.debug(f"Using IP {ip_to_query} for query.")
|
|
|
|
if ip_to_query and query_port_host is not None:
|
|
try:
|
|
logger.info(f"Querying {game.name} server '{server.name}' at {ip_to_query}:{query_port_host}")
|
|
server.live_stats = a2s_query(ip=ip_to_query, port=query_port_host) # Call the mapped function
|
|
if server.live_stats:
|
|
logger.info(f"Query successful for '{server.name}'.") # Add more detail if needed
|
|
else:
|
|
logger.warning(f"Query returned no data for '{server.name}'.")
|
|
except Exception as e:
|
|
logger.error(f"Error querying server '{server.name}': {e}", exc_info=True)
|
|
server.live_stats = None # Ensure it's None on error
|
|
else:
|
|
logger.warning(f"Skipping query for '{server.name}': Missing IP or Host Port.")
|
|
|
|
if server.status == 'online':
|
|
active_server_list.append(server)
|
|
else:
|
|
dormant_server_list.append(server)
|
|
|
|
return render(request, 'webpanel/game_detail.html', {
|
|
'game': game,
|
|
'active_servers': active_server_list, # Use the list we built
|
|
'dormant_servers': dormant_server_list # Use the list we built
|
|
}) |