# Real Racing 3 Community Server

A cross-platform .NET 8+ community server implementation for Real Racing 3, enabling custom/private server functionality.

## Overview

This server emulates EA's Synergy backend infrastructure, allowing players to:
- Host community servers
- Play offline or on private networks
- Customize game content and progression
- Preserve the game when official servers shut down

## Features

- ✅ Cross-platform support (Windows, Linux, macOS)
- ✅ Minimal ASP.NET Core Web API implementation
- ✅ All critical Synergy API endpoints
- ✅ Session management & authentication
- ✅ User profile & device management
- ✅ DRM/Purchase verification (stub for community use)
- ✅ Product catalog management
- ✅ Analytics/tracking endpoints (optional logging)
- ✅ Configurable via JSON
- ✅ SQLite database for data persistence

## Requirements

- .NET 8.0 SDK or later
- SQLite (included via NuGet)
- Port 443 (HTTPS) or custom port with SSL certificate

## Quick Start

### 1. Build the Server
```bash
cd RR3CommunityServer
dotnet restore
dotnet build
```

### 2. Configure
Edit `appsettings.json` to customize server behavior.

### 3. Run
```bash
dotnet run
```

The server will start on `https://localhost:5001` by default.

### 4. Redirect Game Traffic
You'll need to intercept DNS/HTTPS traffic from the game to redirect EA servers to your server:

**Option A: Hosts File (Simple)**
```
# Add to C:\Windows\System32\drivers\etc\hosts (Windows)
# or /etc/hosts (Linux/macOS)
127.0.0.1 syn-dir.sn.eamobile.com
127.0.0.1 director-stage.sn.eamobile.com
```

**Option B: Proxy/VPN (Advanced)**
Use tools like Proxifier, mitmproxy, or custom VPN to redirect traffic.

**Option C: SSL Interception (Full Control)**
Use mitmproxy with custom CA certificate installed on device.

## Architecture

```
[Real Racing 3 App]
        ↓ HTTPS
[Community Server]
        ↓
[SQLite Database]
```

The server implements EA's Synergy API protocol:
- JSON request/response format
- Custom headers: `EAM-SESSION`, `EAM-USER-ID`, `EA-SELL-ID`
- Session-based authentication
- RESTful endpoints

## API Endpoints

### User Management
- `GET /user/api/android/getDeviceID` - Register device
- `GET /user/api/android/validateDeviceID` - Validate device
- `GET /user/api/android/getAnonUid` - Get anonymous ID

### Product Catalog
- `GET /product/api/core/getAvailableItems` - Get item catalog
- `GET /product/api/core/getMTXGameCategories` - Get categories
- `POST /product/api/core/getDownloadItemUrl` - Get download URLs

### DRM & Purchases
- `GET /drm/api/core/getNonce` - Get DRM nonce
- `GET /drm/api/core/getPurchasedItems` - Get purchases
- `POST /drm/api/android/verifyAndRecordPurchase` - Verify purchase

### Tracking & Analytics
- `POST /tracking/api/core/logEvent` - Log analytics event

### Director (Discovery)
- `GET /director/api/android/getDirectionByPackage` - Service discovery

## Configuration

See `appsettings.json` for configuration options:

```json
{
  "Server": {
    "EnableAnalytics": false,
    "EnablePurchaseVerification": false,
    "AllowUnverifiedDevices": true
  },
  "Catalog": {
    "DataPath": "./catalog-data",
    "EnableCustomContent": true
  }
}
```

## Security Notes

⚠️ **For Community Use Only**

This server is for:
- Private/LAN play
- Game preservation
- Educational purposes
- Offline gameplay

**NOT for:**
- Piracy or circumventing legitimate purchases
- Cheating in official multiplayer
- Redistributing EA's content

## Project Structure

```
RR3CommunityServer/
├── Controllers/          # API endpoint controllers
│   ├── DirectorController.cs
│   ├── UserController.cs
│   ├── ProductController.cs
│   ├── DrmController.cs
│   └── TrackingController.cs
├── Models/              # Data models & DTOs
├── Services/            # Business logic
├── Data/                # Database context
├── Middleware/          # Session/auth middleware
├── appsettings.json     # Configuration
└── Program.cs           # Entry point
```

## Development

### Adding New Endpoints
1. Create controller in `Controllers/`
2. Add models in `Models/`
3. Implement service logic in `Services/`
4. Update database schema if needed

### Testing
```bash
# Run unit tests
dotnet test

# Test API endpoints
curl -k -H "EAM-SESSION: test-session" https://localhost:5001/user/api/android/getDeviceID?deviceId=test123
```

## Contributing

Contributions welcome! Please:
1. Fork the repository
2. Create a feature branch
3. Submit a pull request

## License

This project is for educational and preservation purposes. Real Racing 3 and related trademarks are property of Electronic Arts Inc.

## Disclaimer

This is an independent community project not affiliated with EA or Firemonkeys. Use responsibly and respect intellectual property rights.
