from ._base import * from .pages import check_server_status, get_online_characters_count from .auth import _set_game_account_session # Endpoints JSON que alimentan las islas React/TSX del frontend (Vite). # Se montan bajo /api/ (fuera de i18n_patterns). De momento con JsonResponse; # si crece la superficie de la API se puede introducir DRF. def home_news_api(request): """Últimas noticias para la isla de la portada.""" noticias = Noticia.objects.order_by('-fecha_publicacion')[:50] data = [ { "id": n.id, "titulo": n.titulo, "fecha": n.fecha_publicacion.isoformat() if n.fecha_publicacion else None, "contenido": n.contenido, "enlace": n.enlace or None, } for n in noticias ] return JsonResponse({"noticias": data}) def home_status_api(request): """Estado del servidor para la isla de la portada (nombre, online, login, dirección).""" server = ServerSelection.objects.first() online = get_online_characters_count() status = "Online" if (server and check_server_status(server.address, server.port)) else "Offline" expansion = server.expansion if server else "Unknown" return JsonResponse( { "server_name": server.name if server else None, "address": server.address if server else None, "expansion": expansion, "online_characters": online, "status": status, } ) def account_select_api(request): """Selecciona la cuenta de juego de la bnet en sesión (isla del selector). Vía GET (sin POST): es idempotente y solo permite elegir cuentas ligadas a la propia cuenta Battle.net de la sesión, así que no expone nada de otros usuarios. """ bnet_id = request.session.get('bnet_id') if not bnet_id: return JsonResponse({"success": False, "error": "No autenticado"}, status=401) try: selected_id = int(request.GET.get("account_id", "")) except (TypeError, ValueError): return JsonResponse({"success": False, "error": "Cuenta no válida"}) with connections['acore_auth'].cursor() as cursor: accounts = bnet.get_game_accounts_for_bnet(cursor, bnet_id) chosen = next((g for g in accounts if g["id"] == selected_id), None) if not chosen: return JsonResponse({"success": False, "error": "Cuenta de juego no válida."}) _set_game_account_session(request, chosen) return JsonResponse({"success": True, "redirect": reverse("my-account")})