This commit is contained in:
2024-01-24 00:23:33 +01:00
parent a997c7413f
commit 1cf52ef8b0
6 changed files with 65 additions and 22 deletions

View File

@@ -6,7 +6,7 @@
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/21 10:33:17 by maldavid #+# #+# */
/* Updated: 2024/01/23 10:30:27 by maldavid ### ########.fr */
/* Updated: 2024/01/24 00:11:46 by vvaas ### ########.fr */
/* */
/******************************************************************************/
@@ -27,6 +27,8 @@ namespace irc
inline int getFD() const { return _fd; }
inline int getID() const { return _id; }
inline int getLogged() const { return _logged; }
inline int getDisconnect() const { return _to_disconnect; }
inline sockaddr_in getSockAddr() const { return _s_data; }
inline const std::string& getMsgInFlight() const { return _msg_in_flight; }
@@ -35,6 +37,8 @@ namespace irc
inline void setNewNickName(const std::string& name) { _nickname = name; }
inline void setNewUserName(const std::string& name) { _username = name; }
inline void setNewRealName(const std::string& name) { _realname = name; }
inline void setLogged(void) { _logged = true; }
inline void setDisconnect(void) { _to_disconnect = true; }
inline const std::string& getNickName() const { return _nickname; }
inline const std::string& getUserName() const { return _username; }
@@ -57,6 +61,8 @@ namespace irc
sockaddr_in _s_data;
int _fd;
int _id;
bool _logged;
bool _to_disconnect;
};
}

View File

@@ -6,7 +6,7 @@
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/21 09:12:28 by maldavid #+# #+# */
/* Updated: 2024/01/23 17:07:50 by vvaas ### ########.fr */
/* Updated: 2024/01/23 23:29:00 by vvaas ### ########.fr */
/* */
/******************************************************************************/
@@ -50,6 +50,7 @@ namespace irc
// ugly as f*ck
void handleNick(unstd::SharedPtr<class Client> client, const class Message& msg);
void handleUser(unstd::SharedPtr<class Client> client, const class Message& msg);
void handlePass(unstd::SharedPtr<class Client> client, const class Message& msg);
void handleQuit(unstd::SharedPtr<class Client> client, const class Message& msg);
void handlePart(unstd::SharedPtr<class Client> client, const class Message& msg);
void handleJoin(unstd::SharedPtr<class Client> client, const class Message& msg);

View File

@@ -6,7 +6,7 @@
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/21 10:36:21 by maldavid #+# #+# */
/* Updated: 2024/01/23 17:43:02 by vvaas ### ########.fr */
/* Updated: 2024/01/23 23:55:17 by vvaas ### ########.fr */
/* */
/******************************************************************************/
@@ -23,15 +23,11 @@ namespace irc
{
if (!_clients.insert(client).second)
{
logs::report(log_message, "%s is already is channel for", client->getNickName().c_str());
client->sendCode(ERR_USERONCHANNEL, "You are already in the channel");
return ;
}
for(std::set<unstd::SharedPtr<Client> >::iterator it = _clients.begin(); it != _clients.end(); ++it)
{
const_cast<unstd::SharedPtr<irc::Client>&>(*it)->sendMsg(client->getNickName(), "JOIN", _name);
logs::report(log_message, "%s has been sent a JOIN message", const_cast<unstd::SharedPtr<irc::Client>&>(*it)->getNickName().c_str());
}
}
bool Channel::removeClient(unstd::SharedPtr<Client> client)
@@ -54,7 +50,8 @@ namespace irc
{
if(_topic_op_restrict && _operators.find(client) == _operators.end() )
{
// send error code to user
client->sendCode(ERR_CHANOPRIVSNEEDED, "You need operator privileges");
return ;
}
_topic = new_topic;
}

View File

