{% extends "online/base.html" %} {% block title %}Administración{% endblock %} {% block content %}

PANEL DEL SERVIDOR

Administración

Gestión auditada de universos, jugadores, moderación, colaboradores, privacidad y comercio.

{% if admin_section == "dashboard" %}

Estado del servicio

{% if stats.staff_without_mfa %}
{{ stats.staff_without_mfa }} cuentas del equipo no han activado todavía la verificación en dos pasos.
{% endif %}
Cuentas{{ stats.accounts }}
Activas en 5 minutos{{ stats.online }}
Universos{{ stats.universes }}
Reportes pendientes{{ stats.reports }}
Compras a revisar{{ stats.review_purchases }}
Capturado{{ "%.2f"|format(stats.revenue_cents / 100) }}

Reportes recientes

{% for report in admin_reports %}

#{{ report.id }} {{ report.subject }} — {{ report.username }} — {{ report.priority }}

{% else %}

No hay reportes urgentes.

{% endfor %}

Actividad reciente

{% for item in recent_actions %}

{{ item.created_at|date_label }} — {{ item.username or "cuenta eliminada" }} — {{ item.endpoint }} — HTTP {{ item.result_status }}

{% else %}

No hay actividad registrada.

{% endfor %}
{% elif admin_section == "universes" %}

Crear un universo administrado

Puede ser solo humano, solo IA o mixto. Los jugadores humanos comienzan con el mismo perfil inicial que una IA normal.

El servidor no impone topes de plazas, IA, granjas, galaxias ni sistemas. El administrador debe dimensionar el hardware y dar al universo espacio suficiente para todos sus imperios.

Universos existentes

{% for item in universes %}{% endfor %}
UniversoEstadoHumanosIAGranjasTipoIdioma
{{ item.row.name }}{{ item.row.status }}{{ item.counts.humans or 0 }}{{ item.counts.ais or 0 }}{{ item.counts.farms or 0 }}{{ UNIVERSE_ACCESS_MODES.get(item.config.access_mode, "Local o anterior") }}{{ "Mixto" if item.config.language_policy != "single" else LANGUAGES.get(item.config.communication_language or "es", LANGUAGES.es).native_name }}
{% elif admin_section == "universe_detail" %}

Volver a universos

UNIVERSO #{{ game.id }}

{{ game.name }}

Estado
{{ game.status }}
Velocidad
×{{ game.speed }}
Tamaño
{{ game_config.galaxy_count or 1 }} galaxias × {{ game.galaxy_size }} sistemas
Modo fuera de línea
{{ game_config.offline_mode }}

En un universo de un solo idioma, la interfaz sigue la preferencia personal, pero informes, avisos y comunicación se generan en el idioma indicado.

Reglas avanzadas y futuras

Editor completo del objeto de reglas. Conserva automáticamente el modo administrado y admite nuevas claves que se incorporen al juego sin tener que ampliar este formulario.

Eliminar universo definitivamente

La opción está visible aunque el universo siga activo. Elimina jugadores, IA, planetas y todo su progreso. Antes se crea automáticamente una copia verificada de la base de datos.

{% if purchase_count %}

Borrado bloqueado: este universo tiene {{ purchase_count }} compras vinculadas y debe conservarse para mantener pedidos, reembolsos y auditoría.

{% else %}
{% endif %}

Ampliar universo

Sin límites artificiales. Puede añadir rivales, granjas y espacio en una sola operación.

Retirar IA

Jugadores humanos

{% if members %}
{% for member in members %}{% endfor %}
CuentaImperioEstadoPlanetasPuntos
{{ member.username }}{{ member.empire_name }}{{ member.status }}{{ member.planet_count }}{{ member.score|number }}
{% else %}

Sin jugadores humanos.

{% endif %}

Imperios IA

{% if ais %}
{% for ai in ais %}{% endfor %}
ImperioComandanteTipoPlanetasPuntos
{{ ai.name }}{{ ai.commander }}{{ "Granja" if ai.is_farm_world else "Rival" }}{{ ai.planet_count }}{{ ai.score|number }}
{% endif %}
{% elif admin_section == "players" %}

Jugadores

{% if 'player.moderate' in permissions %}
Crear una cuenta manualmente
{% endif %}

{{ total_players }} cuentas encontradas. Página {{ player_page }} de {{ player_pages }}.

{% for item in players %}{% endfor %}
UsuarioCorreoEstadoUniversosRolÚltima actividad
{{ item.username }}{{ item.email }}{{ ACCOUNT_STATUSES.get(item.status, item.status) }}{{ item.universe_count }}{{ ROLE_LABELS.get(item.staff_role, "Jugador") }}{{ item.last_seen_at|date_label if item.last_seen_at else "Nunca" }}
{% elif admin_section == "player_detail" %}

Volver a jugadores

