Skip to content

PGBmax/ft_irc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 

Repository files navigation

 FT_IRC

✅ TODO – CrĂ©ation du Serveur IRC (ft_irc – 42)

🎯 Objectif

Construire un serveur IRC en C++98, capable de gérer plusieurs clients en parallÚle et d'interpréter les commandes du protocole IRC (RFC 1459/2812). Ce to-do couvre exclusivement la partie serveur, rien de plus.


đŸ§© PARTIE 1 – Mise en place de la base rĂ©seau

L’objectif ici est de mettre en place un socket TCP non bloquant qui Ă©coute les connexions entrantes.

  • Inclure les bons headers

    • inclure ceux qui permettent d’utiliser socket(), bind(), listen(), accept(), poll(), fcntl(), etc.
    • Exemples : <sys/socket.h>, <netinet/in.h>, <fcntl.h>, <unistd.h>, etc.
  • CrĂ©er le socket serveur

    • Utilise socket(AF_INET, SOCK_STREAM, 0)
    • VĂ©rifie que le fd retournĂ© est valide (≠ -1)
  • Rendre l'adresse rĂ©utilisable

    • Avec setsockopt() et l’option SO_REUSEADDR, pour Ă©viter les erreurs du type "address already in use"
  • Rendre le socket non-bloquant

    • GrĂące Ă  fcntl(), pour que ton serveur puisse gĂ©rer plusieurs clients sans ĂȘtre bloquĂ© par un seul
  • Remplir la structure d'adresse sockaddr_in

    • SpĂ©cifie : IPv4 (AF_INET), IP (INADDR_ANY), port (utilise htons(port))
  • Lier le socket avec bind()

    • Lie le socket Ă  l’adresse IP + port
    • VĂ©rifie les retours d’erreurs
  • Mettre en Ă©coute avec listen()

    • Commence Ă  Ă©couter les connexions entrantes (backlog = SOMAXCONN par exemple)
  • Afficher un message pour confirmer que le serveur est prĂȘt

    • Par exemple : "Serveur en Ă©coute sur le port 6667..."

đŸ§© PARTIE 2 – GĂ©rer plusieurs clients avec poll()

L’objectif est de gĂ©rer plusieurs connexions client en parallĂšle grĂące Ă  une boucle non-bloquante avec poll().

  • Initialiser une structure pollfd[]

    • Mets le socket serveur dedans, avec l’évĂ©nement POLLIN
  • CrĂ©er une boucle principale

    • Appelle poll() sur le tableau de pollfd
    • VĂ©rifie le retour de poll() pour dĂ©tecter une activitĂ©
  • Accepter une nouvelle connexion si POLLIN sur le socket serveur

    • Utilise accept()
    • Rends la nouvelle socket client non bloquante
    • Ajoute-la dans le tableau pollfd
  • Afficher un message quand un client se connecte

    • Tu peux afficher son IP + port
  • Lire les messages entrants (recv())

    • Si recv() retourne 0 ou -1, dĂ©connecter le client
    • Sinon, stocker ou afficher le message
  • GĂ©rer la dĂ©connexion propre

    • Fermer le socket du client et le retirer du tableau pollfd

đŸ§© PARTIE 3 – Structurer ton projet

Commence Ă  organiser ton code avec des classes C++ propres.

  • CrĂ©er une classe Server

    • Membres : port, socket serveur, tableau/listes de clients, etc.
    • MĂ©thodes : start(), acceptClient(), handlePoll(), etc.
  • CrĂ©er une classe Client

    • Membres : fd, pseudo (nick), username, buffer, etc.
    • Identifier les clients par leur fd
  • Stocker les clients dans une structure

    • Par exemple : tableau statique, map fd → Client, etc.

đŸ§© PARTIE 4 – ImplĂ©menter les commandes IRC

Commence Ă  traiter les vraies commandes du protocole RFC IRC (1459/2812).

  • Lire les messages complets (finis par \r\n)

    • Traiter les lignes complĂštes reçues
  • GĂ©rer la commande PASS

    • Refuser toute commande tant que le mot de passe n’a pas Ă©tĂ© validĂ©
  • GĂ©rer NICK

    • VĂ©rifier unicitĂ© du pseudo
    • Mettre Ă  jour le client
  • GĂ©rer USER

    • Stocker les infos de l’utilisateur
  • Envoyer le message de bienvenue (code 001)

    • Quand le client a envoyĂ© PASS, NICK et USER
  • ImplĂ©menter PING / PONG

    • Pour maintenir la connexion active
  • GĂ©rer les erreurs standard

    • Mauvaise syntaxe, nickname en double, commande inconnue, etc.

đŸ§© PARTIE 5 – Gestion des canaux & communication

Mise en place des interactions entre clients et canaux.

  • GĂ©rer JOIN

    • CrĂ©er un canal s’il n’existe pas
    • Ajouter le client Ă  la liste des membres
  • GĂ©rer PRIVMSG

    • Envoi d’un message Ă  un canal (tous les membres sauf l’émetteur)
    • Envoi d’un message privĂ© Ă  un autre utilisateur
  • GĂ©rer PART

    • Quitter un canal
  • GĂ©rer QUIT

    • DĂ©connexion manuelle
  • (Optionnel) Ajouter NOTICE, TOPIC, MODE, etc.


đŸ§© PARTIE 6 – Tests et validation

