mise a jour RPL 2805

This commit is contained in:
Ladebeze66 2024-05-29 13:28:55 +02:00
parent f5f5c2ed96
commit 80c82ede1f

View File

@ -6,7 +6,7 @@
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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<std::string, Channel *> &channels = server->getChannels();
Channel *channel;
std::map<std::string, Channel *> &channels = server->getChannels();
Channel *channel;
std::vector<std::string> lst = split(channelName, ",");
for (std::vector<std::string>::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<Client *> clients = channel->getClients();
for (std::vector<Client *>::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<Client *> clients = channel->getClients();
std::string users;
for (std::vector<Client *>::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<Client *> clients = channel->getClients();
std::string usersList = ":server 353 " + clients[0]->getNickname() + " = " + channel->getName() + " :";
for (std::vector<Client *>::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;
}