/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* join.cpp :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: iherman- > args; if (!client.isRegistered()) return (client.send(":" SERVER_NAME " 451 * :You have not registered\r\n")); if (args.empty()) return (client.send(":" SERVER_NAME " 461 " + client.getNick() + " JOIN :Not enough parameters\r\n")); std::map::iterator it = channels_.find(args); // creates channel if (it == channels_.end()) { channels_[args] = Channel(args); channels_[args].addMember(client.getFd()); channels_[args].addOperator(client.getFd()); client.joinChannel(args); std::string joinMsg = ":" + client.getNick() + "!" + client.getUsername() + "@localhost JOIN " + args + "\r\n"; channels_[args].broadcast(joinMsg, clients_, -1); std::string namesList = ":" SERVER_NAME " 353 " + client.getNick() + " = " + args + " :"; const std::set &members = channels_[args].getMembers(); for (std::set::const_iterator m = members.begin(); m != members.end(); m++) { std::map::iterator u = clients_.find(*m); if (u != clients_.end()) { if (channels_[args].hasOperator(*m)) namesList += "@"; namesList += u->second.getNick() + " "; } } client.send(namesList + "\r\n"); client.send(":" SERVER_NAME " 366 " + client.getNick() + " " + args + " :End of /NAMES list\r\n"); } else { if (it->second.hasMember(client.getFd())) { client.send(":" SERVER_NAME " 443 " + client.getNick() + " " + args + " :is already on channel\r\n"); return ; } if (it->second.isInviteOnly() && !it->second.isInvited(client.getFd())) { client.send(":" SERVER_NAME " 473 " + client.getNick() + " " + args + " :Cannot join channel (+i)\r\n"); return ; } it->second.addMember(client.getFd()); client.joinChannel(it->first); std::string joinMsg = ":" + client.getNick() + "!" + client.getUsername() + "@localhost JOIN " + args + "\r\n"; channels_[args].broadcast(joinMsg, clients_, -1); std::string namesList = ":" SERVER_NAME " 353 " + client.getNick() + " = " + args + " :"; const std::set &members = channels_[args].getMembers(); for (std::set::const_iterator m = members.begin(); m != members.end(); m++) { std::map::iterator u = clients_.find(*m); if (u != clients_.end()) { if (channels_[args].hasOperator(*m)) namesList += "@"; namesList += u->second.getNick() + " "; } } client.send(namesList + "\r\n"); client.send(":" SERVER_NAME " 366 " + client.getNick() + " " + args + " :End of /NAMES list\r\n"); } }