Documentation Côté Serveur

Le serveur de jeu est construit selon une architecture orientée services, utilisant Node.js avec TypeScript. Il s'appuie principalement sur Socket.IO pour les communications en temps réel, Firebase (Authentication + Storage + Messaging) pour l'authentification, le stockage et les notifications, et MongoDB pour la persistance des données. L'architecture est conçue pour gérer plusieurs parties simultanées, avec une logique complexe pour les mécanismes de jeu, le combat, les interactions entre joueurs, un système social complet, et une économie virtuelle.

Stack Technique

Technologies principales

Services Firebase

Autres dépendances

Point d'Entrée

Fichier : server.ts

Initialise le serveur HTTP, configure Socket.IO, et démarre tous les services via TypeDI.

Architecture et Organisation

Injection de Dépendances

Le serveur utilise TypeDI pour l'injection de dépendances, permettant:

Pattern :

@Service()
export class MyService {
    constructor(private readonly otherService: OtherService) {}
}

Structure des Dossiers

server/app/
├── classes/          # Classes métier (OnGoingGame, Player, User, etc.)
├── controllers/      # Contrôleurs REST (endpoints HTTP)
├── middleware/       # Middlewares Express (auth)
├── services/         # Services métier et logique
├── app.ts           # Configuration Express
├── server.ts        # Point d'entrée Socket.IO
├── env.ts          # Variables d'environnement
└── index.ts        # Démarrage de l'application

Organisation Fonctionnelle des Services

Le côté serveur est divisé en plusieurs catégories fonctionnelles. Les sections suivantes présentent un résumé technique de chaque catégorie.

Sous-sections détaillées disponibles

Pour une documentation détaillée de chaque composant, consultez les sous-sections :

  1. Infrastructure et Configuration
  2. Authentification et Gestion des Sessions
  3. Gestion des WebSockets
  4. Gestion des Parties
  5. Système de Combat
  6. Gestion des Items
  7. Gestion des Joueurs
  8. Contrôle de Jeu et Vérification
  9. Système de Canaux et Chat
  10. Système d'Amis
  11. Boutique
  12. GIFs Tenor
  13. Prize Pool et Économie
  14. Statistiques
  15. Notifications Push
  16. Classes du Jeu

1. Infrastructure et Configuration

Responsabilité : Initialisation et configuration du serveur

Fichiers clés :

Technologies :

Configuration :

// Variables d'environnement
FIREBASE_PROJECT_ID
FIREBASE_PRIVATE_KEY
FIREBASE_CLIENT_EMAIL
MONGODB_URI
TENOR_API_KEY
FCM_SERVER_KEY

2. Authentification et Gestion des Sessions

Services :

Flux d'authentification :

  1. Client s'authentifie avec Firebase (client-side)
  2. Client envoie token ID Firebase au serveur
  3. Serveur vérifie token avec FirebaseAuthService.verifyIdToken()
  4. Serveur crée/récupère utilisateur dans MongoDB
  5. Serveur vérifie session unique (un appareil à la fois)
  6. Serveur crée session avec UUID via SessionService
  7. Serveur retourne session ID
  8. Client authentifie socket avec session ID
  9. Serveur valide et associe socket à session

Endpoints :

Sécurité :

3. Gestion des Utilisateurs

Services :

Modèle User (MongoDB) :

{
    _id: ObjectId,
    firebaseUid: string (unique),
    username: string (unique),
    email: string,
    virtualCurrencyBalance: number,
    purchaseHistory: string[],           // IDs des items achetés
    channels: string[],                   // IDs des canaux
    friends: string[],                    // Firebase UIDs des amis
    pendingFriendsRequest: string[],      // Firebase UIDs des demandes en attente
    activeSessionId: string,              // UUID de session
    lastLoginAt: Date,
    avatarUrl: string,                    // URL Firebase Storage
    predefinedAvatarId: string,           // ID d'avatar prédéfini (ex: 'avatar_01')
    lastReadAt: { [channelId: string]: Date },  // Dernière lecture par canal
    fcmTokens: string[],                  // Tokens FCM pour notifications push
    isDeleted: boolean,                   // Soft delete
    deletedAt: Date,
    preferences: {
        musicName: string,
        themeName: string,
        languageName: string
    },
    stats: {
        totalGamesPlayed: number,
        totalGamesWon: number,
        gamesPlayedClassic: number,
        gamesWonClassic: number,
        gamesPlayedCTF: number,
        gamesWonCTF: number,
        totalDurationClassic: number,
        totalDurationCTF: number,
        totalDurationTotal: number
    },
    createdAt: Date
}

Endpoints :

Fonctionnalités :

4. Système d'Amis

Services :

Endpoints :

Events Socket.IO émis :

Fonctionnalités :

5. Système de Canaux et Chat

Services :

Modèle Channel (MongoDB) :

