diff --git a/ft_irc3/src/AdditionalCommands.cpp b/ft_irc3/src/AdditionalCommands.cpp index bec6364..ffc2cf9 100644 --- a/ft_irc3/src/AdditionalCommands.cpp +++ b/ft_irc3/src/AdditionalCommands.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/16 15:27:29 by fgras-ca #+# #+# */ -/* Updated: 2024/05/29 12:16:24 by fgras-ca ### ########.fr */ +/* Updated: 2024/05/29 13:41:49 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -145,7 +145,7 @@ void AdditionalCommands::handlePrivmsgCommand(Server *server, Client *client, co if (channelClients[i] != client) { std::stringstream privMsg; - privMsg << ":" << client->getNickname() << " PRIVMSG " << target << " :" << message << "\r\n"; + privMsg << ":" << client->getNickname() << " PRIVMSG " << target << message << "\r\n"; server->sendToClient(channelClients[i]->getFd(), privMsg.str()); } } @@ -158,7 +158,7 @@ void AdditionalCommands::handlePrivmsgCommand(Server *server, Client *client, co if (targetClient) { std::stringstream privMsg; - privMsg << ":" << client->getNickname() << " PRIVMSG " << target << " :" << message << "\r\n"; + privMsg << ":" << client->getNickname() << " PRIVMSG " << target << message << "\r\n"; server->sendToClient(targetClient->getFd(), privMsg.str()); if (targetClient->isAway()) { diff --git a/ft_irc3/src/CommandHandler.cpp b/ft_irc3/src/CommandHandler.cpp index 8cab8bb..5eba6b3 100644 --- a/ft_irc3/src/CommandHandler.cpp +++ b/ft_irc3/src/CommandHandler.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/15 18:26:34 by fgras-ca #+# #+# */ -/* Updated: 2024/05/28 15:30:11 by fgras-ca ### ########.fr */ +/* Updated: 2024/05/29 13:41:25 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -63,7 +63,7 @@ void CommandHandler::handleCommand(Client* client, const std::string& command) _additionalCommands->processCommand(client, command); } } - std::cout << "Client " << client->getFd() << " " << client->getNickname() << " " << client->getUser() << " " << client->getPassword() << " " << client->getRealName() << std::endl; + //std::cout << "Client " << client->getFd() << " " << client->getNickname() << " " << client->getUser() << " " << client->getPassword() << " " << client->getRealName() << std::endl; } void CommandHandler::handleCapCommand(Client* client, const std::vector& tokens) diff --git a/ft_irc3/src/Join.cpp b/ft_irc3/src/Join.cpp index cc958be..be6aa33 100644 --- a/ft_irc3/src/Join.cpp +++ b/ft_irc3/src/Join.cpp @@ -1,89 +1,197 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* Join.cpp :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: fgras-ca +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/05/21 19:51:31 by fgras-ca #+# #+# */ -/* Updated: 2024/05/29 13:24:35 by fgras-ca ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "Join.hpp" - -void JoinHandler::handleJoinCommand(Client *client, const std::string &channelName, Server *server) -{ - 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((*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 (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)]; - } - - channel->addClient(client); - - 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); - } - - std::string usersList = getUsersList(channel); - server->sendToClient(client->getFd(), usersList); - } -} - -std::string JoinHandler::getUsersList(Channel *channel) -{ - 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 +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* Join.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: fgras-ca +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/05/21 19:51:31 by fgras-ca #+# #+# */ +/* Updated: 2024/05/21 20:13:30 by fgras-ca ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "Join.hpp" + +#include "Join.hpp" + + +/*void JoinHandler::handleJoinCommand(Client *client, const std::string &channelNames, Server *server) +{ + if (channelNames.empty()) { + server->sendToClient(client->getFd(), ERR_NEEDMOREPARAMS(client, "JOIN")); + return; + } + + std::vector channelList = split(channelNames, ","); + for (std::vector::iterator it = channelList.begin(); it != channelList.end(); ++it) + { + const std::string &channelName = *it; + if (channelName.empty()) continue; + + std::map &channels = server->getChannels(); + Channel *channel; + + if (channels.find(channelName) == channels.end()) { + channel = new Channel(channelName); + channels[channelName] = channel; + channel->addOperator(client); // Set client as operator for new channel + } else { + channel = channels[channelName]; + } + + if (channel->isBanned(client)) { + server->sendToClient(client->getFd(), ERR_BANNEDFROMCHAN(client, channelName)); + continue; + } + + if (channel->isFull()) { + server->sendToClient(client->getFd(), ERR_CHANNELISFULL(client, channelName)); + continue; + } + + if (channel->isInviteOnly() && !channel->isInvited(client)) { + server->sendToClient(client->getFd(), ERR_INVITEONLYCHAN(client, channelName)); + continue; + } + + 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"; + channel->broadcast(joinMessage, client, server); + + 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())); + } else { + server->sendToClient(client->getFd(), RPL_NOTOPIC(client, channel->getName())); + } + + 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) { + if (channel->isOperator(*it)) + users += "@"; + users += (*it)->getNickname() + " "; + } + + std::ostringstream oss; + oss << RPL_NAMREPLY(clients[0], channel->getName(), users); + oss << RPL_ENDOFNAMES(clients[0], channel->getName()); + return oss.str(); +}*/ + +void JoinHandler::handleJoinCommand(Client *client, const std::string &channelNames, Server *server) +{ + std::map &channels = server->getChannels(); + Channel *channel; + + std::vector lst = split(channelNames, ","); + for (std::vector::iterator itl = lst.begin(); itl != lst.end(); ++itl) + { + const std::string &channelName = *itl; + std::cout << "hjoincmd .. " << channelName << std::endl; + + if (channelName.empty()) + { + server->sendToClient(client->getFd(), ERR_NEEDMOREPARAMS(client, "JOIN")); + return; + } + + if (channelName[0] == '0' && channelName.size() == 1) + { + // Leave all channels + return; + } + + if (channelName[0] != '#' && channelName[0] != '&') + { + server->sendToClient(client->getFd(), ERR_NOSUCHCHANNEL(client->getFd(), channelName)); + return; + } + + if (channels.find(channelName) == channels.end()) + { + channel = new Channel(channelName); + channels[channelName] = channel; + channel->addOperator(client); // Set client as operator for new channel + } + else + { + channel = channels[channelName]; + } + + if (channel->isBanned(client)) + { + server->sendToClient(client->getFd(), ERR_BANNEDFROMCHAN(client, channelName)); + return; + } + + if (channel->isFull()) + { + server->sendToClient(client->getFd(), ERR_CHANNELISFULL(client, channelName)); + return; + } + + if (channel->isInviteOnly() && !channel->isInvited(client)) + { + server->sendToClient(client->getFd(), ERR_INVITEONLYCHAN(client, channelName)); + return; + } + + channel->addClient(client); + sendJoinSuccess(client, channel, server); + } +} + +void JoinHandler::sendJoinSuccess(Client *client, Channel *channel, Server *server) +{ + std::vector clients = channel->getClients(); + for (std::vector::iterator it = clients.begin(); it != clients.end(); ++it) + { + std::string joinMsg = ":" + client->getNickname() + " JOIN " + channel->getName() + "\r\n"; + server->sendToClient((*it)->getFd(), joinMsg); + } + + 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())); + } + else + { + server->sendToClient(client->getFd(), RPL_NOTOPIC(client, channel->getName())); + } + + 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) + { + if (channel->isOperator((*it))) + users += "@"; + users += (*it)->getNickname() + " "; + } + + std::ostringstream oss; + oss << RPL_NAMREPLY(clients[0], channel->getName(), users); + oss << RPL_ENDOFNAMES(clients[0], channel->getName()); + return oss.str(); +} +