From b9eada30365aa2fdc2a46080ce8ef24fd4624130 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Mon, 22 Jan 2024 16:12:28 +0100 Subject: [PATCH] vavaas --- includes/channel.hpp | 9 ++++++- srcs/server.cpp | 59 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/includes/channel.hpp b/includes/channel.hpp index 7cab443..bc3ee30 100644 --- a/includes/channel.hpp +++ b/includes/channel.hpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/21 10:34:25 by maldavid #+# #+# */ -/* Updated: 2024/01/22 14:41:25 by maldavid ### ########.fr */ +/* Updated: 2024/01/22 16:06:15 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,9 @@ #define __CHANNEL__ #include +#include +#include +#include namespace irc { @@ -23,10 +26,14 @@ namespace irc Channel(const std::string& name); inline const std::string& getName() const { return _name; } + inline void addClient(unstd::SharedPtr client) { _clients.insert(client); } + inline bool removeClient(unstd::SharedPtr client) { return _clients.erase(client); } + inline std::size_t getNumberOfClients() const { return _clients.size(); } ~Channel(); private: + std::set > _clients; const std::string _name; }; } diff --git a/srcs/server.cpp b/srcs/server.cpp index 194d24f..1849c74 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/22 14:54:21 by maldavid ### ########.fr */ +/* Updated: 2024/01/22 16:08:55 by maldavid ### ########.fr */ /* */ /******************************************************************************/ @@ -195,26 +195,75 @@ namespace irc void Server::handlePart(unstd::SharedPtr client, const Message& msg) { - (void)client; - (void)msg; + if(msg.getTokens().size() < 2 && msg.getTokens().size() > 3) + { + logs::report(log_error, "PART, invalid command '%s'", msg.getRawMsg().c_str()); + return; + } + if(msg.getTokens()[1][0] != '#' && msg.getTokens()[1][0] != '&') + { + logs::report(log_error, "PART, invalid channel name '%s'", msg.getTokens()[1].c_str()); + return; + } + + for(std::string::const_iterator it = msg.getTokens()[1].begin(); it != msg.getTokens()[1].end(); ++it) + { + if((it == msg.getTokens()[1].begin() || *(it - 1) == ',') && std::strchr("&#", *it) == NULL) + { + logs::report(log_error, "PART, invalid channel name '%s'", msg.getTokens()[1].c_str()); + return; + } + } + + std::vector::iterator chit; + for(chit = _channels.begin(); chit != _channels.end(); ++chit) + { + if(msg.getTokens()[1] == chit->getName()) + break; + } + if(chit == _channels.end()) + { + logs::report(log_error, "PART, channel not found '%s'", msg.getTokens()[1].c_str()); + return; + } + if(!chit->removeClient(client)) + { + logs::report(log_error, "PART, client was not in channel '%s'", msg.getTokens()[1].c_str()); + return; + } + 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()); } void Server::handleJoin(unstd::SharedPtr client, const Message& msg) { - if(msg.getTokens().size() > 3) + if(msg.getTokens().size() < 2 && msg.getTokens().size() > 3) { logs::report(log_error, "JOIN, invalid command '%s'", msg.getRawMsg().c_str()); return; } + if(msg.getTokens()[1][0] != '#' && msg.getTokens()[1][0] != '&') + { + logs::report(log_error, "JOIN, invalid channel name '%s'", msg.getTokens()[1].c_str()); + return; + } - std::vector::const_iterator it; + std::vector::iterator it; for(it = _channels.begin(); it != _channels.end(); ++it) { if(msg.getTokens()[1] == it->getName()) break; } if(it == _channels.end()) + { _channels.push_back(Channel(msg.getTokens()[1])); + logs::report(log_message, "channel '%s' has beed created", msg.getTokens()[1].c_str()); + _channels.back().addClient(client); + } + else + it->addClient(client); client->printUserHeader(); std::cout << "joining new channel, " << msg.getTokens()[1] << std::endl; }