diff --git a/ft_irc3/src/Join.cpp b/ft_irc3/src/Join.cpp index 04a4073..cc958be 100644 --- a/ft_irc3/src/Join.cpp +++ b/ft_irc3/src/Join.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/21 19:51:31 by fgras-ca #+# #+# */ -/* Updated: 2024/05/28 14:33:01 by fgras-ca ### ########.fr */ +/* Updated: 2024/05/29 13:24:35 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,66 +14,76 @@ void JoinHandler::handleJoinCommand(Client *client, const std::string &channelName, Server *server) { - if (channelName.empty()) { - server->sendToClient(client->getFd(), ERR_NEEDMOREPARAMS(client, "JOIN")); - return; - } + std::map &channels = server->getChannels(); + Channel *channel; - std::map &channels = server->getChannels(); - Channel *channel; + std::vector lst = split(channelName, ","); + for (std::vector::iterator itl = lst.begin(); itl != lst.end(); ++itl) + { + std::cout << "hjoincmd .. " << (*itl) << std::endl; + // ERR_TOOMANYCHANNELS (405) + // ERR_NEEDMOREPARAMS (461)//? + // ERR_CHANNELISFULL (471) + // ERR_INVITEONLYCHAN (473) + // ERR_BADCHANNELKEY (475) + // RPL_TOPIC (332) + // RPL_TOPICWHOTIME (333) - if (channels.find(channelName) == channels.end()) { - channel = new Channel(channelName); - channels[channelName] = channel; - } else { - channel = channels[channelName]; - } + if((*itl)[0] == '0' && (*itl).size() == 1) + { + //leave all + continue; + } + // check le nom du chanel + else if ((*itl)[0] != '#' && (*itl)[0] != '&') + { + // ERR_NOSUCHCHANNEL (403) + // ERR_BADCHANMASK (476) + server->sendToClient(client->getFd(), "bad name \r\n"); + continue; + } - if (channel->isBanned(client)) { - server->sendToClient(client->getFd(), ERR_BANNEDFROMCHAN(client, channelName)); - return; - } + if (channels.find((*itl)) == channels.end()) + { + // if (channels[*itl]->isBanned(client)) + // { + // // ERR_BANNEDFROMCHAN (474) + // server->sendToClient(client->getFd(), "ban from channel \r\n"); + // continue; + // } + channel = new Channel((*itl)); + channels[(*itl)] = channel; + channel->addOperator(client);//set op + } + else + { + channel = channels[(*itl)]; + } - if (channel->isFull()) { - server->sendToClient(client->getFd(), ERR_CHANNELISFULL(client, channelName)); - return; - } + channel->addClient(client); - if (channel->isInviteOnly() && !channel->isInvited(client)) { - server->sendToClient(client->getFd(), ERR_INVITEONLYCHAN(client, channelName)); - return; - } + std::vector clients = channel->getClients(); + for (std::vector::iterator it = clients.begin(); it != clients.end(); ++it) + { + std::string cmd = ":" + client->getNickname() + " JOIN " + channel->getName() + "\r\n"; + server->sendToClient((*it)->getFd(), cmd); + } - channel->addClient(client); - sendJoinSuccess(client, channel, server); -} - -void JoinHandler::sendJoinSuccess(Client *client, Channel *channel, Server *server) -{ - std::string joinMessage = ":" + client->getNickname() + " JOIN " + channel->getName() + "\r\n"; - server->sendToClient(client->getFd(), joinMessage); - - if (!channel->getTopic().empty()) { - server->sendToClient(client->getFd(), RPL_TOPIC(client, channel->getName(), channel->getTopic())); - server->sendToClient(client->getFd(), RPL_TOPICWHOTIME(client, channel->getName(), channel->getTopicSetter(), channel->getTopicTime())); - } - - std::string usersList = getUsersList(channel); - server->sendToClient(client->getFd(), usersList); - - channel->broadcast(joinMessage, client, server); + std::string usersList = getUsersList(channel); + server->sendToClient(client->getFd(), usersList); + } } std::string JoinHandler::getUsersList(Channel *channel) { - std::vector clients = channel->getClients(); - std::string users; - for (std::vector::iterator it = clients.begin(); it != clients.end(); ++it) { - users += (*it)->getNickname() + " "; - } - - std::ostringstream oss; - oss << RPL_NAMREPLY(clients[0], channel->getName(), users); - oss << RPL_ENDOFNAMES(clients[0], channel->getName()); - return oss.str(); -} + std::vector clients = channel->getClients(); + std::string usersList = ":server 353 " + clients[0]->getNickname() + " = " + channel->getName() + " :"; + for (std::vector::iterator it = clients.begin(); it != clients.end(); ++it) + { + if (channel->isOperator((*it))) + usersList += "@"; + usersList += (*it)->getNickname() + " "; + } + usersList += "\r\n:server 366 " + clients[0]->getNickname() + " " + channel->getName() + " :End of /NAMES list.\r\n"; + return usersList; +} \ No newline at end of file