This commit is contained in:
2024-01-30 02:40:37 +01:00
parent 540ebf47b6
commit bbbc4dac16
12 changed files with 233 additions and 39 deletions

3
.gitignore vendored
View File

@@ -18,4 +18,5 @@
.cache/
objs/
ircserv
.vscode/
.vscode/
objs_bonus/

View File

@@ -6,12 +6,14 @@
# By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# 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

32
includes/bot.hpp Normal file
View File

@@ -0,0 +1,32 @@
/******************************************************************************/
/* */
/* ::: :::::::: */
/* Bot.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <irc.hpp>
#include <vector>
#include <string>
class bot
{
public:
bot();
void init(void);
void connect_to_server(void);
~bot();
private :
struct sockaddr_in _serv_addr;
int _fd;
std::vector<std::string> _connect_commands;
};

View File

@@ -6,7 +6,7 @@
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <irc.hpp>
#include <string>
#include <set>
#include <errorscode.hpp>
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;
};
}

View File

@@ -1,14 +1,14 @@
/* ************************************************************************** */
/******************************************************************************/
/* */
/* ::: :::::::: */
/* config.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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

View File

@@ -6,7 +6,7 @@
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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)
{

View File

@@ -6,7 +6,7 @@
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/******************************************************************************/

View File

@@ -6,7 +6,7 @@
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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<class Client> 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<class Client> 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<std::string>::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<class Client> 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
{

19
srcs_bonus/ansi.cpp Normal file
View File

@@ -0,0 +1,19 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ansi.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/20 19:08:31 by maldavid #+# #+# */
/* Updated: 2024/01/23 09:38:17 by maldavid ### ########.fr */
/* */
/* ************************************************************************** */
#include <ansi.hpp>
#include <unstd/string.hpp>
std::ostream& operator<<(std::ostream& os, const AnsiColor::Codes code)
{
return os << "\033[1;" << unstd::toString(static_cast<int>(code)) << "m";
}

54
srcs_bonus/bot.cpp Normal file
View File

@@ -0,0 +1,54 @@
/******************************************************************************/
/* */
/* ::: :::::::: */
/* Bot.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/30 01:54:56 by vvaas #+# #+# */
/* Updated: 2024/01/30 02:40:17 by vvaas ### ########.fr */
/* */
/******************************************************************************/
#include <bot.hpp>
#include <logs.hpp>
#include <string>
#include <iostream>
#include <errno.h>
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<std::string>::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;
}
}

45
srcs_bonus/logs.cpp Normal file
View File

@@ -0,0 +1,45 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* logs.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/21 09:17:47 by maldavid #+# #+# */
/* Updated: 2024/01/22 09:46:54 by maldavid ### ########.fr */
/* */
/* ************************************************************************** */
#include <logs.hpp>
#include <ansi.hpp>
#include <cstdarg>
#include <cstdlib>
#include <cstdio>
#include <config.hpp>
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;
}
}
}
}

View File

@@ -6,26 +6,16 @@
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <irc.hpp>
#include <logs.hpp>
#include <bot.hpp>
#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();
}