CUENTA #{{ player.id }}

{{ player.username }}

Correo
{{ player.email }}
Correo verificado
{{ "Sí" if player.email_verified else "No" }}
Estado
{{ ACCOUNT_STATUSES.get(player.status, player.status) }}
Registro
{{ player.created_at|date_label }}
Último acceso
{{ player.last_login_at|date_label if player.last_login_at else "Nunca" }}
Nota de moderación
{{ player.moderation_note or "Sin nota" }}
{% if 'player.moderate' in permissions %}

Identidad de la cuenta

Estado de la cuenta

Seguridad

{% if not player.email_verified %}
{% endif %}

Medidas de moderación

Permite advertencias, suspensiones y expulsiones globales o limitadas a un universo, temporales o permanentes. El motivo público explica la decisión al jugador y el interno conserva el contexto del equipo.

Historial de medidas

{% for sanction in sanctions %}

#{{ sanction.id }} — {{ sanction.sanction_type }} — {{ sanction.game_name or "cuenta completa" }}

{{ sanction.public_reason }}

Aplicada por {{ sanction.creator_name or "sistema" }} el {{ sanction.created_at|date_label }}. {% if sanction.expires_at %}Caduca: {{ sanction.expires_at|date_label }}.{% else %}Sin caducidad.{% endif %} {% if sanction.revoked_at %}Revocada por {{ sanction.revoker_name or "sistema" }}: {{ sanction.revocation_reason }}{% endif %}

{% if not sanction.revoked_at %}
{% endif %}
{% else %}

No hay medidas registradas.

{% endfor %}
{% if 'settings.manage' in permissions and player.id != account.id %}

Pseudonimizar y cerrar la cuenta

Utiliza esta operación solo después de verificar una solicitud de supresión y las obligaciones de conservación. Retira correo, credenciales, segundo factor, sesiones, roles y nombres de imperios; conserva referencias contables pseudónimas.

{% endif %} {% endif %}

Membresías

{% if 'player.moderate' in permissions and available_games %}
Incorporar manualmente a otro universo

La administración puede incorporar la cuenta aunque el registro del universo esté cerrado; debe existir espacio físico para el planeta.

{% endif %}
{% for membership in memberships %}

{{ membership.game_name }}

{{ membership.empire_name }} — {{ membership.score|number }} puntos — {{ membership.status }}

{% if 'player.moderate' in permissions %}
Transferir imperio a otra cuenta
{% endif %}
{% endfor %}
{% if 'player.moderate' in permissions %}

Ajuste administrativo de recursos

Puede sumar, retirar o fijar una cantidad exacta. Los valores nunca quedan por debajo de cero y toda modificación queda auditada.

{% endif %} {% if 'player.moderate' in permissions %}

Editor administrativo de progreso

Permite reparar estados o conceder contenido. No procesa un pago y todas las acciones quedan auditadas.

Fijar edificio o tecnología

{% for key in BUILDINGS %}

Ajustar naves o defensas

{% for key in SHIPS %}

Propiedades de planetas

Cada formulario parte de los valores reales del planeta y permite cambiar nombre, tamaño, clima, población y ecología.

{% for planet in player_planets %}
{{ planet.game_name }} — {{ planet.name }} — {{ planet.fields_max }} campos
{% endfor %}

Crear, editar o retirar lunas

{% for planet in player_planets %}
{{ planet.game_name }} — {{ planet.name }} — {{ "con luna" if planet.moon_id else "sin luna" }}
{% endfor %}
{% endif %}

Últimas acciones

{% for item in player_actions %}{% endfor %}
FechaAcciónResultadoUniverso
{{ item.created_at|date_label }}{{ item.endpoint }}HTTP {{ item.result_status }}{{ item.game_id or "—" }}

Compras

{% for item in purchases %}{% endfor %}
PedidoProductoImporteEstado
#{{ item.id }}{{ item.product_name }}{{ "%.2f"|format(item.amount_cents / 100) }} {{ item.currency }}{{ item.status }}
{% elif admin_section == "reports" %}

Expedientes de moderación y soporte

{% for report in admin_reports %}{% endfor %}
ExpedienteAsuntoReportaSeñaladoEstadoPrioridadResponsable
#{{ report.id }}{{ report.subject }}{{ report.reporter_username }}{{ report.target_username or "—" }}{{ report.status }}{{ report.priority }}{{ report.assigned_username or "Sin asignar" }}
{% elif admin_section == "report_detail" %}

Volver a reportes

EXPEDIENTE #{{ report.id }}

{{ report.subject }}

Reporta
{{ report.reporter_username }}
Señalado
{{ report.target_username or "Nadie" }}
Universo
{{ report.game_name or "General" }}
Categoría
{{ REPORT_CATEGORIES.get(report.category, report.category) }}
Descripción
{{ report.description }}
Evidencias
{{ report.evidence or "Sin referencias" }}

