From bbbc4dac16dfc158d8e218197235af62fab67d1b Mon Sep 17 00:00:00 2001 From: Namonay Date: Tue, 30 Jan 2024 02:40:37 +0100 Subject: [PATCH] bot --- .gitignore | 3 ++- Makefile | 32 ++++++++++++++++++++--- includes/bot.hpp | 32 +++++++++++++++++++++++ includes/client.hpp | 9 ++++++- includes/config.hpp | 10 ++++---- srcs/client.cpp | 4 +-- srcs/server.cpp | 2 +- srcs/server_functions.cpp | 40 ++++++++++++++++++++++------- srcs_bonus/ansi.cpp | 19 ++++++++++++++ srcs_bonus/bot.cpp | 54 +++++++++++++++++++++++++++++++++++++++ srcs_bonus/logs.cpp | 45 ++++++++++++++++++++++++++++++++ srcs_bonus/main.cpp | 22 +++++----------- 12 files changed, 233 insertions(+), 39 deletions(-) create mode 100644 includes/bot.hpp create mode 100644 srcs_bonus/ansi.cpp create mode 100644 srcs_bonus/bot.cpp create mode 100644 srcs_bonus/logs.cpp diff --git a/.gitignore b/.gitignore index d351af9..56296a1 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,5 @@ .cache/ objs/ ircserv -.vscode/ \ No newline at end of file +.vscode/ +objs_bonus/ \ No newline at end of file diff --git a/Makefile b/Makefile index b31aa0d..17d5a9d 100644 --- a/Makefile +++ b/Makefile @@ -6,12 +6,14 @@ # By: vvaas +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2023/08/09 15:08:49 by vavaas #+# #+# # -# Updated: 2024/01/29 20:44:32 by vvaas ### ########.fr # +# Updated: 2024/01/30 02:40:31 by vvaas ### ########.fr # # # #******************************************************************************# NAME = ircserv +NAME_BONUS = greg + SRCS = srcs/main.cpp \ srcs/logs.cpp \ srcs/ansi.cpp \ @@ -22,8 +24,16 @@ SRCS = srcs/main.cpp \ srcs/unstd/string.cpp \ srcs/server_functions.cpp \ +SRCS_BONUS = srcs_bonus/main.cpp \ + srcs_bonus/bot.cpp \ + srcs_bonus/logs.cpp \ + srcs_bonus/ansi.cpp \ + OBJ_DIR = objs +OBJ_DIR_BONUS = objs_bonus + OBJS = $(addprefix $(OBJ_DIR)/, $(SRCS:.cpp=.o)) +OBJS_BONUS = $(addprefix $(OBJ_DIR_BONUS)/, $(SRCS_BONUS:.cpp=.o)) CXX = c++ FLAGS ?= true @@ -47,22 +57,36 @@ $(OBJ_DIR)/%.o: %.cpp @printf "\e[1;32m[compiling "$(MODE)" {"$(CXX)"}...]\e[1;00m "$<"\n" @$(CXX) $(CXXFLAGS) $(COPTS) -c $< -o $@ +$(OBJ_DIR_BONUS)/%.o: %.cpp + @printf "\e[1;32m[compiling "$(MODE)" {"$(CXX)"}...]\e[1;00m "$<"\n" + @$(CXX) $(CXXFLAGS) $(COPTS) -c $< -o $@ + all: $(NAME) +bonus : $(NAME_BONUS) + $(NAME): $(OBJ_DIR) $(OBJS) @printf "\e[1;32m[linking "$(MODE)" {"$(CXX)"}...]\e[1;00m "$@"\n" @$(CXX) -o $(NAME) $(OBJS) @printf "\e[1;32m[build finished]\e[1;00m\n" +$(NAME_BONUS): $(OBJ_DIR_BONUS) $(OBJS_BONUS) + @printf "\e[1;32m[linking "$(MODE)" {"$(CXX)"}...]\e[1;00m "$@"\n" + @$(CXX) -o $(NAME_BONUS) $(OBJS_BONUS) + @printf "\e[1;32m[build finished]\e[1;00m\n" + $(OBJ_DIR): @mkdir -p $(sort $(addprefix $(OBJ_DIR)/, $(dir $(SRCS)))) +$(OBJ_DIR_BONUS): + @mkdir -p $(sort $(addprefix $(OBJ_DIR_BONUS)/, $(dir $(SRCS_BONUS)))) + clean: - @$(RM) $(OBJ_DIR) + @$(RM) $(OBJ_DIR) $(OBJ_DIR_BONUS) fclean: clean - @$(RM) $(NAME) + @$(RM) $(NAME) $(NAME_BONUS) re: fclean all -.PHONY: all clean fclean re +.PHONY: all bonus clean fclean re diff --git a/includes/bot.hpp b/includes/bot.hpp new file mode 100644 index 0000000..2a3985c --- /dev/null +++ b/includes/bot.hpp @@ -0,0 +1,32 @@ +/******************************************************************************/ +/* */ +/* ::: :::::::: */ +/* Bot.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvaas +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/01/30 01:54:36 by vvaas #+# #+# */ +/* Updated: 2024/01/30 02:39:52 by vvaas ### ########.fr */ +/* */ +/******************************************************************************/ + +#define IP "127.0.0.1" +#define PORT 6667 +#define PASSWORD "gg" + +#include +#include +#include + +class bot +{ + public: + bot(); + void init(void); + void connect_to_server(void); + ~bot(); + private : + struct sockaddr_in _serv_addr; + int _fd; + std::vector _connect_commands; +}; \ No newline at end of file diff --git a/includes/client.hpp b/includes/client.hpp index c54ac72..2ec8c99 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 00:07:07 by vvaas ### ########.fr */ +/* Updated: 2024/01/30 01:45:23 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -16,6 +16,7 @@ #include #include #include +#include namespace irc { @@ -38,9 +39,13 @@ namespace irc inline void setNewRealName(const std::string& name) { _realname = name; } 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 requireDisconnect() { _disconnect_required = true; } inline bool isLogged() const { return _logged; } + inline bool isRegistered() const { return _registered; } + inline bool isWelcomed() const { return _welcomed; } inline bool disconnectRequired() const { return _disconnect_required; } inline const std::string& getNickName() const { return _nickname; } @@ -72,7 +77,9 @@ namespace irc sockaddr_in _s_data; int _fd; int _id; + bool _welcomed; bool _logged; + bool _registered; bool _disconnect_required; }; } diff --git a/includes/config.hpp b/includes/config.hpp index 056b8d3..35c4df1 100644 --- a/includes/config.hpp +++ b/includes/config.hpp @@ -1,14 +1,14 @@ -/* ************************************************************************** */ +/******************************************************************************/ /* */ /* ::: :::::::: */ /* config.hpp :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: maldavid +#+ +:+ +#+ */ +/* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/22 09:45:10 by maldavid #+# #+# */ -/* Updated: 2024/01/23 10:22:15 by maldavid ### ########.fr */ +/* Updated: 2024/01/30 01:37:03 by vvaas ### ########.fr */ /* */ -/* ************************************************************************** */ +/******************************************************************************/ #ifndef __CONFIG__ #define __CONFIG__ @@ -17,5 +17,5 @@ #define LOGS_BUFFER_SIZE 4096 #define MAX_USERS 20 #define NULL_SOCKET -1 - +#define LEGAL_CHARACTER "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}[]\\|^`-_" #endif diff --git a/srcs/client.cpp b/srcs/client.cpp index d1d503a..b2c2e14 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/30 00:39:39 by vvaas ### ########.fr */ +/* Updated: 2024/01/30 01:41:49 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -25,7 +25,7 @@ namespace irc { - Client::Client(int fd, sockaddr_in sock, int id) : _s_data(sock), _fd(fd), _id(id), _logged(false), _disconnect_required(false) {} + Client::Client(int fd, sockaddr_in sock, int id) : _s_data(sock), _fd(fd), _id(id), _welcomed(false), _logged(false), _registered(false), _disconnect_required(false) {} void Client::sendCode(const std::string& code, const std::string& msg) { diff --git a/srcs/server.cpp b/srcs/server.cpp index b84c398..9f18c5b 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 00:26:39 by maldavid ### ########.fr */ +/* Updated: 2024/01/30 01:09:20 by vvaas ### ########.fr */ /* */ /******************************************************************************/ diff --git a/srcs/server_functions.cpp b/srcs/server_functions.cpp index 3ed2bb5..e121bb6 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 00:40:40 by vvaas ### ########.fr */ +/* Updated: 2024/01/30 02:32:17 by vvaas ### ########.fr */ /* */ /******************************************************************************/ @@ -36,6 +36,11 @@ namespace irc void Server::handleNick(unstd::SharedPtr client, const Message& msg) { + if (msg.getTokens().size() < 2) + { + client->sendCode(ERR_NONICKNAMEGIVEN, "No nickname given"); + return; + } if(msg.getTokens().size() != 2 && msg.getTokens().size() != 3) { logs::report(log_error, "NICK, invalid command '%s'", msg.getRawMsg().c_str()); @@ -55,39 +60,56 @@ namespace irc std::string oldNick = (client->getNickName().size() > 0) ? client->getNickName() : msg.getTokens()[1]; // get nickname before /nick execution inside server (oldNick) client->printUserHeader(); client->setNewNickName(msg.getTokens()[1]); - client->sendMsg(oldNick, "NICK", 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(); - if (client->isLogged()) - client->sendCode(RPL_WELCOME, welcome_msg); + client->welcome(); std::cout << "new nickname, " << client->getNickName() << std::endl; } void Server::handleUser(unstd::SharedPtr client, const Message& msg) { - if(msg.getTokens().size() != 5) + if(msg.getTokens().size() < 5) { + client->sendCode(ERR_NEEDMOREPARAMS, "Need more parameters"); logs::report(log_error, "USER, invalid command '%s'", msg.getRawMsg().c_str()); return; } + if (client->isRegistered()) + { + client->sendCode(ERR_ALREADYREGISTRED, "You are already registered"); + return ; + } + if (msg.getTokens()[4][0] != ':') + return ; client->printUserHeader(); client->setNewUserName(msg.getTokens()[1]); std::cout << "new username, " << client->getUserName() << std::endl; client->printUserHeader(); - client->setNewRealName(msg.getTokens()[4]); + + std::string realname; + for (std::vector::const_iterator it = msg.getTokens().begin() + 4; it != msg.getTokens().end(); ++it) + { + realname.append(*it); + realname.append(" "); + } + realname.erase(realname.begin()); + realname.erase(realname.end() - 1); + client->setNewRealName(realname); std::cout << "new realname, " << client->getRealName() << std::endl; + } void Server::handlePass(unstd::SharedPtr client, const Message& msg) { - std::string welcome_msg = "Welcone to yipirc :), " + client->getNickName(); + std::string welcome_msg = "Welcome to yipirc :), " + client->getNickName(); if(client->isLogged()) return; if(msg.getTokens()[1] == _password) { client->login(); - if (client->getNickName().size() != 0) - client->sendCode(RPL_WELCOME, welcome_msg); + client->welcome(); } else { diff --git a/srcs_bonus/ansi.cpp b/srcs_bonus/ansi.cpp new file mode 100644 index 0000000..6857c8d --- /dev/null +++ b/srcs_bonus/ansi.cpp @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ansi.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maldavid +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/01/20 19:08:31 by maldavid #+# #+# */ +/* Updated: 2024/01/23 09:38:17 by maldavid ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +std::ostream& operator<<(std::ostream& os, const AnsiColor::Codes code) +{ + return os << "\033[1;" << unstd::toString(static_cast(code)) << "m"; +} diff --git a/srcs_bonus/bot.cpp b/srcs_bonus/bot.cpp new file mode 100644 index 0000000..69677c3 --- /dev/null +++ b/srcs_bonus/bot.cpp @@ -0,0 +1,54 @@ +/******************************************************************************/ +/* */ +/* ::: :::::::: */ +/* Bot.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vvaas +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/01/30 01:54:56 by vvaas #+# #+# */ +/* Updated: 2024/01/30 02:40:17 by vvaas ### ########.fr */ +/* */ +/******************************************************************************/ + +#include +#include +#include +#include +#include + +bot::bot() {} + +bot::~bot() {} + +void bot::init() +{ + _connect_commands.push_back("USER greg_bot 0 * :botrealname\r\n"); + _connect_commands.push_back("NICK greg\r\n"); + _connect_commands.push_back("PASS " PASSWORD "\r\n"); + _fd = socket(AF_INET, SOCK_STREAM, 0); + if (_fd == -1) + irc::logs::report(irc::log_fatal_error, "FD error"); + _serv_addr.sin_family = AF_INET; + _serv_addr.sin_port = htons(PORT); + _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"); + } + +} + +void bot::connect_to_server() +{ + char buffer[1024]; + 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"); + } + while (true) + { + while (recv(_fd, buffer, 1024, 0) < 0) + std::cout << buffer << std::endl; + } +} \ No newline at end of file diff --git a/srcs_bonus/logs.cpp b/srcs_bonus/logs.cpp new file mode 100644 index 0000000..076fc86 --- /dev/null +++ b/srcs_bonus/logs.cpp @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* logs.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maldavid +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/01/21 09:17:47 by maldavid #+# #+# */ +/* Updated: 2024/01/22 09:46:54 by maldavid ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include +#include +#include +#include + +namespace irc +{ + namespace logs + { + void report(LogType type, std::string message, ...) + { + char buffer[LOGS_BUFFER_SIZE]; + + va_list al; + va_start(al, message); + vsnprintf(buffer, LOGS_BUFFER_SIZE, message.c_str(), al); + va_end(al); + + switch(type) + { + 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; + } + } + } +} diff --git a/srcs_bonus/main.cpp b/srcs_bonus/main.cpp index cbbdff0..a51b74f 100644 --- a/srcs_bonus/main.cpp +++ b/srcs_bonus/main.cpp @@ -6,26 +6,16 @@ /* By: vvaas +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/29 20:36:23 by vvaas #+# #+# */ -/* Updated: 2024/01/29 20:41:45 by vvaas ### ########.fr */ +/* Updated: 2024/01/30 02:40:04 by vvaas ### ########.fr */ /* */ /******************************************************************************/ -#include -#include +#include -#define IP "127.0.0.1" -#define PORT 6667 int main() { - struct sockaddr_in serv_addr; - int fd = socket(AF_LOCAL, SOCK_STREAM, 0); - if (fd == -1) - irc::logs::report(irc::log_fatal_error, "FD error"); - serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(PORT); - if (connect(fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) - { - irc::logs::report(irc::log_fatal_error, "connect error"); - return -1; - } + bot greg; + + greg.init(); + greg.connect_to_server(); } \ No newline at end of file