From 65557cc1c0fd26d37a6af0223e355c0bf54a2198 Mon Sep 17 00:00:00 2001 From: Namonay Date: Tue, 30 Jan 2024 17:15:10 +0100 Subject: [PATCH] bouffon --- .gitignore | 1 + includes/bot.hpp | 5 ++- includes/client.hpp | 5 ++- srcs/logs.cpp | 8 ++-- srcs/server.cpp | 82 +++++++++++++++++++-------------------- srcs/server_functions.cpp | 4 +- srcs_bonus/bot.cpp | 21 +++++++--- 7 files changed, 69 insertions(+), 57 deletions(-) diff --git a/.gitignore b/.gitignore index ee02f03..9d5f713 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ ircserv .vscode/ objs_bonus/ greg +ft_irc-tester/ diff --git a/includes/bot.hpp b/includes/bot.hpp index 2a3985c..999cabb 100644 --- a/includes/bot.hpp +++ b/includes/bot.hpp @@ -1,12 +1,12 @@ /******************************************************************************/ /* */ /* ::: :::::::: */ -/* Bot.hpp :+: :+: :+: */ +/* bot.hpp :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/30 01:54:36 by vvaas #+# #+# */ -/* Updated: 2024/01/30 02:39:52 by vvaas ### ########.fr */ +/* Updated: 2024/01/30 16:56:57 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -24,6 +24,7 @@ class bot bot(); void init(void); void connect_to_server(void); + void handle_response(std::string buffer); ~bot(); private : struct sockaddr_in _serv_addr; diff --git a/includes/client.hpp b/includes/client.hpp index 2ec8c99..92e0bd4 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/30 01:45:23 by vvaas ### ########.fr */ +/* Updated: 2024/01/30 17:06:21 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -17,6 +17,7 @@ #include #include #include +#include namespace irc { @@ -40,7 +41,7 @@ namespace irc inline void login() { _logged = true; } inline void register_user() { _registered = true; } - inline void welcome() { if (isLogged() && !isWelcomed()) return ; _welcomed = true; sendCode(RPL_WELCOME, "Welcome to yipirc :), " + _nickname); } + inline void welcome() { if (!isLogged() || isWelcomed() || _nickname.empty()) return ; _welcomed = true; sendCode(RPL_WELCOME, "Welcome to yipirc :), " + _nickname); } inline void requireDisconnect() { _disconnect_required = true; } inline bool isLogged() const { return _logged; } diff --git a/srcs/logs.cpp b/srcs/logs.cpp index 1f41c37..92fc845 100644 --- a/srcs/logs.cpp +++ b/srcs/logs.cpp @@ -1,14 +1,14 @@ -/* ************************************************************************** */ +/******************************************************************************/ /* */ /* ::: :::::::: */ /* logs.cpp :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: maldavid +#+ +:+ +#+ */ +/* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/21 09:17:47 by maldavid #+# #+# */ -/* Updated: 2024/01/30 00:38:44 by maldavid ### ########.fr */ +/* Updated: 2024/01/30 17:07:07 by vvaas ### ########.fr */ /* */ -/* ************************************************************************** */ +/******************************************************************************/ #include #include diff --git a/srcs/server.cpp b/srcs/server.cpp index 09231a4..5ae2cd2 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/30 02:41:02 by vvaas ### ########.fr */ +/* Updated: 2024/01/30 17:15:03 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -40,7 +40,7 @@ namespace irc _s_data.sin_addr.s_addr = INADDR_ANY; _s_data.sin_port = htons(_port); _main_socket = socket(AF_INET, SOCK_STREAM, 0); // AF_INET == IPv4, SOCK_STREAM == TCP - if(_main_socket < 0) + if (_main_socket < 0) logs::report(log_fatal_error, "socket error"); logs::report(log_message, "socket succesfully started"); } @@ -50,14 +50,14 @@ namespace irc 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 + if (setsockopt(_main_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) // SOL_SOCKET : modify socket only, SO_REUSEADDR : Reusable after program ends logs::report(log_fatal_error, "setsockopt() error (tout a pete)"); - if(bind(_main_socket, reinterpret_cast(&_s_data), sizeof(_s_data)) != 0) // Bind _main_socket to localhost + if (bind(_main_socket, reinterpret_cast(&_s_data), sizeof(_s_data)) != 0) // Bind _main_socket to localhost logs::report(log_fatal_error, "bind error"); logs::report(log_message, "bind successful, starting listen loop"); - if(listen(_main_socket, MAX_USERS) != 0) // init the listen with MAX_USERS + if (listen(_main_socket, MAX_USERS) != 0) // init the listen with MAX_USERS logs::report(log_fatal_error, "listen error"); logs::report(log_message, "listen queue created successfully"); @@ -68,27 +68,27 @@ namespace irc { char buffer[INPUT_SIZE] = { 0 }; ssize_t recv_size; - for(std::vector >::iterator it = _client.begin(); it != _client.end(); ++it) + for (std::vector >::iterator it = _client.begin(); it != _client.end(); ++it) { - if(!FD_ISSET((*it)->getFD(), &_fd_set)) + if (!FD_ISSET((*it)->getFD(), &_fd_set)) continue; - while((recv_size = recv((*it)->getFD(), buffer, INPUT_SIZE, 0)) > 0) // read() but for socket fd + while ((recv_size = recv((*it)->getFD(), buffer, INPUT_SIZE, 0)) > 0) // read() but for socket fd { (*it)->newMsgInFlight(buffer); #ifdef DEBUG logs::report(log_message,"processing '%s'", buffer); #endif - while(handleMessage(*it)); + while (handleMessage(*it)); std::memset(buffer, 0, sizeof(buffer)); // clear the buffer to avoid trash remaining } - if(recv_size == 0 || (*it)->disconnectRequired()) // recv return 0 if an user disconnect + if (recv_size == 0 || (*it)->disconnectRequired()) // recv return 0 if an user disconnect { logs::report(log_message, "User %d disconnected", (*it)->getID()); close((*it)->getFD()); - for(channel_it cit = _channels.begin(); cit != _channels.end();) + for (channel_it cit = _channels.begin(); cit != _channels.end();) { cit->removeClient(*it); - if(cit->getNumberOfClients() == 0) + if (cit->getNumberOfClients() == 0) { logs::report(log_message, "channel '%s' has been destroyed", cit->getName().c_str()); cit = _channels.erase(cit); @@ -113,20 +113,20 @@ namespace irc FD_ZERO(&_fd_set); FD_SET(_main_socket, &_fd_set); - for(std::vector >::iterator it = _client.begin(); it != _client.end(); ++it) + for (std::vector >::iterator it = _client.begin(); it != _client.end(); ++it) FD_SET((*it)->getFD(), &_fd_set); tmp = select(MAX_USERS, &_fd_set, NULL, NULL, NULL); // SELECT blocks till a connection or message is received, and let only those in _fd_set - if(tmp < 0 && _main_socket != NULL_SOCKET) + if (tmp < 0 && _main_socket != NULL_SOCKET) logs::report(log_fatal_error, "select fd error"); - if(FD_ISSET(_main_socket, &_fd_set)) // if it's a new connection + if (FD_ISSET(_main_socket, &_fd_set)) // if it's a new connection { sockaddr_in cli_sock; fd = accept(_main_socket, reinterpret_cast(&cli_sock), &len); // adds the new connection - if(fd < 0) + if (fd < 0) logs::report(log_fatal_error, "accept() error"); - if(fcntl(fd, F_SETFL, O_NONBLOCK) < 0) + if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) logs::report(log_fatal_error, "fcntl() error"); unstd::SharedPtr new_client(new Client(fd, cli_sock, i++)); @@ -140,50 +140,50 @@ namespace irc bool Server::handleMessage(unstd::SharedPtr client) { - if(client->getMsgInFlight().empty()) // if there are no commands just return + if (client->getMsgInFlight().empty()) // if there are no commands just return return false; const Message msg(client, client->getNextMsg()); - if(msg.getCmd() == "NICK") + if (msg.getCmd() == "NICK") handleNick(client, msg); - else if(msg.getCmd() == "USER") + else if (msg.getCmd() == "USER") handleUser(client, msg); else if (msg.getCmd() == "PASS") handlePass(client, msg); - else if(!client->isLogged()) + else if (!client->isLogged()) return true; - else if(msg.getCmd() == "QUIT") + else if (msg.getCmd() == "QUIT") handleQuit(client, msg); - else if(msg.getCmd() == "WHO") + else if (msg.getCmd() == "WHO") handleWho(client, msg); - else if(msg.getCmd() == "PART") + else if (msg.getCmd() == "PART") handlePart(client, msg); - else if(msg.getCmd() == "JOIN") + else if (msg.getCmd() == "JOIN") handleJoin(client, msg); - else if(msg.getCmd() == "INVITE") + else if (msg.getCmd() == "INVITE") handleInvite(client, msg); - else if(msg.getCmd() == "PRIVMSG") + else if (msg.getCmd() == "PRIVMSG") handlePrivMsg(client, msg); - else if(msg.getCmd() == "NOTICE") + else if (msg.getCmd() == "NOTICE") handleNotice(client, msg); - else if(msg.getCmd() == "KICK") + else if (msg.getCmd() == "KICK") handleKick(client, msg); - else if(msg.getCmd() == "TOPIC") + else if (msg.getCmd() == "TOPIC") handleTopic(client, msg); - else if(msg.getCmd() == "PING") + else if (msg.getCmd() == "PING") handlePing(client, msg); - else if(msg.getCmd() == "MODE") + else if (msg.getCmd() == "MODE") handleMode(client, msg); - else if(msg.getCmd() == "imfeelinglucky") + else if (msg.getCmd() == "imfeelinglucky") handleRussian(client); return true; } bool Server::isUserKnown(const std::string& user) const { - for(client_const_it it = _client.begin(); it < _client.end(); ++it) + for (client_const_it it = _client.begin(); it < _client.end(); ++it) { - if(const_cast&>(*it)->getNickName() == user) + if (const_cast&>(*it)->getNickName() == user) return true; } return false; @@ -191,9 +191,9 @@ namespace irc bool Server::isChannelKnown(const std::string& channel) const { - for(channel_const_it it = _channels.begin(); it < _channels.end(); ++it) + for (channel_const_it it = _channels.begin(); it < _channels.end(); ++it) { - if(it->getName() == channel) + if (it->getName() == channel) return true; } return false; @@ -201,9 +201,9 @@ namespace irc Channel* Server::getChannelByName(const std::string& name) { - for(channel_it it = _channels.begin(); it < _channels.end(); ++it) + for (channel_it it = _channels.begin(); it < _channels.end(); ++it) { - if(it->getName() == name) + if (it->getName() == name) return &*it; } return NULL; @@ -211,9 +211,9 @@ namespace irc unstd::SharedPtr Server::getClientByName(const std::string& name) { - for(client_it it = _client.begin(); it < _client.end(); ++it) + for (client_it it = _client.begin(); it < _client.end(); ++it) { - if((*it)->getNickName() == name) + if ((*it)->getNickName() == name) return *it; } return unstd::SharedPtr(NULL); diff --git a/srcs/server_functions.cpp b/srcs/server_functions.cpp index e121bb6..9db6ca1 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/30 02:32:17 by vvaas ### ########.fr */ +/* Updated: 2024/01/30 16:59:42 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -62,7 +62,6 @@ namespace irc client->setNewNickName(msg.getTokens()[1]); for (client_it it = _client.begin(); it != _client.end(); ++it) (*it)->sendMsg(oldNick, "NICK", msg.getTokens()[1]); - std::string welcome_msg = "Welcome to yipirc :), " + client->getNickName(); client->welcome(); std::cout << "new nickname, " << client->getNickName() << std::endl; } @@ -103,7 +102,6 @@ namespace irc void Server::handlePass(unstd::SharedPtr client, const Message& msg) { - std::string welcome_msg = "Welcome to yipirc :), " + client->getNickName(); if(client->isLogged()) return; if(msg.getTokens()[1] == _password) diff --git a/srcs_bonus/bot.cpp b/srcs_bonus/bot.cpp index bc72155..5e5b20f 100644 --- a/srcs_bonus/bot.cpp +++ b/srcs_bonus/bot.cpp @@ -6,7 +6,7 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/30 01:54:56 by vvaas #+# #+# */ -/* Updated: 2024/01/30 02:41:49 by vvaas ### ########.fr */ +/* Updated: 2024/01/30 17:07:02 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -14,7 +14,9 @@ #include #include #include -#include +#include +#include +#include bot::bot() {} @@ -33,6 +35,14 @@ void bot::init() _serv_addr.sin_addr.s_addr = inet_addr(IP); if (connect(_fd, (struct sockaddr*)&_serv_addr, sizeof(_serv_addr)) < 0) irc::logs::report(irc::log_fatal_error, "connect error"); + if(fcntl(_fd, F_SETFL, O_NONBLOCK) < 0) + irc::logs::report(irc::log_fatal_error, "fcntl() error"); +} + +void bot::handle_response(std::string buffer) +{ + if (buffer == ":yipirc 001 greg :Welcome to yipirc :), greg\r\n") + return ; } void bot::connect_to_server() @@ -42,10 +52,11 @@ void bot::connect_to_server() { if (send(_fd, (*it).c_str(), (*it).size(), 0) < 0) irc::logs::report(irc::log_fatal_error, "send error"); - } + } while (true) { - while (recv(_fd, buffer, 1024, 0) < 0) - std::cout << buffer << std::endl; + if (recv(_fd, buffer, 1024, 0) > 0) + handle_response(buffer); + std::memset(buffer, 0, sizeof(buffer)); } } \ No newline at end of file