{"id":17436288,"url":"https://github.com/raveriss/ft_irc","last_synced_at":"2026-02-25T20:31:04.697Z","repository":{"id":257864859,"uuid":"870171714","full_name":"raveriss/ft_irc","owner":"raveriss","description":"Projet de développement d’un serveur IRC en C++98, suivant les standards du protocole IRC. Le serveur supporte plusieurs connexions simultanées, des opérations non bloquantes, et permet aux clients de rejoindre des canaux, d’envoyer des messages privés, et de gérer des opérateurs de canaux. ","archived":false,"fork":false,"pushed_at":"2024-11-30T22:52:06.000Z","size":4480,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-07T22:02:49.688Z","etag":null,"topics":["42-paris","42-school","42school","cpp98","ft-irc","internet","internet-relay-chat","irc","networking","non-blocking-io","server","sockets"],"latest_commit_sha":null,"homepage":"https://www.linkedin.com/in/rafael-verissimo-8b382b20b/","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/raveriss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-10-09T15:08:06.000Z","updated_at":"2025-08-26T10:02:45.000Z","dependencies_parsed_at":"2024-10-16T19:52:30.879Z","dependency_job_id":"a4dee040-ad56-4ac8-ae3e-6219de7ce77a","html_url":"https://github.com/raveriss/ft_irc","commit_stats":{"total_commits":9,"total_committers":3,"mean_commits":3.0,"dds":"0.33333333333333337","last_synced_commit":"cfb4242ba3504b89d2eec26ea37cf1b3b5b37179"},"previous_names":["raveriss/ft_irc"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/raveriss/ft_irc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_irc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_irc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_irc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_irc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/raveriss","download_url":"https://codeload.github.com/raveriss/ft_irc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raveriss%2Fft_irc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29838032,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T19:08:47.527Z","status":"ssl_error","status_checked_at":"2026-02-25T18:59:04.705Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["42-paris","42-school","42school","cpp98","ft-irc","internet","internet-relay-chat","irc","networking","non-blocking-io","server","sockets"],"created_at":"2024-10-17T10:08:09.601Z","updated_at":"2026-02-25T20:31:04.666Z","avatar_url":"https://github.com/raveriss.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# ft_irc - École 42 | Paris\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/language-C++98-blue\" alt=\"C++98\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/standard-IRC-1f425f\" alt=\"IRC Protocol\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/socket-TCP/IP-blue\" alt=\"TCP/IP\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/school-42-green\" alt=\"42\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/42-Paris-blue\" alt=\"42 Paris\"\u003e\n\u003c/div\u003e\n\n###\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/ayogun/42-project-badges/refs/heads/main/badges/ft_irce.png?raw=true\" alt=\"Badge du projet push_swap\"\u003e\n\u003c/div\u003e\n\n## Description\n\nLe projet **`ft_irc`** consiste à développer un serveur IRC en respectant le standard IRC tout en utilisant le langage **`C++98`**. Le serveur doit gérer plusieurs connexions simultanées et fonctionner en mode non bloquant pour permettre une communication fluide entre les clients.\n\nVous devez tester votre serveur à l'aide d'un vrai client IRC pour garantir la compatibilité avec le protocole standard.\n\n## Objectifs\n\n- Reproduire le fonctionnement d'un serveur **`IRC`** en `C++98`.\n- Gérer plusieurs clients simultanément sans blocage.\n- Implémenter les principales commandes IRC comme `NICK`, `USER`, `JOIN`, `PRIVMSG`, etc.\n- Fournir un système d'authentification via un mot de passe à la connexion.\n- Supporter les opérateurs de canal et les commandes associées comme `KICK`, `INVITE`, `TOPIC`, et `MODE`.\n\n## Fonctionnalités\n\n- **Communication `TCP`/`IP`** : Utilisation des sockets pour la communication entre le serveur et les clients via le protocole **`TCP`/`IP`** (`v4` ou `v6`).\n- **Gestion des canaux** : Le serveur doit permettre la création et la gestion de canaux `IRC`, avec la possibilité d'envoyer des messages privés ou dans des canaux.\n- **Non-bloquant** : Toutes les opérations d'entrée/sortie (E/S) sont non bloquantes afin de ne jamais empêcher la gestion simultanée des connexions multiples.\n- **Sécurité** : Utilisation d'un mot de passe pour sécuriser l'accès au serveur. Chaque client doit fournir le bon mot de passe pour pouvoir se connecter.\n- **Support multi-clients** : Le serveur peut gérer plusieurs connexions simultanément sans aucun forking ou thread supplémentaire.\n\n## Structure du Projet\n\n```bash\n.\n├── incs\n│   ├── Bot.hpp\n│   ├── Channel.hpp\n│   ├── Client.hpp\n│   ├── IrcMessageBuilder.hpp\n│   ├── IrcNumericReplies.hpp\n│   └── Server.hpp\n├── Makefile\n├── README.md\n└── srcs\n    ├── Bot.cpp\n    ├── Channel.cpp\n    ├── Client.cpp\n    ├── IrcMessageBuilder.cpp\n    ├── main.cpp\n    └── Server.cpp\n```\n## Exemple de commandes IRC supportées\n\n- **`NICK`** : Changer le pseudonyme du client\n- **`USER`** : S'authentifier sur le serveur\n- **`JOIN`** : Rejoindre un canal\n- **`PRIVMSG`** : Envoyer un message privé ou un message dans un canal\n- **`KICK`** : Éjecter un client d'un canal (opérateurs uniquement)\n- **`INVITE`** : Inviter un client à rejoindre un canal\n- **`TOPIC`** : Changer ou afficher le sujet d'un canal\n- **`MODE`** : Modifier les permissions d'un canal (opérateurs uniquement)\n\n## Bonus\n\n- **Bot IRC** : Possibilité d'ajouter un petit bot qui interagit avec les utilisateurs.\n- **Transfert de fichiers** : Support de l'envoi de fichiers entre clients.\n\n## Compilation\n\nUtilisez le **`Makefile`** pour compiler le projet avec les options de compilation requises. Le projet doit se compiler en utilisant `C++98` avec les flags `-Wall -Wextra -Werror`.\n\n**Commandes disponibles :**\n```bash\nmake        # Compile le projet\nmake clean  # Supprime les fichiers objets\nmake fclean # Supprime les fichiers objets et les binaires\nmake re     # Recompile le projet\n```\n\n## Lancer le serveur :\n```bash\n./ircserv \u003cport\u003e \u003cpassword\u003e\n```\n- **Arguments** :\n  - `\u003cport\u003e` : Le numéro de `port` sur lequel le serveur écoutera.\n  - `\u003cpassword\u003e` : Le mot de passe que les clients devront fournir pour se connecter.\n\n## Aperçu du Serveur\n\nVoici un aperçu de l'interface graphique du serveur `ft_irc` lors de son lancement :\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"assets/ft_irc.png\" alt=\"Aperçu du serveur ft_irc\" width=\"800\"\u003e\n\u003c/div\u003e\n\n## Gestion des Adresses `IP`\n\n- **Afficher les Adresses `IP` de l’Hôte :**\n\n  ```bash\n  hostname -I\n  ```\n- **Afficher l’Adresse `IPv4` de l’Interface `enp3s0f0` :**\n\n  ```bash\n  ip -o -4 addr show enp3s0f0 | awk '{print $4}' | cut -d/ -f1\n  ```\n    **Explication des Commandes :**\n    \n    - `ip -o -4 addr show enp3s0f0` : Affiche les informations d’adresse `IPv4` pour l’interface `enp3s0f0` en format compact.\n    - `awk '{print $4}'` : Sélectionne la colonne contenant l’adresse `IP` avec le masque de sous-réseau.\n    - `cut -d/ -f1` : Supprime le masque de sous-réseau pour ne garder que l’adresse `IP` pure.\n- **Extraction de l’Adresse `IP` Principale :**\n\n  ```bash\n  hostname -I | awk '{print $1}'\n  ```\n## Se Connecter à un Serveur `IRC`\n\nCette section décrit les différentes méthodes pour se connecter à un serveur `IRC` en fonction de l'outil utilisé.\n\n### 1. Connexion avec `nc` (`netcat`)\nUtilisez `nc` pour établir une connexion basique au serveur `IRC`. C'est utile pour des tests rapides :\n    \n```bash\nnc \u003cserver_ip\u003e \u003cport\u003e\n```\n    \nEnvoi de commandes `IRC` : Une fois connecté, entrez vos commandes `IRC` directement dans le terminal (par exemple, `PASS`, `NICK`, `USER`, etc.).\n\n### 2. Connexion avec `irssi`\n  - **Méthode A** : Connexion simple\n    Lancer `irssi` :\n    ```bash\n    irssi\n    ```\n\n    Une fois dans l'interface d'`irssi`, utilisez la commande suivante :\n    ```irssi\n    /connect \u003cserver_ip\u003e \u003cport\u003e\n    ```\n  - **Méthode B** : Connexion avec paramètres (`port`, `nickname`, `password`)\n    ```bash\n    irssi -c \u003cserver_ip\u003e -p \u003cport\u003e -n \u003cnickname\u003e -w \u003cpassword\u003e\n    ```\n  **Comparaison des outils :**\n  \n  `nc` (`netcat`) : Idéal pour des tests basiques et vérifier les échanges bruts avec le serveur.\n  `irssi` : Offre une interface interactive, utile pour tester des fonctionnalités avancées comme la gestion des canaux ou les commandes administratives.\n\n## Diagnostic et Debug\n### Outils de Débogage et Diagnostic\n- **Vérification des Connexions Actives sur le Port `\u003cport\u003e` avec `lsof` :**\n  ```bash\n  lsof -i :\u003cport\u003e\n  ```\n- **Forcer la Fermeture des Processus Actifs sur le Port `\u003cport\u003e` :**\n  ```bash\n  kill -9 $(lsof -t -i :\u003cport\u003e)\n  ```\n- **Fuites Mémoire et Vérification des Descripteurs Actifs pour `ircserv` via `Valgrind` :**\n  ```bash\n  valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --track-fds=yes ./ircserv \u003cport\u003e \u003cpassword\u003e\n  ```\n## Utilisation d’`Irssi`\n- **Ouvrir le Fichier de Configuration d'`Irssi` avec `VS Code` :**\n  ```bash\n  code ~/.irssi/config\n  ```\n\n- **Pour Utiliser `RAWLOG` avec votre Serveur `IRC` :**\n\n  Dans `irssi` :\n  ```irssi\n  /RAWLOG OPEN ~/debug.log\n  ```\n- **Passer d'une conversation privée à la page d'accueil d'`Irssi` :**\n\n  - Appuyez sur `Alt + 1` ou `Esc` suivi de `1` pour retourner à la fenêtre 1, qui est souvent la page d'accueil ou le canal principal.\n    \n  - Appuyez sur `Alt + flèche gauche` ou `Alt + flèche droite` pour naviguer entre les fenêtres.\n  Vous pouvez également utiliser `Ctrl + P` (fenêtre précédente) ou `Ctrl + N` (fenêtre suivante).\n\n  - Tapez `/window goto 1` dans n'importe quelle fenêtre pour revenir à la fenêtre 1.\n- **Adresse `IP` pour les transferts DCC**\n\n  - **Observation** :\n    Votre configuration indique `hostname = \"127.0.0.1\"` dans les paramètres du core. L'adresse `127.0.0.1` est l'adresse de bouclage (*localhost*) et n'est pas accessible depuis d'autres machines sur le réseau.\n  \n  - **Solution** :\n    Définissez votre adresse `IP` externe ou locale correcte en utilisant la commande suivante dans `Irssi` :\n    ```irssi\n    /set dcc_own_ip votre.adresse.ip\n    ```\n    Remplacez votre.adresse.ip par votre adresse IP réelle sur le réseau.\n  \n  - **Résultat** : Cette commande ajoutera automatiquement l'entrée suivante dans votre fichier de configuration `~/.irssi/config` :\n    ```\n    \"irc/dcc\" = { dcc_own_ip = \"\u003cclient_ip\u003e\"; };\n    };\n    ```\n\n## Envoi de fichier.\n### Avec `irssi` :\n- **Envoyer un Fichier avec `DCC` :**\n\n  ```irssi\n  /dcc send Pol /mnt/nfs/homes/raveriss/Desktop/Sender/test.txt\n  ```\n- **Recevoir un Fichier avec `DCC` :**\n\n  ```irssi\n  /dcc get Raf test.txt\n  ```\n\n### Avec `nc` :\n\n\n- **1. Sur le client expéditeur (`Raf`) :**\n\n  Ouvrez un terminal et placez-vous dans le répertoire du fichier :\n\n  ```bash\n  cd /mnt/nfs/homes/raveriss/Desktop/Sender/\n  ```\n  Lancez `netcat` en écoute sur un port dédié, par exemple `12345` :\n  ```bash\n  nc -l 12345 \u003c test.txt\n  ```\n \n- **2. Sur le client récepteur (`Pol`) :**\n\n  Lancez la commande suivante pour vous connecter à `Raf` et recevoir le fichier :\n\n  ```bash\n  nc \u003cserver_ip\u003e 12345 \u003e test.txt\n  ```\n    - `\u003cserver_ip\u003e` : Adresse `IP` de `Raf`.\n    - `12345` : `Port` fourni par `Raf`.\n\n## Tester la suspention d'un client dans un channel\n### Avec `nc` :\n\n- **1. Quand un client est dans un channel contenant plusieurs autres clients, faire un `Ctrl + Z`.**\n\nCe message devrait apparaitre :\n\n```bash\n[\u003cn\u003e]+  Stopped                 nc \u003cserver_ip\u003e \u003cport\u003e\n```\nCela signifie que ce client est maintenant suspendu.\n\n- **2. Envoyez maintenant plusieurs `PRIVMSG` dans le channel avec plusieurs clients qui y sont presents.**\n- **3. Effectuez la commande suivante avec le client suspendu :**\n\n```bash\nfg % \u003cn\u003e\n```\nRemplacez `\u003cn\u003e` par le numéro affiché entre crochets dans le message `Stopped`.\n\nSi votre projet `IRC` fonctionne correctement, apres cette commande les messages ecrits pendant qu'il etait suspendu devraient apparaitre dans le terminal.\n\n---\n\n## Contributeurs\n\n- [acatusse](https://github.com/0x2Anessie)\n- [lgoure](https://github.com/lukas94kdl)\n- [raveriss](https://github.com/raveriss) \n\n## Ressources Utilisées\n\n- [Documentation officielle de l'IRC](https://tools.ietf.org/html/rfc2812)\n- [Documentation des sockets en C++](https://www.boost.org/doc/libs/1_76_0/doc/html/boost_asio.html)\n- [Tutoriel sur les sockets Unix](https://beej.us/guide/bgnet/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraveriss%2Fft_irc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fraveriss%2Fft_irc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraveriss%2Fft_irc/lists"}