diff --git a/Server.cpp b/Server.cpp index 3918df5..3156cda 100644 --- a/Server.cpp +++ b/Server.cpp @@ -540,22 +540,17 @@ void Server::handleClientData(int fd) std::cout << "Received data from client " << fd << ": " << command << std::endl; int auth = client.getAuthentication(); -//******************* FROM THERE IM STARTING TOP GGG ************ - if ((startsWith(command, "pass ") || startsWith(command, "PASS ")) && auth == 0) { std::string passwordLine = command.substr(command.find(" ") + 1); passwordLine = trim(passwordLine); - // Check if the password starts and ends with a quote if (!passwordLine.empty() && ((passwordLine[0] == '"' && passwordLine.size() > 1 && passwordLine[passwordLine.size() - 1] == '"') || (passwordLine[0] == '\'' && passwordLine.size() > 1 && passwordLine[passwordLine.size() - 1] == '\''))) { - // Remove the quotes passwordLine = passwordLine.substr(1, passwordLine.size() - 2); } - // Validate the password if (passwordLine.empty()) { std::string errorMessage = "Error: Password cannot be empty\n"; @@ -597,9 +592,31 @@ void Server::handleClientData(int fd) usernames.erase(userIt); } std::map::iterator nickIt; - userIt = nicknames.find(fd); - if (userIt != nicknames.end()) { - nicknames.erase(userIt); + nickIt = nicknames.find(fd); + if (nickIt != nicknames.end()) { + nicknames.erase(nickIt); + } + + for (std::map::iterator it = channels.begin(); it != channels.end(); ++it) { + std::map &usersfdmap = it->second.getUserFdMap(); + for (std::map::iterator it3 = usersfdmap.begin(); it3 != usersfdmap.end(); ++it3) { + if (it3->second == fd) + usersfdmap.erase(it3); + } + } + for (std::map::iterator it1 = channels.begin(); it1 != channels.end(); ++it1) { + std::map &invitedusrmap = it1->second.invitedUserss(); + for (std::map::iterator it3 = invitedusrmap.begin(); it3 != invitedusrmap.end(); ++it3) { + if (it3->second == fd) + invitedusrmap.erase(it3); + } + } + for (std::map::iterator it2 = channels.begin(); it2 != channels.end(); ++it2) { + std::map &operatorsmap = it2->second.getOperators(); + for (std::map::iterator it3 = operatorsmap.begin(); it3 != operatorsmap.end(); ++it3) { + if (it3->second == fd) + operatorsmap.erase(it3); + } } clientCleanup(fd); } @@ -1147,7 +1164,6 @@ void Server::handleClientData(int fd) } } } -//**************** STOOOOOOP HERE TOP G ... client.clearCommand(); } } @@ -1188,18 +1204,14 @@ Client& Server::getClientByFd(int fd) { } int randomInRange(int min, int max) { - // Check for invalid range if (min > max) { - return -1; // Or throw an exception + return -1; } - // Calculate range size (inclusive) int range_size = max - min + 1; - // Generate random number between 0 and RAND_MAX (scaled by range size) double random_double = (double)rand() / (RAND_MAX + 1.0) * range_size; - // Convert to integer and shift by minimum value return (int)random_double + min; } diff --git a/Server.hpp b/Server.hpp index cce92fc..e9bb355 100644 --- a/Server.hpp +++ b/Server.hpp @@ -4,8 +4,8 @@ #include #include #include -#include // Include for the send function -#include // Include for the strlen function +#include +#include #include #include #include @@ -37,10 +37,8 @@ class Server { std::string _password; std::vector _fds; std::vector _clients; - // THAT'S THA DATA OF TOOOP GGG START FROM THERE . std::map nicknames; std::map usernames; - std::map channels; @@ -48,11 +46,8 @@ class Server { public: Server(); ~Server(); - // THAT'S MY FUNCTIONS START FROM THERE void setNickname(int fd, const std::string& nickname); std::string getPassowrd() const; - void setPassword(const std::string& password); - void setUsernameoperators(int fd, const std::string& username); void setUsernames(int fd, const std::string& username); std::string formatCreationTime(); std::string constructCreationTimeMessage(const std::string& channelName); @@ -67,13 +62,8 @@ class Server { void smallbroadcastMessageforTopic(std::string nicknamesender, const std::string& channelname, std::string topic); void smallbroadcastMOOD(std::string nicknamesender, const std::string& channelname, std::string mode, std::string receiver); int findUserFd1(const std::string& username); - std::string findUsernameforsending(int fd); - bool isOperator(int fd); - void kickUser(int fd); - int findUserFdforkickregulars(const std::string& username); bool dontputthesamenick(const std::string& nickname); bool dontputthesameusername(const std::string& username); - // AND END HERE. void parseArgs(int ac, char **av); static void receiveSignal(int signum); void init(); diff --git a/channel.cpp b/channel.cpp index f87f0d2..74a5bae 100644 --- a/channel.cpp +++ b/channel.cpp @@ -3,21 +3,11 @@ Channel::Channel(){} -Channel::Channel(const std::string& name) : Channelname(name), opperatorfd(false), issettop(false), isinveted(false) {} +Channel::Channel(const std::string& name) : Channelname(name) {} Channel::~Channel() {} -void Channel::setoperator(int value) -{ - opperatorfd = value; -} - -int Channel::getoperator() -{ - return opperatorfd; -} - void Channel::setlimitchannel(int value) { limite = value; @@ -28,31 +18,11 @@ int Channel::getlimitechannel() return limite; } -void Channel::setbooltopic(bool value) -{ - issettop = value; -} - -bool Channel::getbooltopic() -{ - return issettop; -} - -void Channel::setboolinvited(bool value) -{ - isinveted = value; -} - -bool Channel::getboolinvited() -{ - return isinveted; -} void Channel::setTopic(const std::string& newTopic) { topic = newTopic; } - // Get topic function std::string Channel::getTopic() const { return topic; @@ -66,9 +36,7 @@ void Channel::addClientinveted(const std::string& client, int fd) { invitedUsers[client] = fd; } - // Add an operator to the channel void Channel::addOperator(const std::string& operatorName, int fd) { -// Store the operator name and file descriptor in the map operators[operatorName] = fd; } @@ -77,21 +45,18 @@ int Channel::getUserFd(const std::string& username) const { if (it != userFdMap.end()) { return it->second; } - return -1; // Return -1 if username not found + return -1; } bool Channel::isUserInChannel(const std::string& nickname) const { - // Search for the nickname in the userMap std::map::const_iterator it = userFdMap.find(nickname); - // If the nickname is found and the user is connected, return true if (it != userFdMap.end() && it->second) { return true; } - // Otherwise, return false return false; } - // Get all clients' usernames in the channel + std::vector Channel::getClients() const { std::vector clients; std::map::const_iterator it; @@ -105,71 +70,63 @@ std::string Channel::getNickname(int fd) const { std::map::const_iterator it; for (it = userFdMap.begin(); it != userFdMap.end(); ++it) { if (it->second == fd) { - return it->first; // Return the nickname if the file descriptor matches + return it->first; + } } - } - return ""; // Return an empty string if the file descriptor is not found + return ""; } bool Channel::isOperator(int fd) { -// Iterate through the map of operators + for (std::map::iterator it = operators.begin(); it != operators.end(); ++it) { - // Check if the file descriptor matches if (it->second == fd) { - return true; // Found the file descriptor in the map + return true; } } -return false; // File descriptor not found in the map +return false; } bool Channel::isInvited(std::string nickname) { -// Iterate through the map of operators for (std::map::iterator it = invitedUsers.begin(); it != invitedUsers.end(); ++it) { - // Check if the file descriptor matches if (it->first == nickname) { - return true; // Found the file descriptor in the map + return true; } } -return false; // File descriptor not found in the map +return false; } int Channel::findUserFdForKickRegulars(const std::string& username) { -// Iterate through the userFdMap to find the user std::map::iterator it; for (it = userFdMap.begin(); it != userFdMap.end(); ++it) { if (it->first == username) { - return it->second; // Return the file descriptor if the username matches + return it->second; } } -return -1; // Return -1 if the user is not found +return -1; } void Channel::ejectUserfromusers(int fd) { - // Iterate over the map to find the user with the given file descriptor std::map::iterator it; for (it = userFdMap.begin(); it != userFdMap.end(); ++it) { if (it->second == fd) { - // Erase the user from the map userFdMap.erase(it); std::cout << "the user earased " << std::endl; - return; // Exit the function after removing the user + return; } } } void Channel::ejectUserfromivited(std::string nickname) { - // Iterate over the map to find the user with the given file descriptor std::map::iterator it; for (it = invitedUsers.begin(); it != invitedUsers.end(); ++it) { if (it->first == nickname) { - // Erase the user from the map invitedUsers.erase(it); std::cout << "the user earased " << std::endl; - return; // Exit the function after removing the user + return; } } } @@ -181,20 +138,39 @@ std::string Channel::getOperatorNickname(int fd) const { return it->first; } } - return ""; // Return empty string if operator not found + return ""; } void Channel::removeOperator(const std::string& operatorName ) { - // Iterate through the map to find the operator std::map::iterator it; for (it = operators.begin(); it != operators.end(); ++it) { if (it->first == operatorName) { - // Erase the operator from the map operators.erase(it); - return; // Exit the function after removing the operator + return; } } } +std::map& Channel::getUserFdMap() { + return userFdMap; +} +std::map& Channel::invitedUserss() { + return invitedUsers; +} + +std::map& Channel::getOperators() { + return operators; +} + + +void Channel::setPass(const std::string &Newpass) +{ + pass = Newpass; +} + +std::string Channel::getPass() +{ + return pass; +} \ No newline at end of file diff --git a/channel.hpp b/channel.hpp index 669c659..d0d6502 100644 --- a/channel.hpp +++ b/channel.hpp @@ -26,12 +26,9 @@ private: std::string key; std::string pass; int limite; - std::map userFdMap; // Mapping of usernames to file descriptors + std::map userFdMap; std::map invitedUsers; std::map operators; - int opperatorfd; - bool issettop; - bool isinveted; bool channelconnect; public: @@ -41,23 +38,9 @@ public: ~Channel(); void setTopic(const std::string& newTopic); std::string getTopic() const; - - //checks - void setoperator(int value); - int getoperator(); - - //check void setlimitchannel(int value); int getlimitechannel(); - //checks - void setbooltopic(bool value); - bool getbooltopic(); - - //checks - void setboolinvited(bool value); - bool getboolinvited(); - void addClient(const std::string& client, int fd); void addClientinveted(const std::string& client, int fd); @@ -75,15 +58,12 @@ public: void removeOperator(const std::string& operatorName ); - void setPass(const std::string &Newpass) - { - pass = Newpass; - } + void setPass(const std::string &Newpass); - std::string getPass() - { - return pass; - } + std::string getPass(); + std::map& getUserFdMap(); + std::map& invitedUserss(); + std::map& getOperators(); }; diff --git a/todo.txt b/todo.txt deleted file mode 100644 index b7dd059..0000000 --- a/todo.txt +++ /dev/null @@ -1,44 +0,0 @@ -remember the quote commande - -create object for each instence : channel and client and server - - -client : fd , pass ,name , nick , user , and remember the lastchannel * - - -channel : _limite : it's limite of the users joined the channel --> nameofchannel -->topic -->key -->hastopic haskey and creationtime : if created . - -->victor of clients -->vicotr of invited users -->victor of operators -//tpic seter . -//tpic time . - - - - -this if for testing this how the commande behav : /connect liberachat - - - - -////remember this when you connect to irssi you need to prompte the client to put a password - - -//remmember the username have 4 parameter check rfc - - -after seting the data , password user , nick ---> responce 001, 002, 003, 004 - - -and make sure the irssi client need all the responce to recognized you as a server be awake - - - -rmreconns - -window close \ No newline at end of file