diff --git a/includes/client.hpp b/includes/client.hpp index e739fd0..310555e 100644 --- a/includes/client.hpp +++ b/includes/client.hpp @@ -6,7 +6,7 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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; }; } diff --git a/includes/server.hpp b/includes/server.hpp index 3db9b85..5e51d4c 100644 --- a/includes/server.hpp +++ b/includes/server.hpp @@ -6,7 +6,7 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 client, const class Message& msg); void handleUser(unstd::SharedPtr client, const class Message& msg); + void handlePass(unstd::SharedPtr client, const class Message& msg); void handleQuit(unstd::SharedPtr client, const class Message& msg); void handlePart(unstd::SharedPtr client, const class Message& msg); void handleJoin(unstd::SharedPtr client, const class Message& msg); diff --git a/srcs/channel.cpp b/srcs/channel.cpp index e70aef2..5a2697a 100644 --- a/srcs/channel.cpp +++ b/srcs/channel.cpp @@ -6,7 +6,7 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 >::iterator it = _clients.begin(); it != _clients.end(); ++it) - { const_cast&>(*it)->sendMsg(client->getNickName(), "JOIN", _name); - logs::report(log_message, "%s has been sent a JOIN message", const_cast&>(*it)->getNickName().c_str()); - } } bool Channel::removeClient(unstd::SharedPtr client) @@ -52,9 +48,10 @@ namespace irc void Channel::setTopic(unstd::SharedPtr client, const std::string& new_topic) { - if(_topic_op_restrict && _operators.find(client) == _operators.end()) + 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; } diff --git a/srcs/client.cpp b/srcs/client.cpp index e26be1d..5caa343 100644 --- a/srcs/client.cpp +++ b/srcs/client.cpp @@ -6,7 +6,7 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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(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(out.length())) logs::report(log_error, "server failed to send a message from '%s' to '%s' (:sadge:)", sender.c_str(), _username.c_str()); } diff --git a/srcs/server.cpp b/srcs/server.cpp index 676cc0d..6342099 100644 --- a/srcs/server.cpp +++ b/srcs/server.cpp @@ -6,7 +6,7 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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; } diff --git a/srcs/server_functions.cpp b/srcs/server_functions.cpp index f6cd18a..bf5a002 100644 --- a/srcs/server_functions.cpp +++ b/srcs/server_functions.cpp @@ -6,7 +6,7 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 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 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 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,9 +206,27 @@ namespace irc logs::report(log_error, "TOPIC, invalid command '%s'", msg.getRawMsg().c_str()); return; } + 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::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 >::iterator it = _client.begin(); it != _client.end(); ++it) { - } }