Files
mtgonline/README.md
T

8.3 KiB

MTG Online Web Application

A modern web-based implementation of the MTG Online multiplayer Magic: The Gathering platform.

Features

  • User Authentication: Secure JWT-based authentication with bcrypt password hashing
  • Deck Building: Full-featured deck editor with import/export in multiple formats
  • Real-Time Multiplayer: WebSocket-based game server for live gameplay
  • Protocol Compatibility: Compatible with MTG Online protocol buffer messages
  • Card Database: Integration with MTJSON for comprehensive card data
  • Admin Tools: Comprehensive moderation and administration dashboard

Tech Stack

  • Backend: Python 3.12, FastAPI, SQLAlchemy (async), PostgreSQL
  • Frontend: React, TypeScript, Zustand (coming soon)
  • Game Server: WebSocket with real-time state synchronization
  • Authentication: JWT tokens with bcrypt password hashing
  • Database: PostgreSQL with async driver (asyncpg)
  • Protocol: Protocol buffer message compatibility

Getting Started

Prerequisites

  • Docker and Docker Compose
  • Python 3.12+ (for development)
  • PostgreSQL 14+ (if running without Docker)
  • Redis (optional, for caching)
  • MTGJSON data files (see below)

Installation

  1. Clone the repository
git clone https://github.com/yourusername/mtgonline-web.git
cd mtgonline-web
  1. Configure environment
cp .env.example .env
# Edit .env with your configuration
  1. Prepare MTGJSON data files

The application requires MTGJSON data files. You have two options:

Option A: Download from MTGJSON (recommended)

# Create data directory
mkdir -p data

# Download required files from MTGJSON
# See scripts/download-mtgjson.sh for automated download
bash scripts/download-mtgjson.sh

Option B: Provide your own JSON files

Place these files in the data/ directory:

  • AllSetFiles/ (directory containing set JSON files)
  • AllPrintings.json
  • AllIdentifiers.json
  • CardTypes.json
  • DeckList.json
  • Keywords.json
  • SetList.json
