ft_irc is an IRC server implemented in modern C++, following RFC1459 and IRCv3 conventions. It supports multi-client connections, user authentication, nick/user management, channel join/leave operations, and private messaging.
Built collaboratively as part of the Hive Helsinki 42 curriculum.
- RFC-compliant command parsing
- Robust input validation and error handling
- Multi-client management via non-blocking sockets
- Clear separation of message parsing, client state, and command execution
- Unit tested with Catch2
git clone https://github.com/mxafi/ft_irc
cd ft_irc && make
./ircserv <port> <password>port: Port to bind the serverpassword: Required password for clients to connect
While many parts of this project were developed collaboratively through pair programming and peer reviews, the following elements were authored and tested independently by me:
- Implementation of nickname validation and command execution logic
- Catch2 test suites covering input parsing,
PRIVMSG, and protocol-compliance edge cases (excluding server state tests) - Pull requests listed below that focus on testing, refactoring, and feature development
These contributions reflect my personal initiative and responsibility within the project.
| Date | Commit | Description |
|---|---|---|
| 2024-03-20 | b5d3014 |
Test/command/execute (#87) |
| 2024-03-16 | 30b7d59 |
Additional tests for NICK command (#75) |
| 2024-03-14 | 91f0e09 |
Refactor reply.h, remove magic numbers (#69) |
| 2024-02-21 | 7ad2aca |
Implemented Message class and parsing logic (#19) |
See full list on GitHub.
We used Catch2 to implement robust unit and integration tests covering:
- Nickname validation (RFC2812 rules + DALnet extensions)
- PRIVMSG routing
- Command execution logic
- Error message handling
- Input edge cases (nulls, whitespace, multi-targets, Unicode, etc.)
We tested over 30 cases for nickname parsing:
- Valid input trimming and truncation
- Invalid characters:
* ? @ . : & $ \n \t - Empty or whitespace-only input
- Unicode and control characters
Test Snippet (Click to expand)
TEST_CASE("Nick", "[command][nick]") {
REQUIRE(client1.getNickname() == expectedNick);
REQUIRE(client1.getNickname().length() <= 9);
}Client,Message, andCommandclasses handle connection state, message parsing, and command dispatch.Command::execute()orchestrates validation, reply construction, and client interaction.- Test cases explore unregistered states, malformed messages, multi-client routing, and protocol correctness.
MIT