fixing vavaas issues
This commit is contained in:
@@ -6,14 +6,10 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/30 01:54:36 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 <irc.hpp>
|
#include <irc.hpp>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -22,15 +18,18 @@ class Bot
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Bot();
|
Bot();
|
||||||
|
|
||||||
bool init(const std::string &ip, const std::string &port, const std::string &password);
|
bool init(const std::string &ip, const std::string &port, const std::string &password);
|
||||||
void connect_to_server(void);
|
void connect_to_server(void);
|
||||||
void handle_response(std::string buffer);
|
void handle_response(std::string buffer);
|
||||||
void send_message(const std::string &content);
|
void send_message(const std::string &content);
|
||||||
|
|
||||||
~Bot();
|
~Bot();
|
||||||
|
|
||||||
private :
|
private :
|
||||||
bool _channel_created;
|
std::vector<std::string> _connect_commands;
|
||||||
bool _logged;
|
|
||||||
struct sockaddr_in _serv_addr;
|
struct sockaddr_in _serv_addr;
|
||||||
int _fd;
|
int _fd;
|
||||||
std::vector<std::string> _connect_commands;
|
bool _channel_created;
|
||||||
|
bool _logged;
|
||||||
};
|
};
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/21 09:15:24 by maldavid #+# #+# */
|
/* 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_message = 0,
|
||||||
log_warning,
|
log_warning,
|
||||||
log_error,
|
log_error
|
||||||
log_fatal_error
|
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace logs
|
namespace logs
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/21 09:12:28 by maldavid #+# #+# */
|
/* 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 const std::string &getRunDate(void) const { return _run_date; };
|
||||||
inline size_t getClientCount(void) const { return _client.size(); };
|
inline size_t getClientCount(void) const { return _client.size(); };
|
||||||
inline size_t getChannelCount(void) const { return _channels.size(); };
|
inline size_t getChannelCount(void) const { return _channels.size(); };
|
||||||
|
inline bool hasFailedInit() const { return _init_failed; }
|
||||||
|
|
||||||
~Server();
|
~Server();
|
||||||
|
|
||||||
@@ -87,6 +88,7 @@ namespace irc
|
|||||||
int _port;
|
int _port;
|
||||||
int _main_socket;
|
int _main_socket;
|
||||||
bool _active;
|
bool _active;
|
||||||
|
bool _init_failed;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,14 +6,13 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/21 09:17:47 by maldavid #+# #+# */
|
/* 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 <logs.hpp>
|
#include <logs.hpp>
|
||||||
#include <ansi.hpp>
|
#include <ansi.hpp>
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
#include <cstdlib>
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <config.hpp>
|
#include <config.hpp>
|
||||||
|
|
||||||
@@ -35,10 +34,8 @@ namespace irc
|
|||||||
case log_message: std::cout << AnsiColor::blue << "[IRC serv] Message : " << AnsiColor::reset << buffer << std::endl; break;
|
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_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_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;
|
default: break;
|
||||||
std::exit(EXIT_FAILURE);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/20 09:27:04 by maldavid #+# #+# */
|
/* 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;
|
return 0;
|
||||||
}
|
}
|
||||||
if(av[1] == NULL || av[2] == NULL)
|
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;
|
char* end;
|
||||||
int port = std::strtol(av[1], &end, 10);
|
int port = std::strtol(av[1], &end, 10);
|
||||||
if(errno == ERANGE || *end != 0 || port <= 0 || port > 0xFFFF || std::strlen(av[1]) == 0)
|
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]);
|
irc::Server serv(port, av[2]);
|
||||||
|
if(serv.hasFailedInit())
|
||||||
|
return 1;
|
||||||
serv_ptr = &serv;
|
serv_ptr = &serv;
|
||||||
signal(SIGINT, signalsHandler);
|
signal(SIGINT, signalsHandler);
|
||||||
signal(SIGQUIT, signalsHandler);
|
signal(SIGQUIT, signalsHandler);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/21 09:31:17 by maldavid #+# #+# */
|
/* 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)
|
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);
|
time_t ltime = time(NULL);
|
||||||
struct tm tstruct = *localtime(<ime);
|
struct tm tstruct = *localtime(<ime);
|
||||||
char buf[100];
|
char buf[100];
|
||||||
@@ -53,7 +54,11 @@ namespace irc
|
|||||||
_s_data.sin_port = htons(_port);
|
_s_data.sin_port = htons(_port);
|
||||||
_main_socket = socket(AF_INET, SOCK_STREAM, 0); // AF_INET == IPv4, SOCK_STREAM == TCP
|
_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_error, "socket error");
|
||||||
|
_init_failed = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
logs::report(log_message, "socket succesfully started");
|
logs::report(log_message, "socket succesfully started");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,14 +68,26 @@ namespace irc
|
|||||||
|
|
||||||
initSocketData();
|
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)");
|
{
|
||||||
|
logs::report(log_error, "setsockopt() error (tout a pete)");
|
||||||
|
_init_failed = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(bind(_main_socket, reinterpret_cast<sockaddr*>(&_s_data), sizeof(_s_data)) != 0) // Bind _main_socket to localhost
|
if(bind(_main_socket, reinterpret_cast<sockaddr*>(&_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");
|
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_error, "listen error");
|
||||||
|
_init_failed = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
logs::report(log_message, "listen queue created successfully");
|
logs::report(log_message, "listen queue created successfully");
|
||||||
|
|
||||||
logs::report(log_message, "server is up and running");
|
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
|
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");
|
{
|
||||||
|
logs::report(log_error, "select fd error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(FD_ISSET(_main_socket, &_fd_set)) // ifit's a new connection
|
if(FD_ISSET(_main_socket, &_fd_set)) // ifit's a new connection
|
||||||
{
|
{
|
||||||
sockaddr_in cli_sock;
|
sockaddr_in cli_sock;
|
||||||
fd = accept(_main_socket, reinterpret_cast<sockaddr*>(&cli_sock), &len); // adds the new connection
|
fd = accept(_main_socket, reinterpret_cast<sockaddr*>(&cli_sock), &len); // adds the new connection
|
||||||
if(fd < 0)
|
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)
|
if(fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
|
||||||
logs::report(log_fatal_error, "fcntl() error");
|
{
|
||||||
|
logs::report(log_error, "fcntl() error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
unstd::SharedPtr<Client> new_client(new Client(fd, cli_sock, i++));
|
unstd::SharedPtr<Client> new_client(new Client(fd, cli_sock, i++));
|
||||||
_client.push_back(new_client); // put the client into the vector used in handle_input
|
_client.push_back(new_client); // put the client into the vector used in handle_input
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/22 17:31:06 by maldavid #+# #+# */
|
/* 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]);
|
Channel* channel = getChannelByName(msg.getArgs()[0]);
|
||||||
if(channel == NULL)
|
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())))
|
if(!channel->removeClient(client, (msg.getReason().empty() ? "" : msg.getReason())))
|
||||||
{
|
{
|
||||||
client->sendCode(ERR_NOTONCHANNEL, "PART : Not on channel");
|
client->sendCode(ERR_NOTONCHANNEL, "PART : Not on channel");
|
||||||
@@ -337,15 +340,21 @@ namespace irc
|
|||||||
|
|
||||||
Channel* channel_target = getChannelByName(msg.getArgs()[1]);
|
Channel* channel_target = getChannelByName(msg.getArgs()[1]);
|
||||||
if(channel_target == NULL)
|
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> client_target = getClientByName(msg.getArgs()[0]);
|
unstd::SharedPtr<Client> client_target = getClientByName(msg.getArgs()[0]);
|
||||||
if(client_target.get() == NULL)
|
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))
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -403,10 +412,16 @@ namespace irc
|
|||||||
|
|
||||||
Channel* channel_target = getChannelByName(*channel);
|
Channel* channel_target = getChannelByName(*channel);
|
||||||
if(channel_target == NULL)
|
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> client_target = getClientByName(*user);
|
unstd::SharedPtr<Client> client_target = getClientByName(*user);
|
||||||
if(client_target.get() == NULL)
|
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()))
|
if(!channel_target->kick(client, client_target, msg.getReason()))
|
||||||
continue;
|
continue;
|
||||||
@@ -454,7 +469,10 @@ namespace irc
|
|||||||
}
|
}
|
||||||
Channel* channel = getChannelByName(msg.getArgs()[0]);
|
Channel* channel = getChannelByName(msg.getArgs()[0]);
|
||||||
if(channel == NULL)
|
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))
|
if(!channel->hasClient(client))
|
||||||
{
|
{
|
||||||
client->sendCode(ERR_NOTONCHANNEL, msg.getArgs()[0] + " you're not on that channel");
|
client->sendCode(ERR_NOTONCHANNEL, msg.getArgs()[0] + " you're not on that channel");
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/30 01:54:56 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;
|
bool active = true;
|
||||||
|
|
||||||
Bot::Bot() : _channel_created(false), _logged(false), _fd(-1)
|
Bot::Bot() : _fd(-1), _channel_created(false), _logged(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Bot::~Bot()
|
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)
|
bool Bot::init(const std::string &ip, const std::string &port, const std::string &password)
|
||||||
{
|
{
|
||||||
if(ip.empty() || port.empty() || password.empty())
|
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;
|
char* end;
|
||||||
int portval = std::strtol(port.c_str(), &end, 10);
|
int portval = std::strtol(port.c_str(), &end, 10);
|
||||||
if(errno == ERANGE || *end != 0 || portval < 0 || portval > 0xFFFF)
|
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("PASS " + password + "\r\n");
|
||||||
_connect_commands.push_back("NICK greg\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("USER greg_Bot 0 * :Botrealname\r\n");
|
||||||
_connect_commands.push_back("JOIN #greg\r\n");
|
_connect_commands.push_back("JOIN #greg\r\n");
|
||||||
_fd = socket(AF_INET, SOCK_STREAM, 0);
|
_fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
if(_fd == -1)
|
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_family = AF_INET;
|
||||||
_serv_addr.sin_port = htons(portval);
|
_serv_addr.sin_port = htons(portval);
|
||||||
_serv_addr.sin_addr.s_addr = inet_addr(ip.c_str());
|
_serv_addr.sin_addr.s_addr = inet_addr(ip.c_str());
|
||||||
if(connect(_fd, (struct sockaddr*)&_serv_addr, sizeof(_serv_addr)) < 0)
|
if(connect(_fd, (struct sockaddr*)&_serv_addr, sizeof(_serv_addr)) < 0)
|
||||||
{
|
{
|
||||||
irc::logs::report(irc::log_error, "connect error");
|
irc::logs::report(irc::log_error, "connect error");
|
||||||
return (false);
|
return false;
|
||||||
}
|
}
|
||||||
if(fcntl(_fd, F_SETFL, O_NONBLOCK) < 0)
|
if(fcntl(_fd, F_SETFL, O_NONBLOCK) < 0)
|
||||||
{
|
{
|
||||||
irc::logs::report(irc::log_error, "fcntl error");
|
irc::logs::report(irc::log_error, "fcntl error");
|
||||||
return (false);
|
return false;
|
||||||
}
|
}
|
||||||
signal(SIGINT, signalsHandler);
|
signal(SIGINT, signalsHandler);
|
||||||
signal(SIGQUIT, signalsHandler);
|
signal(SIGQUIT, signalsHandler);
|
||||||
return (true);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bot::send_message(const std::string &content)
|
void Bot::send_message(const std::string &content)
|
||||||
{
|
{
|
||||||
if(send(_fd, content.c_str(), content.length(), 0) < 0)
|
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)
|
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)
|
if(buffer.find("KICK #greg greg :") != std::string::npos || buffer.find("explose") != std::string::npos)
|
||||||
{
|
{
|
||||||
send_message("QUIT: Explose\r\n");
|
send_message("QUIT: Explose\r\n");
|
||||||
std::exit(0);
|
active = false;
|
||||||
}
|
}
|
||||||
if(buffer.find("quoi") != std::string::npos)
|
if(buffer.find("quoi") != std::string::npos)
|
||||||
send_message("PRIVMSG #greg :feur\r\n");
|
send_message("PRIVMSG #greg :feur\r\n");
|
||||||
@@ -111,7 +123,10 @@ void Bot::connect_to_server()
|
|||||||
for(std::vector<std::string>::iterator it = _connect_commands.begin(); it != _connect_commands.end(); ++it)
|
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)
|
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)
|
if(recv(_fd, buffer, 1024, 0) > 0)
|
||||||
handle_response(buffer);
|
handle_response(buffer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,14 +6,13 @@
|
|||||||
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
|
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/21 09:17:47 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 <logs.hpp>
|
#include <logs.hpp>
|
||||||
#include <ansi.hpp>
|
#include <ansi.hpp>
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
#include <cstdlib>
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <config.hpp>
|
#include <config.hpp>
|
||||||
|
|
||||||
@@ -35,10 +34,8 @@ namespace irc
|
|||||||
case log_message: std::cout << AnsiColor::blue << "[IRC serv] Message : " << AnsiColor::reset << buffer << std::endl; break;
|
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_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_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;
|
default: break;
|
||||||
std::exit(EXIT_FAILURE);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/29 20:36:23 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)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
if(argc != 4)
|
if(argc != 4)
|
||||||
irc::logs::report(irc::log_fatal_error, "./greg <ip address> <port> <password>");
|
{
|
||||||
|
irc::logs::report(irc::log_error, "./greg <ip address> <port> <password>");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
Bot greg;
|
Bot greg;
|
||||||
|
|
||||||
if(!greg.init(argv[1], argv[2], argv[3]))
|
if(!greg.init(argv[1], argv[2], argv[3]))
|
||||||
|
|||||||
Reference in New Issue
Block a user