# WebSocket Event Flow - Jackbox Integration

## Event Broadcasting Behavior

| Event | Broadcast To | Requires Subscription? |
|-------|--------------|------------------------|
| `session.started` | **All authenticated clients** | ❌ NO |
| `game.added` | Session subscribers only | ✅ YES |
| `session.ended` | Session subscribers only | ✅ YES |

## Bot Connection Flow

```
1. Connect to WebSocket
   ↓
2. Send auth message with JWT token
   ↓
3. Receive auth_success
   ↓
4. Wait for session.started (automatic broadcast)
   ↓
5. When session.started received:
   - Subscribe to that specific session ID
   - Announce "Game Night is starting!"
   ↓
6. Receive game.added events (for subscribed session)
   - Announce new games
   ↓
7. Receive session.ended event (for subscribed session)
   - Announce final votes + goodnight
```

## Message Formats

### 1. Authentication
**Bot → Server:**
```json
{
  "type": "auth",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
```

**Server → Bot:**
```json
{
  "type": "auth_success",
  "message": "Authenticated successfully"
}
```

### 2. Session Started (Automatic Broadcast)
**Server → Bot:**
```json
{
  "type": "session.started",
  "timestamp": "2025-11-01T03:24:30Z",
  "data": {
    "session": {
      "id": 21,
      "is_active": 1,
      "created_at": "2025-11-01 07:24:30",
      "notes": null
    }
  }
}
```

**Bot Action:**
- Automatically subscribe to this session
- Announce "🎮 Game Night is starting! Session #21"

### 3. Subscribe to Session
**Bot → Server:**
```json
{
  "type": "subscribe",
  "sessionId": 21
}
```

**Server → Bot:**
```json
{
  "type": "subscribed",
  "message": "Subscribed to session 21"
}
```

### 4. Game Added (Requires Subscription)
**Server → Bot:**
```json
{
  "type": "game.added",
  "timestamp": "2025-11-01T03:25:00Z",
  "data": {
    "session": {
      "id": 21,
      "is_active": true,
      "games_played": 1
    },
    "game": {
      "id": 42,
      "title": "Drawful 2",
      "pack_name": "Drawful 2",
      "min_players": 3,
      "max_players": 8,
      "manually_added": false
    }
  }
}
```

**Bot Action:**
- Announce previous game's votes (if any)
- Announce "🎮 Coming up next: Drawful 2!"

### 5. Session Ended (Requires Subscription)
**Server → Bot:**
```json
{
  "type": "session.ended",
  "timestamp": "2025-11-01T04:30:00Z",
  "data": {
    "session": {
      "id": 21,
      "is_active": 0,
      "games_played": 5
    }
  }
}
```

**Bot Action:**
- Announce final game's votes (if any)
- Announce "🌙 Game Night has ended! Thanks for playing!"
- Clear active session (reset to time-based vote debouncing)

## Fallback Polling

If WebSocket events are missed, the bot has a fallback polling mechanism (every 30 seconds):

- **Detects new sessions** via HTTP GET `/api/sessions/active`
- **Detects ended sessions** when active session becomes null/inactive
- **Logs warnings** when polling detects changes (indicates missed WebSocket events)

Example warning logs:
```
WARN Found active session 21 via polling (session.started event may have been missed)
WARN Active session ended (detected via polling, session.ended event may have been missed)
```

## Testing

### Expected Logs (Happy Path)
```
INFO Authentication successful
INFO Session started: ID=21
INFO Subscribed to session 21
INFO Active session set to 21
INFO Broadcasting Jackbox message: 🎮 Game Night is starting! Session #21
INFO Subscription confirmed: Subscribed to session 21
INFO Game added: Drawful 2 from Drawful 2
INFO Broadcasting Jackbox message: 🎮 Coming up next: Drawful 2!
INFO Session ended event received
INFO Broadcasting Jackbox message: 🌙 Game Night has ended! Thanks for playing!
```

### Expected Logs (Fallback Polling)
```
INFO Authentication successful
WARN Found active session 21 via polling (session.started event may have been missed), subscribing...
INFO Subscribed to session 21
```

## Troubleshooting

### Bot doesn't receive `session.started`
- Check backend logs: Should say "Broadcasted session.started to X client(s)"
- Check bot is authenticated: Look for "Authentication successful" in logs
- Check WebSocket connection: Should say "WebSocket connected"

### Bot doesn't receive `game.added` or `session.ended`
- Check bot subscribed to session: Look for "Subscribed to session X" in logs
- Check backend logs: Should say "Broadcasted game.added to X client(s) for session Y"
- If X = 0, bot didn't subscribe properly

### Polling warnings appear
- This means WebSocket events aren't being received
- Check your backend is calling `broadcastToAll()` for `session.started`
- Check your backend is calling `broadcastEvent(sessionId)` for `game.added` and `session.ended`

