## Major Features Added - **🎛️ Complete Admin Dashboard**: Real-time player monitoring with detailed stats - **👥 Player Management**: Individual and mass player kicking with proper notifications - **🎯 Global Round Control**: Advance/retreat rounds across all rooms simultaneously - **⏸️ Game Control**: Pause/resume games from admin interface - **🔔 Client Notifications**: Players receive alerts for kicks and round changes ## Technical Improvements - **🏗️ Official Colyseus API**: Replaced global variable hacks with `matchMaker.query()` and `matchMaker.remoteRoomCall()` - **📡 Proper Client Communication**: Implemented broadcast messages for `adminKicked`, `gamePaused`, `gameResumed`, `roundChanged` - **🎮 Enhanced GameRoom Methods**: Added `pauseGame()`, `resumeGame()`, `advanceRound()`, `previousRound()`, `_forceClientDisconnect()`, `_forceDisconnectAllClients()`, `getInspectData()` ## UI/UX Enhancements - **📊 Detailed Player Info**: Name, room, role, producer type, and current tokens (🦃☕🌽) - **🚫 Proper Kick Notifications**: Clients auto-redirect to home with clear messaging - **🎨 Improved Admin Interface**: Better organized controls for non-technical commentators - **📱 Responsive Design**: Works well on different screen sizes ## Bug Fixes - **🔧 Fixed Admin Service URLs**: Now correctly calls Colyseus server (port 2567) instead of admin server (port 3001) - **✅ Mass Kick Notifications**: All players receive proper notifications when expelled en masse - **🔄 Auto-redirect**: Kicked clients properly return to home screen ## Architecture - **🏗️ Clean API Design**: All admin endpoints use official Colyseus patterns - **🔒 Type Safety**: Maintained TypeScript sync between server and clients - **📦 Microservices Ready**: Separated concerns between game server and admin interface **Breaking Changes:** None - fully backward compatible **Migration:** No migration needed
9.0 KiB
9.0 KiB
Guía de Trabajo - SnatchGame
Instrucciones del Proyecto
Crear un juego multijugador para red local con:
- Servidor central usando Colyseus.io para estado compartido
- Cliente con Vue 3 + CSS + HTML vanilla
- Cliente usa Colyseus.js SDK
- Servidor y clientes en la misma red local
Estructura del Proyecto
/server/ # Servidor Colyseus.io
/client/ # Cliente Vue 3 vanilla
Stack Tecnológico
Servidor:
- Colyseus.io (framework de servidor)
- Node.js
- TypeScript
Cliente:
- Vue 3 (vanilla, sin build tools)
- HTML vanilla
- CSS vanilla
- Colyseus.js (SDK cliente)
- TypeScript
UI Administración:
- Vue 3 (vanilla, sin build tools)
- HTML vanilla
- CSS vanilla
- Colyseus.js (SDK cliente)
- TypeScript
Convenciones de Código
Lenguaje:
- Código: Inglés
- UI/Diálogos: Español
- Comentarios: Inglés
Naming Conventions:
- Variables/Funciones:
thisIsAFunction - Clases:
ThisIsAClass - Constantes globales/env:
THIS_IS_A_GLOBAL_CONSTANT
TypeScript:
- Tipado estricto en todos los componentes
- Tipos auto-generados desde servidor usando schema-codegen
- Homogeneidad de tipos entre los 3 componentes
Arquitectura - Microservicios
Desarrollo
/server/ # Servidor Colyseus.io + TypeScript (Puerto 2567)
/client/ # Cliente Vue 3 + Express server (Puerto 3000)
/admin/ # UI Admin Vue 3 + Express server (Puerto 3001)
Producción (Docker + Nginx Proxy Manager)
snatchgame-server # Contenedor servidor Colyseus
snatchgame-client # Contenedor cliente Express
snatchgame-admin # Contenedor admin Express
nginx-proxy-manager # Proxy reverso y balanceador
Enrutamiento Producción:
/→ Cliente UI/admin→ Admin UI/server→ API Servidor Colyseus
UI de Administración
Arquitectura:
- Servidor Express independiente (Puerto 3001)
- Comunicación SSE con servidor Colyseus
- Actualización de estado cada 500ms (polling)
- Una interfaz principal (múltiples conexiones opcionales)
Funcionalidades principales:
- Dashboard con estadísticas en tiempo real:
- Cantidad de jugadores conectados
- Cantidad de partidas activas
- Ronda actual del juego global
- Estados: esperando jugadores, pausa, juego terminado
- Nombres de las rondas
- Panel de control:
- Expulsar jugadores individuales y todos (con notificaciones)
- Control de rondas global (avanzar/retroceder en todas las salas)
- Pausar/reanudar juego
- Cancelar partidas de grupos específicos
- Lista de jugadores detallada:
- Nombre, sala, rol del juego y tipo de productor
- Tokens actuales (🦃 pavos, ☕ café, 🌽 maíz)
- Estado de conexión en tiempo real
- Sistema de notificaciones a clientes:
- Expulsión con redirección automática
- Cambios de ronda globales
- Pausas y reanudaciones
- Panel de debugging para IT profesional
- Transparencia total del estado del servidor
Usuarios objetivo:
- Admin no-técnico: Vista simple de estadísticas
- IT profesional: Vista detallada de debugging
- Comentaristas deportivos: Información clara para narración en vivo
Comandos Importantes
Desarrollo
- Servidor:
cd server && npm run dev(Puerto 2567) - Cliente:
cd client && npm run dev(Puerto 3000) - Admin:
cd admin && npm run dev(Puerto 3001)
Generación de Tipos TypeScript
- Manual:
cd server && npx schema-codegen src/rooms/GameRoom.ts --ts --output ../client/src/types/ - Automático (cliente):
cd client && npm run generate-types - Automático (admin):
cd admin && npm run generate-types
Testing y Debugging
- Verificar puertos libres:
lsof -i :2567,3000,3001 - Cerrar procesos:
pkill -f "ts-node-dev" && pkill -f "vite" && pkill -f "node.*server" - Cerrar procesos específicos:
kill <PID>(usar PID del proceso)
IMPORTANTE:
- ⚠️ Siempre cerrar servicios después de testing/debugging
- ⚠️ Si servicios no arrancan probablemente el usuario los levantó manualmente
- ⚠️ Verificar puertos antes de iniciar servicios para evitar conflictos
Producción
- Build Server:
cd server && npm run build - Start Server:
cd server && npm run start - Start Client:
cd client && npm run start - Start Admin:
cd admin && npm run start
Docker (Producción)
- Build:
docker-compose build - Start:
docker-compose up -d - Stop:
docker-compose down - Logs:
docker-compose logs -f [service]
Variables de Entorno
- Desarrollo:
.env.development - Producción:
.env.production
VSCode Tasks
- Ctrl+Shift+P →
Tasks: Run Task - Start Server - Ejecutar solo servidor Colyseus
- Start Client - Ejecutar solo cliente UI
- Start Admin - Ejecutar solo admin UI
- Start All Services - Ejecutar todos los servicios paralelo
- Install All Dependencies - Instalar deps de todos
- Build Server - Compilar servidor TypeScript
Gestión de Tipos TypeScript
Schema-Codegen (Colyseus)
Funcionalidad:
- Genera automáticamente tipos TypeScript desde Schema classes del servidor
- Solo funciona para clases que extienden
Schemacon decoradores@type - Mantiene sincronización perfecta entre servidor y cliente
- Es la práctica oficial recomendada por Colyseus
Comandos:
# Desde directorio server
npx schema-codegen src/rooms/GameRoom.ts --ts --output ../client/src/types/
# Desde directorio client (npm script configurado)
npm run generate-types
Archivos generados:
client/src/types/
├── Player.ts # Auto-generado desde server/src/rooms/GameRoom.ts
├── GameState.ts # Auto-generado desde server/src/rooms/GameRoom.ts
└── index.ts # Re-exports + tipos auxiliares manuales
Tipos No-Schema (Manuales)
Importante: Los tipos que NO son Schema classes deben copiarse manualmente:
Ejemplos de tipos manuales:
GameRoomOptions(interfaces para opciones)export interface(interfaces auxiliares)export type(type aliases)- Enums, constantes, utilidades
Ubicación:
- Server:
server/src/rooms/GameRoom.ts(junto a Schema classes) - Cliente:
client/src/types/index.ts(copiados manualmente) - Admin:
admin/src/types/index.ts(copiados manualmente)
Flujo de trabajo:
- Schema classes: Se auto-generan con schema-codegen
- Tipos auxiliares: Se copian manualmente cuando se añaden/modifican
- Consistencia: Usar nombres idénticos entre server y client
API Admin - Arquitectura Técnica
Endpoints Implementados
Servidor Colyseus (Puerto 2567):
GET /api/admin/stats- Estadísticas en tiempo real usandomatchMaker.query()POST /api/admin/kick-player- Expulsar jugador específico con notificaciónPOST /api/admin/kick-all-players- Expulsar todos los jugadores con notificacionesPOST /api/admin/pause-game- Pausar todas las partidas activasPOST /api/admin/resume-game- Reanudar partidas pausadasPOST /api/admin/advance-round- Avanzar ronda globalmentePOST /api/admin/previous-round- Retroceder ronda globalmentePOST /api/admin/cancel-game- Cancelar partidas específicas o todas
Métodos GameRoom Implementados
getInspectData()- Datos completos para el admin (compatible con monitor oficial)pauseGame()- Pausar juego con broadcast a clientesresumeGame()- Reanudar juego con broadcast a clientesadvanceRound()- Avanzar ronda con límite máximo 10previousRound()- Retroceder ronda con límite mínimo 1_forceClientDisconnect(sessionId)- Expulsar jugador con notificación_forceDisconnectAllClients()- Expulsar todos con notificaciones
Comunicación Cliente-Servidor
Mensajes del servidor a clientes:
adminKicked- Notificación de expulsión individualgamePaused- Notificación de pausa del juegogameResumed- Notificación de reanudación del juegoroundChanged- Notificación de cambio de ronda global
Manejo en el cliente:
- Auto-redirección a home al recibir
adminKicked - Alerts informativos para cambios de estado
- Logging detallado de eventos administrativos
Principios de Diseño
- API Oficial Colyseus: Sin hacks de variables globales
- matchMaker.query(): Acceso seguro a información de salas
- matchMaker.remoteRoomCall(): Ejecución remota de métodos
- Type Safety: Sincronización completa TypeScript
- Error Handling: Try/catch en todos los endpoints
- Graceful Notifications: Delay de 1 segundo para procesar mensajes
Notas Específicas
- Offline: Sin dependencias externas de internet
- Microservicios: Arquitectura separada por responsabilidades
- Red Local: Funciona completamente en LAN
- Monorepo: Un repositorio para todos los servicios
- Docker: Orquestación con docker-compose en producción
- Nginx Proxy Manager: Enrutamiento y balanceo de carga
- Variables de Entorno: Configuración por ambiente (.env)
- Logging: Detallado para debugging profesional
- Tipos TypeScript: Auto-generación con schema-codegen + copiar tipos auxiliares manualmente
- Admin Dashboard: Completamente funcional con control total del juego