From da1f23c294d71489435153cb17017131fe3e5b1a Mon Sep 17 00:00:00 2001 From: Namonay Date: Tue, 30 Jan 2024 00:26:02 +0100 Subject: [PATCH] gg --- includes/client.hpp | 4 ++-- includes/server.hpp | 3 ++- srcs/channel.cpp | 6 +++--- srcs/client.cpp | 7 ++++++- srcs/server.cpp | 4 +++- srcs/server_functions.cpp | 37 ++++++++++++++++++++++++++----------- 6 files changed, 42 insertions(+), 19 deletions(-) diff --git a/includes/client.hpp b/includes/client.hpp index fa44512..c54ac72 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/29 22:57:10 by maldavid ### ########.fr */ +/* Updated: 2024/01/30 00:07:07 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -57,7 +57,7 @@ namespace irc void sendMsg(const std::string& sender, const std::string& cmd, const std::string& trailing); void sendModular(std::string message, ...); void sendCodeInChannel(const std::string& code, const class Channel &chan, const std::string& msg); - + void kill(const std::string& reason); inline void inviteToChannel(const std::string& channel) { _invites.insert(channel); } inline bool hasBeenInvitedTo(const std::string& channel) { return _invites.erase(channel); } diff --git a/includes/server.hpp b/includes/server.hpp index 05377e7..ebbaf2d 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/26 00:42:56 by vvaas ### ########.fr */ +/* Updated: 2024/01/30 00:24:49 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -62,6 +62,7 @@ namespace irc void handleTopic(unstd::SharedPtr client, const class Message& msg); void handlePing(unstd::SharedPtr client, const class Message& msg); void handleMode(unstd::SharedPtr client, const class Message& msg); + void handleRussian(unstd::SharedPtr client); class Channel* getChannelByName(const std::string& name); unstd::SharedPtr getClientByName(const std::string& name); diff --git a/srcs/channel.cpp b/srcs/channel.cpp index 44023f1..81f0b80 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/29 22:08:11 by vvaas ### ########.fr */ +/* Updated: 2024/01/29 23:47:14 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -127,7 +127,7 @@ namespace irc } void Channel::showModes(unstd::SharedPtr client) { - std::string modes = "+"; + std::string modes = " +"; if (_invite_only) modes += 'i'; @@ -137,7 +137,7 @@ namespace irc modes += 'k'; if (_channel_size != -1) modes += 'l'; - if (modes.size() < 2) + if (modes.size() <= 2) return ; client->sendCode(RPL_CHANNELMODEIS, modes); } diff --git a/srcs/client.cpp b/srcs/client.cpp index cc349b5..939ebae 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/29 23:27:33 by maldavid ### ########.fr */ +/* Updated: 2024/01/30 00:10:23 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -137,5 +137,10 @@ namespace irc return (std::string()); } + void Client::kill(const std::string& reason) + { + sendMsg("yipirc", "KILL", reason); + } + Client::~Client() {} } diff --git a/srcs/server.cpp b/srcs/server.cpp index 24796af..dc72d89 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/29 23:27:51 by maldavid ### ########.fr */ +/* Updated: 2024/01/30 00:17:49 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -163,6 +163,8 @@ namespace irc handlePing(client, msg); else if(msg.getCmd() == "MODE") handleMode(client, msg); + else if(msg.getCmd() == "imfeelinglucky") + handleRussian(client); return true; } diff --git a/srcs/server_functions.cpp b/srcs/server_functions.cpp index fc23415..13d0186 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/29 23:27:39 by maldavid ### ########.fr */ +/* Updated: 2024/01/30 00:25:13 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -23,6 +23,8 @@ #include #include #include +#include +#include namespace irc { @@ -44,7 +46,9 @@ namespace irc { if((*it)->getNickName() == nickname) { - client->sendCode(ERR_NICKCOLLISION, "Nickname is used"); + client->sendCode(ERR_NICKCOLLISION, nickname + " Nickname is used"); + client->kill("Nickname already used"); + client->requireDisconnect(); return; } } @@ -170,7 +174,7 @@ namespace irc logs::report(log_message, "channel '%s' has been created", msg.getTokens()[1].c_str()); return ; } - if(msg.getTokens().size() == 3 && msg.getTokens()[2] != it->getPassword()) + if((msg.getTokens().size() == 3 && msg.getTokens()[2] != it->getPassword()) || (msg.getTokens().size() == 2 && it->getPassword().size() > 0)) client->sendCode(ERR_BADCHANNELKEY, "Invalid password"); else if(it->getChannelSize() != -1 && it->getChannelSize() >= static_cast(it->getNumberOfClients())) client->sendCode(ERR_CHANNELISFULL, "Channel is full"); @@ -178,7 +182,7 @@ namespace irc client->sendCode(ERR_INVITEONLYCHAN, "channel is invite only and you have not been invited u looser"); else if(it->getPassword().size() == 0) it->addClient(client); - else if(it->getPassword().size() > 0 && msg.getTokens()[2] == it->getPassword()) + else if(msg.getTokens().size() == 3 && it->getPassword().size() > 0 && msg.getTokens()[2] == it->getPassword()) it->addClient(client); } @@ -299,28 +303,30 @@ namespace irc logs::report(log_error, "INVITE, invalid command '%s'", msg.getRawMsg().c_str()); return; } - + Channel* channel_target = getChannelByName(msg.getArgs()[1]); + if(channel_target == NULL) + { + client->sendCode(ERR_NOSUCHCHANNEL, "No such channel"); + return ; + } if(!isUserKnown(msg.getArgs()[0])) { - client->sendCode(ERR_NOSUCHNICK, const_cast(msg.getArgs()[0]) + " no such nick"); + client->sendCodeInChannel(ERR_NOSUCHNICK, *channel_target, "No such nick"); return; } if(!isChannelKnown(msg.getArgs()[1])) { - client->sendCode(ERR_NOSUCHCHANNEL, const_cast(msg.getArgs()[1]) + " no such channel"); + client->sendCodeInChannel(ERR_NOSUCHCHANNEL, *channel_target, "no such channel"); return; } - Channel* channel_target = getChannelByName(msg.getArgs()[1]); - if(channel_target == NULL) - logs::report(log_fatal_error, "(INVITE), cannot get channel '%s' by name; panic !", msg.getArgs()[1].c_str()); unstd::SharedPtr client_target = getClientByName(msg.getArgs()[0]); if(client_target.get() == NULL) logs::report(log_fatal_error, "(INVITE), cannot get client '%s' by name; panic !", msg.getArgs()[0].c_str()); if(!channel_target->hasClient(client)) { - client->sendCode(ERR_NOTONCHANNEL, msg.getArgs()[0], "you're not on that channel"); + logs::report(log_fatal_error, "(INVITE), cannot get channel '%s' by name; panic !", msg.getArgs()[1].c_str()); return; } @@ -488,4 +494,13 @@ namespace irc return ; chan->changeMode(client, msg); } + + void Server::handleRussian(unstd::SharedPtr client) + { + srand(time(NULL)); + + if (rand() % 6 == 0) + client->kill("Bye Bye Bye"); + } } +