encoursjoinRPL

This commit is contained in:
Ladebeze66 2024-05-29 16:21:06 +02:00
parent 80c82ede1f
commit b1b7b917af
3 changed files with 202 additions and 94 deletions

View File

@ -6,7 +6,7 @@
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */ /* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/16 15:27:29 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) if (channelClients[i] != client)
{ {
std::stringstream privMsg; 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()); server->sendToClient(channelClients[i]->getFd(), privMsg.str());
} }
} }
@ -158,7 +158,7 @@ void AdditionalCommands::handlePrivmsgCommand(Server *server, Client *client, co
if (targetClient) if (targetClient)
{ {
std::stringstream privMsg; 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()); server->sendToClient(targetClient->getFd(), privMsg.str());
if (targetClient->isAway()) { if (targetClient->isAway()) {

View File

@ -6,7 +6,7 @@
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */ /* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/15 18:26:34 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); _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<std::string>& tokens) void CommandHandler::handleCapCommand(Client* client, const std::vector<std::string>& tokens)

View File

@ -6,84 +6,192 @@
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */ /* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/21 19:51:31 by fgras-ca #+# #+# */ /* Created: 2024/05/21 19:51:31 by fgras-ca #+# #+# */
/* Updated: 2024/05/29 13:24:35 by fgras-ca ### ########.fr */ /* 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 &channelName, Server *server) #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<std::string> channelList = split(channelNames, ",");
for (std::vector<std::string>::iterator it = channelList.begin(); it != channelList.end(); ++it)
{
const std::string &channelName = *it;
if (channelName.empty()) continue;
std::map<std::string, Channel *> &channels = server->getChannels(); std::map<std::string, Channel *> &channels = server->getChannels();
Channel *channel; Channel *channel;
std::vector<std::string> lst = split(channelName, ","); if (channels.find(channelName) == channels.end()) {
for (std::vector<std::string>::iterator itl = lst.begin(); itl != lst.end(); ++itl) channel = new Channel(channelName);
{ channels[channelName] = channel;
std::cout << "hjoincmd .. " << (*itl) << std::endl; channel->addOperator(client); // Set client as operator for new channel
// ERR_TOOMANYCHANNELS (405) } else {
// ERR_NEEDMOREPARAMS (461)//? channel = channels[channelName];
// 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] != '&') if (channel->isBanned(client)) {
{ server->sendToClient(client->getFd(), ERR_BANNEDFROMCHAN(client, channelName));
// ERR_NOSUCHCHANNEL (403)
// ERR_BADCHANMASK (476)
server->sendToClient(client->getFd(), "bad name \r\n");
continue; continue;
} }
if (channels.find((*itl)) == channels.end()) if (channel->isFull()) {
{ server->sendToClient(client->getFd(), ERR_CHANNELISFULL(client, channelName));
// if (channels[*itl]->isBanned(client)) continue;
// {
// // 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
{ if (channel->isInviteOnly() && !channel->isInvited(client)) {
channel = channels[(*itl)]; server->sendToClient(client->getFd(), ERR_INVITEONLYCHAN(client, channelName));
continue;
} }
channel->addClient(client); channel->addClient(client);
sendJoinSuccess(client, channel, server);
}
}
std::vector<Client *> clients = channel->getClients(); void JoinHandler::sendJoinSuccess(Client *client, Channel *channel, Server *server)
for (std::vector<Client *>::iterator it = clients.begin(); it != clients.end(); ++it) {
{ std::string joinMessage = ":" + client->getNickname() + " JOIN " + channel->getName() + "\r\n";
std::string cmd = ":" + client->getNickname() + " JOIN " + channel->getName() + "\r\n"; channel->broadcast(joinMessage, client, server);
server->sendToClient((*it)->getFd(), cmd);
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); std::string usersList = getUsersList(channel);
server->sendToClient(client->getFd(), usersList); server->sendToClient(client->getFd(), usersList);
}
} }
std::string JoinHandler::getUsersList(Channel *channel) std::string JoinHandler::getUsersList(Channel *channel)
{ {
std::vector<Client *> clients = channel->getClients(); std::vector<Client *> clients = channel->getClients();
std::string usersList = ":server 353 " + clients[0]->getNickname() + " = " + channel->getName() + " :"; std::string users;
for (std::vector<Client *>::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<std::string, Channel *> &channels = server->getChannels();
Channel *channel;
std::vector<std::string> lst = split(channelNames, ",");
for (std::vector<std::string>::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<Client *> clients = channel->getClients();
for (std::vector<Client *>::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<Client *> clients = channel->getClients();
std::string users;
for (std::vector<Client *>::iterator it = clients.begin(); it != clients.end(); ++it) for (std::vector<Client *>::iterator it = clients.begin(); it != clients.end(); ++it)
{ {
if (channel->isOperator((*it))) if (channel->isOperator((*it)))
usersList += "@"; users += "@";
usersList += (*it)->getNickname() + " "; users += (*it)->getNickname() + " ";
} }
usersList += "\r\n:server 366 " + clients[0]->getNickname() + " " + channel->getName() + " :End of /NAMES list.\r\n";
return usersList; std::ostringstream oss;
oss << RPL_NAMREPLY(clients[0], channel->getName(), users);
oss << RPL_ENDOFNAMES(clients[0], channel->getName());
return oss.str();
} }