# Copy the data directory to a volume mount path
mkdir -p ~/mtg-data
cp -r data/* ~/mtg-data/

# Start the application
sudo docker compose up -d

The backend container will automatically process the JSON files from the mounted volume and populate the database.

Project Structure

mtgonline-web/
├── backend/
│   ├── app/
│   │   ├── core/           # Core configuration and utilities
│   │   │   ├── settings.py # Application settings
│   │   │   ├── database.py # Database engine and sessions
│   │   │   └── security.py # Authentication and password hashing
│   │   ├── models/         # SQLAlchemy ORM models
│   │   │   └── models.py
│   │   ├── schemas/        # Pydantic schemas
│   │   │   ├── schemas.py
│   │   │   ├── proto_messages.py
│   │   │   └── protocol_constants.py
│   │   ├── routers/        # API route handlers
│   │   │   ├── auth.py
│   │   │   ├── users.py
│   │   │   ├── decks.py
│   │   │   ├── rooms.py
│   │   │   ├── games.py
│   │   │   ├── admin.py
│   │   │   └── ws.py
│   │   ├── services/       # Business logic services
│   │   │   ├── game_server.py
│   │   │   ├── card_database.py
│   │   │   └── deck_parser.py
│   │   └── main.py         # FastAPI application
│   ├── tests/              # Test suite
│   ├── requirements.txt    # Python dependencies
│   ├── pyproject.toml      # Ruff configuration
│   └── .env.example        # Environment template
├── frontend/               # React/TypeScript frontend (coming soon)
├── shared/                 # Shared protocol definitions
│   └── proto/              # Protocol buffer definitions
└── README.md

Docker Deployment

1. Prepare the Data Directory

Create a directory on your host machine to store the MTGJSON files:

mkdir -p ~/mtg-data
cp -r data/* ~/mtg-data/

2. Configure Environment

cp .env.example .env
# Edit .env with your configuration

3. Mount and Start

# Start with data directory mounted (Linux/macOS)
sudo docker compose up -d

# The data directory is automatically mounted to /app/data in the backend container
# Alternatively, specify a custom path:
sudo docker compose up -d --build

The backend will:

  • Detect the JSON files in the mounted volume
  • Upsert all data into the PostgreSQL database
  • Start the FastAPI application

4. Verify

# Check backend logs
docker compose logs -f backend

# Test health endpoint
curl http://localhost:8000/health

Updating Data

When MTGJSON releases updates:

  1. Copy new .json files to ~/mtg-data/
  2. The backend will automatically process new files on next startup
  3. Or trigger a manual refresh via /refresh endpoint

Development

Run Locally

cd backend
pip install -r requirements.txt
python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

Run Tests

cd backend
pytest

Project Structure

mtgonline-web/
├── backend/
│   ├── app/
│   │   ├── core/           # Core configuration and utilities
│   │   │   ├── settings.py # Application settings
│   │   │   ├── database.py # Database engine and sessions
│   │   │   └── security.py # Authentication and password hashing
│   │   ├── models/         # SQLAlchemy ORM models
│   │   │   └── models.py
│   │   ├── schemas/        # Pydantic schemas
│   │   │   ├── schemas.py
│   │   │   ├── proto_messages.py
│   │   │   └── protocol_constants.py
│   │   ├── routers/        # API route handlers
│   │   │   ├── auth.py
│   │   │   ├── users.py
│   │   │   ├── decks.py
│   │   │   ├── rooms.py
│   │   │   ├── games.py
│   │   │   ├── admin.py
│   │   │   └── ws.py
│   │   ├── services/       # Business logic services
│   │   │   ├── game_server.py
│   │   │   ├── card_database.py
│   │   │   └── deck_parser.py
│   │   └── main.py         # FastAPI application
│   ├── tests/              # Test suite
│   ├── requirements.txt    # Python dependencies
│   ├── pyproject.toml      # Ruff configuration
│   └── .env.example        # Environment template
├── frontend/               # React/TypeScript frontend (coming soon)
├── shared/                 # Shared protocol definitions
│   └── proto/              # Protocol buffer definitions
├── data/                   # MTGJSON data files (not in git)
├── scripts/                # Utility scripts
└── README.md

API Endpoints

Authentication

  • POST /api/v1/auth/login - User login
  • POST /api/v1/auth/register - User registration
  • POST /api/v1/auth/refresh - Refresh access token
  • GET /api/v1/auth/me - Get current user

Users

  • GET /api/v1/users/{user_id} - Get user by ID
  • PATCH /api/v1/users/{user_id} - Update user profile
  • POST /api/v1/users/{user_id}/ban - Ban user (admin)
  • POST /api/v1/users/{user_id}/unban - Unban user (admin)

Decks

  • GET /api/v1/decks/ - List decks
  • POST /api/v1/decks/ - Create deck
  • GET /api/v1/decks/{deck_id} - Get deck
  • PATCH /api/v1/decks/{deck_id} - Update deck
  • DELETE /api/v1/decks/{deck_id} - Delete deck
  • GET /api/v1/decks/folders - List folders
  • POST /api/v1/decks/folders - Create folder
  • DELETE /api/v1/decks/folders/{folder_id} - Delete folder

Admin

  • GET /api/v1/admin/users - List all users (admin)
  • GET /api/v1/admin/bans - List all bans (admin)
  • POST /api/v1/admin/bans - Create ban (admin)
  • POST /api/v1/admin/bans/{ban_id}/unban - Unban user (admin)
  • GET /api/v1/admin/logs - List game logs (admin)

Testing

Run the test suite:

cd backend
pytest

License

MIT License

Contributing

Contributions are welcome! Please open an issue or submit a pull request.

Support

For questions or issues, please open a GitHub issue.