mirror of
https://github.com/Ladebeze66/ft_irc.git
synced 2025-12-17 06:28:03 +01:00
encoursjoinRPL
This commit is contained in:
parent
80c82ede1f
commit
b1b7b917af
@ -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()) {
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
std::map<std::string, Channel *> &channels = server->getChannels();
|
if (channelNames.empty()) {
|
||||||
Channel *channel;
|
server->sendToClient(client->getFd(), ERR_NEEDMOREPARAMS(client, "JOIN"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<std::string> lst = split(channelName, ",");
|
std::vector<std::string> channelList = split(channelNames, ",");
|
||||||
for (std::vector<std::string>::iterator itl = lst.begin(); itl != lst.end(); ++itl)
|
for (std::vector<std::string>::iterator it = channelList.begin(); it != channelList.end(); ++it)
|
||||||
{
|
{
|
||||||
std::cout << "hjoincmd .. " << (*itl) << std::endl;
|
const std::string &channelName = *it;
|
||||||
// ERR_TOOMANYCHANNELS (405)
|
if (channelName.empty()) continue;
|
||||||
// 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)
|
std::map<std::string, Channel *> &channels = server->getChannels();
|
||||||
{
|
Channel *channel;
|
||||||
//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.find(channelName) == channels.end()) {
|
||||||
{
|
channel = new Channel(channelName);
|
||||||
// if (channels[*itl]->isBanned(client))
|
channels[channelName] = channel;
|
||||||
// {
|
channel->addOperator(client); // Set client as operator for new channel
|
||||||
// // ERR_BANNEDFROMCHAN (474)
|
} else {
|
||||||
// server->sendToClient(client->getFd(), "ban from channel \r\n");
|
channel = channels[channelName];
|
||||||
// continue;
|
}
|
||||||
// }
|
|
||||||
channel = new Channel((*itl));
|
|
||||||
channels[(*itl)] = channel;
|
|
||||||
channel->addOperator(client);//set op
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
channel = channels[(*itl)];
|
|
||||||
}
|
|
||||||
|
|
||||||
channel->addClient(client);
|
if (channel->isBanned(client)) {
|
||||||
|
server->sendToClient(client->getFd(), ERR_BANNEDFROMCHAN(client, channelName));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<Client *> clients = channel->getClients();
|
if (channel->isFull()) {
|
||||||
for (std::vector<Client *>::iterator it = clients.begin(); it != clients.end(); ++it)
|
server->sendToClient(client->getFd(), ERR_CHANNELISFULL(client, channelName));
|
||||||
{
|
continue;
|
||||||
std::string cmd = ":" + client->getNickname() + " JOIN " + channel->getName() + "\r\n";
|
}
|
||||||
server->sendToClient((*it)->getFd(), cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string usersList = getUsersList(channel);
|
if (channel->isInviteOnly() && !channel->isInvited(client)) {
|
||||||
server->sendToClient(client->getFd(), usersList);
|
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::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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user