From a604e930700a6e8e4b0ce0dad13c5a71c8cd40b3 Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Fri, 7 Jun 2024 15:32:58 +0200 Subject: [PATCH] modefin --- ft_irc3/includes/ModeHandler.hpp | 3 ++- ft_irc3/includes/RPL.hpp | 22 +++++++++++++++++---- ft_irc3/src/AdditionalCommands.cpp | 4 +++- ft_irc3/src/CommandHandler.cpp | 8 +++----- ft_irc3/src/InviteHandler.cpp | 6 +++--- ft_irc3/src/ModeHandler.cpp | 31 +++++++++++++++++------------- ft_irc3/src/Who.cpp | 3 ++- 7 files changed, 49 insertions(+), 28 deletions(-) diff --git a/ft_irc3/includes/ModeHandler.hpp b/ft_irc3/includes/ModeHandler.hpp index 593def9..56de04f 100644 --- a/ft_irc3/includes/ModeHandler.hpp +++ b/ft_irc3/includes/ModeHandler.hpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/30 11:12:57 by fgras-ca #+# #+# */ -/* Updated: 2024/06/04 14:00:47 by fgras-ca ### ########.fr */ +/* Updated: 2024/06/07 12:24:49 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -47,6 +47,7 @@ class ModeHandler void applyModeK(Client *client, Channel* channel, bool adding, const std::string& argument); void applyModeT(Channel* channel, bool adding); void applyModeO(Client *client, Channel* channel, bool adding, const std::string& argument); + bool needsArgument(char mode); }; #endif diff --git a/ft_irc3/includes/RPL.hpp b/ft_irc3/includes/RPL.hpp index 16c442b..4852695 100644 --- a/ft_irc3/includes/RPL.hpp +++ b/ft_irc3/includes/RPL.hpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/19 15:12:47 by fgras-ca #+# #+# */ -/* Updated: 2024/06/06 19:36:05 by fgras-ca ### ########.fr */ +/* Updated: 2024/06/07 14:00:45 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -106,6 +106,13 @@ inline std::string RPL_WHOISSERVER(Client *client, const std::string& targetNick return oss.str(); } +inline std::string RPL_WHOISOPERATOR(Client* client, const std::string& nick) +{ + std::ostringstream oss; + oss << ":" << SERVER_NAME << " 313 " << CLIENT_NICK(client) << " " << nick << " :is an IRC operator\r\n"; + return oss.str(); +} + inline std::string RPL_ENDOFWHO(Client *client, const std::string& channel) { std::ostringstream oss; @@ -183,10 +190,10 @@ inline std::string RPL_ENDOFINVITELIST(Client *client, const std::string& channe return oss.str(); } -inline std::string RPL_INVITING(Client* client, const std::string& channel) +inline std::string RPL_INVITING(Client* client, Client* clientTarget, const std::string& channel) { std::ostringstream oss; - oss << ":" << SERVER_NAME << " 341 " << CLIENT_NICK(client) << " " << CLIENT_NICK(client) << " " << channel << "\r\n"; + oss << ":" << SERVER_NAME << " 341 " << CLIENT_NICK(client) << " " << CLIENT_NICK(clientTarget) << " " << channel << "\r\n"; return oss.str(); } @@ -215,7 +222,7 @@ inline std::string RPL_WHOREPLY(const std::string& channel, Client* target) { std::ostringstream oss; oss << ":" << SERVER_NAME << " 352 " << CLIENT_NICK(target) << " " << channel << " " - << CLIENT_USER(target) << " " << CLIENT_HOST(target) << " " << SERVER_NAME << " " + << CLIENT_USER(target) << " " << CLIENT_HOST(target) << SERVER_NAME << " " << CLIENT_NICK(target) << " H :0 " << CLIENT_REALNAME(target) << "\r\n"; return oss.str(); } @@ -548,4 +555,11 @@ inline std::string BOTMESSAGE(Client *client, const std::string &channel, const return oss.str(); } +inline std::string MODELCHANGE(Client *client, std::string channel, const std::string& mode) +{ + std::ostringstream oss; + oss << SERVER_NAME <<":" << client->getNickname() << " MODE " << channel << " " << mode << " :" << "\r\n"; + return oss.str(); +} + #endif diff --git a/ft_irc3/src/AdditionalCommands.cpp b/ft_irc3/src/AdditionalCommands.cpp index 8e4f6ef..1b78c5a 100644 --- a/ft_irc3/src/AdditionalCommands.cpp +++ b/ft_irc3/src/AdditionalCommands.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/16 15:27:29 by fgras-ca #+# #+# */ -/* Updated: 2024/06/06 18:41:08 by fgras-ca ### ########.fr */ +/* Updated: 2024/06/07 11:34:13 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -107,6 +107,8 @@ void AdditionalCommands::handlePartCommand(Server *server, Client *client, const partMsg << ":" << client->getNickname() << " PART " << channelName << "\r\n"; server->sendToClient(client->getFd(), partMsg.str()); + channel->broadcast(partMsg.str(), client, server); + if (channel->isEmpty()) { delete channel; diff --git a/ft_irc3/src/CommandHandler.cpp b/ft_irc3/src/CommandHandler.cpp index ad1a3a4..e433aef 100644 --- a/ft_irc3/src/CommandHandler.cpp +++ b/ft_irc3/src/CommandHandler.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/15 18:26:34 by fgras-ca #+# #+# */ -/* Updated: 2024/06/05 09:57:55 by fgras-ca ### ########.fr */ +/* Updated: 2024/06/07 11:32:32 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -268,12 +268,10 @@ void CommandHandler::handlePingCommand(Client* client, const std::vectorsendToClient(client->getFd(), pongMessage); + std::string latence = tokens[1]; + _server->sendToClient(client->getFd(), RPL_PONG(latence)); } - void CommandHandler::handleQuitCommand(Client* client, const std::vector& tokens) { std::string reason = "Quit: "; diff --git a/ft_irc3/src/InviteHandler.cpp b/ft_irc3/src/InviteHandler.cpp index 2b66b05..c286334 100644 --- a/ft_irc3/src/InviteHandler.cpp +++ b/ft_irc3/src/InviteHandler.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/30 13:02:09 by fgras-ca #+# #+# */ -/* Updated: 2024/06/01 19:11:22 by fgras-ca ### ########.fr */ +/* Updated: 2024/06/07 11:44:34 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,7 +39,7 @@ void InviteHandler::handleInviteCommand(Client* client, const std::string& comma return; } - if (!channel->isOperator(client) && channel->isInviteOnly()) + if (!channel->isOperator(client)) { _server->sendToClient(client->getFd(), ERR_CHANOPRIVSNEEDED(client, channelName)); return; @@ -59,7 +59,7 @@ void InviteHandler::handleInviteCommand(Client* client, const std::string& comma } channel->addInvitedClient(targetClient); - _server->sendToClient(client->getFd(), RPL_INVITING(client, channel->getName())); + _server->sendToClient(client->getFd(), RPL_INVITING(client, targetClient, channel->getName())); std::ostringstream inviteMsg; inviteMsg << ":" << client->getNickname() << " INVITE " << nickname << " " << channelName << "\r\n"; diff --git a/ft_irc3/src/ModeHandler.cpp b/ft_irc3/src/ModeHandler.cpp index c28f350..70af0f5 100644 --- a/ft_irc3/src/ModeHandler.cpp +++ b/ft_irc3/src/ModeHandler.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/30 11:13:08 by fgras-ca #+# #+# */ -/* Updated: 2024/06/04 16:12:50 by fgras-ca ### ########.fr */ +/* Updated: 2024/06/07 14:10:23 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -104,24 +104,21 @@ void ModeHandler::handleChannelMode(Client* client, const std::vectorlog("Adding mode: " + std::string(1, mode), GREEN); - } else if (mode == '-') + } + else if (mode == '-') { adding = false; _server->log("Removing mode: " + std::string(1, mode), RED); - } else if (mode == 'b' || mode == 'l' || mode == 'i' || mode == 'k' || mode == 't' || mode == 'o') + } + else { std::string argument; - if (argIndex < tokens.size()) + if (needsArgument(mode) && argIndex < tokens.size()) { argument = tokens[argIndex++]; } setChannelMode(client, channel, std::string(1, mode), adding, argument); } - else - { - _server->sendToClient(client->getFd(), ERR_UNKNOWNMODE(client, mode, channelName)); - _server->log("Unknown mode: " + std::string(1, mode), RED); - } } } @@ -161,6 +158,7 @@ void ModeHandler::applyModeL(Client *client, Channel* channel, bool adding, cons } std::ostringstream oss; oss << limit; + _server->sendToClient(client->getFd(), MODELCHANGE(client, channel->getName(), argument)); _server->log("Applying mode L: Setting limit to " + oss.str(), GREEN); channel->setClientLimit(limit); } @@ -231,15 +229,17 @@ void ModeHandler::applyModeK(Client *client, Channel *channel, bool adding, cons void ModeHandler::applyModeT(Channel* channel, bool adding) { - std::string modeChange; - bool isAlreadySet; + std::string modeChange; + bool isAlreadySet; modeChange = adding ? "+t" : "-t"; - isAlreadySet = channel->isInviteOnly() == adding; + isAlreadySet = channel->getTopicProtection() == adding; if (!isAlreadySet) { _server->log("Applying mode T: " + std::string(adding ? "Setting topic protection" : "Removing topic protection"), GREEN); channel->setTopicProtection(adding); + // Inform the client and channel about the mode change + channel->broadcast(MODEACCEPTMESSAGE(NULL, channel->getName(), modeChange), NULL, _server); } } @@ -274,4 +274,9 @@ void ModeHandler::applyModeO(Client* client, Channel* channel, bool adding, cons std::string message = ":" + client->getNickname() + " MODE " + channel->getName() + " -o " + targetClient->getNickname() + "\r\n"; channel->broadcast(message, NULL, _server); } -} \ No newline at end of file +} + +bool ModeHandler::needsArgument(char mode) +{ + return mode == 'k' || mode == 'l' || mode == 'o'; +} diff --git a/ft_irc3/src/Who.cpp b/ft_irc3/src/Who.cpp index 34b22f6..f422767 100644 --- a/ft_irc3/src/Who.cpp +++ b/ft_irc3/src/Who.cpp @@ -6,7 +6,7 @@ /* By: fgras-ca +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/17 16:09:20 by fgras-ca #+# #+# */ -/* Updated: 2024/05/30 16:56:03 by fgras-ca ### ########.fr */ +/* Updated: 2024/06/07 13:43:54 by fgras-ca ### ########.fr */ /* */ /* ************************************************************************** */ @@ -68,4 +68,5 @@ void WhoHandler::handleWhoisCommand(Client *client, const std::string &command) _server->sendToClient(client->getFd(), RPL_WHOISUSER(client, targetClient)); _server->sendToClient(client->getFd(), RPL_WHOISSERVER(client, target, "IRC server info")); _server->sendToClient(client->getFd(), RPL_ENDOFWHOIS(client, target)); + _server->sendToClient(client->getFd(), RPL_WHOISOPERATOR(client, client->getNickname())); }