diff --git a/Makefile b/Makefile index 7e513c4..becf1fa 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: apommier +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/12/01 17:27:29 by apommier #+# #+# # -# Updated: 2023/02/15 17:14:51 by apommier ### ########.fr # +# Updated: 2023/02/16 18:21:46 by apommier ### ########.fr # # # # **************************************************************************** # @@ -36,6 +36,8 @@ SRCS := main.cpp\ \ commands/other/quit.cpp\ commands/other/ping_pong.cpp\ + commands/other/who.cpp\ + commands/other/names.cpp\ \ commands/channel_op/invite.cpp\ commands/channel_op/kick.cpp\ diff --git a/includes/ft_irc.hpp b/includes/ft_irc.hpp index 4389ec4..950bcbd 100644 --- a/includes/ft_irc.hpp +++ b/includes/ft_irc.hpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/01 17:27:37 by apommier #+# #+# */ -/* Updated: 2023/02/15 19:54:47 by apommier ### ########.fr */ +/* Updated: 2023/02/16 23:01:17 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -147,7 +147,7 @@ struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY struct epoll_event events[MAX_EVENTS]; int epollFd; int serverFd; - std::vector userList; + std::vector userFdList; accessList channelList; accessList userData; @@ -200,6 +200,7 @@ void split_but_keep(std::string const &str, const char delim, std::vector +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/09 22:34:36 by apommier #+# #+# */ -/* Updated: 2023/02/13 19:21:07 by apommier ### ########.fr */ +/* Updated: 2023/02/16 23:01:04 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,7 +23,7 @@ bool clientRequest(fdList &allFds, int userNbr)//, //buf.reserve(1024); //se demerder pour join quand pas \n // std::cout << "fd in client request " << allFds.userData[userNbr].fd << std::endl; - // std::cout << "fd of list in client request " << allFds.userList[userNbr] << std::endl; + // std::cout << "fd of list in client request " << allFds.userFdList[userNbr] << std::endl; // std::cout << "user nbr " << userNbr << std::endl; //std::cout << "client request!" << std::endl; @@ -38,7 +38,7 @@ bool clientRequest(fdList &allFds, int userNbr)//, delete_user(allFds, userNbr); // close(allFds.userData[userNbr].fd); // allFds.userData.erase(allFds.userData.begin() + userNbr); - // allFds.userList.erase(allFds.userList.begin() + userNbr); + // allFds.userFdList.erase(allFds.userFdList.begin() + userNbr); // allFds.nbrUser--; // std::cout << "buffer empty\n"; return (1); diff --git a/srcs/commands/channel/channel_utils.cpp b/srcs/commands/channel/channel_utils.cpp index a3fb99a..b8e9e7f 100644 --- a/srcs/commands/channel/channel_utils.cpp +++ b/srcs/commands/channel/channel_utils.cpp @@ -6,12 +6,29 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/09 17:21:57 by apommier #+# #+# */ -/* Updated: 2023/02/14 20:13:38 by apommier ### ########.fr */ +/* Updated: 2023/02/16 22:52:31 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" +int is_chan_op(fdList &allFds, channelData *chanName, int userNbr) +{ + std::vector::iterator start = chanName->opList.begin(); + std::vector::iterator pastEnd = chanName->opList.end(); + //std::cout << "name1= ---" << chanName << "---\n"; + while (start != pastEnd) + { + //std::cout << "result in find chan = " << pastEnd - start << std::endl; + std::cout << "test = " << chanName->opList[pastEnd - start - 1]->nickname << "---\n"; + if (chanName->opList[pastEnd - start - 1]->nickname == allFds.userData[userNbr].nickname) + return (1); + start++; + } + std::cout << "chan not found\n"; + return (0); +} + int is_joined(fdList &allFds, std::string chanName, int userNbr) { std::vector::iterator start = allFds.userData[userNbr].joinedChan.begin(); diff --git a/srcs/commands/channel/join.cpp b/srcs/commands/channel/join.cpp index fd11e0d..968b3c5 100644 --- a/srcs/commands/channel/join.cpp +++ b/srcs/commands/channel/join.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/09 15:40:33 by apommier #+# #+# */ -/* Updated: 2023/02/14 14:50:57 by apommier ### ########.fr */ +/* Updated: 2023/02/16 18:47:49 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -70,15 +70,13 @@ int chan_check(fdList &allFds, int userNbr, int chanNbr, std::vector splitBuff, fdList &allFds, int userNbr) +void join_or_create(std::string buffer, fdList &allFds, int userNbr) { int chanNbr; channelData joined_chan; - + std::vector splitBuff; + + split(buffer, ' ', splitBuff); chanNbr = find_channel(allFds, splitBuff[1]); if (chanNbr != -1) //chan already exist { @@ -93,11 +91,10 @@ void join_or_create(std::vector splitBuff, fdList &allFds, int user { std::cout << "new chan\n"; channelData new_chan; - + new_chan.name = splitBuff[1]; new_chan.nbrUser = 1; new_chan.userList.push_back(&allFds.userData[userNbr]); - //new_chan.userList joined_chan = new_chan; allFds.channelList.push_back(new_chan); allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList.back());//add chan in user data @@ -118,7 +115,36 @@ void join_or_create(std::vector splitBuff, fdList &allFds, int user - +void join_loop(fdList &allFds, std::vector splitBuff, int userNbr) +{ + std::vector splitChan; + std::vector splitPwd; + std::string buffer; + + split(buffer, ',', splitChan); + split(buffer, ',', splitPwd); + if (splitBuff[1] == "0") + { + leave_all(allFds, userNbr); + return ; + } + for (size_t i = 0; i < splitChan.size(); i++) + { + if (splitBuff[1][0] != '#' && splitBuff[1][0] != '&') + { + //error bad channel name + buffer = "476 * JOIN " + splitBuff[1] + " ::Bad Channel Mask\n"; + cmd_error(allFds, allFds.userData[userNbr].fd, buffer); + //:Bad Channel Mask + return ; + } + if (i < splitPwd.size()) + buffer = "JOIN " + splitChan[i] + " " + splitPwd[i]; + else + buffer = "JOIN " + splitChan[i]; + join_or_create(buffer, allFds, userNbr); + } +} @@ -143,20 +169,8 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr) cmd_error(allFds, allFds.userData[userNbr].fd, "461 * JOIN :Not enough parameters\n"); //ERR_NEEDMOREPARAMS return ; } + join_loop(allFds, splitBuff, userNbr); //if (splitBuff[1].find(' ') != std::string::npos || splitBuff[1].find(7) != std::string::npos) - if (splitBuff[1][0] != '#' && splitBuff[1][0] != '&') - { - //error bad channel name - msg = "476 * JOIN " + splitBuff[1] + " ::Bad Channel Mask\n"; - cmd_error(allFds, allFds.userData[userNbr].fd, msg); - //:Bad Channel Mask - return ; - } - if (splitBuff[1] == "0") - { - leave_all(allFds, userNbr); - return ; - } - join_or_create(splitBuff, allFds, userNbr); + //send 352 and 315 or 353 and 366 (WHO or NAME) } \ No newline at end of file diff --git a/srcs/commands/channel_op/invite.cpp b/srcs/commands/channel_op/invite.cpp index 3c8c227..f3b7183 100644 --- a/srcs/commands/channel_op/invite.cpp +++ b/srcs/commands/channel_op/invite.cpp @@ -6,16 +6,68 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 19:19:56 by apommier #+# #+# */ -/* Updated: 2023/02/11 20:06:47 by apommier ### ########.fr */ +/* Updated: 2023/02/16 23:03:43 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" +// Commande: INVITE +// Paramètres: + +// ERR_NEEDMOREPARAMS ERR_NOSUCHNICK +// ERR_NOTONCHANNEL ERR_USERONCHANNEL +// ERR_CHANOPRIVSNEEDED +// RPL_INVITING RPL_AWAY + void INVITE(std::string buffer, fdList &allFds, int userNbr) { - (void)buffer; - (void)allFds; - (void)userNbr; + std::vector splitBuff; + int invitedNbr; + channelData chan; + int chanNbr; + + split(buffer, ' ', splitBuff); + if (splitBuff.size() < 3) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "461 * INVITE :Not enough parameters\n"); + return ; + } + if ((invitedNbr = find_user(allFds, splitBuff[1])) == -1) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "401 * " + splitBuff[1] + " :No such nick/channel\n"); + return ; + } + if (is_joined(allFds, splitBuff[2], userNbr) == -1) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "422 * " + splitBuff[2] + " :You're not on that channel\n"); + return ; + } + if (is_joined(allFds, splitBuff[2], invitedNbr) != -1) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "443 * " + splitBuff[1] + " " + splitBuff[2] + " :is already on channel\n"); + return ; + } + if (is_joined(allFds, splitBuff[2], invitedNbr) != -1) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "443 * " + splitBuff[1] + " " + splitBuff[2] + " :is already on channel\n"); + return ; + } + if ((chanNbr = find_channel(allFds, splitBuff[2])) != -1) + { + chan = allFds.channelList[chanNbr]; + if (!is_chan_op(allFds, &chan, userNbr)) + cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[2] + " :You're not channel operator\n"); + return ; + } + else if (!allFds.userData[userNbr].op) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[2] + " :You're not channel operator\n"); + return ; + } + std::cout << "invite him !!!!" << splitBuff[1] << " to " << splitBuff[2] << std::endl; + //RPL_INVITING + //RPL_AWAY + //set authorization to join return ; } \ No newline at end of file diff --git a/srcs/commands/not_done_cmd.cpp b/srcs/commands/not_done_cmd.cpp index 5f86db3..ef9856b 100644 --- a/srcs/commands/not_done_cmd.cpp +++ b/srcs/commands/not_done_cmd.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/09 22:04:11 by apommier #+# #+# */ -/* Updated: 2023/02/15 17:00:46 by apommier ### ########.fr */ +/* Updated: 2023/02/16 18:19:44 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,13 +39,6 @@ void PART(std::string buffer, fdList &allFds, int userNbr) -void NAMES(std::string buffer, fdList &allFds, int userNbr) -{ - (void)buffer; - (void)allFds; - (void)userNbr; - return ; -} void LIST(std::string buffer, fdList &allFds, int userNbr) { @@ -139,13 +132,7 @@ void INFO(std::string buffer, fdList &allFds, int userNbr) // return ; // } -void WHO(std::string buffer, fdList &allFds, int userNbr) -{ - (void)buffer; - (void)allFds; - (void)userNbr; - return ; -} + void WHOIS(std::string buffer, fdList &allFds, int userNbr) { diff --git a/srcs/commands/operator/wallops.cpp b/srcs/commands/operator/wallops.cpp new file mode 100644 index 0000000..aa6f064 --- /dev/null +++ b/srcs/commands/operator/wallops.cpp @@ -0,0 +1,13 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* wallops.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/16 17:09:38 by apommier #+# #+# */ +/* Updated: 2023/02/16 17:09:45 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../../includes/ft_irc.hpp" \ No newline at end of file diff --git a/srcs/commands/other/names.cpp b/srcs/commands/other/names.cpp new file mode 100644 index 0000000..7de7f60 --- /dev/null +++ b/srcs/commands/other/names.cpp @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* names.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/16 18:14:15 by apommier #+# #+# */ +/* Updated: 2023/02/16 18:19:48 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../../includes/ft_irc.hpp" + +void NAMES(std::string buffer, fdList &allFds, int userNbr) +{ + (void)buffer; + (void)allFds; + (void)userNbr; + return ; +} diff --git a/srcs/commands/other/quit.cpp b/srcs/commands/other/quit.cpp index 43de71a..225e8d5 100644 --- a/srcs/commands/other/quit.cpp +++ b/srcs/commands/other/quit.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 19:10:26 by apommier #+# #+# */ -/* Updated: 2023/02/15 20:15:13 by apommier ### ########.fr */ +/* Updated: 2023/02/16 22:25:37 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,10 +40,11 @@ void send_quit_msg(fdList &allFds, int userNbr, std::string msg) void QUIT(std::string buffer, fdList &allFds, int userNbr) { std::vector splitBuff; + split(buffer, ' ', splitBuff); - if (splitBuff.size() == 2) + if (splitBuff.size() > 2) { - send_quit_msg(allFds, userNbr, splitBuff[1]); + send_quit_msg(allFds, userNbr, buffer.substr(5, std::string::npos));//to test //print message? //:kinou2!kinou@172.17.0.1 QUIT :Quit: leaving } diff --git a/srcs/commands/other/who.cpp b/srcs/commands/other/who.cpp new file mode 100644 index 0000000..8e7dce3 --- /dev/null +++ b/srcs/commands/other/who.cpp @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* who.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/16 18:14:17 by apommier #+# #+# */ +/* Updated: 2023/02/16 18:19:32 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../../includes/ft_irc.hpp" + +void WHO(std::string buffer, fdList &allFds, int userNbr) +{ + (void)buffer; + (void)allFds; + (void)userNbr; + return ; +} \ No newline at end of file diff --git a/srcs/delete_user.cpp b/srcs/delete_user.cpp index 84ce69b..28e5108 100644 --- a/srcs/delete_user.cpp +++ b/srcs/delete_user.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/12 20:38:50 by apommier #+# #+# */ -/* Updated: 2023/02/13 20:25:45 by apommier ### ########.fr */ +/* Updated: 2023/02/16 23:01:04 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,7 +33,7 @@ void delete_user(fdList &allFds, int userNbr) close(allFds.userData[userNbr].fd); allFds.userData.erase(allFds.userData.begin() + userNbr); - allFds.userList.erase(allFds.userList.begin() + userNbr); + allFds.userFdList.erase(allFds.userFdList.begin() + userNbr); allFds.nbrUser--; } \ No newline at end of file diff --git a/srcs/new_connection.cpp b/srcs/new_connection.cpp index 66f68c9..5a26f1a 100644 --- a/srcs/new_connection.cpp +++ b/srcs/new_connection.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/09 22:26:27 by apommier #+# #+# */ -/* Updated: 2023/02/13 19:46:41 by apommier ### ########.fr */ +/* Updated: 2023/02/16 23:01:04 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,10 +29,10 @@ void new_connection(fdList &allFds) // } //int newUserFd; - //allFds.userList.push_back(newUserFd); + //allFds.userFdList.push_back(newUserFd); newFd = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen); - //allFds.userList[allFds.nbrUser] = newFd; - allFds.userList.push_back(newFd); + //allFds.userFdList[allFds.nbrUser] = newFd; + allFds.userFdList.push_back(newFd); //std::cout << "newConnection | old user fd = " << newFd << std::endl; if (fcntl(newFd, F_SETFL, O_NONBLOCK) == -1) ft_error("fctnl() error"); @@ -40,7 +40,7 @@ void new_connection(fdList &allFds) //std::cout << "fcntl return = " << newFd; //close(newFd); - //std::cout << "newConnection | user fd = " << allFds.userList[allFds.nbrUser] << std::endl; + //std::cout << "newConnection | user fd = " << allFds.userFdList[allFds.nbrUser] << std::endl; clientData newElement; newElement.fd = newFd; @@ -48,9 +48,9 @@ void new_connection(fdList &allFds) newElement.ip = inet_ntoa(addr.sin_addr); //newElement.op = 0; allFds.userData.push_back(newElement); - //allFds.userData[allFds.nbrUser].fd = allFds.userList[allFds.nbrUser]; + //allFds.userData[allFds.nbrUser].fd = allFds.userFdList[allFds.nbrUser]; //std::cout << "newConnection | user in data fd = " << allFds.userData[allFds.nbrUser].fd << std::endl; - epoll_add(allFds.epollFd, allFds.userList[allFds.nbrUser]); + epoll_add(allFds.epollFd, allFds.userFdList[allFds.nbrUser]); allFds.nbrUser++; } \ No newline at end of file diff --git a/srcs/server_loop.cpp b/srcs/server_loop.cpp index adb16b2..95663b2 100644 --- a/srcs/server_loop.cpp +++ b/srcs/server_loop.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 21:58:13 by apommier #+# #+# */ -/* Updated: 2023/02/14 18:11:44 by apommier ### ########.fr */ +/* Updated: 2023/02/16 23:01:04 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -49,7 +49,7 @@ void start_loop(fdList &allFds) } else { - nbr = find(allFds.userList.begin(), allFds.userList.end(), allFds.events[i].data.fd) - allFds.userList.begin(); + nbr = find(allFds.userFdList.begin(), allFds.userFdList.end(), allFds.events[i].data.fd) - allFds.userFdList.begin(); //if (!clientRequest(allFds, i)) // if (!clientRequest(allFds, nbr)) // alive = false;