@@ -6,7 +6,7 @@
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/21 10:35:52 by maldavid #+# #+# */
/* Updated: 2024/01/23 12:38:15 by maldavid ### ########.fr */
/* Updated: 2024/01/24 00:07:56 by vvaas ### ########.fr */
/* */
/******************************************************************************/
@@ -18,11 +18,12 @@
namespace irc
{
Client::Client(int fd, sockaddr_in sock, int id) : _s_data(sock), _fd(fd), _id(id) {}
Client::Client(int fd, sockaddr_in sock, int id) : _s_data(sock), _fd(fd), _id(id), _logged(false) {}
void Client::sendCode(const std::string& code, const std::string& msg)
{
const std::string command = code + " :" + msg;
logs::report(log_message, "C<-%s", command.c_str());
if(send(_fd, command.c_str(), command.size(), 0) != static_cast<ssize_t>(command.length()))
logs::report(log_error, "server failed to send a code to '%s' (:sadge:)", _username.c_str());
}
@@ -30,6 +31,7 @@ namespace irc
void Client::sendMsg(const std::string& sender, const std::string& cmd, const std::string& trailing)
{
const std::string out = ':' + sender + ' ' + cmd + " :" + trailing + "\r\n";
logs::report(log_message,"<- S %s", out.c_str());
if(send(_fd, out.c_str(), out.length(), 0) != static_cast<ssize_t>(out.length()))
logs::report(log_error, "server failed to send a message from '%s' to '%s' (:sadge:)", sender.c_str(), _username.c_str());
}

View File

@@ -6,7 +6,7 @@
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/21 09:31:17 by maldavid #+# #+# */
/* Updated: 2024/01/23 17:10:38 by vvaas ### ########.fr */
/* Updated: 2024/01/24 00:16:34 by vvaas ### ########.fr */
/* */
/******************************************************************************/
@@ -41,7 +41,7 @@ namespace irc
void Server::initSocket()
{
int opt = 0;
int opt = 1;
initSocketData();
if(setsockopt(_main_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) // SOL_SOCKET : modify socket only, SO_REUSEADDR : Reusable after program ends
@@ -75,9 +75,10 @@ namespace irc
std::memset(buffer, 0, sizeof(buffer)); // clear the buffer to avoid trash remaining
}
if(recv((*it)->getFD(), buffer, INPUT_SIZE, 0) == 0) // recv return 0 if an user disconnect
if(recv((*it)->getFD(), buffer, INPUT_SIZE, 0) == 0 || (*it)->getDisconnect()) // recv return 0 if an user disconnect
{
logs::report(log_message, "User %d disconnected", (*it)->getID());
close((*it)->getFD());
it = _client.erase(it) - 1;
}
}
@@ -126,14 +127,17 @@ namespace irc
return false;
const Message msg(client, client->getNextMsg());
if(msg.getCmd() == "NICK")
handleNick(client, msg);
else if(msg.getCmd() == "USER")
handleUser(client, msg);
else if (msg.getCmd() == "PASS")
handlePass(client, msg);
else if (!client->getLogged())
return true;
else if(msg.getCmd() == "QUIT")
handleQuit(client, msg);
else if(msg.getCmd() == "PART")
else if(msg.getCmd() == "PART") // Not mandatory ?
handlePart(client, msg);
else if(msg.getCmd() == "JOIN")
handleJoin(client, msg);
@@ -151,7 +155,6 @@ namespace irc
handlePing(client, msg);
else if(msg.getCmd() == "MODE")
handleMode(client, msg);
return true;
}

View File

@@ -6,7 +6,7 @@
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/22 17:31:06 by maldavid #+# #+# */
/* Updated: 2024/01/23 12:33:34 by maldavid ### ########.fr */
/* Updated: 2024/01/24 00:23:29 by vvaas ### ########.fr */
/* */
/******************************************************************************/
@@ -40,9 +40,10 @@ namespace irc
return;
}
}
std::string oldNick = (client->getNickName().size() > 0) ? client->getNickName() : msg.getTokens()[1]; // get nickname before /nick execution inside server (oldNick)
client->printUserHeader();
client->setNewNickName(msg.getTokens()[1]);
client->sendMsg(oldNick, "NICK", msg.getTokens()[1]);
std::cout << "new nickname, " << client->getNickName() << std::endl;
}
@@ -61,7 +62,22 @@ namespace irc
client->setNewRealName(msg.getTokens()[4]);
std::cout << "new realname, " << client->getRealName() << std::endl;
}
void Server::handlePass(unstd::SharedPtr<class Client> client, const Message& msg)
{
if (client->getLogged())
return ;
if (msg.getTokens()[1] == _password)
{
client->setLogged();
client->sendCode(RPL_WELCOME, "Welcome :)\n");
}
else
{
client->sendCode(ERR_PASSWDMISMATCH);
client->setDisconnect();
}
}
void Server::handleQuit(unstd::SharedPtr<class Client> client, const Message& msg)
{
(void)msg;
@@ -112,7 +128,7 @@ namespace irc
client->printUserHeader();
std::cout << "leaving channel, " << msg.getTokens()[1] << std::endl;
if(chit->getNumberOfClients() == 0)
logs::report(log_message, "channel '%s' has beed destroyed", chit->getName().c_str());
logs::report(log_message, "channel '%s' has been destroyed", chit->getName().c_str());
}
void Server::handleJoin(unstd::SharedPtr<class Client> client, const Message& msg)
@@ -138,7 +154,7 @@ namespace irc
{
_channels.push_back(Channel(msg.getTokens()[1]));
_channels.back().addClient(client);
logs::report(log_message, "channel '%s' has beed created", msg.getTokens()[1].c_str());
logs::report(log_message, "channel '%s' has been created", msg.getTokens()[1].c_str());
}
else
it->addClient(client);
@@ -190,11 +206,29 @@ namespace irc
logs::report(log_error, "TOPIC, invalid command '%s'", msg.getRawMsg().c_str());
return;
}
for(std::vector<unstd::SharedPtr<Client> >::iterator it = _client.begin(); it != _client.end(); ++it)
if(msg.getTokens()[1][0] != '#' && msg.getTokens()[1][0] != '&')
{
logs::report(log_error, "TOPIC, invalid channel name '%s'", msg.getTokens()[1].c_str());
return;
}
std::vector<Channel>::iterator it;
for(it = _channels.begin(); it != _channels.end(); ++it)
{
if(msg.getTokens()[1] == it->getName())
{
}
}
if(it == _channels.end())
{
_channels.push_back(Channel(msg.getTokens()[1]));
_channels.back().addClient(client);
logs::report(log_message, "channel '%s' has been created", msg.getTokens()[1].c_str());
}
for(std::vector<unstd::SharedPtr<Client> >::iterator it = _client.begin(); it != _client.end(); ++it)
{
}
}
void Server::handlePing(unstd::SharedPtr<class Client> client, const Message& msg)
{