From 7ce9d57433b9c3b402ae96cb59c7bece6ab6a32a Mon Sep 17 00:00:00 2001 From: Nouman elallaoui <103364555+Nellaoui@users.noreply.github.com> Date: Wed, 24 Jul 2024 09:44:10 +0100 Subject: [PATCH 01/11] settteing the Data --- .vscode/settings.json | 14 +++-- tests/Channel.cpp | 10 ++++ tests/Channel.hpp | 4 ++ tests/IRC | Bin 188156 -> 0 bytes tests/Server.cpp | 126 +++++++++++++++++++++++++++++++++--------- tests/Server.hpp | 7 ++- tests/User.hpp | 1 + tests/main.cpp | 11 +++- 8 files changed, 135 insertions(+), 38 deletions(-) delete mode 100755 tests/IRC diff --git a/.vscode/settings.json b/.vscode/settings.json index 09b9350..574ffa0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,10 @@ { "files.associations": { + "iosfwd": "cpp", + "sstream": "cpp", + "vector": "cpp", + "algorithm": "cpp", + "string": "cpp", "__bit_reference": "cpp", "__config": "cpp", "__debug": "cpp", @@ -13,8 +18,8 @@ "__split_buffer": "cpp", "__string": "cpp", "__threading_support": "cpp", + "__tree": "cpp", "__tuple": "cpp", - "algorithm": "cpp", "array": "cpp", "atomic": "cpp", "bit": "cpp", @@ -36,29 +41,26 @@ "functional": "cpp", "initializer_list": "cpp", "ios": "cpp", - "iosfwd": "cpp", "iostream": "cpp", "istream": "cpp", "iterator": "cpp", "limits": "cpp", "locale": "cpp", + "map": "cpp", "memory": "cpp", "mutex": "cpp", "new": "cpp", "optional": "cpp", "ostream": "cpp", "ratio": "cpp", - "sstream": "cpp", "stdexcept": "cpp", "streambuf": "cpp", - "string": "cpp", "string_view": "cpp", "system_error": "cpp", "tuple": "cpp", "type_traits": "cpp", "typeinfo": "cpp", "unordered_map": "cpp", - "utility": "cpp", - "vector": "cpp" + "utility": "cpp" } } \ No newline at end of file diff --git a/tests/Channel.cpp b/tests/Channel.cpp index 9b2e676..261189b 100644 --- a/tests/Channel.cpp +++ b/tests/Channel.cpp @@ -62,6 +62,16 @@ void Channel::removeUser(const User *user) _users.erase(std::remove(_users.begin(), _users.end(), user), _users.end()); } +std::string Channel::getName() const +{ + return _name; +} + +std::vector Channel::getUsers() const +{ + return _users; +} + /* ** --------------------------------- ACCESSOR --------------------------------- diff --git a/tests/Channel.hpp b/tests/Channel.hpp index 4eaec08..7ecb904 100644 --- a/tests/Channel.hpp +++ b/tests/Channel.hpp @@ -16,6 +16,10 @@ class Channel Channel( Channel const & src ); void addUser( User *user); void removeUser(const User *user); + + std::string getName() const; + std::vector getUsers() const; + ~Channel(); Channel & operator=( Channel const & rhs ); diff --git a/tests/IRC b/tests/IRC deleted file mode 100755 index 819bd1e9aded10231813d7a08ba609a11c41533c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188156 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%0As!golf?xASoj!nmBKS(;2=NWXW5oYQTqb_W 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 users = _channels.at(channelName).getUsers(); + std::cout << users.size() << " user"; + if (users.size() != 1) std::cout << "s"; + std::cout << "): "; + + for (size_t i = 0; i < users.size(); ++i) { + if (i > 0) std::cout << ", "; + std::cout << users[i]->getNickName(); + } + std::cout << std::endl; + } +} + +void Server::start(string port, string password) { std::cout << "Server started" << std::endl; - _createServer(); + _password = password; + _createServer(port); } @@ -87,39 +116,84 @@ void Server::_hundleNewConnection(int socketFd) throw std::runtime_error("Accept failed"); return ; } - _setNonBlocking(clientfd); - FD_SET(clientfd, &_masterSet); - _clients.push_back(clientfd); - _authenticated[clientfd] = true; - if (clientfd > _maxFd) + try + { + User* newUser = new User(clientfd, "random" + std::to_string(clientfd), "random"); + _users[clientfd] = newUser; + _setNonBlocking(clientfd); + FD_SET(clientfd, &_masterSet); + _clients.push_back(clientfd); + _authenticated[clientfd] = true; + if (clientfd > _maxFd) _maxFd = clientfd; cout << "New connection for the socket :" << clientfd << endl; + } + catch(const std::exception& e) + { + std::cerr << e.what() << '\n'; + } + } void Server::_hundleMessage(string message, int clientFd) { std::istringstream iss(message); - string channelName; + string command; + User *user; user = _users[clientFd]; - - - string command; - iss >> command; + while (iss >> command) + { + cout << command << endl; + if (command == "PASS") + { + string password; + iss >> password; + // string trash; + // std::getline(iss, trash); + // string nickName; + // iss >> nickName; + // cout << nickName << "her "<< endl;; + // std::getline(iss, trash); + if (password != _password) + { + string response = "The password is incorrect : For the User " + _users[clientFd]->getUserName() + "\n"; + send(clientFd, response.c_str(), response.size(), 0); + break ; + } + } + else if (command == "NICK") + { + string nickName; + iss >> nickName; + user->setNickName(nickName); + } + else if (command == "USER") + { + string userName; + iss >> userName; + user->setUserName(userName); + string trash; + iss >> trash; + string ipAdresse; + iss >> ipAdresse; + } + } + string channelName; + // cout << "\n \n here is the command " << command << endl; if (command == "join" || command == "JOIN") { + iss >> channelName; _channels[channelName] = Channel(channelName); Channel& channel = _channels[channelName]; - - // Add the user to the channel - channel.addUser(user); - // Send join confirmation to the user - std::string joinMsg = ":" "@localhost JOIN " + channelName + "\r\n"; - send(user->getFd(), joinMsg.c_str(), joinMsg.length(), 0); - + channel.addUser(user); + cout << "join recived " << channelName << endl; + std::string joinMsg = ":" "@localhost JOIN " + channelName + "here" + "\n"; + send(user->getFd(), joinMsg.c_str(), joinMsg.length(), 0); } } + void Server::_hundleClientMessage(int ClientFd) { char str[4090]; @@ -137,10 +211,9 @@ void Server::_hundleClientMessage(int ClientFd) } else { - str[bytesReceived] = '\0'; - // _authentification(ClientFd, ) - // std::cout << "Received: " << str << std::endl; + _hundleMessage(str, ClientFd); + // std::cout << "Received: " << str << "THE end" << std::endl; if (send(ClientFd, str, bytesReceived, 0) == -1) { std::cerr << "Failed to send message" << std::endl; @@ -149,7 +222,7 @@ void Server::_hundleClientMessage(int ClientFd) // _authentification() } -void Server::_createServer() +void Server::_createServer(string port) { int socketFd; struct sockaddr_in serverAdresse; @@ -161,7 +234,7 @@ void Server::_createServer() int status=setsockopt(socketFd, SOL_SOCKET,SO_REUSEADDR , &op, sizeof(op)); memset(&serverAdresse, 0, sizeof(serverAdresse)); serverAdresse.sin_family = AF_INET; - serverAdresse.sin_port = htons(6667); + serverAdresse.sin_port = htons(strtod(port.c_str(), NULL)); serverAdresse.sin_addr.s_addr = inet_addr("127.0.0.1"); bind(socketFd, (const struct sockaddr *)&serverAdresse, sizeof(serverAdresse)); listen(socketFd, 20); @@ -169,7 +242,6 @@ void Server::_createServer() FD_ZERO(&_masterSet); FD_SET(socketFd, &_masterSet); _maxFd = socketFd; - cout << "Server started" << endl; while (1) { _readSet = _masterSet; @@ -182,10 +254,10 @@ void Server::_createServer() { int clientFd = _clients[i]; if (FD_ISSET(clientFd, &_readSet)) - { _hundleClientMessage(clientFd); - } } + + // printChannels(); } close(socketFd); } diff --git a/tests/Server.hpp b/tests/Server.hpp index c66a865..634954f 100644 --- a/tests/Server.hpp +++ b/tests/Server.hpp @@ -37,7 +37,7 @@ class Server Server(); Server( Server const & src ); ~Server(); - void start(); + void start(string port, string password); Server & operator=( Server const & rhs ); @@ -46,16 +46,17 @@ class Server fd_set _readSet; map _users; map _authenticated; - // std::map _users; map _channels; vector _clients; int _maxFd; + string _password; - void _createServer(); + void _createServer(string port); void _setNonBlocking(int socketFd); void _hundleNewConnection(int socketFd); void _hundleClientMessage(int ClientFd); void _hundleMessage(string message, int clientFd); + void printChannels() const ; // void _authentification(int socketFd, const string &nickName, const string &userName); }; diff --git a/tests/User.hpp b/tests/User.hpp index d85d616..ad054d3 100644 --- a/tests/User.hpp +++ b/tests/User.hpp @@ -30,6 +30,7 @@ class User void setUserName(const string &userName); void setNickName(const string &nickName); + User & operator=( User const & rhs ); private: diff --git a/tests/main.cpp b/tests/main.cpp index 79d3321..871c524 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -1,11 +1,18 @@ #include "Server.hpp" -int main() +int main(int ac, char **av) { + if (ac != 3) + { + cerr << "Must be run as follows: : ./ircserv " << endl; + return 1; + } try { + string port = av[1]; + string password = av[2]; Server srv; - srv.start(); + srv.start(av[1], av[2]); } catch(const std::exception& e) { From 2d481959f2adf8b12550380ce37859d9503dbe81 Mon Sep 17 00:00:00 2001 From: Nouman elallaoui <103364555+Nellaoui@users.noreply.github.com> Date: Wed, 24 Jul 2024 12:59:01 +0100 Subject: [PATCH 02/11] trying to hundle join in hexChat --- tests/Server.cpp | 61 ++++++++++++++++++++++++++++++------------------ tests/Server.hpp | 2 ++ tests/client.cpp | 2 +- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/tests/Server.cpp b/tests/Server.cpp index d854d9e..25fcedc 100644 --- a/tests/Server.cpp +++ b/tests/Server.cpp @@ -135,6 +135,28 @@ void Server::_hundleNewConnection(int socketFd) } +void Server::_brodcastMessage(string ChannelName, string message) +{ + map::iterator it = _channels.find(ChannelName); + + if (it != _channels.end()) + { + Channel &channel = it->second; + vector users = channel.getUsers(); + for (size_t i = 0; i < users.size(); i++) + { + User *user = users[i]; + send(user->getFd(), message.c_str(), message.size(), 0); + } + } + +} + +void Server::_sendMessage() +{ + +} + void Server::_hundleMessage(string message, int clientFd) { std::istringstream iss(message); @@ -149,15 +171,9 @@ void Server::_hundleMessage(string message, int clientFd) { string password; iss >> password; - // string trash; - // std::getline(iss, trash); - // string nickName; - // iss >> nickName; - // cout << nickName << "her "<< endl;; - // std::getline(iss, trash); if (password != _password) { - string response = "The password is incorrect : For the User " + _users[clientFd]->getUserName() + "\n"; + string response = "The password is incorrect \n"; send(clientFd, response.c_str(), response.size(), 0); break ; } @@ -178,18 +194,17 @@ void Server::_hundleMessage(string message, int clientFd) string ipAdresse; iss >> ipAdresse; } - } - string channelName; - // cout << "\n \n here is the command " << command << endl; - if (command == "join" || command == "JOIN") - { - iss >> channelName; - _channels[channelName] = Channel(channelName); - Channel& channel = _channels[channelName]; - channel.addUser(user); - cout << "join recived " << channelName << endl; - std::string joinMsg = ":" "@localhost JOIN " + channelName + "here" + "\n"; - send(user->getFd(), joinMsg.c_str(), joinMsg.length(), 0); + else if (command == "join" || command == "JOIN") + { + string channelName; + iss >> channelName; + _channels[channelName] = Channel(channelName); + Channel& channel = _channels[channelName]; + channel.addUser(user); + string joinMsg = "You have Joined to " + channelName + " Channel\n"; + send(user->getFd(), joinMsg.c_str(), joinMsg.size(), 0); + } + _brodcastMessage(user->getNickName(), message); } } @@ -214,10 +229,10 @@ void Server::_hundleClientMessage(int ClientFd) str[bytesReceived] = '\0'; _hundleMessage(str, ClientFd); // std::cout << "Received: " << str << "THE end" << std::endl; - if (send(ClientFd, str, bytesReceived, 0) == -1) - { - std::cerr << "Failed to send message" << std::endl; - } + // if (send(ClientFd, str, bytesReceived, 0) == -1) + // { + // std::cerr << "Failed to send message" << std::endl; + // } } // _authentification() } diff --git a/tests/Server.hpp b/tests/Server.hpp index 634954f..963431c 100644 --- a/tests/Server.hpp +++ b/tests/Server.hpp @@ -56,6 +56,8 @@ class Server void _hundleNewConnection(int socketFd); void _hundleClientMessage(int ClientFd); void _hundleMessage(string message, int clientFd); + void _sendMessage(); + void _brodcastMessage(string ChannelName, string message); void printChannels() const ; // void _authentification(int socketFd, const string &nickName, const string &userName); diff --git a/tests/client.cpp b/tests/client.cpp index f93c889..5178675 100644 --- a/tests/client.cpp +++ b/tests/client.cpp @@ -37,7 +37,7 @@ void communicate(int client_fd) { std::string message; std::getline(std::cin, message); - if (send(client_fd, message.c_str(), message.length(), 0) == -1) { + if (send(client_fd, message.c_str(), message.size(), 0) == -1) { std::cerr << "Failed to send message" << std::endl; break; } From 199b3eb45c22fafd4aaad91e85802bda2f289db4 Mon Sep 17 00:00:00 2001 From: Nouman elallaoui <103364555+Nellaoui@users.noreply.github.com> Date: Wed, 24 Jul 2024 13:22:09 +0100 Subject: [PATCH 03/11] trying to hundle join in hexChat --- tests/Server.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Server.cpp b/tests/Server.cpp index 25fcedc..5bf5aef 100644 --- a/tests/Server.cpp +++ b/tests/Server.cpp @@ -201,11 +201,11 @@ void Server::_hundleMessage(string message, int clientFd) _channels[channelName] = Channel(channelName); Channel& channel = _channels[channelName]; channel.addUser(user); - string joinMsg = "You have Joined to " + channelName + " Channel\n"; + string joinMsg = ":" + user->getNickName() + "!" + user->getUserName() ; send(user->getFd(), joinMsg.c_str(), joinMsg.size(), 0); } - _brodcastMessage(user->getNickName(), message); } + _brodcastMessage(user->getNickName(), message); } From d5c6c7bd64deefa9c243453c7ad0a5c0c2a76c3c Mon Sep 17 00:00:00 2001 From: Nouman elallaoui <103364555+Nellaoui@users.noreply.github.com> Date: Wed, 24 Jul 2024 20:11:12 +0100 Subject: [PATCH 04/11] join done --- tests/IRC | Bin 0 -> 215476 bytes tests/Server.cpp | 42 ++++++++++++++++++++++++++++++------------ tests/Server.hpp | 5 ++--- tests/User.cpp | 11 +++++++++++ tests/User.hpp | 3 +++ 5 files changed, 46 insertions(+), 15 deletions(-) create mode 100755 tests/IRC diff --git a/tests/IRC b/tests/IRC new file mode 100755 index 0000000000000000000000000000000000000000..151dd4678ab1efae3b144ffbd2a981d71da78ee2 GIT binary patch literal 215476 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 ZL(7_*QbN_;&xgC^6YlhdllCwA=l@I}GE@Kn literal 0 HcmV?d00001 diff --git a/tests/Server.cpp b/tests/Server.cpp index 5bf5aef..aff9c95 100644 --- a/tests/Server.cpp +++ b/tests/Server.cpp @@ -161,12 +161,11 @@ void Server::_hundleMessage(string message, int clientFd) { std::istringstream iss(message); string command; - User *user; user = _users[clientFd]; + // user->setFd(clientFd); while (iss >> command) { - cout << command << endl; if (command == "PASS") { string password; @@ -186,26 +185,46 @@ void Server::_hundleMessage(string message, int clientFd) } else if (command == "USER") { - string userName; + string userName, realName, ipAdresse; iss >> userName; user->setUserName(userName); - string trash; - iss >> trash; - string ipAdresse; + iss >> realName; iss >> ipAdresse; + user->setIpAdresse(ipAdresse); } - else if (command == "join" || command == "JOIN") + else if (command == "JOIN") { string channelName; iss >> channelName; _channels[channelName] = Channel(channelName); Channel& channel = _channels[channelName]; channel.addUser(user); - string joinMsg = ":" + user->getNickName() + "!" + user->getUserName() ; - send(user->getFd(), joinMsg.c_str(), joinMsg.size(), 0); + string joinMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP JOIN " + channelName + " * :realname\r\n"; + cout << joinMsg << endl; + send(clientFd, joinMsg.c_str(), joinMsg.size(), 0); } + // else if (command == "PRIVMSG") + // { + // string recipent; + // iss >> recipent; + // map::iterator it = _users.begin(); + // while (it != _users.end()) + // { + // User *user = it->second; + // cout << "this is the nickName " << user->getNickName() << endl; + // cout << "this is the recipent " << recipent << endl; + // if(user->getNickName() == recipent) + // { + // string prvMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP PRIVMSG " + recipent; + // cout << prvMsg << endl; + // send(user->getFd(), prvMsg.c_str(), prvMsg.size(), 0); + // } + // ++it; + // } + + // } } - _brodcastMessage(user->getNickName(), message); + // _brodcastMessage(user->getNickName(), message); } @@ -246,7 +265,7 @@ void Server::_createServer(string port) if (socketFd < 0) { throw std::runtime_error("Socket creation failed"); } - int status=setsockopt(socketFd, SOL_SOCKET,SO_REUSEADDR , &op, sizeof(op)); + int status = setsockopt(socketFd, SOL_SOCKET,SO_REUSEADDR , &op, sizeof(op)); memset(&serverAdresse, 0, sizeof(serverAdresse)); serverAdresse.sin_family = AF_INET; serverAdresse.sin_port = htons(strtod(port.c_str(), NULL)); @@ -271,7 +290,6 @@ void Server::_createServer(string port) if (FD_ISSET(clientFd, &_readSet)) _hundleClientMessage(clientFd); } - // printChannels(); } close(socketFd); diff --git a/tests/Server.hpp b/tests/Server.hpp index 963431c..48423c8 100644 --- a/tests/Server.hpp +++ b/tests/Server.hpp @@ -29,6 +29,7 @@ using std::map; using std::vector; + class Server { @@ -50,7 +51,7 @@ class Server vector _clients; int _maxFd; string _password; - + void _createServer(string port); void _setNonBlocking(int socketFd); void _hundleNewConnection(int socketFd); @@ -59,8 +60,6 @@ class Server void _sendMessage(); void _brodcastMessage(string ChannelName, string message); void printChannels() const ; - // void _authentification(int socketFd, const string &nickName, const string &userName); - }; std::ostream & operator<<( std::ostream & o, Server const & i ); diff --git a/tests/User.cpp b/tests/User.cpp index d046b7d..0bd83ba 100644 --- a/tests/User.cpp +++ b/tests/User.cpp @@ -37,6 +37,7 @@ User & User::operator=( User const & rhs ) this->_fd = rhs.getFd(); this->_nickName = rhs.getNickName(); this->_userName = rhs.getUserName(); + this->_userName = rhs.getIpAdresse(); } return *this; } @@ -67,6 +68,11 @@ string User::getNickName() const return _nickName; } +string User::getIpAdresse() const +{ + return _ipAdresse; +} + void User::setFd(int &fd) { _fd = fd; @@ -82,6 +88,11 @@ void User::setNickName(const string &nickName) _nickName = nickName; } +void User::setIpAdresse(const string &ipAdresse) +{ + _ipAdresse = ipAdresse; +} + /* ** --------------------------------- ACCESSOR --------------------------------- diff --git a/tests/User.hpp b/tests/User.hpp index ad054d3..aefbca8 100644 --- a/tests/User.hpp +++ b/tests/User.hpp @@ -24,11 +24,13 @@ class User /// SETTERS AND GETTERS string getUserName() const; string getNickName() const; + string getIpAdresse() const; int getFd() const; // void setFd(int &fd); void setUserName(const string &userName); void setNickName(const string &nickName); + void setIpAdresse(const string &ipAdresse); User & operator=( User const & rhs ); @@ -37,6 +39,7 @@ class User int _fd; string _userName; string _nickName; + string _ipAdresse; }; From 92198a11e2611cc0aea5ee109e6cad517bbd5501 Mon Sep 17 00:00:00 2001 From: Nouman elallaoui <103364555+Nellaoui@users.noreply.github.com> Date: Thu, 25 Jul 2024 21:52:11 +0100 Subject: [PATCH 05/11] PRIV MSG IS DONE --- .vscode/settings.json | 5 ++++- tests/IRC | Bin 215476 -> 217636 bytes tests/Server.cpp | 35 ++++++++++++++++------------------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 574ffa0..893c203 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -61,6 +61,9 @@ "type_traits": "cpp", "typeinfo": "cpp", "unordered_map": "cpp", - "utility": "cpp" + "utility": "cpp", + "typescript.tsserver.maxTsServerIdleTime": "600000", + "editor.folding": "false", + "cpp.memoryLimit": "8192" } } \ No newline at end of file diff --git a/tests/IRC b/tests/IRC index 151dd4678ab1efae3b144ffbd2a981d71da78ee2..4ab8a72d24796e2828bdc74161d18748920b3529 100755 GIT binary patch delta 36171 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 UKi@wlq4*V7%#%7TlbZH_0L6~7PXGV_ diff --git a/tests/Server.cpp b/tests/Server.cpp index aff9c95..5609254 100644 --- a/tests/Server.cpp +++ b/tests/Server.cpp @@ -203,26 +203,23 @@ void Server::_hundleMessage(string message, int clientFd) cout << joinMsg << endl; send(clientFd, joinMsg.c_str(), joinMsg.size(), 0); } - // else if (command == "PRIVMSG") - // { - // string recipent; - // iss >> recipent; - // map::iterator it = _users.begin(); - // while (it != _users.end()) - // { - // User *user = it->second; - // cout << "this is the nickName " << user->getNickName() << endl; - // cout << "this is the recipent " << recipent << endl; - // if(user->getNickName() == recipent) - // { - // string prvMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP PRIVMSG " + recipent; - // cout << prvMsg << endl; - // send(user->getFd(), prvMsg.c_str(), prvMsg.size(), 0); - // } - // ++it; - // } + else if (command == "PRIVMSG") + { + string recipent; + iss >> recipent; + map::iterator it = _users.begin(); + while (it != _users.end()) + { + User *user = it->second; + if(user->getNickName() == recipent) + { + string prvMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP PRIVMSG " + recipent + "\r\n"; + send(user->getFd(), prvMsg.c_str(), prvMsg.size(), 0); + } + ++it; + } - // } + } } // _brodcastMessage(user->getNickName(), message); } From a0a468b81a658f4074e4814d4bc2fb60d8bc0fe4 Mon Sep 17 00:00:00 2001 From: Nouman elallaoui <103364555+Nellaoui@users.noreply.github.com> Date: Fri, 26 Jul 2024 10:35:12 +0100 Subject: [PATCH 06/11] PRIV MSG IS DONE --- tests/Server.cpp | 3 +-- tests/Server.hpp | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Server.cpp b/tests/Server.cpp index 5609254..c9887b7 100644 --- a/tests/Server.cpp +++ b/tests/Server.cpp @@ -152,7 +152,7 @@ void Server::_brodcastMessage(string ChannelName, string message) } -void Server::_sendMessage() +void Server::_findChannel(map channels) { } @@ -218,7 +218,6 @@ void Server::_hundleMessage(string message, int clientFd) } ++it; } - } } // _brodcastMessage(user->getNickName(), message); diff --git a/tests/Server.hpp b/tests/Server.hpp index 48423c8..6307911 100644 --- a/tests/Server.hpp +++ b/tests/Server.hpp @@ -59,6 +59,8 @@ class Server void _hundleMessage(string message, int clientFd); void _sendMessage(); void _brodcastMessage(string ChannelName, string message); + void _findChannel(); + void printChannels() const ; }; From b7e06716622b8f8e1528c50feeacd022eeb18388 Mon Sep 17 00:00:00 2001 From: Nouman elallaoui <103364555+Nellaoui@users.noreply.github.com> Date: Sun, 28 Jul 2024 16:56:32 +0100 Subject: [PATCH 07/11] Channel Done --- tests/Channel.cpp | 17 ++++++++++++- tests/Channel.hpp | 2 ++ tests/IRC | Bin 217636 -> 0 bytes tests/Server.cpp | 59 +++++++++++++++++++++++++++++++--------------- 4 files changed, 58 insertions(+), 20 deletions(-) delete mode 100755 tests/IRC diff --git a/tests/Channel.cpp b/tests/Channel.cpp index 261189b..cf40758 100644 --- a/tests/Channel.cpp +++ b/tests/Channel.cpp @@ -1,4 +1,7 @@ -#include "Channel.hpp" +# include "Channel.hpp" +# include + + /* ** ------------------------------- CONSTRUCTOR -------------------------------- @@ -52,6 +55,18 @@ std::ostream & operator<<( std::ostream & o, Channel const & i ) ** --------------------------------- METHODS ---------------------------------- */ + +void Channel::prodcastToChannel(std::string &message, User *client) +{ + for (std::vector::iterator it = _users.begin(); it != _users.end(); it++) + { + User *user = *it; + if (user != client) + send(user->getFd(), message.c_str(), message.size(), 0); + } + +} + void Channel::addUser( User *user) { _users.push_back(user); diff --git a/tests/Channel.hpp b/tests/Channel.hpp index 7ecb904..cc83cd9 100644 --- a/tests/Channel.hpp +++ b/tests/Channel.hpp @@ -24,6 +24,8 @@ class Channel Channel & operator=( Channel const & rhs ); + void prodcastToChannel(std::string &message, User *client); + private: std::string _name; std::vector _users; diff --git a/tests/IRC b/tests/IRC deleted file mode 100755 index 4ab8a72d24796e2828bdc74161d18748920b3529..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217636 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 diff --git a/tests/Server.cpp b/tests/Server.cpp index c9887b7..1a956fa 100644 --- a/tests/Server.cpp +++ b/tests/Server.cpp @@ -49,24 +49,24 @@ std::ostream & operator<<( std::ostream & o, Server const & i ) void Server::printChannels() const { if (_channels.empty()) - { + { std::cout << "No channels exist." << std::endl; return; } std::cout << "Existing channels:" << std::endl; - for (const auto& channel_pair : _channels) { - const std::string& channelName = channel_pair.first; - const Channel& channel = channel_pair.second; + for (std::map::const_iterator it = _channels.begin(); it != _channels.end(); ++it) { + const std::string& channelName = it->first; + const Channel& channel = it->second; std::cout << "- " << channelName << " ("; - const std::vector& users = _channels.at(channelName).getUsers(); + const std::vector& users = _channels.find(channelName)->second.getUsers(); std::cout << users.size() << " user"; if (users.size() != 1) std::cout << "s"; std::cout << "): "; - for (size_t i = 0; i < users.size(); ++i) { + for (std::vector::size_type i = 0; i < users.size(); ++i) { if (i > 0) std::cout << ", "; std::cout << users[i]->getNickName(); } @@ -152,10 +152,10 @@ void Server::_brodcastMessage(string ChannelName, string message) } -void Server::_findChannel(map channels) -{ - -} +// void Server::_findChannel(map channels) +// { +// if (channels) +// } void Server::_hundleMessage(string message, int clientFd) { @@ -200,30 +200,51 @@ void Server::_hundleMessage(string message, int clientFd) Channel& channel = _channels[channelName]; channel.addUser(user); string joinMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP JOIN " + channelName + " * :realname\r\n"; - cout << joinMsg << endl; send(clientFd, joinMsg.c_str(), joinMsg.size(), 0); } else if (command == "PRIVMSG") { string recipent; iss >> recipent; - map::iterator it = _users.begin(); - while (it != _users.end()) + if (recipent[0] == '#') { - User *user = it->second; - if(user->getNickName() == recipent) + if (_channels.find(recipent) != _channels.end()) { - string prvMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP PRIVMSG " + recipent + "\r\n"; - send(user->getFd(), prvMsg.c_str(), prvMsg.size(), 0); + string msg; + iss >> msg; + Channel &channel = _channels[recipent]; + vector users = channel.getUsers(); + + for (vector::iterator it = users.begin(); it != users.end(); it++) + { + User *user = *it; + string message = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP PRIVMSG " + recipent + " " + msg.substr(1) + "\r\n"; + send(user->getFd(), message.c_str(), message.size(), 0); + } + } + } + else + { + + map::iterator it = _users.begin(); + while (it != _users.end()) + { + User *user = it->second; + if(user->getNickName() == recipent) + { + string prvMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP PRIVMSG " + recipent + "\r\n"; + send(user->getFd(), prvMsg.c_str(), prvMsg.size(), 0); + } + ++it; } - ++it; } } + } - // _brodcastMessage(user->getNickName(), message); } + void Server::_hundleClientMessage(int ClientFd) { char str[4090]; From c2a5cddd1fffd5dfadc12463206a6f893bb08284 Mon Sep 17 00:00:00 2001 From: Nouman elallaoui <103364555+Nellaoui@users.noreply.github.com> Date: Tue, 30 Jul 2024 16:43:02 +0100 Subject: [PATCH 08/11] complet the who end list --- .vscode/settings.json | 3 ++- tests/IRC | Bin 0 -> 232744 bytes tests/Server.cpp | 55 +++++++++++++++++++++++++++++++++--------- tests/User.cpp | 18 +++++++++----- tests/User.hpp | 6 ++++- 5 files changed, 62 insertions(+), 20 deletions(-) create mode 100755 tests/IRC diff --git a/.vscode/settings.json b/.vscode/settings.json index 893c203..c33d1d3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -64,6 +64,7 @@ "utility": "cpp", "typescript.tsserver.maxTsServerIdleTime": "600000", "editor.folding": "false", - "cpp.memoryLimit": "8192" + "cpp.memoryLimit": "8192", + "editor.renderWhitespace": "all" } } \ No newline at end of file diff --git a/tests/IRC b/tests/IRC new file mode 100755 index 0000000000000000000000000000000000000000..e0ccef944f97098182fa5faea918c009a341773a GIT binary patch literal 232744 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 z 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 + user = _users[clientFd];; while (iss >> command) { if (command == "PASS") @@ -181,7 +180,9 @@ void Server::_hundleMessage(string message, int clientFd) { string nickName; iss >> nickName; + string msgNick = ":" + user->getNickName() + "!" + user->getUserName() + "@" + "0.0.0.0.IP NICK :" + nickName + "\r\n"; user->setNickName(nickName); + send(clientFd, msgNick.c_str(), msgNick.size(), 0); } else if (command == "USER") { @@ -197,6 +198,8 @@ void Server::_hundleMessage(string message, int clientFd) string channelName; iss >> channelName; _channels[channelName] = Channel(channelName); + bool op = (_channels.find(channelName) == _channels.end()); + Channel& channel = _channels[channelName]; channel.addUser(user); string joinMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP JOIN " + channelName + " * :realname\r\n"; @@ -229,16 +232,50 @@ void Server::_hundleMessage(string message, int clientFd) map::iterator it = _users.begin(); while (it != _users.end()) { - User *user = it->second; - if(user->getNickName() == recipent) + User *use = it->second; + if(use->getNickName() == recipent) { - string prvMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP PRIVMSG " + recipent + "\r\n"; - send(user->getFd(), prvMsg.c_str(), prvMsg.size(), 0); + string message; + iss >> message; + string prvMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP PRIVMSG " + recipent + " " + message + "\r\n"; + send(use->getFd(), prvMsg.c_str(), prvMsg.size(), 0); } ++it; } } } + else if (command == "WHO") + { + string channelName; + iss >> channelName; + + if (_channels.find(channelName) != _channels.end()) + { + Channel &channel = _channels[channelName]; + vector users = channel.getUsers(); + string msg = ":127.0.0.1 353 " + user->getNickName() + " = " + channelName + " :"; + for(vector::iterator it = users.begin() ; it != users.end() ; ++it) + { + User *use = *it; + msg = msg + use->getNickName() + " "; + } + msg = msg + "\r\n"; + send(user->getFd(), msg.c_str(), msg.size(), 0); + for(vector::iterator it = users.begin() ; it != users.end() ; ++it) + { + User *use = *it; + string sendNickName = ":127.0.0.1 354 " + user->getNickName() + " 152 " + channelName + " " + use->getNickName() + " " + use->getIpAdresse() + ".IP * .127.0.0.1"; + + } + string endList; + endList = ":127.0.0.1 315 " + user->getNickName() + " " + channelName + " :End of /WHO list.\r\n"; + send(user->getFd(), endList.c_str(), endList.size(), 0); + } + } + else if (command == "MODE") + { + if + } } } @@ -264,13 +301,7 @@ void Server::_hundleClientMessage(int ClientFd) { str[bytesReceived] = '\0'; _hundleMessage(str, ClientFd); - // std::cout << "Received: " << str << "THE end" << std::endl; - // if (send(ClientFd, str, bytesReceived, 0) == -1) - // { - // std::cerr << "Failed to send message" << std::endl; - // } } - // _authentification() } void Server::_createServer(string port) diff --git a/tests/User.cpp b/tests/User.cpp index 0bd83ba..0075fa2 100644 --- a/tests/User.cpp +++ b/tests/User.cpp @@ -4,7 +4,7 @@ ** ------------------------------- CONSTRUCTOR -------------------------------- */ -User::User() +User::User() : _fd(0) , _userName("user"), _nickName("nick"), _ipAdresse("0.0.0.0"), _operators(false) { } @@ -12,11 +12,6 @@ User::User(int fd, const string &userName, const string &nickName) : _fd(fd), _u { } -User::User( const User & src ) -{ -} - - /* ** -------------------------------- DESTRUCTOR -------------------------------- */ @@ -38,6 +33,7 @@ User & User::operator=( User const & rhs ) this->_nickName = rhs.getNickName(); this->_userName = rhs.getUserName(); this->_userName = rhs.getIpAdresse(); + this->_operators = rhs.getOperator(); } return *this; } @@ -73,6 +69,12 @@ string User::getIpAdresse() const return _ipAdresse; } +bool User::getOperator() const +{ + return _operators; +} + + void User::setFd(int &fd) { _fd = fd; @@ -93,6 +95,10 @@ void User::setIpAdresse(const string &ipAdresse) _ipAdresse = ipAdresse; } +void User::setOperator(bool op) +{ + _operators = op; +} /* ** --------------------------------- ACCESSOR --------------------------------- diff --git a/tests/User.hpp b/tests/User.hpp index aefbca8..a5e25b2 100644 --- a/tests/User.hpp +++ b/tests/User.hpp @@ -25,18 +25,22 @@ class User string getUserName() const; string getNickName() const; string getIpAdresse() const; + bool getOperator() const; int getFd() const; + // - void setFd(int &fd); void setUserName(const string &userName); void setNickName(const string &nickName); void setIpAdresse(const string &ipAdresse); + void setOperator(bool op); + void setFd(int &fd); User & operator=( User const & rhs ); private: int _fd; + bool _operators; string _userName; string _nickName; string _ipAdresse; From 06395810e744ebf965f25d62049209bd5a9065fc Mon Sep 17 00:00:00 2001 From: siiine-764 Date: Wed, 21 Aug 2024 20:49:44 +0100 Subject: [PATCH 09/11] ddd --- README.md | 12 +++++ tests/Channel.cpp | 9 ++++ tests/Channel.hpp | 5 ++ tests/IRC | Bin 232744 -> 0 bytes tests/Server.cpp | 134 ++++++++++++++++++++++++++++++++++++++++++++-- tests/Server.hpp | 3 ++ tests/User.hpp | 9 ++-- 7 files changed, 164 insertions(+), 8 deletions(-) delete mode 100755 tests/IRC diff --git a/README.md b/README.md index 13247fa..d53c757 100644 --- a/README.md +++ b/README.md @@ -24,5 +24,17 @@ | Notice | The NOTICE command is used to send notices between users, as well as to send notices to channels. The difference between NOTICE and PRIVMSG is that automatic replies must never be sent in response to a NOTICE message. | +// ./IRC 6667 123456789 + +i (Invisible): User becomes invisible. They are not shown in channel lists or user queries. +o (Operator): User becomes an IRC operator with administrative privileges. + +b: Ban. This mode is used to ban certain users from a channel. +k: Key. This mode sets a 'key' or password for the channel. +o: Operator. This mode gives a user operator status in the channel. +p: Private. This mode makes the channel private. +s: Secret. This mode makes the channel secret. +t: Topic. This mode allows only channel operators to change the channel topic. +v: Voice. This mode allows a user to speak in a moderated channel. diff --git a/tests/Channel.cpp b/tests/Channel.cpp index cf40758..79d4071 100644 --- a/tests/Channel.cpp +++ b/tests/Channel.cpp @@ -88,6 +88,15 @@ std::vector Channel::getUsers() const } +int Channel::count_membres() { + return _users.size(); +} + +std::string Channel::get_topic() { + // Replace with your actual implementation + return _topic; // assuming topic is a string variable holding the topic of the channel +} + /* ** --------------------------------- ACCESSOR --------------------------------- */ diff --git a/tests/Channel.hpp b/tests/Channel.hpp index cc83cd9..84d698d 100644 --- a/tests/Channel.hpp +++ b/tests/Channel.hpp @@ -26,8 +26,13 @@ class Channel void prodcastToChannel(std::string &message, User *client); + void prodcastToChannel(std::string &message); + + int count_membres(); + std::string get_topic(); private: std::string _name; + std::string _topic; // new member variable for the topic std::vector _users; diff --git a/tests/IRC b/tests/IRC deleted file mode 100755 index e0ccef944f97098182fa5faea918c009a341773a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232744 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 z zQ{-y08|ftO-z9s=NBl(j*$_*JUK#sf*dFJh7_rP3i%+~31lz%3UYw_2sudpo*X70 zVHtT*@~Pw$IYM?JAH~1d$X>G3VcZAEgUMl}li2?!IYz#|z}QcbeT9ZYh^N?h6d8_? zA0oS8D&~iEG3H+KH{>As_O8Y}NBwjk%XRrjKDC`8#rm ze1BhK9w7(&8FnKdMgA_Olt=zMIY7Q(YhxZKAFz$#6!{aIQ4U1j!flPYLcR;{zMWwY z`Au?weC_teJVc)9HXI>u)!%T8{4_a1?lpk&QLeEr&e^JEw5skr~bwol%3h>;f|pFxh2Zzadc?~`4q=OS<0 zU5)z~`C+mL^<2!~C40%^cQf`~sOMsSJ=sg{InXA3-}J^1mR*$YaZmd5U}~Ie>C6_E+1CaxZM}U-Y2d z3ETS@ePnyTV3cgHrzFVs`iVk06ZiJ|iHBTuiRrI>WPAN2Mz+^a5@dV-mkZ@eks{msJ3J`2BH!NM;UnAoJ3?f8e@BFD z@9&6`?fo5bvc0~PAlvIpUep8e&t6{&knQ!Q5ZPW|a-$xIeS3Y$N4D3OLS%csIZC$6 zTO9R7+}rzkQ>X{Rw*7F0VLLw(WII392xD&NhnH;UN04miN0@A{A4kacdU2d=ulKq~ z8u|8mua|6xH%2~on5mBmvb{eyGTOL*)XVYg9)?roD0#rXEWhMK$gVw&eS3echivb! z^^sT5euR7h!=v^x?q48#yoUE2Zt3}%7}-vb6xmL1_rAuyojzW&o&I66o&IsMo&IV+ zGPOo2) z)9Y6gjQjNZ6*;|rMZU#n(kDu`_s1s4_WG7Z+Xb}c+*F=$D1LtJ>HCx?eS)u zY>zix2N?PGerylf?r(f#yL}Il?e;xPw%hjv*>2z6lZ<@3efN^>_B}|p+xIZpZr>wh zyM2$5?e*q3*k@sQwbRTH^50SlOX$PhJ2FZiat_erTbI8%j#{EO&IQeUGf;@JV zaj&Kr`wx>npAq`@4=Y z^4w&5y}(Ph*SCFSdwn}XuBZDr`DJp7`~%rF)%dqJ+I1a%vb~<*Biri<0rEMpFY%9( zpQZcoG$XG&+If)|BOgpokuM^Z^#kyNc3YOFHSz2td219zb1#sBhfF3{RsIF^;i3f62B_?vH*&hnFnG+cysR=Dsu!+pua$wSCBah#f`?lOUVPtx06SaA1C|BFOzG?|0JJ6{+=8rcSpY>@rjcAlOH2jkXMl>l0PCJ zL;i_;BDrtSg#Rq^uH-AoUh-Y!5P2#2Ci3g#CFIrQRpg(^De@NR_jLI?(fB`z+?PC> zyeoM!c>=kLd^C9uIY?eazKMJd`7!ce$qDi^m$<`E>FLEz(fV?w# zA$c$I)#QW8QF1N$Bl1b)pUCHt-OVOE*ONz)A0Qu1ewG|0zeB!>{3ZD@a?wF1J_&L^ z@>=q4WM_-+ga7J|3Y??f3eMXH|90y5INM>a0NL+ob zrXa{3Hog6&JnE#RN zBi~MTEjH$_krOokmK-4W?r!7<6(fuhXCGsWv=( z3uEqi*zo1#;1I(flGQtgy<0N;yBR){9AbR`(9@WE*BJ9#wleI(I=lFPWiP|-Pw5`@ zSmG0DG(5Qv-9Kd5iFz;Q@kb3mNA}J)d<@zRF?YRfxDV>RuxBfi-bE@BYSq;snD-lf#fJ?yn=O-3=$mZs=k@ z4ehW_uNj8#BFBz4y!{R^FA1q6`@flFANjAsT|(-mlT3Kmk{6N34ix#A&td!XM{*eX zApSp24zd0FNizy5{>0oh$hZ#;H1d0c@!X*;K-tl-Sk-^?^7x@Vem9SQ%H!TUYWZn- zyXWzwJg&{-d-GVCelIO=QXXHP#~G>;eO@iTes+%-2mpU*csL>|w|<2iY}*l;>L z*W@w3JCinFl4t%z9zT=EFXZu?dHh};f0D;v3bE_p|oi0c4clW-k~Ycj4WxVqvx2-j3x({N44 zbqKCQaUF(B-X{XMs&EzKD#6ta*Jik!xVqz#`IR2HT)4KtwI!~exVFO83s-MkeQ@=~ z)el!GuB~xxgKJw{+u_6L6K`!j~6SJuZ0rc2A;#!3399)ZWor~){T<7Du09P2-g}5%lbuq3>a9xUPKV0K*b-^_Q zS2eC0T#dMbxK6}{zmR=3gIjRT!F2|%GjUypYg768|7ZDeE5HB9%pqrhDf+9WWo2?! zll=kTPWX~-uH>w*+U6Q`=BIcwk~{sY!D-PI=`TU2AK?JePWn)Dw#d1XQ6_J2NM)yc zAYXq@d!Uc1%utS*{gGiYP9OQ!$w!4{%kKPhyt1XYaU@x`@qgxUvMe9cr}yO_9@dtf z{3FM*>~!L>f>~0{A;NxLFqqePWD1JS<#On5t`)ny&`P>A*_>ydU83y6&f5HtvV<&c z;Xn8p=WKuSzo4CMrjy71#PG(R4-@BQMJ&-3zobNp}M|Cix$k7tf8j^vCJ-BNnu>R!324Q#<@4 zGoR7Ud7k}6ZEeur$H7~l?3jBPTs01Z`@cJvCoAaq#}kW{dQJlp7i{=&jDS8n za6`|F%XV5ltEvgEtLj>sCstRMmF1oP){)iRqvJZTnSbtF`&M~qUHcYz#9jLqM&z8_ z)`7jOerm|+;KQ@MDuSEZl465k?~(WQ0?rK z(EdlF-Ofn&cRhygeo=-UWVIpx&Go;dW0!e)`G#a!r@olvHc9As zruw9#W-|I48f$9(Gpd?vC(7aK#;k$^!PQWVl>vHqSR&+B0R56)u!J!9MMp|rneAUdhynS*wJ$AFvO<~Nj(4eD#^ zI;TozPIzp0R-x&d-!rfswPq$j*`YC~TilU{O|X7=%uS%q`` zZvV3zbI4aM@1PWxdPqSaOV8*wmcZPo0F z)zgve(?5ktKC`cnwLZ)%*1O zC9Xo^s6rKs6y=z($5a7GB=SODn4~W0Pbn4@Ga|rzn?Ewg%NE|`4x1?zimlD~3p;!H zhNF|O$aeLD3PD~?bJ#nyAkA;)joZT@GSeIk(PC$wPL# zWuXRT_8|T@YZUDK%n=)jJS@!Ba!;#B)E#mZ_GJCdwzNfU$6Zc08{Eo!+U2&`mH$_a zdw}cK7$W1tHz_k*nB%w`w)8~HCDg;vR<_;d>xEEd1`OYw5{O#$1WA5;wJTQp?N8d& z;~;+$@<9=K()iyl3_lAtOB4;~ufrgOnI1NF#>3suRVB#9!6%L!m6)~=d1Sd#Aog`L zOP%KR8CMg2K#4>^zJnTDbsr6a#OS+Di{I|PuYWA3tDoI)4;?GB z+7t&RZrP;U$zj786t;b4!x=7j_79`k{^zEEMQ=<2IZ~asL*2$c7=Vs&Hn0`uPq+_G zVFk_Bt6d4}DBl*s8e#C8fx~h|I@;cw`P*o=D5l%-f2^a{M&~+W%8#85-y$Cb=6kt% zVGP#O9Rm)FE8J{w(I5~X_qT9oEX&n&Ux@uw)_am<6~|DGNjzaS3icH zKi?MbvtqL^*JQT-``bVNP8oHx_xI^j`IeCZxhwP80%p#q-h=YtuXu;FE~oGmxXqH|1Q^fT$la;F8>0So`J%5#R9wguk2z3 zIADulYW#J#p8c_=#pqw?WAGoY1mb`9>-m@Y&&3?Sy*>$O==Nli#zfLcm&^#5K(+*t z^R!7>2uOFl`Y}ICSznT!VSV< ziL;D_R|FZ0aKLLJl%H_Ia>r#`IWQgvA~wJ1hz}(Nb1edy5HwH)z_bVaOjWb3wvc$Q}>^74v!sH$@eeaWZZTz>0NfH${M-E|* zhN6Qr$V(ASmiK?PcfC;50Wf>}n<9Q(XD{FuU9T78-`|iNVc!snKf~TJk{wQ5^C<*e z6=xJa0LzA2!FiIl?{UM-TD3?N_vEq=-U=7y;!kw~pG3BFBU{5pseCsI*_BngiaI`) z%OaxiH+En_>zlYm5D;B#PMse!FZy8KtKI7p$$_P9P&kPfDj{dHVNNq4(YxHvgLpiQ z;!Hwpz_1=!hV^guQFPuw;DkDIN*dgbhJdh2l}ka;bBrmId6PKjg#)G92i@rX}K;nINng8$OBht4f zt9^C_H(dVj`wRtM(y5t0&+~EzZ(aFtcZGi!UOg*4Ant+km46Ka9g%xto6v~`AcjxX zjKoVo4ki5cdBdk!QQ=3Xxttj(8Jp=AhkczRK!86hSKu`cUgT-Ozck7x_?zuXQo8A! zLDi8cedRr4SaIar^;$a$ByR8NwuCrfUfmJdZM?cW&fXrr<$_$m_M#A$Y9o$BKa{@9 zZPat7S7IPhC?bqyF3GQq0j+DeNg|pbdqrrL%j84tafkR7cpU50WLizRZ7Hi*FdMQ# zAAienwwBp`i4BP({-Z!##fS!(g4w^c7(-ML4Z=qO9}?HiXMw-$VqT~tgDaKL_4sRU zn~W8k;Qody*F_GtLglG;a{l}B0&*V`G9dTcUo4Yv zQ9V__Ig&SS1^2a{7RZhK+tY&lQlkCZ<~EXi>mYF2+!}fU|H!6)wX2W~Pk+TN=_@YP zo$Yrq2eZE~?VCW>gZ*u7f+;2eHw2@toIXe}5{RdG@Jxx}n zOI!C`+UqPJF`2NjoJs=bTf&-s*+^!4jHVvoMUwP%DghR-BGl4nK+6Gb-P!M-uKHBO zgi^-BUcmB^5?hrI5DsJQ0krRg_ypvcuK)U6G+hbyxN2{jP{Y(p9qK_noY}E;q6RhY z+$tdjgm5EoQg_v;7vlaYF5mjlk9r-oAtuno4&bai2PLWDJdvi<%Sp5xU0w3!B05tO zR+H9r$u6Qb^_uDuq%Mil8REDnbg;BH{i)X$=w&qb0E04BiRxMUkQ@Ge{DU>A-kc`* zfI2-aRI3z?Td$$>db%VKIU4gY_*6|~ukfikb@08a>_J^pv``P^Wx3GE=jHCR^E_JF zE3WH2Pfz>0-WA0k>*we3JN9e}i^Q+iC&vePy~ zs6;&IT}0N@>{Sp*x;8+{Ea2MBRX?0h_fu!0)NQ;}+h~b_Q9%dNZP^hHbLY5SQz1rv z#tZ6JaYMjAR@l;_g!+@i1RFVleKe`VM}>Ft$wN0!uS=dt79^TWMKmfbBH9tI^X(Kp zjHG9JatFeJWed&3w$Lfilfkhs;;(XU=RiA636BHPd=_hzn)X268QMw_fHa@RKrizu z#}}%Rw+KH6w;zeecESo=(A#1&CL@xW5{mC?z21i`Smy)xgB>6(CwP(BTxOfHiVD9X zfy*Yt5KYhC-kl>$WcN{FNhoa^%YIMNK1xk7M$0tW(8C6`o4mc5O*hjSs!r9GJlmmG z{(z*U9I)&5@8OtvpFDuA(Xx#MTQ}J@+MzCgraDDvdESY3sARw}9rnw%s-cAe0l&op zA=}Agmg66~c8d)ltM7^$UfIajpF(!y%h>{7(kLdxJNu{HrU2k=KmV)*z>$lUFowiV zv_}fMTgUC>0R#R>(wx4X_2KgpB>=ec3(P6X>R~gNAF~GJ|!s=tI37{evtiKsDR)9YISfs z3N>2SkxX?3O)lF@@~51%=CYztNu(>(3dP+Z zdp|n9yBIS45bGJ*F!qV3n=dWpBNnMQD>}~S%C2M4D5-QtqaBrOm<8(eD~g(qq+f%u zFxAR-{86gaqR)U<73z*OXeYPCSm!z$RfAI|tu_?ZNxHm6bkinh#Mq^`prYvxju^?3 zoB)r8(bBd8N~3RCEAF`P><$)#Agr&GYVoA1W|hO?*}8+;0fSKYp9h1&Qs5X2$UMTr zkxky@BZ?RK9Asc5uWy_36ze4;((&4Xco~U%^`z3}!q9%seAdCf>5fi@xiC8?35WAD zjgoOvL*mD>sFGoe)p6R2-u7I!GsKd?h!hvO`ZOTR;&+VX#rqKfWCJo0kYEFz7Q{L` z5^st1U`L*GKQ@VS%zuzAn!NkCKnR$yHC-ND_CRdidYfWG0Vs=K5o&S`RBBIWjiCBj z^O}X3Jd#a<>1@Fe!udl80(gK}j5m283^6va;xEw%Be@m*7@i- zqHWr=vBbVI7*>I|PInY{l7NUzrc0Yz$QFW)sB;KhW2_UbFpB=K*sdGtrWb(IRcp7) zp+b&LE%r$#(hAU=Kr1tsaYIbg2i5}er*0$tU@qXMt`T~sHblv#nokK!)75G%QVr*5 z2C#Rsz?ubSi`51Q3Y*o?o?u_TyslqG1EM{iDZ<-r4|i|K$C3ZAT!oshKYq4d&4$Cd zBKLuuE=cbOq<-*R8cNQx)ImsrxGU(ikLHo^g-``_mEEC-1|(KUaWK+UW23ZbN$~)6 zCG1l@fnalVV|^kiSeD#Qxk?YE9ehhznP`?Cc;iyC8NWpAqVn!_hPLv1LiYH>RrJ9jU|UP)u0d#aMHR2kY*vd6z(N~H?vT#4ji#Hn2yx&@U5^<7|I=VC(_md z{Y0=sBfuG{Y4H@z&*h5MN&-~z@6f5FwQE-o6V2Y9 zI5WbI*-Yo+u@$`Hf+VrDB@2{`Gg3PLS9W(;p9g--#gD)CC(`lBmD=9I@!!HyxFU8E_`-gXE$>U zHwd;un?uA{k*(55YKD@e+vMPs9UWM_>J{!r73``0+3H zO-Hw8KUet91}>+cv~)Jm>uPv}O}_ji884L`Wg?I$eiv49gaT@*2a@L+<^xLnK!P>l(-3(>WjV()p_zm%aCdjdwX<(c0Cnya^t; zlZ-$l-{~S@c@5m7|Am=SXLIzb5_9F0gIP_Xh$W7JA9*;OBf4RonA}vh`7cm)oD?#T zCY80M{;cPG<;X5X$5PR%m*4in$syh8-KUMFY&lsaXuT}^cO`Vrh9%}&NoZ*pbpD+l zXSehkugV8ipvf$$?x3ieO(a*cF5QcWvkePbUSW~RmH5n$Mr9|ddaYg?pdtfhHykwI zOuEbMn&bSfEPhPrRVG}xn13X@4tz%#ci(=(+vDh)+j+1RgOZ_Yl;pyWqG~0oAI5W* zsx<)nD*%BY5>>8Ce5yVc@vlg&E0pxjxQ>j@+8B75=k^Vsww**ac-8R9}C6CN3@Oq#%F53c3LzTPn3v%>`P8F zCIT&3ng_X&Tg9t^*syLzMFC<}>7*IL2}8ya=C0Oy0#IvuxHt|+tC*2`@XMrhNZXBz zP4^0_k!4>u-6(Gjc(X+@-KrJji8O|3^@?t+d5EVX2E2J+@^K{vo#WdG#-72o_T{E2 za%{GxL%tL21`6*hXb_axX(|wrjzr7JNDkJ;qTQt|lS09#p&LK&{rO+=xHP`zddYjO zLO*a9l6_p-OG2p=_C7R`D7B)wPPWglmlQ;)7y>GuKlz$nyspYW@z@jEKGCPiZ4<~9 zgYU`groI~D!5f|1uohEU8-xTU>tZZSCo~e-zD;ni#t)1oPYMd`5P)yNVpH!)Au+A% zv;aQo>I1j@__P#py+zK~)M@<{zZ{#c9Ym@@Ybm{%aNBDxWy(693>zF?MJBL0FiX$I$2o=MzD*FRYsr9xzKC&zG!o}S0IYD7JvO${n_?5hs`N}96lq1ITbWWo{| z%Jx@XQl`@UWOfM;m+vj3hJ+wGcCqi2?lBpysv??xGcW!{X+F72Vx z=c5KYe-bVoYu@9@IOIWbKjmqeh@4lRjJua4Dr|vvY64A&9#v3Ci7Z3yM?)bDc3PH| z(1omr*4qI;qyeoj5}+tb$mFrPfE{xJNRZ>s{Ov{epu643)jW;3bCVtDP5#^LX7Zqbc=_4Sa|bf(ZW+Hw~sh zJ`NNz2pA|QLWXjNL3{v#VGq=YA>~8w8773I82B`_sg7fWe$eQ|M>d+J`aVX8Frg`t zk;Z6kIT#!XN5}(L_ffBPcatI@f{t;$*Pj1L?BaOTMafYRxU3#yO*?8rk6YDL@L48- zP1jAao(_~`0VPmDQ#6_>7EGsc``URHO3tW-d44LndLa;0{wH{Z$I1f6RBukx5c>lf z$4M)nPLCAPshv5|MRML+4g=6DRf6&$t{ka@)qxS0P)=WenN0G@YPKcc{V%e9d%Y#) ze&+@_n+Qz+QCYakD<>*WU9Vgxpm4bJHB#AGs3~xIjRnn04#y6nzMi=g=&%sF;geq) z1WMz~XqEW72xqin`Q=E^Js`TlbEs?fNC0gM>Rm!L&$drH12ye7i*lc%whVogCnZ&@ zv4w@zxO6g(syivknwpDasI^Gaq9!gU4_>};5KE|P6!JvoH^$$FV|BdA&72CF4OE>E zSFg)rTh8!?`?B2cCW|q>9KoqQg#{`7-hkIYEH3cuw5m-qKV{I63P=}ze^OW1s72zD zN?rcaC2*`fmM+pnCq@r(>d3JOgh*|coD#Q5w2WF#hnB;*3G)Hk-SC)V8s!-mEfw>( z=D!H(C2(#;y`=9LJ{EV!73&93R3{4XhHSbI$)DR?sLAoeA`P4Y46co@UXe#o>-g)8 zIS(}G9e=!mGh}tA!Vs`Qk|>R8af~+4=|wQnHXq`Tc(qtfpB6=4K2QENovzpS`M+yL z&FF2qcrC``)qc07H2v>W(W^y8@Ic83`Uu~G{BXA&WGDgJZ_Bq5hww9}_)i5*iKQpj z=i@g;4#X1(4d5RqLU2Fa{g`eh)V%5qDn=i=l1g>@4wAq$npqV;n98decL_mLuCVJ8 z3B3i$d()6W*ZwPQqyh(0_i4adh#~i`og%te#}(~WOd05=8n%FwB!$i^3inJ&0U$g} zoc8F_ByJ{ccInAFJ@^owYwH71eY&x=G>?I}DPy;GYSu3Yr)G790yhXijuWK}F#^N7 z9=7(*bp^s0e){}Qbq0s$Vs+he+cYe!L(Bt;4?L;`X-bF49?ufeUnxeU2jUaZTpt-& z5)!_cNxpJy>@c{r5hw2_Iw|1pJ9#R!)-m&@g6oCNW=;PdcIY}sDIrolvzv9(U4yXQ z6zK+tfm|s43bnF_FiCUbX}i@#aDuykPsRFJ`T?TYNl@q)nbrkfCqG@21y$Yp^?{#i z*M~+M6rtdh+bO#vCp1;`YoQ!J!Z|DuZYedpewl_*-Y0LNYSKDV*`_r%gebR<+~hB@ z=$LiMX~R~%r7mf#x(VOq&dR`qk=AnqXGdhfeS?Cx=4zp*@sB?{Lqtgt)7=@v#QChAa@6Q zNT%9F^2xM7w4k9nHxBLv>2923L1>&TgdJA?+~_80hYJ$>#-XCJmT88%$XZ0LpPCJs z4@ub;QCDs!(oFSmwLp0?!DwOA%3GH_dkct(VGKD2Fe0zhG@-5JTP%o{Wz`#YdUiuAlMfB&hIj(s@{`sFNE3Oava!QWZ%& zOh+GI&h~pbHK{wWc>?#Oo|URuP37#k*Rr0MgX2jTIn(w?^fsz*>ymgpXp-`DT;!;9 z8Bti{xrX}i3kFhj0;Ws5bQ|EE>an zSh#Xj&vL0@Gq2qzj`xTSUU`?#Ghko$))>Nv6FlwC0M$FBZue8>U$a9dVll?&y(}-| zFs!_`@ht<0Z59Ys?=6%_Rw|~;$nzsc)|)PY_!fzm7<%6URUoO-20(z|&m!P!jX=7;5~MC}YgRKeN*Rwy4jaKL;kI*8fH z7|$pNL+06%@z0O6(~JWDz_d8agJ8oQNMukbp!8gUt5E<)^iwmjKxOFX1i4$Y$$N|G zIo*X-lM<`l5Gk_ZSwEeSInl@7ab{u~ssMrSeV*^9FJoLGY<@fv+QE5EOSA9`$9ioh zJbJaYiktAM&4B_!FdQT2Bv}W7TJ5(#y{DQw5koK)vC~Z9aB@J5(XqH3G#>3BFZ4rj zib>2mZwMiL$7b?3b-e<*T zU!ogM4pO0)uBYcYZAf7dK1$UX~(8x1`|3V%#X6Bwb@KTejFdRW|tMD_2 z{m?w*QxnR;>C2}EIGFX^DEtV@h78u^jb!!6X0D0^=KjA5QQUMyJ#h#w%=94}9kzB&mqtyIxFBmZ`8>>9v-=luA-h@%!)*Km#gMt)HGk8pu7yX7+hPlh!EzHNEL zNf2&{6B!*1yK_Gg;y;-Wn@Qxl0P{ph7V{K=tzF1I_bk4|r9MepLG(1hVNs&Gze zj?`-NvvBWT>jIFNm+d^PR0AgYpb_d*4rt38cph+C6*Ur}#HNjA^f_-sA-wHA&bfNw z&^n&(qF0P$ZXpzdRK8>USylpBB_hFEpiVapdRvr|Ktkysy7ybnL!Gd_m(xGcBoBoh za3eAoI~nFbwyHWwzeXu4gIGVp$Y;11v(Jh@^%VGhJXVi!vn9UacgndO<`ZN)I8D*m zm+EEK@ervAyf7qAqWXa~;hztt)2Bb@H+m{w$`!xI!6fWb%4NXvRTz>0?RqShBAk-1 zT{kseHih4DLB}Z;#?44n_%v3r$f|2wxapxassBlkv@J#PAvx|5fTGzEoQBlA60$ax zcqw>y-j!)n&(mT0x+(`Vos&JwX^QX|Y43bs)-s zJ5MC;39!wE$v&-U0xgzFJ6IZ~v;_wj>7`IDtRI!5TJQyUkbQAKd@fgWQ622gHb%Qr zv?ChQKULQ;>9|@IqR(nf3Gogz9u#Kxnjqb!=UgYLFqmqe%5*Gg#S&YpSBUViHz~w2 zpbMAfrl9`sS3s4cfGdnq0e2K-taVi#LBQWx z+hbLSE+tw-+9NCmZkouQ;kOoB8;PwAY*fmv)c|`5V67IpTEp$|Py?>b50aY0Q~+f8 z)(IW=T`Ay>A(HUVfK=1hKuHlm(*St)eOs>nU_F5Ep{c~{l+>Ibq`*5P@3z26oPh>pt>(V0cHQ+}ZTBd4I}=%GPj z23tblo($O6m1SoFMzAg85>C6oAOwM6U_ur$9>{PcE5_a!nm7*uB`PZ3itS#uV@8K8 zA{hmm?#OIG(@ObK!z{&E!gQi%$*I|>ve|G|v}Ud`7G$@8aD^w)3f6F13D8!nv<Xi6fW& zEw!GpwfQ^*{V|O70YqEN*#e?Jz8O(308I8_0%<yEx9D{fD)5@l{~nU18dU>L-K%n zlCWpUY5*{GSxTig#TPY5R;eOHx8t5l=61SRE*5KE9GuRZ?dmQ$kUn8lMW9kWXwwxy zIYz`bWi9s_--Tr-M`d$FP zD|~Z|h}#GXH@B;WhzR!JXfZzVRWP|than`&NE&&LYy8O)4Q+4{n+~THv7#E^39A9# zld#RoGl+x$A4fwlnq(g6ek+{1qSDlj#b^o>_dy|zwYeh2mhknxj{jEPU2Cqbu>-Z}LvK~?M#wK2-@xM=tk;mWXZ)c> zkmFix8U07yEjLS)hFFKDbWJ$y1PnGKArG}-+DZ)F#^v79|e)HstBeOu5B7a_Q#XGQsGyPA1<)_mW(~bo`O{DZ&mVYBTBKiB^$7Nx2A_W$d60UlzG#S0t0wiy71u}Wr4AmK244S^f$Wk@jMF9#?_^dgR4s)maBkJxeA=+^@YFg^`%df*8v*3 z9t6(KpU(ft2RDEuUxWm(8$d$}6S2+M(|- zdc)OqALbT-sF4*@ed}+kUwfJAg7R%Lx5=omt@+-o-ox#BBvZP~{O4kxZ}4getFd(), endList.c_str(), endList.size(), 0); } } - else if (command == "MODE") + else if (command == "KICK") { - if + string channelName, nickName; + iss >> channelName; + iss >> nickName; + if (_channels.find(channelName) != _channels.end()) + { + Channel &channel = _channels[channelName]; + vector users = channel.getUsers(); + for(vector::iterator it = users.begin() ; it != users.end() ; ++it) + { + User *use = *it; + if (use->getNickName() == nickName) + { + string kickMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP KICK " + channelName + " " + nickName + " :Kicked by " + user->getNickName() + "\r\n"; + send(use->getFd(), kickMsg.c_str(), kickMsg.size(), 0); + channel.removeUser(use); + } + } + } } - - } + else if (command == "QUIT") + { + string msg; + iss >> msg; + string quitMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP QUIT :" + msg + "\r\n"; + send(user->getFd(), quitMsg.c_str(), quitMsg.size(), 0); + close(user->getFd()); + FD_CLR(user->getFd(), &_masterSet); + _clients.erase(std::remove(_clients.begin(),_clients.end(), user->getFd()), _clients.end()); + _authenticated.erase(user->getFd()); + } + else if (command == "PART") + { + string channelName; + iss >> channelName; + if (_channels.find(channelName) != _channels.end()) + { + Channel &channel = _channels[channelName]; + vector users = channel.getUsers(); + for(vector::iterator it = users.begin() ; it != users.end() ; ++it) + { + User *use = *it; + if (use->getNickName() == user->getNickName()) + { + string partMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP PART " + channelName + " :Leaving channel\r\n"; + } + } + } + } + else if (command == "OPER") + { + string userName, password; + iss >> userName; + iss >> password; + if (userName == "admin" && password == "admin") + { + user->setOperator(true); + string operMsg = ": " + user->getNickName() + "!" + user->getUserName() + "@" + + user->getIpAdresse() + ".IP MODE " + user->getNickName() + " +o\r\n"; + send(user->getFd(), operMsg.c_str(), operMsg.size(), 0); + } + } + else if (command == "LIST") + { + list(*user); + } + } +// else if (command == "MODE") +// { +// string target; +// string mode; +// iss >> target >> mode; + +// if (_channels.find(target) != _channels.end()) // target is a channel +// { +// Channel &channel = _channels[target]; +// if (mode[0] == '+') // adding a mode +// { +// channel.addMode(mode.substr(1)); +// } +// else if (mode[0] == '-') // removing a mode +// { +// channel.removeMode(mode.substr(1)); +// } +// } +// else // target is a user +// { +// for (std::vector::iterator it = _users.begin(); it != _users.end(); ++it) +// { +// User* user = *it; +// if (user->getNickName() == target) +// { +// if (mode[0] == '+') // adding a mode +// { +// user->addMode(mode.substr(1)); +// } +// else if (mode[0] == '-') // removing a mode +// { +// user->removeMode(mode.substr(1)); +// } +// break; +// } +// } +// } +// } + } + + void Server::list(User& user) +{ + send_reply(321, user, "Channel", "Users Name"); + + for (map::iterator it = _channels.begin(); it != _channels.end(); it++) + { + std::stringstream ss; + ss << "#" << it->first << " " << it->second.count_membres(); + send_reply(322, user, ss.str(), it->second.get_topic()); + } + + send_reply(323, user, "", "End of /LIST"); } +void Server::send_reply(int code, User& client, const std::string& arg1, const std::string& arg2) +{ + std::stringstream ss; + ss << ":" << code << " " << arg1 << " " << arg2 << "\r\n"; + std::string msg = ss.str(); + // Assuming Client has a method getFd() that returns a file descriptor + int fd = client.getFd(); + + // Send the message to the client + send(fd, msg.c_str(), msg.size(), 0); +} void Server::_hundleClientMessage(int ClientFd) { @@ -300,6 +425,7 @@ void Server::_hundleClientMessage(int ClientFd) else { str[bytesReceived] = '\0'; + // cout MM / _hundleMessage(str, ClientFd); } } diff --git a/tests/Server.hpp b/tests/Server.hpp index 6307911..820801e 100644 --- a/tests/Server.hpp +++ b/tests/Server.hpp @@ -39,9 +39,12 @@ class Server Server( Server const & src ); ~Server(); void start(string port, string password); + // void send_err(int code, User &sender, std::string arg1, std::string msg); Server & operator=( Server const & rhs ); + void list(User& user); + void send_reply(int code, User& client, const std::string& arg1, const std::string& arg2); private: fd_set _masterSet; fd_set _readSet; diff --git a/tests/User.hpp b/tests/User.hpp index a5e25b2..de1dcee 100644 --- a/tests/User.hpp +++ b/tests/User.hpp @@ -28,22 +28,23 @@ class User bool getOperator() const; int getFd() const; + int get_socket(); + // + void setFd(int &fd); void setUserName(const string &userName); void setNickName(const string &nickName); void setIpAdresse(const string &ipAdresse); void setOperator(bool op); - void setFd(int &fd); - User & operator=( User const & rhs ); private: int _fd; - bool _operators; string _userName; string _nickName; - string _ipAdresse; + std::string _ipAdresse; + bool _operators; }; From 799a534ad24daa3d8b0ad4a1d751802cf68005bd Mon Sep 17 00:00:00 2001 From: siiine-764 Date: Thu, 22 Aug 2024 20:39:47 +0100 Subject: [PATCH 10/11] update --- README.md | 6 +++ tests/Channel.hpp | 78 +++++++++++++++++++++++++++- tests/Server.cpp | 127 ++++++++++++++++++++++++++++++++-------------- 3 files changed, 172 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index d53c757..447c47a 100644 --- a/README.md +++ b/README.md @@ -37,4 +37,10 @@ s: Secret. This mode makes the channel secret. t: Topic. This mode allows only channel operators to change the channel topic. v: Voice. This mode allows a user to speak in a moderated channel. + i: Set/remove Invite-only channel +· t: Set/remove the restrictions of the TOPIC command to channel +operators +· k: Set/remove the channel key (password) +· o: Give/take channel operator privilege +· l: Set/remove the user limit to channel diff --git a/tests/Channel.hpp b/tests/Channel.hpp index 84d698d..171619c 100644 --- a/tests/Channel.hpp +++ b/tests/Channel.hpp @@ -5,12 +5,88 @@ # include # include # include "User.hpp" +#include +# include // Add this line class Channel { - + int userLimit; + bool invite_only; + bool topic_restricted; + std::string key; + std::set voice_users; + std::set operators; + std::map modes; + public: + void setInviteOnly() { + invite_only = true; + } + + void removeInviteOnly() { + invite_only = false; + } + + bool isInviteOnly() const { + return invite_only; + } + + void restrictTopic() { + topic_restricted = true; + } + + void removeTopicRestriction() { + topic_restricted = false; + } + + bool isTopicRestricted() const { + return topic_restricted; + } + + void setKey(const std::string& newKey) { + key = newKey; + } + + void removeKey() { + key.clear(); + } + + const std::string& getKey() const { + return key; + } + + void giveVoice(const std::string& user) { + voice_users.insert(user); + } + + void removeVoice(const std::string& user) { + voice_users.erase(user); + } + + bool hasVoice(const std::string& user) const { + return voice_users.find(user) != voice_users.end(); + } + + void addOperator(const std::string& user) { + operators.insert(user); + } + + void removeOperator(const std::string& user) { + operators.erase(user); + } + + bool isOperator(const std::string& user) const { + return operators.find(user) != operators.end(); + } + + void addMode(std::string mode) { modes[mode] = true; } // Add this method + void removeMode(std::string mode) { modes.erase(mode); } // Add this method + + void setUserLimit(int limit) { userLimit = limit; } // Add this method + void removeUserLimit() { userLimit = -1; } // Add this method + int getUserLimit() { return userLimit; } // Add this method + Channel(); Channel(const std::string &name); Channel( Channel const & src ); diff --git a/tests/Server.cpp b/tests/Server.cpp index efcb115..666a6d8 100644 --- a/tests/Server.cpp +++ b/tests/Server.cpp @@ -339,45 +339,96 @@ void Server::_hundleMessage(string message, int clientFd) { list(*user); } + else if (command == "MODE") + { + string target; + string mode; + iss >> target >> mode; + + if (_channels.find(target) != _channels.end()) // target is a channel + { + std::cout << "ffff" << target << std:endl; + + Channel &channel = _channels[target]; + if (mode[0] == '+') // adding a mode + { + if (mode[1] == 'l') // setting a user limit + { + int limit; + iss >> limit; + channel.setUserLimit(limit); + } + else if (mode[1] == 'i') // setting a channel to invite-only + { + channel.setInviteOnly(); + } + else if (mode[1] == 't') // restricting TOPIC command to operators + { + channel.restrictTopic(); + } + else if (mode[1] == 'k') // setting a channel key + { + std::string newKey; + iss >> newKey; + channel.setKey(newKey); + } + else if (mode[1] == 'v') // giving a user voice + { + std::string user; + iss >> user; + channel.giveVoice(user); + } + else if (mode[1] == 'o') // giving a user operator privileges + { + std::string user; + iss >> user; + channel.addOperator(user); + } + else + { + channel.addMode(mode.substr(1)); + } + } + else if (mode[0] == '-') // removing a mode + { + if (mode[1] == 'l') // removing a user limit + { + channel.removeUserLimit(); + } + else if (mode[1] == 'i') // removing invite-only status from a channel + { + channel.removeInviteOnly(); + } + else if (mode[1] == 't') // removing restriction on TOPIC command + { + channel.removeTopicRestriction(); + } + else if (mode[1] == 'k') // removing a channel key + { + channel.removeKey(); + } + else if (mode[1] == 'v') // removing a user's voice + { + std::string user; + iss >> user; + channel.removeVoice(user); + } + else if (mode[1] == 'o') // taking away a user's operator privileges + { + std::string user; + iss >> user; + channel.removeOperator(user); + } + else + { + channel.removeMode(mode.substr(1)); + } + } + } + // ... existing code ... } -// else if (command == "MODE") -// { -// string target; -// string mode; -// iss >> target >> mode; - -// if (_channels.find(target) != _channels.end()) // target is a channel -// { -// Channel &channel = _channels[target]; -// if (mode[0] == '+') // adding a mode -// { -// channel.addMode(mode.substr(1)); -// } -// else if (mode[0] == '-') // removing a mode -// { -// channel.removeMode(mode.substr(1)); -// } -// } -// else // target is a user -// { -// for (std::vector::iterator it = _users.begin(); it != _users.end(); ++it) -// { -// User* user = *it; -// if (user->getNickName() == target) -// { -// if (mode[0] == '+') // adding a mode -// { -// user->addMode(mode.substr(1)); -// } -// else if (mode[0] == '-') // removing a mode -// { -// user->removeMode(mode.substr(1)); -// } -// break; -// } -// } -// } -// } + +} } void Server::list(User& user) From e16ab151ae1705400f5146ebf8fad8167346915d Mon Sep 17 00:00:00 2001 From: siiine-764 Date: Fri, 23 Aug 2024 22:42:23 +0100 Subject: [PATCH 11/11] add command topic && update in cmd mode --- README.md | 26 +++++++------------- tests/Channel.cpp | 4 ++++ tests/Channel.hpp | 15 ++---------- tests/Server.cpp | 60 +++++++++++++++++++++++++++++++++++++---------- 4 files changed, 62 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 447c47a..be51105 100644 --- a/README.md +++ b/README.md @@ -26,21 +26,13 @@ // ./IRC 6667 123456789 -i (Invisible): User becomes invisible. They are not shown in channel lists or user queries. -o (Operator): User becomes an IRC operator with administrative privileges. - -b: Ban. This mode is used to ban certain users from a channel. -k: Key. This mode sets a 'key' or password for the channel. -o: Operator. This mode gives a user operator status in the channel. -p: Private. This mode makes the channel private. -s: Secret. This mode makes the channel secret. -t: Topic. This mode allows only channel operators to change the channel topic. -v: Voice. This mode allows a user to speak in a moderated channel. - - i: Set/remove Invite-only channel -· t: Set/remove the restrictions of the TOPIC command to channel -operators -· k: Set/remove the channel key (password) -· o: Give/take channel operator privilege -· l: Set/remove the user limit to channel + · i: Set/remove Invite-only channel + + · t: Set/remove the restrictions of the TOPIC command to channel operators + + · k: Set/remove the channel key (password) + + · o: Give/take channel operator privilege + + · l: Set/remove the user limit to channel diff --git a/tests/Channel.cpp b/tests/Channel.cpp index 79d4071..124bc19 100644 --- a/tests/Channel.cpp +++ b/tests/Channel.cpp @@ -97,6 +97,10 @@ std::string Channel::get_topic() { return _topic; // assuming topic is a string variable holding the topic of the channel } +void Channel::setTopic(const std::string& newTopic) { + _topic = newTopic; +} + /* ** --------------------------------- ACCESSOR --------------------------------- */ diff --git a/tests/Channel.hpp b/tests/Channel.hpp index 171619c..bb9a28a 100644 --- a/tests/Channel.hpp +++ b/tests/Channel.hpp @@ -56,18 +56,6 @@ class Channel return key; } - void giveVoice(const std::string& user) { - voice_users.insert(user); - } - - void removeVoice(const std::string& user) { - voice_users.erase(user); - } - - bool hasVoice(const std::string& user) const { - return voice_users.find(user) != voice_users.end(); - } - void addOperator(const std::string& user) { operators.insert(user); } @@ -106,9 +94,10 @@ class Channel int count_membres(); std::string get_topic(); + void setTopic(const std::string& newTopic); private: std::string _name; - std::string _topic; // new member variable for the topic + std::string _topic; // new member variable for the topic std::vector _users; diff --git a/tests/Server.cpp b/tests/Server.cpp index 666a6d8..d845962 100644 --- a/tests/Server.cpp +++ b/tests/Server.cpp @@ -201,6 +201,30 @@ void Server::_hundleMessage(string message, int clientFd) bool op = (_channels.find(channelName) == _channels.end()); Channel& channel = _channels[channelName]; + if (channel.isInviteOnly()) + { + string response = "invite only"; + send(clientFd, response.c_str(), response.size(), 0); + } + if (channel.getUserLimit()) + { + if (channel.count_membres() >= channel.getUserLimit()) + { + string response = "Channel is full"; + send(clientFd, response.c_str(), response.size(), 0); + } + } + // if (channel.getKey()) + // { + // string key; + // iss >> key; + // if (key != channel.getKey()) + // { + // string response = "Wrong key"; + // send(clientFd, response.c_str(), response.size(), 0); + // } + // } + channel.addUser(user); string joinMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP JOIN " + channelName + " * :realname\r\n"; send(clientFd, joinMsg.c_str(), joinMsg.size(), 0); @@ -339,15 +363,37 @@ void Server::_hundleMessage(string message, int clientFd) { list(*user); } + else if (command == "TOPIC") + { + string channelName; + iss >> channelName; + if (_channels.find(channelName) != _channels.end()) + { + Channel &channel = _channels[channelName]; + if (channel.isTopicRestricted() && !channel.isOperator(user->getNickName())) + { + string response = "403 " + user->getNickName() + " :You're not an operator of this channel.\r\n"; + send(user->getFd(), response.c_str(), response.size(), 0); + } + else { + string newTopic; + iss >> newTopic; + channel.setTopic(newTopic); + + string topicMsg = ":" + user->getNickName() + "!" + user->getUserName() + "@" + user->getIpAdresse() + ".IP TOPIC " + channelName + " :" + newTopic + "\r\n"; + } + } + } else if (command == "MODE") { string target; string mode; iss >> target >> mode; + std::cout << mode << std::endl; if (_channels.find(target) != _channels.end()) // target is a channel { - std::cout << "ffff" << target << std:endl; + std::cout << "ffff" << target << std::endl; Channel &channel = _channels[target]; if (mode[0] == '+') // adding a mode @@ -372,12 +418,6 @@ void Server::_hundleMessage(string message, int clientFd) iss >> newKey; channel.setKey(newKey); } - else if (mode[1] == 'v') // giving a user voice - { - std::string user; - iss >> user; - channel.giveVoice(user); - } else if (mode[1] == 'o') // giving a user operator privileges { std::string user; @@ -407,12 +447,6 @@ void Server::_hundleMessage(string message, int clientFd) { channel.removeKey(); } - else if (mode[1] == 'v') // removing a user's voice - { - std::string user; - iss >> user; - channel.removeVoice(user); - } else if (mode[1] == 'o') // taking away a user's operator privileges { std::string user;