4.5 KiB
4.5 KiB
MTG Online WebSocket Game Server - Handoff Document
Project Overview
MTG Online is a multiplayer Magic: The Gathering platform with a FastAPI backend. Phase 5 (Game Management) is complete. Phase 6 (WebSocket Game Server) is ready for implementation.
Current Status
- Phase 1-4: Complete (authentication, users, decks, cards, user data)
- Phase 5: Complete (game management, rooms, MTGJSON integration)
- Phase 6: In Progress (WebSocket game server architecture designed)
Codebase Structure
/home/wall-o/projects/mtgonline/backend/
├── app/
│ ├── core/ # Configuration, database, security, logging
│ ├── models/ # SQLAlchemy ORM models
│ ├── routers/ # API endpoint definitions
│ ├── services/ # Business logic layer
│ ├── schemas/ # Pydantic request/response schemas
│ └── main.py # Application entry point
├── tests/ # Test suite (28 tests, all passing)
├── docs/ # Documentation
└── state.json # Project state
Recent Changes
- Fixed critical bug in
games_router.py:player_result→player_stmtincreate_gameendpoint - Fixed deprecation warning in
main.py: Updated lifespan from generator to@asynccontextmanager - Designed WebSocket architecture documented in
docs/WEB_SOCKET_ARCHITECTURE.md
WebSocket Game Server Architecture
The architecture is fully designed and documented. Key components:
Protocol
- JSON message format with type, sequence number, timestamp, and payload
- Message types: connection management, game lifecycle, player actions, turn management, chat
- JWT authentication via
hellomessage
Components
- WebSocket Endpoint (
/ws/game/{game_id}) - connection management - Game Server Manager - coordinates active game instances
- Game State Manager - authoritative state, validates actions
- Persistence Layer - PostgreSQL for state saving and recovery
Concurrency
- asyncio-based architecture
- Game-level locks for state mutations
- Action queue for ordering within turns
Key Features
- Full state snapshots on connection
- Incremental state updates for changes
- Priority system for turn management
- Reconnection and recovery support
- Error handling with specific error codes
Implementation Plan
Phase 1: Basic Infrastructure
- WebSocket endpoint setup
- Connection management
- Authentication
- Basic message routing
Phase 2: Game State Management
- Game state model
- State serialization
- Full state snapshots
- Incremental updates
Phase 3: Turn and Phase Management
- Turn structure implementation
- Phase transitions
- Priority system
- Action validation
Phase 4: Player Actions
- Card play actions
- Combat actions
- Spell casting
- Ability activation
Phase 5: Persistence and Recovery
- Game state persistence
- Reconnection handling
- Game recovery
- Chat history
Phase 6: Testing and Optimization
- Unit tests
- Integration tests
- Load testing
- Performance optimization
Technical Stack
- Language: Python 3.12
- Framework: FastAPI
- ORM: SQLAlchemy 2.0
- Database: SQLite (development), PostgreSQL (production)
- Auth: JWT (python-jose)
- WebSocket: FastAPI built-in WebSocket support
Key Files
app/main.py- Application entry point with WebSocket endpoint registrationapp/routers/games_router.py- Game management endpoints (includes basic WebSocket endpoint)app/services/game_server.py- Game server service (basic implementation exists)docs/WEB_SOCKET_ARCHITECTURE.md- Complete architecture documenttests/- Test suite
Testing
- 28 tests currently passing
- Test framework: pytest with pytest-asyncio
- Database: In-memory SQLite for tests
- Run tests:
pytest --tb=short
Environment
- Host venv:
/home/wall-o/workspace/venv - Run as user:
wall-o(UID 1001) - Gitea credentials:
/home/wall-o/projects/gitea_credentials.txt - Repository:
https://git.optimex.systems/admin/mtgonline.git
Next Steps
- Implement WebSocket game server following the architecture document
- Add test coverage for games, cards, and user_data routers
- Configure linting (Ruff)
- Add pre-commit hooks
- Set up CI/CD pipeline
Notes
- The codebase is well-structured with clean separation of concerns
- Comprehensive docstrings and type hints throughout
- Service layer abstraction is well-implemented
- No need for code simplification - architecture is already clean