Système de Canaux et Chat
Cette section détaille le système de canaux et de chat qui permet la communication en temps réel entre les utilisateurs. Le système supporte les canaux publics, privés, et les canaux de partie auto-créés.
ChannelService (channel.service.ts)
Service qui gère les canaux de chat avec persistance MongoDB.
Propriétés
private channelsCollection: Collection: Collection MongoDB pour les canaux
Méthodes principales
constructor(dbClient: MongoClient, dbName: string)
Description : Initialise le service avec la connexion MongoDB.
Paramètres :
dbClient: Client MongoDBdbName: Nom de la base de données
async createChannel(name: string, owner: string, users: string[])
Description : Crée un nouveau canal de chat.
Paramètres :
name: Nom du canal (unique)owner: Firebase UID du propriétaireusers: Liste des Firebase UIDs des participants
Validation :
- Nom unique
- Owner valide
- Utilisateurs existants
Retour : Promise<Channel>
async getChannelByName(name: string)
Description : Récupère un canal par son nom.
Retour : Promise<Channel | null>
async getChannelById(channelId: string)
Description : Récupère un canal par son ID.
Retour : Promise<Channel | null>
async getUserChannels(firebaseUid: string)
Description : Récupère tous les canaux d'un utilisateur.
Retour : Promise<Channel[]>
async searchChannels(searchTerm: string, firebaseUid: string)
Description : Recherche des canaux disponibles.
Paramètres :
searchTerm: Terme de recherchefirebaseUid: UID de l'utilisateur
Retour : Promise<Channel[]> (canaux publics ou canaux de l'utilisateur)
async addUserToChannel(channelId: string, firebaseUid: string)
Description : Ajoute un utilisateur à un canal.
Retour : Promise<void>
async removeUserFromChannel(channelId: string, firebaseUid: string)
Description : Retire un utilisateur d'un canal.
Protection : Canal général non quittable
Retour : Promise<void>
async addMessage(channelId: string, author: string, content: string)
Description : Ajoute un message au canal.
Paramètres :
channelId: ID du canalauthor: Firebase UID de l'auteurcontent: Contenu du message (texte ou URL GIF Tenor)
Actions :
- Censure automatique via
MessageCensorshipService - Persistance dans MongoDB
- Retour des 50 derniers messages seulement
Retour : Promise<void>
async getMessages(channelId: string)
Description : Récupère les messages d'un canal.
Limite : 50 derniers messages
Retour : Promise<ChannelMessage[]>
async deleteChannel(channelId: string)
Description : Supprime un canal.
Protection : Canal général et canaux de partie non supprimables
Retour : Promise<void>
async deletePartyChannel(gameCode: string)
Description : Supprime un canal de partie.
Paramètres :
gameCode: Code de la partie (= nom du canal)
Retour : Promise<void>
async createPartyChannel(gameCode: string, players: string[])
Description : Crée un canal de partie automatiquement.
Paramètres :
gameCode: Code de la partieplayers: Firebase UIDs des joueurs
Propriétés du canal :
isPartyChannel: true- Non supprimable manuellement
- Suppression automatique en fin de partie
Retour : Promise<void>
async getActiveChannelParticipantsFormatted(channelId: string)
Description : Récupère les participants actifs d'un canal avec leurs informations.
Retour : Promise<ParticipantInfo[]> (username, avatar, etc.)
ChatSocketService (chat-socket.service.ts)
Service qui gère les événements Socket.IO pour le chat et les canaux.
Propriétés
private channelService: ChannelService: Service de gestion des canauxprivate userService: UserService: Service utilisateurprivate censorshipService: MessageCensorshipService: Service de censureprivate sessionService: SessionService: Service de sessions
Méthodes principales
constructor(...)
Description : Initialise le service avec toutes les dépendances.
Services injectés :
ChannelServiceUserServiceMessageCensorshipServiceSessionService
handleSocket(socket: Socket): void
Description : Configure les gestionnaires d'événements pour le chat.
Événements écoutés :
chat:send-message: Envoyer un messagechat:join-channel: Rejoindre un canalchat:leave-channel: Quitter un canalchat:create-channel: Créer un canalchat:delete-channel: Supprimer un canal
Retour : void
private async handleSendMessage(socket: Socket, data: any)
Description : Gère l'envoi d'un message.
Flux :
- Validation session
- Validation permissions (membre du canal)
- Censure du contenu
- Ajout du message à MongoDB
- Émission
chat:message-receivedà tous les membres du canal
Retour : Promise<void>
private async handleJoinChannel(socket: Socket, data: any)
Description : Gère la jointure d'un canal.
Actions :
- Validation du canal
- Ajout de l'utilisateur au canal
- Jointure de la room Socket.IO
channel:{channelId} - Notification aux autres membres
Retour : Promise<void>
private async handleLeaveChannel(socket: Socket, data: any)
Description : Gère la sortie d'un canal.
Protection : Impossible de quitter le canal général
Actions :
- Retrait de l'utilisateur du canal
- Leave de la room Socket.IO
- Notification aux membres restants
Retour : Promise<void>
private async handleCreateChannel(socket: Socket, data: any)
Description : Gère la création d'un canal.
Validation :
- Nom unique
- Nom non vide
- Utilisateur authentifié
Actions :
- Création du canal dans MongoDB
- Ajout du créateur au canal
- Notification au créateur
Retour : Promise<void>
private async handleDeleteChannel(socket: Socket, data: any)
Description : Gère la suppression d'un canal.
Validation :
- Owner du canal uniquement
- Pas le canal général
- Pas un canal de partie
Actions :
- Suppression du canal de MongoDB
- Notification à tous les membres
- Leave des rooms Socket.IO
Retour : Promise<void>
MessageCensorshipService (message-censorship.service.ts)
Service qui filtre les mots inappropriés dans les messages.
Méthodes
censorMessage(message: string): string
Description : Censure les mots inappropriés dans un message.
Paramètres :
message: Message original
Logique :
- Liste de mots interdits
- Remplacement par des astérisques
- Insensible à la casse
- Préservation de la longueur du mot
Retour : string (message censuré)
Exemple :
Input: "Ce jeu est badword super"
Output: "Ce jeu est ******* super"
Modèle Channel (MongoDB)
{
_id: ObjectId,
name: string (unique), // Nom du canal ou code de partie
owner: string, // Firebase UID du propriétaire
users: string[], // Firebase UIDs des participants
messages: [{
_id: ObjectId,
author: string, // Firebase UID de l'auteur
content: string, // Texte ou URL GIF Tenor
creationDate: Date
}],
isGeneral: boolean, // Canal général (défaut pour tous)
isPartyChannel: boolean, // Canal de partie (auto-géré)
createdAt: Date,
updatedAt: Date
}
Events Socket.IO
Events émis par le serveur
| Event | Description | Destinataires |
|---|---|---|
chat:message-received |
Nouveau message dans un canal | Room channel:{channelId} |
chat:channel-created |
Canal créé | Créateur uniquement |
chat:user-joined-channel |
Utilisateur a rejoint | Room channel:{channelId} |
chat:user-left-channel |
Utilisateur a quitté | Room channel:{channelId} |
chat:channel-deleted |
Canal supprimé | Anciens membres |
chat:channel-participants-updated |
Liste participants mise à jour | Room channel:{channelId} |
chat:user-should-leave-channel |
Forcer sortie d'un canal | Utilisateur spécifique |
chat:user-should-reload-channels |
Recharger liste des canaux | Utilisateur spécifique |
Events reçus par le serveur
| Event | Description | Données requises |
|---|---|---|
chat:send-message |
Envoyer un message | channelId, content |
chat:join-channel |
Rejoindre un canal | channelId |
chat:leave-channel |
Quitter un canal | channelId |
chat:create-channel |
Créer un canal | name |
chat:delete-channel |
Supprimer un canal | channelId |
Intégration avec d'autres systèmes
Canal Général
- Créé automatiquement au premier démarrage
- Tous les utilisateurs auto-join à la connexion
- Non supprimable, non quittable
isGeneral: true
Canaux de Partie
- Créés automatiquement au lancement de la partie
- Nom = code de la partie (4 chiffres)
- Participants = joueurs de la partie
- Suppression automatique :
- Quand dernier joueur quitte la stats room
- Via
StatsRoomService.deletePartyChannel()
isPartyChannel: true
Support GIFs Tenor
- Messages peuvent contenir des URLs GIF Tenor
- Format :
https://media.tenor.com/... - Pas de validation spéciale côté serveur
- Client détecte et affiche les GIFs
Censure de Messages
- Appliquée automatiquement avant stockage
- Liste de mots interdits configurable
- Remplacement par astérisques
- Transparente pour l'utilisateur
Sécurité
Validations
- Authentification requise pour tous les events
- Vérification de membre du canal pour envoyer message
- Vérification de propriétaire pour supprimer canal
- Protection des canaux spéciaux (général, partie)
Limites
- Messages : 50 derniers seulement
- Censure automatique
- Canaux : Pas de limite