a l'aide
This commit is contained in:
@@ -6,7 +6,7 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/21 10:33:17 by maldavid #+# #+# */
|
/* Created: 2024/01/21 10:33:17 by maldavid #+# #+# */
|
||||||
/* Updated: 2024/01/23 10:30:27 by maldavid ### ########.fr */
|
/* Updated: 2024/01/24 00:11:46 by vvaas ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
@@ -27,6 +27,8 @@ namespace irc
|
|||||||
|
|
||||||
inline int getFD() const { return _fd; }
|
inline int getFD() const { return _fd; }
|
||||||
inline int getID() const { return _id; }
|
inline int getID() const { return _id; }
|
||||||
|
inline int getLogged() const { return _logged; }
|
||||||
|
inline int getDisconnect() const { return _to_disconnect; }
|
||||||
inline sockaddr_in getSockAddr() const { return _s_data; }
|
inline sockaddr_in getSockAddr() const { return _s_data; }
|
||||||
inline const std::string& getMsgInFlight() const { return _msg_in_flight; }
|
inline const std::string& getMsgInFlight() const { return _msg_in_flight; }
|
||||||
|
|
||||||
@@ -35,6 +37,8 @@ namespace irc
|
|||||||
inline void setNewNickName(const std::string& name) { _nickname = name; }
|
inline void setNewNickName(const std::string& name) { _nickname = name; }
|
||||||
inline void setNewUserName(const std::string& name) { _username = name; }
|
inline void setNewUserName(const std::string& name) { _username = name; }
|
||||||
inline void setNewRealName(const std::string& name) { _realname = name; }
|
inline void setNewRealName(const std::string& name) { _realname = name; }
|
||||||
|
inline void setLogged(void) { _logged = true; }
|
||||||
|
inline void setDisconnect(void) { _to_disconnect = true; }
|
||||||
|
|
||||||
inline const std::string& getNickName() const { return _nickname; }
|
inline const std::string& getNickName() const { return _nickname; }
|
||||||
inline const std::string& getUserName() const { return _username; }
|
inline const std::string& getUserName() const { return _username; }
|
||||||
@@ -57,6 +61,8 @@ namespace irc
|
|||||||
sockaddr_in _s_data;
|
sockaddr_in _s_data;
|
||||||
int _fd;
|
int _fd;
|
||||||
int _id;
|
int _id;
|
||||||
|
bool _logged;
|
||||||
|
bool _to_disconnect;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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/01/23 17:07:50 by vvaas ### ########.fr */
|
/* Updated: 2024/01/23 23:29:00 by vvaas ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
@@ -50,6 +50,7 @@ namespace irc
|
|||||||
// ugly as f*ck
|
// ugly as f*ck
|
||||||
void handleNick(unstd::SharedPtr<class Client> client, const class Message& msg);
|
void handleNick(unstd::SharedPtr<class Client> client, const class Message& msg);
|
||||||
void handleUser(unstd::SharedPtr<class Client> client, const class Message& msg);
|
void handleUser(unstd::SharedPtr<class Client> client, const class Message& msg);
|
||||||
|
void handlePass(unstd::SharedPtr<class Client> client, const class Message& msg);
|
||||||
void handleQuit(unstd::SharedPtr<class Client> client, const class Message& msg);
|
void handleQuit(unstd::SharedPtr<class Client> client, const class Message& msg);
|
||||||
void handlePart(unstd::SharedPtr<class Client> client, const class Message& msg);
|
void handlePart(unstd::SharedPtr<class Client> client, const class Message& msg);
|
||||||
void handleJoin(unstd::SharedPtr<class Client> client, const class Message& msg);
|
void handleJoin(unstd::SharedPtr<class Client> client, const class Message& msg);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/21 10:36:21 by maldavid #+# #+# */
|
/* Created: 2024/01/21 10:36:21 by maldavid #+# #+# */
|
||||||
/* Updated: 2024/01/23 17:43:02 by vvaas ### ########.fr */
|
/* Updated: 2024/01/23 23:55:17 by vvaas ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
@@ -23,15 +23,11 @@ namespace irc
|
|||||||
{
|
{
|
||||||
if (!_clients.insert(client).second)
|
if (!_clients.insert(client).second)
|
||||||
{
|
{
|
||||||
logs::report(log_message, "%s is already is channel for", client->getNickName().c_str());
|
|
||||||
client->sendCode(ERR_USERONCHANNEL, "You are already in the channel");
|
client->sendCode(ERR_USERONCHANNEL, "You are already in the channel");
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
for(std::set<unstd::SharedPtr<Client> >::iterator it = _clients.begin(); it != _clients.end(); ++it)
|
for(std::set<unstd::SharedPtr<Client> >::iterator it = _clients.begin(); it != _clients.end(); ++it)
|
||||||
{
|
|
||||||
const_cast<unstd::SharedPtr<irc::Client>&>(*it)->sendMsg(client->getNickName(), "JOIN", _name);
|
const_cast<unstd::SharedPtr<irc::Client>&>(*it)->sendMsg(client->getNickName(), "JOIN", _name);
|
||||||
logs::report(log_message, "%s has been sent a JOIN message", const_cast<unstd::SharedPtr<irc::Client>&>(*it)->getNickName().c_str());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Channel::removeClient(unstd::SharedPtr<Client> client)
|
bool Channel::removeClient(unstd::SharedPtr<Client> client)
|
||||||
@@ -52,9 +48,10 @@ namespace irc
|
|||||||
|
|
||||||
void Channel::setTopic(unstd::SharedPtr<Client> client, const std::string& new_topic)
|
void Channel::setTopic(unstd::SharedPtr<Client> client, const std::string& new_topic)
|
||||||
{
|
{
|
||||||
if(_topic_op_restrict && _operators.find(client) == _operators.end())
|
if(_topic_op_restrict && _operators.find(client) == _operators.end() )
|
||||||
{
|
{
|
||||||
// send error code to user
|
client->sendCode(ERR_CHANOPRIVSNEEDED, "You need operator privileges");
|
||||||
|
return ;
|
||||||
}
|
}
|
||||||
_topic = new_topic;
|
_topic = new_topic;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: vvaas <vvaas@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/01/21 10:35:52 by maldavid #+# #+# */
|
/* Created: 2024/01/21 10:35:52 by maldavid #+# #+# */
|
||||||
/* Updated: 2024/01/23 12:38:15 by maldavid ### ########.fr */
|
/* Updated: 2024/01/24 00:07:56 by vvaas ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
@@ -18,11 +18,12 @@
|
|||||||
|
|
||||||
namespace irc
|
namespace irc
|
||||||
{
|
{
|
||||||
Client::Client(int fd, sockaddr_in sock, int id) : _s_data(sock), _fd(fd), _id(id) {}
|
Client::Client(int fd, sockaddr_in sock, int id) : _s_data(sock), _fd(fd), _id(id), _logged(false) {}
|
||||||
|
|
||||||
void Client::sendCode(const std::string& code, const std::string& msg)
|
void Client::sendCode(const std::string& code, const std::string& msg)
|
||||||
{
|
{
|
||||||
const std::string command = code + " :" + msg;
|
const std::string command = code + " :" + msg;
|
||||||
|
logs::report(log_message, "C<-%s", command.c_str());
|
||||||
if(send(_fd, command.c_str(), command.size(), 0) != static_cast<ssize_t>(command.length()))
|
if(send(_fd, command.c_str(), command.size(), 0) != static_cast<ssize_t>(command.length()))
|
||||||
logs::report(log_error, "server failed to send a code to '%s' (:sadge:)", _username.c_str());
|
logs::report(log_error, "server failed to send a code to '%s' (:sadge:)", _username.c_str());
|
||||||
}
|
}
|
||||||
@@ -30,6 +31,7 @@ namespace irc
|
|||||||
void Client::sendMsg(const std::string& sender, const std::string& cmd, const std::string& trailing)
|
void Client::sendMsg(const std::string& sender, const std::string& cmd, const std::string& trailing)
|
||||||
{
|
{
|
||||||
const std::string out = ':' + sender + ' ' + cmd + " :" + trailing + "\r\n";
|
const std::string out = ':' + sender + ' ' + cmd + " :" + trailing + "\r\n";
|
||||||
|
logs::report(log_message,"<- S %s", out.c_str());
|
||||||
if(send(_fd, out.c_str(), out.length(), 0) != static_cast<ssize_t>(out.length()))
|
if(send(_fd, out.c_str(), out.length(), 0) != static_cast<ssize_t>(out.length()))
|
||||||
logs::report(log_error, "server failed to send a message from '%s' to '%s' (:sadge:)", sender.c_str(), _username.c_str());
|
logs::report(log_error, "server failed to send a message from '%s' to '%s' (:sadge:)", sender.c_str(), _username.c_str());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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/01/23 17:10:38 by vvaas ### ########.fr */
|
/* Updated: 2024/01/24 00:16:34 by vvaas ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ namespace irc
|
|||||||
|
|
||||||
void Server::initSocket()
|
void Server::initSocket()
|
||||||
{
|
{
|
||||||
int opt = 0;
|
int opt = 1;
|
||||||
|
|
||||||
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
|
||||||
@@ -75,9 +75,10 @@ namespace irc
|
|||||||
std::memset(buffer, 0, sizeof(buffer)); // clear the buffer to avoid trash remaining
|
std::memset(buffer, 0, sizeof(buffer)); // clear the buffer to avoid trash remaining
|
||||||
}
|
}
|
||||||
|
|
||||||
if(recv((*it)->getFD(), buffer, INPUT_SIZE, 0) == 0) // recv return 0 if an user disconnect
|
if(recv((*it)->getFD(), buffer, INPUT_SIZE, 0) == 0 || (*it)->getDisconnect()) // recv return 0 if an user disconnect
|
||||||
{
|
{
|
||||||
logs::report(log_message, "User %d disconnected", (*it)->getID());
|
logs::report(log_message, "User %d disconnected", (*it)->getID());
|
||||||
|
close((*it)->getFD());
|
||||||
it = _client.erase(it) - 1;
|
it = _client.erase(it) - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,14 +127,17 @@ namespace irc
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
const Message msg(client, client->getNextMsg());
|
const Message msg(client, client->getNextMsg());
|
||||||
|
|
||||||
if(msg.getCmd() == "NICK")
|
if(msg.getCmd() == "NICK")
|
||||||
handleNick(client, msg);
|
handleNick(client, msg);
|
||||||
else if(msg.getCmd() == "USER")
|
else if(msg.getCmd() == "USER")
|
||||||
handleUser(client, msg);
|
handleUser(client, msg);
|
||||||
|
else if (msg.getCmd() == "PASS")
|
||||||
|
handlePass(client, msg);
|
||||||
|
else if (!client->getLogged())
|
||||||
|
return true;
|
||||||
else if(msg.getCmd() == "QUIT")
|
else if(msg.getCmd() == "QUIT")
|
||||||
handleQuit(client, msg);
|
handleQuit(client, msg);
|
||||||
else if(msg.getCmd() == "PART")
|
else if(msg.getCmd() == "PART") // Not mandatory ?
|
||||||
handlePart(client, msg);
|
handlePart(client, msg);
|
||||||
else if(msg.getCmd() == "JOIN")
|
else if(msg.getCmd() == "JOIN")
|
||||||
handleJoin(client, msg);
|
handleJoin(client, msg);
|
||||||
@@ -151,7 +155,6 @@ namespace irc
|
|||||||
handlePing(client, msg);
|
handlePing(client, msg);
|
||||||
else if(msg.getCmd() == "MODE")
|
else if(msg.getCmd() == "MODE")
|
||||||
handleMode(client, msg);
|
handleMode(client, msg);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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/01/23 12:33:34 by maldavid ### ########.fr */
|
/* Updated: 2024/01/24 00:23:29 by vvaas ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
@@ -40,9 +40,10 @@ namespace irc
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
std::string oldNick = (client->getNickName().size() > 0) ? client->getNickName() : msg.getTokens()[1]; // get nickname before /nick execution inside server (oldNick)
|
||||||
client->printUserHeader();
|
client->printUserHeader();
|
||||||
client->setNewNickName(msg.getTokens()[1]);
|
client->setNewNickName(msg.getTokens()[1]);
|
||||||
|
client->sendMsg(oldNick, "NICK", msg.getTokens()[1]);
|
||||||
std::cout << "new nickname, " << client->getNickName() << std::endl;
|
std::cout << "new nickname, " << client->getNickName() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +62,22 @@ namespace irc
|
|||||||
client->setNewRealName(msg.getTokens()[4]);
|
client->setNewRealName(msg.getTokens()[4]);
|
||||||
std::cout << "new realname, " << client->getRealName() << std::endl;
|
std::cout << "new realname, " << client->getRealName() << std::endl;
|
||||||
}
|
}
|
||||||
|
void Server::handlePass(unstd::SharedPtr<class Client> client, const Message& msg)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (client->getLogged())
|
||||||
|
return ;
|
||||||
|
if (msg.getTokens()[1] == _password)
|
||||||
|
{
|
||||||
|
client->setLogged();
|
||||||
|
client->sendCode(RPL_WELCOME, "Welcome :)\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
client->sendCode(ERR_PASSWDMISMATCH);
|
||||||
|
client->setDisconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
void Server::handleQuit(unstd::SharedPtr<class Client> client, const Message& msg)
|
void Server::handleQuit(unstd::SharedPtr<class Client> client, const Message& msg)
|
||||||
{
|
{
|
||||||
(void)msg;
|
(void)msg;
|
||||||
@@ -112,7 +128,7 @@ namespace irc
|
|||||||
client->printUserHeader();
|
client->printUserHeader();
|
||||||
std::cout << "leaving channel, " << msg.getTokens()[1] << std::endl;
|
std::cout << "leaving channel, " << msg.getTokens()[1] << std::endl;
|
||||||
if(chit->getNumberOfClients() == 0)
|
if(chit->getNumberOfClients() == 0)
|
||||||
logs::report(log_message, "channel '%s' has beed destroyed", chit->getName().c_str());
|
logs::report(log_message, "channel '%s' has been destroyed", chit->getName().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::handleJoin(unstd::SharedPtr<class Client> client, const Message& msg)
|
void Server::handleJoin(unstd::SharedPtr<class Client> client, const Message& msg)
|
||||||
@@ -138,7 +154,7 @@ namespace irc
|
|||||||
{
|
{
|
||||||
_channels.push_back(Channel(msg.getTokens()[1]));
|
_channels.push_back(Channel(msg.getTokens()[1]));
|
||||||
_channels.back().addClient(client);
|
_channels.back().addClient(client);
|
||||||
logs::report(log_message, "channel '%s' has beed created", msg.getTokens()[1].c_str());
|
logs::report(log_message, "channel '%s' has been created", msg.getTokens()[1].c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
it->addClient(client);
|
it->addClient(client);
|
||||||
@@ -190,9 +206,27 @@ namespace irc
|
|||||||
logs::report(log_error, "TOPIC, invalid command '%s'", msg.getRawMsg().c_str());
|
logs::report(log_error, "TOPIC, invalid command '%s'", msg.getRawMsg().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(msg.getTokens()[1][0] != '#' && msg.getTokens()[1][0] != '&')
|
||||||
|
{
|
||||||
|
logs::report(log_error, "TOPIC, invalid channel name '%s'", msg.getTokens()[1].c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::vector<Channel>::iterator it;
|
||||||
|
for(it = _channels.begin(); it != _channels.end(); ++it)
|
||||||
|
{
|
||||||
|
if(msg.getTokens()[1] == it->getName())
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(it == _channels.end())
|
||||||
|
{
|
||||||
|
_channels.push_back(Channel(msg.getTokens()[1]));
|
||||||
|
_channels.back().addClient(client);
|
||||||
|
logs::report(log_message, "channel '%s' has been created", msg.getTokens()[1].c_str());
|
||||||
|
}
|
||||||
for(std::vector<unstd::SharedPtr<Client> >::iterator it = _client.begin(); it != _client.end(); ++it)
|
for(std::vector<unstd::SharedPtr<Client> >::iterator it = _client.begin(); it != _client.end(); ++it)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user