Mensajes del expediente

{% for message in report_messages %}

{{ message.username or "Sistema" }}{% if message.internal %} — nota interna{% endif %}

{{ message.body }}

{{ message.created_at|date_label }}
{% endfor %}
{% elif admin_section == "staff" %}

Asignar colaborador

Los roles aportan permisos predeterminados. Los permisos marcados se añaden de forma explícita.

Permisos explícitos adicionales{% for key, label in PERMISSIONS.items() %}{% endfor %}

Equipo actual

{% for item in staff %}{% endfor %}
CuentaCorreoRolActivoSegundo factorPermisos adicionales
{{ item.username }}{{ item.email }}{{ ROLE_LABELS.get(item.role, item.role) }}{{ "Sí" if item.active else "No" }}{{ "Activo" if item.totp_enabled else "Pendiente" }}{{ item.permissions_json }}
{% elif admin_section == "operations" %}

Estado operativo

Base de datos{{ operational_stats.database_bytes|number }} bytes
Cuentas{{ operational_stats.accounts }}
Activas en 5 minutos{{ operational_stats.active_5m }}
Webhooks pendientes o fallidos{{ operational_stats.failed_webhooks }}
Compras a revisar{{ operational_stats.review_purchases }}
Reportes abiertos{{ operational_stats.open_reports }}

Mantenimiento global

Los colaboradores conservan acceso al panel mientras los jugadores reciben un estado HTTP 503 y el mensaje indicado.

Integridad y copias

Copias recientes

Exportaciones administrativas CSV

Los archivos omiten contraseñas, secretos de segundo factor y credenciales de PayPal. Se neutralizan fórmulas para una apertura segura en hojas de cálculo.

{% elif admin_section == "settings" %}

Identidad, registro y textos públicos

Publicar también un aviso

Avisos publicados

{% for item in announcements %}

{{ item.title }}

{{ item.body }}

{{ item.severity }} — {{ item.created_at|date_label }} — {{ "activo" if item.active else "inactivo" }}
{% else %}

No hay avisos.

{% endfor %}
{% elif admin_section == "commerce" %}

Configuración de PayPal

El secreto se cifra con la clave de pagos del servidor y nunca vuelve a mostrarse. Configurado: {{ "sí" if payment.secret_configured else "no" }}.

Crear producto

{% set product = none %}{% include "online/_product_form.html" %}

Productos

{% for product in products %}
{{ product.sku }} — {{ product.name }} — {{ "%.2f"|format(product.price_cents / 100) }} {{ product.currency }} — {% if product.archived_at %}archivado{% elif product.active %}activo{% else %}inactivo{% endif %}{% include "online/_product_form.html" %}
{% if product.archived_at %}{% else %}{% endif %}
{% endfor %}

Pedidos recientes

{% for item in purchases %}{% endfor %}
PedidoJugadorProducto y destinoImporteEstadoAcciones
#{{ item.id }}{{ item.username }}{{ item.product_name }}
{% if item.planet_id %}Planeta #{{ item.planet_id }} {{ item.target_planet_name or "no disponible" }}{% else %}Imperio #{{ item.empire_id }}{% endif %}
{{ "%.2f"|format(item.amount_cents / 100) }} {{ item.currency }}{{ item.status }}{% if item.error_message %}
{{ item.error_message }}{% endif %}

Webhooks de PayPal

Historial de recepción, verificación y procesamiento para investigar entregas, reembolsos y eventos fallidos.

{% for item in webhooks %}{% else %}{% endfor %}
EventoTipoRecibidoVerificadoProcesadoError
{{ item.event_id }}{{ item.event_type }}{{ item.received_at|date_label }}{{ "Sí" if item.verified else "No" }}{{ "Sí" if item.processed else "No" }}{{ item.error_message or "—" }}
Todavía no se han recibido webhooks.
{% elif admin_section == "privacy" %}

Solicitudes de privacidad

{% for item in privacy_requests %}

#{{ item.id }} — {{ item.username }} — {{ PRIVACY_REQUEST_TYPES.get(item.request_type, item.request_type) }}

{{ item.details or "Sin detalles adicionales." }}

{% else %}

No hay solicitudes.

{% endfor %}
{% elif admin_section == "audit" %}

Registro administrativo

Últimas mil acciones coincidentes. Los registros identifican quién hizo qué, sobre qué objeto, cuándo y en qué universo. La exportación completa está en Operaciones.

{% for item in audit_logs %}{% endfor %}
FechaResponsableAcciónObjetoUniversoResumen
{{ item.created_at|date_label }}{{ item.username or "Sistema" }}{{ item.action }}{{ item.object_type }} {{ item.object_id }}{{ item.game_id or "—" }}{{ item.summary }}
{% endif %} {% endblock %}