{
    _id: ObjectId,
    name: string (unique),
    owner: string (Firebase UID),
    users: string[] (Firebase UIDs),
    messages: [{
        _id: ObjectId,
        author: string (Firebase UID),
        content: string,              // Peut contenir URL Tenor
        creationDate: Date
    }],
    isGeneral: boolean,               // Canal général (non supprimable)
    isPartyChannel: boolean,          // Canal de partie (auto-créé)
    createdAt: Date,
    updatedAt: Date
}

Endpoints :

Events Socket.IO :

Fonctionnalités :

6. Boutique (Shop)

Services :

Items disponibles : Définis dans @common/shop-item

Endpoints :

Flux d'achat :

  1. Client appelle check-funds/:itemId
  2. Serveur vérifie solde et retourne canAfford
  3. Client appelle purchase avec itemId
  4. Serveur vérifie:
    • Item existe
    • Pas déjà acheté
    • Solde suffisant
  5. Serveur débite et ajoute à purchaseHistory
  6. Retourne nouveau solde

7. GIFs Tenor

Services :

Endpoints :

Fonctionnalités :

8. Gestion des WebSockets

Services :

Namespaces : Tous les événements sur namespace par défaut /

Rooms :

Fonctionnalités :

9. Gestion des Parties

Services :

Classe OnGoingGame (en mémoire) :

{
    code: string,                     // Code à 4 chiffres
    players: Player[],
    game: Game,                       // Configuration du jeu
    status: 'waiting' | 'started' | 'ended',
    prizePool: number,                // Cagnotte accumulée
    entryFee: number,                 // Frais d'entrée (0-100)
    visibility: 'public' | 'friends',
    allowDropInOut: boolean,
    publiclyListed: boolean,
    isLocked: boolean,
    admin: string,                    // Firebase UID de l'hôte
    winner: string,
    gameDuration: number,
    totalTurns: number,
    tilesVisitedPercentage: number,
    doorsToggledPercentage: number,
    timer: Timer
}

Fonctionnalités :

Flux de partie :

  1. Admin crée partie avec config (visibilité, frais, drop-in/out)
  2. Vérification monnaie des joueurs rejoignant
  3. Déduction frais → ajout au prize pool
  4. Joueurs rejoignent salle d'attente
  5. Admin lance la partie
  6. Support drop-in si activé
  7. Partie se termine
  8. Distribution prix + mise à jour stats
  9. Suppression partie de la mémoire après stats room

10. Système de Combat

Services :

Mécanique :

11. Gestion des Items

Services :

Types d'items : Attaque, défense, action, vie

12. Gestion des Joueurs

Services :

Fonctionnalités :

13. Système de Prize Pool et Économie

Services :

Logique de distribution :

  1. Pendant partie : Frais s'accumulent dans prizePool
  2. Fin de partie :
    • 2/3 prize pool → gagnants (divisé équitablement)
    • 1/3 prize pool → perdants (prix de consolation)
    • Bots exclus
    • Mise à jour MongoDB automatique

Fonctionnalités :

14. Statistiques en Temps Réel (Stats Room)

Services :

Fonctionnalités :

Events Socket.IO :

Nettoyage :

15. Notifications Push (FCM)

Services :

Fonctionnalités :

Endpoints :

16. Système de Traduction

Services :

Fichiers : Partagés avec client (common/i18n/)

Langues : Français, English

17. Classes du Jeu

Classes principales :

API REST - Résumé des Endpoints

Authentification

Utilisateur

Amis

Canaux

Boutique

GIFs

Base de Données MongoDB

Collections

  1. users : Comptes utilisateurs

    • Index : firebaseUid (unique), username (unique)
  2. games : Configurations de jeux (plateaux)

    • Index : name (unique)
  3. channels : Canaux de chat

    • Index : name (unique), users (array)
  4. fs.files et fs.chunks : OBSOLÈTE (GridFS remplacé par Firebase Storage)

Index automatiques

Créés par DatabaseIndexesService au démarrage :

Sécurité

Authentification

Validation

Soft Delete

Variables d'Environnement

# Firebase
FIREBASE_PROJECT_ID=...
FIREBASE_PRIVATE_KEY=...
FIREBASE_CLIENT_EMAIL=...

# MongoDB
MONGODB_URI=mongodb://...

# Tenor API
TENOR_API_KEY=...

# FCM (optionnel)
FCM_SERVER_KEY=...

Flux d'Information

  1. Client se connecte via Socket.IO
  2. Client s'authentifie avec token Firebase
  3. Serveur crée session et associe socket
  4. Events socket routés vers services appropriés
  5. Services mettent à jour état en mémoire (OnGoingGame)
  6. Modifications émises à tous les clients concernés (rooms)
  7. Données persistantes sauvegardées dans MongoDB
  8. Notifications temps réel via Socket.IO et FCM

Résumé des Fonctionnalités

Authentification et Sécurité

Système Utilisateur

Système Social

Chat et Canaux

Économie de Jeu

Parties

Statistiques

Internationalisation

Services Obsolètes

Les services suivants sont dépréciés et remplacés :

Les champs suivants dans User sont dépréciés :