Une fois les fonctionnalités implémentées, il faut tout tester.

  • Tester avec telnet ou netcat

    • Exemple : telnet localhost 6667
  • Tester avec un client IRC comme HexChat

    • VĂ©rifie que le client arrive Ă  se connecter, envoyer des messages, etc.
  • VĂ©rifier les erreurs courantes

    • Pseudo dĂ©jĂ  utilisĂ©, message sans ĂȘtre connectĂ©, commande inconnue...
  • GĂ©rer les dĂ©connexions correctes

    • Retirer le client de tous les canaux
    • LibĂ©rer ses ressources
  • VĂ©rifier les fuites mĂ©moire avec valgrind

    • TrĂšs important pour la soutenance

⚠ Contraintes techniques importantes

  • C++98 uniquement (pas de auto, nullptr, std::vector si pas autorisĂ©, etc.)
  • Aucun appel bloquant (accept(), recv(), etc. doivent ĂȘtre non-bloquants)
  • Gestion robuste des erreurs systĂšme
  • Code structurĂ©, clair, sĂ©parĂ© par fichiers/classes
  • Comportement conforme Ă  la RFC IRC

✅ À retenir

Ce to-do couvre tout ce qui est nécessaire pour implémenter le serveur IRC demandé dans le sujet ft_irc.
Il ne contient aucune fonctionnalitĂ© bonus ou non demandĂ©e (comme l’interface client, TLS, rĂ©seaux de serveurs, etc.).


Notes de Développement Bot & Connect4

SystĂšme de Bot de Base

  • ✅ Structure de classe Bot avec intĂ©gration IRC basique
  • ✅ Parsing des commandes bot (CONNECT4, PLAY)
  • ✅ Stockage de parties basique avec std::map
  • ✅ Communication serveur via sendToChannel()

Logique du Jeu Connect4

  • ✅ Initialisation plateau 6x7
  • ✅ Placement de piĂšces avec simulation de gravitĂ©
  • ✅ DĂ©tection de victoire (horizontal, vertical, diagonal)
  • ✅ Gestion d'Ă©tat de jeu basique
  • ✅ Affichage du plateau dans le canal IRC

IA du Bot

  • ✅ SĂ©lection alĂ©atoire de coups parmi les colonnes valides
  • ✅ Validation basique des colonnes
  • ✅ Alternance des tours entre humain et bot

Déroulement de Partie

  • ✅ DĂ©marrer partie avec commande "CONNECT4" (bot seulement)
  • ✅ Jouer coups avec commande "PLAY "
  • ✅ DĂ©tection basique victoire/dĂ©faite et nettoyage
  • ✅ Gestion des tours

🚧 TODO - Prochaines Sessions de DĂ©veloppement

IA Avancée du Bot

  • ImplĂ©menter dĂ©tection de coup gagnant
  • Ajouter blocage des coups gagnants adverses
  • Meilleur positionnement stratĂ©gique
  • Niveaux de difficultĂ©

Joueur vs Joueur

  • SystĂšme de dĂ©fi avec "CONNECT4 "
  • Accepter dĂ©fis avec commande "ACCEPT"
  • État de jeu appropriĂ© : WAITING_FOR_ACCEPT
  • Timeouts des dĂ©fis

Gestion des Parties

  • DĂ©tection d'Ă©galitĂ© quand plateau plein
  • FonctionnalitĂ© d'abandon
  • Statistiques et comptage des coups
  • Plusieurs parties simultanĂ©es par canal

SystĂšme de Timeouts

  • Suivi d'activitĂ© avec timestamps
  • Nettoyage automatique aprĂšs inactivitĂ©
  • Expiration des dĂ©fis (2 min)
  • Timeout de partie (5 min)

Gestion d'Erreurs & Validation

  • Meilleure validation des entrĂ©es
  • VĂ©rification d'appartenance au canal
  • EmpĂȘcher plusieurs parties par joueur
  • Gestion gracieuse des dĂ©connexions

Fonctionnalités Avancées

  • Support messages privĂ©s pour bot
  • Replay/historique des parties
  • Mode spectateur
  • Tournois Ă  Ă©limination

🔧 Dette Technique

Organisation du Code

  • Diviser Bot.cpp en fichiers plus petits
  • Ajouter codes d'erreur/enum appropriĂ©s
  • Meilleure const correctness
  • Ajouter tests unitaires

Performance

  • Optimiser algorithme de dĂ©tection de victoire
  • Meilleure gestion mĂ©moire pour nombreuses parties
  • Optimisations de pool de connexions

Documentation

  • Ajouter documentation des fonctions
  • ComplĂ©ter exemples README
  • Ajouter guides de dĂ©bogage

🐛 Problùmes Connus

  1. Pas de dĂ©tection d'Ă©galitĂ© - les parties continuent mĂȘme quand le plateau est plein
  2. Pas d'implémentation de commande d'abandon
  3. Limité aux parties contre bot seulement (pas de JcJ)
  4. Pas de gestion des timeouts
  5. Messages d'erreur basiques seulement
  6. Pas de statistiques de parties persistantes

📝 Journal de DĂ©veloppement

  • Architecture bot basique implĂ©mentĂ©e
  • Logique Connect4 fonctionnelle
  • IA simple avec coups alĂ©atoires
  • IntĂ©gration IRC fonctionnelle
  • Parties bot vs humain fonctionnelles
  • DĂ©tection de victoire implĂ©mentĂ©e
  • Affichage du plateau fonctionnel

Prochaine priorité : Implémenter détection d'égalité et améliorer stratégie IA


Bonne construction ! Tu peux cocher chaque Ă©tape Ă  mesure que tu avances. đŸ’»

About

Server CPP

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors