fixing last bugs

This commit is contained in:
Bettercallous
2024-05-01 12:02:12 +01:00
parent 5c8c145c5b
commit 4a50dced99
2 changed files with 53 additions and 47 deletions

View File

@@ -570,54 +570,9 @@ void Server::handleClientData(int fd)
client.setAuthentication(1); client.setAuthentication(1);
} }
} }
else if (startsWith(command, "QUIT ")) else if (startsWith(command, "QUIT"))
{ {
// Iterate over channels cleanChannel(fd);
std::map<std::string, Channel>::iterator it;
for (it = channels.begin(); it != channels.end(); ++it)
{
Channel& channel = it->second;
std::string nickname = channel.getNickname(fd);
// Check if the user is part of the channel
if (channel.isUserInChannel(nickname))
{
// Mark the user as disconnected in the channel
channel.ejectUserfromusers(fd);
}
}
std::map<int, std::string>::iterator userIt;
userIt = usernames.find(fd);
if (userIt != usernames.end()) {
usernames.erase(userIt);
}
std::map<int, std::string>::iterator nickIt;
nickIt = nicknames.find(fd);
if (nickIt != nicknames.end()) {
nicknames.erase(nickIt);
}
for (std::map<std::string, Channel>::iterator it = channels.begin(); it != channels.end(); ++it) {
std::map<std::string, int> &usersfdmap = it->second.getUserFdMap();
for (std::map<std::string, int>::iterator it3 = usersfdmap.begin(); it3 != usersfdmap.end(); ++it3) {
if (it3->second == fd)
usersfdmap.erase(it3);
}
}
for (std::map<std::string, Channel>::iterator it1 = channels.begin(); it1 != channels.end(); ++it1) {
std::map<std::string, int> &invitedusrmap = it1->second.invitedUserss();
for (std::map<std::string, int>::iterator it3 = invitedusrmap.begin(); it3 != invitedusrmap.end(); ++it3) {
if (it3->second == fd)
invitedusrmap.erase(it3);
}
}
for (std::map<std::string, Channel>::iterator it2 = channels.begin(); it2 != channels.end(); ++it2) {
std::map<std::string, int> &operatorsmap = it2->second.getOperators();
for (std::map<std::string, int>::iterator it3 = operatorsmap.begin(); it3 != operatorsmap.end(); ++it3) {
if (it3->second == fd)
operatorsmap.erase(it3);
}
}
clientCleanup(fd); clientCleanup(fd);
} }
else if (startsWith(command, "PING")) else if (startsWith(command, "PING"))
@@ -1170,9 +1125,11 @@ void Server::handleClientData(int fd)
else if (bytesRead == 0) { else if (bytesRead == 0) {
std::cout << "Client <" << fd << "> Disconnected" << std::endl; std::cout << "Client <" << fd << "> Disconnected" << std::endl;
cleanChannel(fd);
clientCleanup(fd); clientCleanup(fd);
} else if (bytesRead == -1) { } else if (bytesRead == -1) {
std::cerr << "Error reading data from client <" << fd << ">" << std::endl; std::cerr << "Error reading data from client <" << fd << ">" << std::endl;
cleanChannel(fd);
clientCleanup(fd); clientCleanup(fd);
} }
} }
@@ -1227,3 +1184,50 @@ void Server::closeFds()
close(_serverSocketFd); close(_serverSocketFd);
_fds.clear(); _fds.clear();
} }
void Server::cleanChannel(int fd) {
std::map<std::string, Channel>::iterator it;
for (it = channels.begin(); it != channels.end(); ++it)
{
Channel& channel = it->second;
std::string nickname = channel.getNickname(fd);
// Check if the user is part of the channel
if (channel.isUserInChannel(nickname))
{
// Mark the user as disconnected in the channel
channel.ejectUserfromusers(fd);
}
}
std::map<int, std::string>::iterator userIt;
userIt = usernames.find(fd);
if (userIt != usernames.end()) {
usernames.erase(userIt);
}
std::map<int, std::string>::iterator nickIt;
nickIt = nicknames.find(fd);
if (nickIt != nicknames.end()) {
nicknames.erase(nickIt);
}
for (std::map<std::string, Channel>::iterator it = channels.begin(); it != channels.end(); ++it) {
std::map<std::string, int> &usersfdmap = it->second.getUserFdMap();
for (std::map<std::string, int>::iterator it3 = usersfdmap.begin(); it3 != usersfdmap.end(); ++it3) {
if (it3->second == fd)
usersfdmap.erase(it3);
}
}
for (std::map<std::string, Channel>::iterator it1 = channels.begin(); it1 != channels.end(); ++it1) {
std::map<std::string, int> &invitedusrmap = it1->second.invitedUserss();
for (std::map<std::string, int>::iterator it3 = invitedusrmap.begin(); it3 != invitedusrmap.end(); ++it3) {
if (it3->second == fd)
invitedusrmap.erase(it3);
}
}
for (std::map<std::string, Channel>::iterator it2 = channels.begin(); it2 != channels.end(); ++it2) {
std::map<std::string, int> &operatorsmap = it2->second.getOperators();
for (std::map<std::string, int>::iterator it3 = operatorsmap.begin(); it3 != operatorsmap.end(); ++it3) {
if (it3->second == fd)
operatorsmap.erase(it3);
}
}
}

View File

@@ -75,9 +75,11 @@ class Server {
void handleClientConnection(); void handleClientConnection();
void handleClientData(int fd); void handleClientData(int fd);
void clientCleanup(int fd); void clientCleanup(int fd);
void cleanChannel(int fd);
void closeFds(); void closeFds();
Client& getClientByFd(int fd); Client& getClientByFd(int fd);
}; };
int randomInRange(int min, int max); int randomInRange(int min, int max);