diff --git a/includes/Bot.hpp b/includes/Bot.hpp index c3b2337..8116947 100644 --- a/includes/Bot.hpp +++ b/includes/Bot.hpp @@ -6,14 +6,10 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/30 01:54:36 by vvaas #+# #+# */ -/* Updated: 2024/02/06 11:52:46 by vvaas ### ########.fr */ +/* Updated: 2024/02/07 16:57:53 by maldavid ### ########.fr */ /* */ /******************************************************************************/ -#define IP "127.0.0.1" -#define PORT 6667 -#define PASSWORD "passwordIRC" - #include #include #include @@ -22,15 +18,18 @@ class Bot { public: Bot(); + bool init(const std::string &ip, const std::string &port, const std::string &password); void connect_to_server(void); void handle_response(std::string buffer); void send_message(const std::string &content); + ~Bot(); + private : - bool _channel_created; - bool _logged; + std::vector _connect_commands; struct sockaddr_in _serv_addr; int _fd; - std::vector _connect_commands; -}; \ No newline at end of file + bool _channel_created; + bool _logged; +}; diff --git a/includes/logs.hpp b/includes/logs.hpp index c525d48..a03bcfb 100644 --- a/includes/logs.hpp +++ b/includes/logs.hpp @@ -6,7 +6,7 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/21 09:15:24 by maldavid #+# #+# */ -/* Updated: 2024/02/06 12:35:38 by vvaas ### ########.fr */ +/* Updated: 2024/02/07 16:52:54 by maldavid ### ########.fr */ /* */ /******************************************************************************/ @@ -21,8 +21,7 @@ namespace irc { log_message = 0, log_warning, - log_error, - log_fatal_error + log_error }; namespace logs diff --git a/includes/server.hpp b/includes/server.hpp index a0191cc..9977739 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/02/06 12:35:48 by vvaas ### ########.fr */ +/* Updated: 2024/02/07 16:50:54 by maldavid ### ########.fr */ /* */ /******************************************************************************/ @@ -40,6 +40,7 @@ namespace irc inline const std::string &getRunDate(void) const { return _run_date; }; inline size_t getClientCount(void) const { return _client.size(); }; inline size_t getChannelCount(void) const { return _channels.size(); }; + inline bool hasFailedInit() const { return _init_failed; } ~Server(); @@ -87,6 +88,7 @@ namespace irc int _port; int _main_socket; bool _active; + bool _init_failed; }; } diff --git a/srcs/logs.cpp b/srcs/logs.cpp index 92fc845..8800a65 100644 --- a/srcs/logs.cpp +++ b/srcs/logs.cpp @@ -6,14 +6,13 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/21 09:17:47 by maldavid #+# #+# */ -/* Updated: 2024/01/30 17:07:07 by vvaas ### ########.fr */ +/* Updated: 2024/02/07 16:53:18 by maldavid ### ########.fr */ /* */ /******************************************************************************/ #include #include #include -#include #include #include @@ -35,10 +34,8 @@ namespace irc case log_message: std::cout << AnsiColor::blue << "[IRC serv] Message : " << AnsiColor::reset << buffer << std::endl; break; case log_warning: std::cout << AnsiColor::magenta << "[IRC serv] Warning : " << AnsiColor::reset << buffer << std::endl; break; case log_error: std::cerr << AnsiColor::red << "[IRC serv] Error : " << AnsiColor::reset << buffer << std::endl; break; - case log_fatal_error: - std::cerr << AnsiColor::red << "[IRC serv] Fatal Error : " << AnsiColor::reset << buffer << std::endl; - std::exit(EXIT_FAILURE); - break; + + default: break; } } } diff --git a/srcs/main.cpp b/srcs/main.cpp index 9bc7c31..394a787 100644 --- a/srcs/main.cpp +++ b/srcs/main.cpp @@ -6,7 +6,7 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/20 09:27:04 by maldavid #+# #+# */ -/* Updated: 2024/02/06 12:35:38 by vvaas ### ########.fr */ +/* Updated: 2024/02/07 16:50:24 by maldavid ### ########.fr */ /* */ /******************************************************************************/ @@ -38,14 +38,22 @@ int main(int ac, char** av) return 0; } if(av[1] == NULL || av[2] == NULL) - irc::logs::report(irc::log_fatal_error, "invalid argv, argv[1] or argv[2] is NULL (wtf)"); + { + irc::logs::report(irc::log_error, "invalid argv, argv[1] or argv[2] is NULL (wtf)"); + return 1; + } char* end; int port = std::strtol(av[1], &end, 10); if(errno == ERANGE || *end != 0 || port <= 0 || port > 0xFFFF || std::strlen(av[1]) == 0) - irc::logs::report(irc::log_fatal_error, "invalid port"); + { + irc::logs::report(irc::log_error, "invalid port"); + return 1; + } irc::Server serv(port, av[2]); + if(serv.hasFailedInit()) + return 1; serv_ptr = &serv; signal(SIGINT, signalsHandler); signal(SIGQUIT, signalsHandler); diff --git a/srcs/server.cpp b/srcs/server.cpp index a7cdf0a..fc2c921 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/02/06 12:36:19 by vvaas ### ########.fr */ +/* Updated: 2024/02/07 16:52:35 by maldavid ### ########.fr */ /* */ /******************************************************************************/ @@ -31,6 +31,7 @@ namespace irc Server::Server(int port, const std::string& password) : _s_len(sizeof(_s_data)), _password(password), _port(port), _main_socket(NULL_SOCKET), _active(true) { + _init_failed = false; time_t ltime = time(NULL); struct tm tstruct = *localtime(<ime); char buf[100]; @@ -53,7 +54,11 @@ namespace irc _s_data.sin_port = htons(_port); _main_socket = socket(AF_INET, SOCK_STREAM, 0); // AF_INET == IPv4, SOCK_STREAM == TCP if(_main_socket < 0) - logs::report(log_fatal_error, "socket error"); + { + logs::report(log_error, "socket error"); + _init_failed = true; + return; + } logs::report(log_message, "socket succesfully started"); } @@ -63,14 +68,26 @@ namespace irc initSocketData(); 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)"); + { + logs::report(log_error, "setsockopt() error (tout a pete)"); + _init_failed = true; + return; + } 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_error, "bind error"); + _init_failed = true; + return; + } logs::report(log_message, "bind successful, starting listen loop"); if(listen(_main_socket, MAX_USERS) != 0) // init the listen with MAX_USERS - logs::report(log_fatal_error, "listen error"); + { + logs::report(log_error, "listen error"); + _init_failed = true; + return; + } logs::report(log_message, "listen queue created successfully"); logs::report(log_message, "server is up and running"); @@ -133,16 +150,25 @@ namespace irc 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) - logs::report(log_fatal_error, "select fd error"); + { + logs::report(log_error, "select fd error"); + return; + } if(FD_ISSET(_main_socket, &_fd_set)) // ifit's a new connection { sockaddr_in cli_sock; fd = accept(_main_socket, reinterpret_cast(&cli_sock), &len); // adds the new connection if(fd < 0) - logs::report(log_fatal_error, "accept() error"); + { + logs::report(log_error, "accept() error"); + return; + } if(fcntl(fd, F_SETFL, O_NONBLOCK) < 0) - logs::report(log_fatal_error, "fcntl() error"); + { + logs::report(log_error, "fcntl() error"); + return; + } unstd::SharedPtr new_client(new Client(fd, cli_sock, i++)); _client.push_back(new_client); // put the client into the vector used in handle_input diff --git a/srcs/server_functions.cpp b/srcs/server_functions.cpp index f07ce39..cbc6651 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/02/06 13:10:44 by vvaas ### ########.fr */ +/* Updated: 2024/02/07 16:45:33 by maldavid ### ########.fr */ /* */ /******************************************************************************/ @@ -146,7 +146,10 @@ namespace irc } Channel* channel = getChannelByName(msg.getArgs()[0]); if(channel == NULL) - logs::report(log_fatal_error, "(KICK), cannot get channel '%s' by name; panic !", channel->getName().c_str()); + { + logs::report(log_error, "(KICK), cannot get channel '%s' by name; panic !", channel->getName().c_str()); + return; + } if(!channel->removeClient(client, (msg.getReason().empty() ? "" : msg.getReason()))) { client->sendCode(ERR_NOTONCHANNEL, "PART : Not on channel"); @@ -337,15 +340,21 @@ namespace irc 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()); + { + logs::report(log_error, "(INVITE), cannot get channel '%s' by name; panic !", msg.getArgs()[1].c_str()); + return; + } 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()); + { + logs::report(log_error, "(INVITE), cannot get client '%s' by name; panic !", msg.getArgs()[0].c_str()); + return; + } if(!channel_target->hasClient(client)) { - logs::report(log_fatal_error, "(INVITE), cannot get channel '%s' by name; panic !", msg.getArgs()[1].c_str()); + logs::report(log_error, "(INVITE), cannot get channel '%s' by name; panic !", msg.getArgs()[1].c_str()); return; } @@ -403,10 +412,16 @@ namespace irc Channel* channel_target = getChannelByName(*channel); if(channel_target == NULL) - logs::report(log_fatal_error, "(KICK), cannot get channel '%s' by name; panic !", channel->c_str()); + { + logs::report(log_error, "(KICK), cannot get channel '%s' by name; panic !", channel->c_str()); + return; + } unstd::SharedPtr client_target = getClientByName(*user); if(client_target.get() == NULL) - logs::report(log_fatal_error, "(KICK), cannot get client '%s' by name; panic !", user->c_str()); + { + logs::report(log_error, "(KICK), cannot get client '%s' by name; panic !", user->c_str()); + return; + } if(!channel_target->kick(client, client_target, msg.getReason())) continue; @@ -454,7 +469,10 @@ namespace irc } Channel* channel = getChannelByName(msg.getArgs()[0]); if(channel == NULL) - logs::report(log_fatal_error, "(TOPIC), cannot get channel '%s' by name; panic !", channel->getName().c_str()); + { + logs::report(log_error, "(TOPIC), cannot get channel '%s' by name; panic !", channel->getName().c_str()); + return; + } if(!channel->hasClient(client)) { client->sendCode(ERR_NOTONCHANNEL, msg.getArgs()[0] + " you're not on that channel"); diff --git a/srcs_bonus/bot.cpp b/srcs_bonus/bot.cpp index a6cdc33..7b962cd 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/02/06 12:36:19 by vvaas ### ########.fr */ +/* Updated: 2024/02/07 16:41:47 by maldavid ### ########.fr */ /* */ /******************************************************************************/ @@ -23,7 +23,7 @@ bool active = true; -Bot::Bot() : _channel_created(false), _logged(false), _fd(-1) +Bot::Bot() : _fd(-1), _channel_created(false), _logged(false) {} Bot::~Bot() @@ -43,41 +43,53 @@ void signalsHandler(int foo) bool Bot::init(const std::string &ip, const std::string &port, const std::string &password) { if(ip.empty() || port.empty() || password.empty()) - irc::logs::report(irc::log_fatal_error, "An argument is empty"); + { + irc::logs::report(irc::log_error, "An argument is empty"); + return false; + } char* end; int portval = std::strtol(port.c_str(), &end, 10); if(errno == ERANGE || *end != 0 || portval < 0 || portval > 0xFFFF) - irc::logs::report(irc::log_fatal_error, "invalid port"); + { + irc::logs::report(irc::log_error, "invalid port"); + return false; + } _connect_commands.push_back("PASS " + password + "\r\n"); _connect_commands.push_back("NICK greg\r\n"); _connect_commands.push_back("USER greg_Bot 0 * :Botrealname\r\n"); _connect_commands.push_back("JOIN #greg\r\n"); _fd = socket(AF_INET, SOCK_STREAM, 0); if(_fd == -1) - irc::logs::report(irc::log_fatal_error, "FD error"); + { + irc::logs::report(irc::log_error, "FD error"); + return false; + } _serv_addr.sin_family = AF_INET; _serv_addr.sin_port = htons(portval); _serv_addr.sin_addr.s_addr = inet_addr(ip.c_str()); if(connect(_fd, (struct sockaddr*)&_serv_addr, sizeof(_serv_addr)) < 0) { irc::logs::report(irc::log_error, "connect error"); - return (false); + return false; } if(fcntl(_fd, F_SETFL, O_NONBLOCK) < 0) { irc::logs::report(irc::log_error, "fcntl error"); - return (false); + return false; } signal(SIGINT, signalsHandler); signal(SIGQUIT, signalsHandler); - return (true); + return true; } void Bot::send_message(const std::string &content) { if(send(_fd, content.c_str(), content.length(), 0) < 0) - irc::logs::report(irc::log_fatal_error, "send error"); + { + irc::logs::report(irc::log_error, "send error"); + active = false; + } } void Bot::handle_response(std::string buffer) @@ -99,7 +111,7 @@ void Bot::handle_response(std::string buffer) if(buffer.find("KICK #greg greg :") != std::string::npos || buffer.find("explose") != std::string::npos) { send_message("QUIT: Explose\r\n"); - std::exit(0); + active = false; } if(buffer.find("quoi") != std::string::npos) send_message("PRIVMSG #greg :feur\r\n"); @@ -111,10 +123,13 @@ void Bot::connect_to_server() for(std::vector::iterator it = _connect_commands.begin(); it != _connect_commands.end(); ++it) { if(send(_fd, (*it).c_str(), (*it).size(), 0) < 0) - irc::logs::report(irc::log_fatal_error, "send error"); + { + irc::logs::report(irc::log_error, "send error"); + return; + } if(recv(_fd, buffer, 1024, 0) > 0) handle_response(buffer); - } + } while(active) { if(recv(_fd, buffer, 1024, 0) > 0) diff --git a/srcs_bonus/logs.cpp b/srcs_bonus/logs.cpp index 076fc86..18bceee 100644 --- a/srcs_bonus/logs.cpp +++ b/srcs_bonus/logs.cpp @@ -6,14 +6,13 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/21 09:17:47 by maldavid #+# #+# */ -/* Updated: 2024/01/22 09:46:54 by maldavid ### ########.fr */ +/* Updated: 2024/02/07 16:53:53 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ #include #include #include -#include #include #include @@ -35,10 +34,8 @@ namespace irc case log_message: std::cout << AnsiColor::blue << "[IRC serv] Message : " << AnsiColor::reset << buffer << std::endl; break; case log_warning: std::cout << AnsiColor::magenta << "[IRC serv] Warning : " << AnsiColor::reset << buffer << std::endl; break; case log_error: std::cerr << AnsiColor::red << "[IRC serv] Error : " << AnsiColor::reset << buffer << std::endl; break; - case log_fatal_error: - std::cerr << AnsiColor::red << "[IRC serv] Fatal Error : " << AnsiColor::reset << buffer << std::endl; - std::exit(EXIT_FAILURE); - break; + + default: break; } } } diff --git a/srcs_bonus/main.cpp b/srcs_bonus/main.cpp index fff1d7b..dbdf411 100644 --- a/srcs_bonus/main.cpp +++ b/srcs_bonus/main.cpp @@ -6,7 +6,7 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/29 20:36:23 by vvaas #+# #+# */ -/* Updated: 2024/02/06 12:35:38 by vvaas ### ########.fr */ +/* Updated: 2024/02/07 16:34:12 by maldavid ### ########.fr */ /* */ /******************************************************************************/ @@ -16,7 +16,10 @@ int main(int argc, char **argv) { if(argc != 4) - irc::logs::report(irc::log_fatal_error, "./greg "); + { + irc::logs::report(irc::log_error, "./greg "); + return 1; + } Bot greg; if(!greg.init(argv[1], argv[2], argv[3]))