From 68466e609ac699d37de0da210f956845d6d4e5c3 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 16 Feb 2023 23:06:21 +0100 Subject: [PATCH 1/3] add invite cmd and prepare cpp file for who ? names? wallops? add multiple join not tested --- Makefile | 4 +- includes/ft_irc.hpp | 5 +- srcs/client_request.cpp | 6 +-- srcs/commands/channel/channel_utils.cpp | 19 +++++++- srcs/commands/channel/join.cpp | 62 +++++++++++++++---------- srcs/commands/channel_op/invite.cpp | 60 ++++++++++++++++++++++-- srcs/commands/not_done_cmd.cpp | 17 +------ srcs/commands/operator/wallops.cpp | 13 ++++++ srcs/commands/other/names.cpp | 21 +++++++++ srcs/commands/other/quit.cpp | 7 +-- srcs/commands/other/who.cpp | 21 +++++++++ srcs/delete_user.cpp | 4 +- srcs/new_connection.cpp | 14 +++--- srcs/server_loop.cpp | 4 +- 14 files changed, 193 insertions(+), 64 deletions(-) create mode 100644 srcs/commands/operator/wallops.cpp create mode 100644 srcs/commands/other/names.cpp create mode 100644 srcs/commands/other/who.cpp 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; From da5580b615f9dfc47e2271673e776ca393c367e4 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Sat, 18 Feb 2023 00:52:35 +0100 Subject: [PATCH 2/3] flemme de fou kick topic wallops start name --- Makefile | 3 +- includes/ft_irc.hpp | 4 +- srcs/commands/channel/channel_utils.cpp | 4 +- srcs/commands/channel/join.cpp | 5 ++- srcs/commands/channel/list.cpp | 12 +++++ srcs/commands/channel/privmsg.cpp | 7 ++- srcs/commands/channel_op/kick.cpp | 58 +++++++++++++++++++++++-- srcs/commands/channel_op/topic.cpp | 39 +++++++++++++++-- srcs/commands/operator/oper.cpp | 3 +- srcs/commands/operator/wallops.cpp | 27 +++++++++++- srcs/commands/other/names.cpp | 21 ++++++++- srcs/delete_user.cpp | 11 ++++- 12 files changed, 174 insertions(+), 20 deletions(-) create mode 100644 srcs/commands/channel/list.cpp diff --git a/Makefile b/Makefile index becf1fa..7a635f9 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: apommier +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/12/01 17:27:29 by apommier #+# #+# # -# Updated: 2023/02/16 18:21:46 by apommier ### ########.fr # +# Updated: 2023/02/17 16:02:14 by apommier ### ########.fr # # # # **************************************************************************** # @@ -47,6 +47,7 @@ SRCS := main.cpp\ commands/operator/squit.cpp\ commands/operator/oper.cpp\ commands/operator/kill.cpp\ + commands/operator/wallops.cpp\ \ commands/not_done_cmd.cpp #special (temporary) diff --git a/includes/ft_irc.hpp b/includes/ft_irc.hpp index 950bcbd..1a51479 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/16 23:01:17 by apommier ### ########.fr */ +/* Updated: 2023/02/17 21:56:13 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -132,6 +132,7 @@ struct channelData //each chan have one std::vector userList; std::vector banList; + //std::vector invitedList; std::vector opList; chanMode mode; @@ -169,6 +170,7 @@ struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY /* ************************************************************************** */ void del_user_in_chan(clientData *user, channelData *chan); +void del_chan_in_user(clientData *user, channelData *chan); void delete_user(fdList &allFds, int userNbr); /* ************************************************************************** */ diff --git a/srcs/commands/channel/channel_utils.cpp b/srcs/commands/channel/channel_utils.cpp index b8e9e7f..86630f5 100644 --- a/srcs/commands/channel/channel_utils.cpp +++ b/srcs/commands/channel/channel_utils.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/09 17:21:57 by apommier #+# #+# */ -/* Updated: 2023/02/16 22:52:31 by apommier ### ########.fr */ +/* Updated: 2023/02/16 23:26:08 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,8 @@ 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"; + if (allFds.userData[userNbr].op) + return (1); while (start != pastEnd) { //std::cout << "result in find chan = " << pastEnd - start << std::endl; diff --git a/srcs/commands/channel/join.cpp b/srcs/commands/channel/join.cpp index 968b3c5..7379429 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/16 18:47:49 by apommier ### ########.fr */ +/* Updated: 2023/02/16 23:47:14 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -91,7 +91,8 @@ void join_or_create(std::string buffer, fdList &allFds, int userNbr) { std::cout << "new chan\n"; channelData new_chan; - + if (splitBuff[1][0] != '#' && splitBuff[1][0] != '&') + cmd_error(allFds, allFds.userData[userNbr].fd, "476 * " + splitBuff[1] + " :Bad Channel Mask\n"); new_chan.name = splitBuff[1]; new_chan.nbrUser = 1; new_chan.userList.push_back(&allFds.userData[userNbr]); diff --git a/srcs/commands/channel/list.cpp b/srcs/commands/channel/list.cpp new file mode 100644 index 0000000..dea4e3c --- /dev/null +++ b/srcs/commands/channel/list.cpp @@ -0,0 +1,12 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/18 00:50:51 by apommier #+# #+# */ +/* Updated: 2023/02/18 00:50:52 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + diff --git a/srcs/commands/channel/privmsg.cpp b/srcs/commands/channel/privmsg.cpp index 1867728..054a1a3 100644 --- a/srcs/commands/channel/privmsg.cpp +++ b/srcs/commands/channel/privmsg.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 08:53:03 by apommier #+# #+# */ -/* Updated: 2023/02/15 15:18:38 by apommier ### ########.fr */ +/* Updated: 2023/02/16 23:20:25 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -62,6 +62,11 @@ void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr) cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/channel\n"); return ; } + // if (allFds.channelList[pos].mode.m && !allFds.userData[userNbr].op && !is_chan_op(allFds, &allFds.channelList[pos], userNbr) && !allFds.channelList[pos].userMode[nbr].v) + // { + // cmd_error(allFds, allFds.userData[userNbr].fd, "404 * PRIVMSG " + dest + " :Cannot send to channel\n"); + // return ; + // } for (size_t i = 0; i < allFds.channelList[pos].userList.size(); i++) { std::cout << "send nickname " << allFds.channelList[pos].userList[i]->nickname << std::endl; diff --git a/srcs/commands/channel_op/kick.cpp b/srcs/commands/channel_op/kick.cpp index 5172677..a697fb1 100644 --- a/srcs/commands/channel_op/kick.cpp +++ b/srcs/commands/channel_op/kick.cpp @@ -6,16 +6,66 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 19:19:32 by apommier #+# #+# */ -/* Updated: 2023/02/11 20:06:32 by apommier ### ########.fr */ +/* Updated: 2023/02/17 21:54:06 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" +//Paramètres: [] + void KICK(std::string buffer, fdList &allFds, int userNbr) { - (void)buffer; - (void)allFds; - (void)userNbr; + std::vector splitBuff; + std::string msg; + int chanPos; + int userPos; + channelData chan; + + split(buffer, ' ', splitBuff); + if (splitBuff.size() < 3) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "431 * KICK :Not enought argument\n"); + return ; + } + + if ((chanPos = find_channel(allFds, splitBuff[1])) == -1) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "401 * KICK " + splitBuff[1] + " :No such nick/channel\n"); + return ; + } + if (!allFds.userData[userNbr].op && is_joined(allFds, splitBuff[1], userNbr) == -1) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "422 * " + splitBuff[1] + " :You're not on that channel\n"); + return ; + } + if (chanPos != -1) + { + chan = allFds.channelList[chanPos]; + if (!is_chan_op(allFds, &chan, userNbr) && !allFds.userData[userNbr].op) + cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); + return ; + } + msg = ":" + allFds.userData[userNbr].nickname + " KICK " + chan.name + " " + splitBuff[2]; + if (splitBuff.size() > 3) + msg += ": " + buffer.substr(splitBuff[0].size() + splitBuff[1].size() + splitBuff[2].size() + 1, std::string::npos); + if ((userPos = find_user(allFds, splitBuff[2])) == -1) + return ; + del_user_in_chan(&allFds.userData[userPos], &allFds.channelList[chanPos]); + del_chan_in_user(&allFds.userData[userPos], &allFds.channelList[chanPos]); + send(allFds.userData[userPos].fd, msg.c_str(), msg.size(), 0); + + // else if (!allFds.userData[userNbr].op) + // { + // cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); + // return ; + // } + + + + + + + return ; } \ No newline at end of file diff --git a/srcs/commands/channel_op/topic.cpp b/srcs/commands/channel_op/topic.cpp index 5059cf8..89c699b 100644 --- a/srcs/commands/channel_op/topic.cpp +++ b/srcs/commands/channel_op/topic.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 19:19:52 by apommier #+# #+# */ -/* Updated: 2023/02/11 20:05:50 by apommier ### ########.fr */ +/* Updated: 2023/02/17 21:55:29 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,39 @@ void TOPIC(std::string buffer, fdList &allFds, int userNbr) { - (void)buffer; - (void)allFds; - (void)userNbr; + channelData chan; + int chanNbr; + std::vector splitBuff; + + split(buffer, ' ', splitBuff); + if (splitBuff.size() < 2) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "461 * TOPIC :Not enough parameters\n"); + return ; + } + if (is_joined(allFds, splitBuff[1], userNbr) == -1) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "422 * " + splitBuff[1] + " :You're not on that channel\n"); + return ; + } + if ((chanNbr = find_channel(allFds, splitBuff[1])) != -1) + { + chan = allFds.channelList[chanNbr]; + if (!is_chan_op(allFds, &chan, userNbr) && !allFds.userData[userNbr].op) + cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); + return ; + } + // else if (!allFds.userData[userNbr].op && !allFds.userData[userNbr].op) + // { + // cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); + // return ; + // } + if (splitBuff.size() < 3) + std::cout << "PRINT TOPIC here\n";//RPL_NOTOPIC //RPL_TOPIC + else + { + allFds.channelList[chanNbr].topic = buffer.substr(6 + splitBuff[1].size() + 1, std::string::npos); + //RPL_TOPIC + } return ; } \ No newline at end of file diff --git a/srcs/commands/operator/oper.cpp b/srcs/commands/operator/oper.cpp index 8caa1fa..c890d2e 100644 --- a/srcs/commands/operator/oper.cpp +++ b/srcs/commands/operator/oper.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 19:04:47 by apommier #+# #+# */ -/* Updated: 2023/02/15 19:43:22 by apommier ### ########.fr */ +/* Updated: 2023/02/17 20:38:40 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,6 +41,7 @@ void OPER(std::string buffer, fdList &allFds, int userNbr) // return ; // } allFds.userData[userNbr].op = 1; + allFds.userData[userNbr].mode.s = 1; msg = "381 * " + allFds.userData[userNbr].nickname + " :You are now an IRC operator\n"; send(allFds.userData[userNbr].fd, msg.c_str(), msg.size(), 0); } \ No newline at end of file diff --git a/srcs/commands/operator/wallops.cpp b/srcs/commands/operator/wallops.cpp index aa6f064..43dbe21 100644 --- a/srcs/commands/operator/wallops.cpp +++ b/srcs/commands/operator/wallops.cpp @@ -6,8 +6,31 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/16 17:09:38 by apommier #+# #+# */ -/* Updated: 2023/02/16 17:09:45 by apommier ### ########.fr */ +/* Updated: 2023/02/17 21:13:21 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ -#include "../../../includes/ft_irc.hpp" \ No newline at end of file +#include "../../../includes/ft_irc.hpp" + + +void WALLOPS(std::string buffer, fdList &allFds, int userNbr) +{ + std::vector splitBuff; + std::string msg; + + //std::cout << "privmsg bufer= --" << buffer << std::endl; + split(buffer, ' ', splitBuff); + if (splitBuff.size() < 2) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "431 * WALLOPS :Not enought argument\n"); + return ; + } + msg = ":" + allFds.userData[userNbr].nickname + " WALLOPS :" + buffer.substr(splitBuff[1].size() + std::string::npos + 1) + "\n"; + //msg = "PRIVMSG " + allFds.userData[userNbr].nickname + " " + buffer.substr(splitBuff[1].size() + std::string::npos + 1); + for (int i = 0; i < allFds.nbrUser; i++) + { + if (allFds.userData[i].op && allFds.userData[i].mode.s) + send(allFds.userData[i].fd, msg.c_str(), msg.size(), 0); + //PRIVMSG(msg, allFds, userNbr); + } +} \ No newline at end of file diff --git a/srcs/commands/other/names.cpp b/srcs/commands/other/names.cpp index 7de7f60..273dc8b 100644 --- a/srcs/commands/other/names.cpp +++ b/srcs/commands/other/names.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/16 18:14:15 by apommier #+# #+# */ -/* Updated: 2023/02/16 18:19:48 by apommier ### ########.fr */ +/* Updated: 2023/02/18 00:51:24 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,5 +17,22 @@ void NAMES(std::string buffer, fdList &allFds, int userNbr) (void)buffer; (void)allFds; (void)userNbr; - return ; + // std::vector splitBuff; + // int pos; + + // split(buffer, ' ', splitBuff); + // if (splitBuff.size() == 1 || splitBuff[1] == "0") + // { + // for (int i = 0; i < allFds.nbrUser; i++) + // { + // if (!allFds.userData[i].mode.i) + // { + // //print who + // } + // } + // return ; + // } + // if (pos = find_channel(allFds, splitBuff[1]) != -1) + + // return ; } diff --git a/srcs/delete_user.cpp b/srcs/delete_user.cpp index 28e5108..4cd0b74 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/16 23:01:04 by apommier ### ########.fr */ +/* Updated: 2023/02/17 21:49:52 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,15 @@ void del_user_in_chan(clientData *user, channelData *chan) chan->nbrUser--; } +void del_chan_in_user(clientData *user, channelData *chan) +{ + size_t i; + for (i = 0; chan != user->joinedChan[i]; i++) + ; + user->joinedChan.erase(user->joinedChan.begin() + i); + //user->nbrUser--; +} + void delete_user(fdList &allFds, int userNbr) { std::cout << "Delete user nbr " << userNbr << std::endl; From 95370cc0a0d094792b108c7225df46cb0888c92d Mon Sep 17 00:00:00 2001 From: kinou-p Date: Wed, 22 Feb 2023 20:05:25 +0100 Subject: [PATCH 3/3] flemme de fou encore toutes les cmds? sauf invite --- Makefile | 3 +- includes/ft_irc.hpp | 5 +- srcs/commands/channel/channel_utils.cpp | 54 ++++++++++++++++---- srcs/commands/channel/join.cpp | 33 ++++++++++--- srcs/commands/channel/part.cpp | 66 +++++++++++++++++++++++++ srcs/commands/channel/privmsg.cpp | 24 +++++---- srcs/commands/channel_op/invite.cpp | 12 ++--- srcs/commands/channel_op/kick.cpp | 29 ++++++----- srcs/commands/channel_op/topic.cpp | 23 +++++++-- srcs/commands/not_done_cmd.cpp | 9 +--- srcs/commands/other/names.cpp | 66 ++++++++++++++++++------- srcs/commands/other/who.cpp | 60 ++++++++++++++++++++-- srcs/epoll.cpp | 3 +- srcs/utils.cpp | 29 +++++++++-- 14 files changed, 329 insertions(+), 87 deletions(-) create mode 100644 srcs/commands/channel/part.cpp diff --git a/Makefile b/Makefile index 7a635f9..68929e7 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: apommier +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/12/01 17:27:29 by apommier #+# #+# # -# Updated: 2023/02/17 16:02:14 by apommier ### ########.fr # +# Updated: 2023/02/19 22:11:26 by apommier ### ########.fr # # # # **************************************************************************** # @@ -33,6 +33,7 @@ SRCS := main.cpp\ commands/channel/join.cpp\ commands/channel/privmsg.cpp\ commands/channel/notice.cpp\ + commands/channel/part.cpp\ \ commands/other/quit.cpp\ commands/other/ping_pong.cpp\ diff --git a/includes/ft_irc.hpp b/includes/ft_irc.hpp index 1a51479..677abc5 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/17 21:56:13 by apommier ### ########.fr */ +/* Updated: 2023/02/22 13:40:08 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -133,6 +133,7 @@ struct channelData //each chan have one std::vector userList; std::vector banList; //std::vector invitedList; + //std::vector verboseList; std::vector opList; chanMode mode; @@ -179,6 +180,7 @@ void delete_user(fdList &allFds, int userNbr); void ft_putstr_fd(int fd, std::string str); void cmd_error(fdList &allFds, int userNbr, std::string error); +void cmd_reply(fdList &allFds, int userNbr, std::string error); void ft_error(std::string str); void close_fd(int fd); int contain_any(std::string str, std::string toFind); @@ -202,6 +204,7 @@ void split_but_keep(std::string const &str, const char delim, std::vector +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/09 17:21:57 by apommier #+# #+# */ -/* Updated: 2023/02/16 23:26:08 by apommier ### ########.fr */ +/* Updated: 2023/02/21 02:02:38 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,7 +27,7 @@ int is_chan_op(fdList &allFds, channelData *chanName, int userNbr) return (1); start++; } - std::cout << "chan not found\n"; + std::cout << "chan not found in is op\n"; return (0); } @@ -35,16 +35,17 @@ int is_joined(fdList &allFds, std::string chanName, int userNbr) { std::vector::iterator start = allFds.userData[userNbr].joinedChan.begin(); std::vector::iterator pastEnd = allFds.userData[userNbr].joinedChan.end(); - //std::cout << "name1= ---" << chanName << "---\n"; + std::cout << "name1= ---" << chanName << "---\n"; while (start != pastEnd) { - //std::cout << "result in find chan = " << pastEnd - start << std::endl; - std::cout << "test = " << allFds.userData[userNbr].joinedChan[pastEnd - start - 1]->name << "---\n"; + + std::cout << "result in find chan = " << pastEnd - start << std::endl; + std::cout << "test is joined= " << allFds.userData[userNbr].joinedChan[pastEnd - start - 1]->name << "---\n"; if (allFds.userData[userNbr].joinedChan[pastEnd - start - 1]->name == chanName) return (pastEnd - start - 1); start++; } - std::cout << "chan not found\n"; + std::cout << "chan not found in is joined\n"; return (-1); } @@ -52,16 +53,16 @@ int find_channel(fdList &allFds, std::string chanName)//return channel nbr { std::_List_iterator start = allFds.channelList.begin(); std::_List_iterator pastEnd = allFds.channelList.end(); - //std::cout << "name1= ---" << chanName << "---\n"; + std::cout << "name1= ---" << chanName << "---\n"; while (start != pastEnd) { - //std::cout << "result in find chan = " << pastEnd - start << std::endl; + std::cout << "chan = ---" << allFds.channelList[pastEnd - start - 1].name << "---" << std::endl; std::cout << "test = " << allFds.channelList[pastEnd - start - 1].name << "---\n"; if (allFds.channelList[pastEnd - start - 1].name == chanName) return (pastEnd - start - 1); start++; } - std::cout << "chan not found\n"; + std::cout << "chan not found in find \n"; return (-1); } @@ -82,3 +83,38 @@ int find_user(fdList &allFds, std::string userName)//return direct user fd return (-1); } +int is_in_same(fdList &allFds, int userNbr, int userNbr2) +{ + size_t size; + if (allFds.userData[userNbr].joinedChan.size() <= allFds.userData[userNbr2].joinedChan.size()) + size = allFds.userData[userNbr].joinedChan.size(); + else + size = allFds.userData[userNbr2].joinedChan.size(); + for (size_t i = 0; i < size; i++) + { + for (size_t j = 0; j < size; j++) + { + if (allFds.userData[userNbr].joinedChan[i] == allFds.userData[userNbr2].joinedChan[j]) + return (1); + } + } + return (0); +} + +// int is_in_same(fdList &allFds, int userNbr, int userNbr2) +// { +// size_t size; +// if (allFds.userData[userNbr].joinedChan.size() <= allFds.userData[userNbr2].joinedChan.size()) +// size = allFds.userData[userNbr].joinedChan.size(); +// else +// size = allFds.userData[userNbr2].joinedChan.size(); +// for (size_t i = 0; i < size; i++) +// { +// for (size_t j = 0; j < size; j++) +// { +// if (allFds.userData[userNbr].joinedChan[i] == allFds.userData[userNbr2].joinedChan[j]) +// return (1); +// } +// } +// return (0); +// } diff --git a/srcs/commands/channel/join.cpp b/srcs/commands/channel/join.cpp index 7379429..8ed5bd1 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/16 23:47:14 by apommier ### ########.fr */ +/* Updated: 2023/02/19 18:18:29 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -76,6 +76,7 @@ void join_or_create(std::string buffer, fdList &allFds, int userNbr) channelData joined_chan; std::vector splitBuff; + std::cout << "JOINORCREATE\n"; split(buffer, ' ', splitBuff); chanNbr = find_channel(allFds, splitBuff[1]); if (chanNbr != -1) //chan already exist @@ -100,13 +101,20 @@ void join_or_create(std::string buffer, fdList &allFds, int userNbr) allFds.channelList.push_back(new_chan); allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList.back());//add chan in user data } + std::string fullMsg; + fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " JOIN :" + joined_chan.name + "\n"; for (int i = 0; i < joined_chan.nbrUser; i++) { - std::string fullMsg; - fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " JOIN :" + joined_chan.name + "\n"; send(joined_chan.userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0); std::cout << "loop here\n"; } + + if (chanNbr == -1) + chanNbr = find_channel(allFds, splitBuff[1]); + if (!allFds.channelList[chanNbr].topic.empty()) + cmd_reply(allFds, allFds.userData[userNbr].fd, "332 TOPIC " + allFds.channelList[chanNbr].name + " :" + allFds.channelList[chanNbr].topic + "\n"); + else + cmd_error(allFds, allFds.userData[userNbr].fd, "331 TOPIC " + allFds.channelList[chanNbr].name + " :No topic is set\n"); // if (chanNbr == -1) // { @@ -122,21 +130,27 @@ void join_loop(fdList &allFds, std::vector splitBuff, int userNbr) std::vector splitPwd; std::string buffer; - split(buffer, ',', splitChan); - split(buffer, ',', splitPwd); + std::cout << "join loop buf= " << splitBuff[1] << std::endl; + std::cout << "==========join loop========\n"; + split(splitBuff[1], ',', splitChan); + split(splitBuff[1], ',', splitPwd); if (splitBuff[1] == "0") { leave_all(allFds, userNbr); return ; } + std::cout << "==========join loop2========\n"; + std::cout << "size= " << splitChan.size() << std::endl; + std::cout << "content= " << splitChan[0] << std::endl; for (size_t i = 0; i < splitChan.size(); i++) { - if (splitBuff[1][0] != '#' && splitBuff[1][0] != '&') + if (splitChan[i][0] != '#' && splitChan[i][0] != '&') { //error bad channel name - buffer = "476 * JOIN " + splitBuff[1] + " ::Bad Channel Mask\n"; + buffer = "476 * JOIN " + splitChan[i] + " ::Bad Channel Mask\n"; cmd_error(allFds, allFds.userData[userNbr].fd, buffer); //:Bad Channel Mask + std::cout << "bad chan mask\n"; return ; } if (i < splitPwd.size()) @@ -144,7 +158,9 @@ void join_loop(fdList &allFds, std::vector splitBuff, int userNbr) else buffer = "JOIN " + splitChan[i]; join_or_create(buffer, allFds, userNbr); + std::cout << "i= " << i << " ==========join loop3========\n"; } + std::cout << "==========join loop3========\n"; } @@ -159,7 +175,7 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr) std::cout << "userNbr= " << userNbr << std::endl; if (!allFds.userData[userNbr].registered) { - /*change error*/ + std::cout << "user not registered\n"; cmd_error(allFds, allFds.userData[userNbr].fd, "451 * JOIN :You have not registered\n"); //ERR_NEEDMOREPARAMS return ; } @@ -167,6 +183,7 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr) if (splitBuff.size() < 2) { /*change error*/ + std::cout << "JOIN : need more param\n"; cmd_error(allFds, allFds.userData[userNbr].fd, "461 * JOIN :Not enough parameters\n"); //ERR_NEEDMOREPARAMS return ; } diff --git a/srcs/commands/channel/part.cpp b/srcs/commands/channel/part.cpp new file mode 100644 index 0000000..407d91b --- /dev/null +++ b/srcs/commands/channel/part.cpp @@ -0,0 +1,66 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* part.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/19 22:10:07 by apommier #+# #+# */ +/* Updated: 2023/02/20 17:50:46 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../../includes/ft_irc.hpp" + +void leave_chan(fdList &allFds, std::string chan, int userNbr, std::string msg) +{ + int chanPos; + std::string reply; + + if ((chanPos = find_channel(allFds, chan)) == -1) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PART " + chan + " :No such nick/channel\n"); + return ; + } + if (is_joined(allFds, chan, userNbr) == -1) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "422 * " + chan + " :You're not on that channel\n"); + return ; + } + del_user_in_chan(&allFds.userData[userNbr], &allFds.channelList[chanPos]); + del_chan_in_user(&allFds.userData[userNbr], &allFds.channelList[chanPos]); + //:WiZ!jto@tolsun.oulu.fi PART #playzone :I lost + //:awd!kinou@kinou PART #test + //reply = ":" + allFds.userData[userNbr].nickname + "!" + + + //reply = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " PART " + allFds.channelList[chanPos].name; + reply = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].hostName + " PART " + allFds.channelList[chanPos].name + "\n"; + //:awd!kinou@172.17.0.1 PART :#test tcpdump + //:awd!kinou@127.0.0.1 PART :#test + (void )msg; + //if (!msg.empty()) + // reply += " :" + msg; + std::cout << "leave msg=" << reply << std::endl; + send(allFds.userData[userNbr].fd, reply.c_str(), reply.size(), 0); + //cmd_reply(allFds, allFds.userData[userNbr].fd, reply + "\n"); +} + +void PART(std::string buffer, fdList &allFds, int userNbr) +{ + std::vector splitBuff; + std::vector splitChan; + std::string msg; + + split(buffer, ' ', splitBuff); + if (splitBuff.size() < 2) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "431 * PART :Not enought argument\n"); + return ; + } + split(splitBuff[1], ',', splitChan); + if (splitBuff.size() > 2) + msg = buffer.substr(splitBuff[0].size() + splitBuff[1].size() + 2, std::string::npos); + for (size_t i = 0; i < splitChan.size(); i++) + leave_chan(allFds, splitChan[i], userNbr, msg); + return ; +} diff --git a/srcs/commands/channel/privmsg.cpp b/srcs/commands/channel/privmsg.cpp index 054a1a3..f57ae02 100644 --- a/srcs/commands/channel/privmsg.cpp +++ b/srcs/commands/channel/privmsg.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 08:53:03 by apommier #+# #+# */ -/* Updated: 2023/02/16 23:20:25 by apommier ### ########.fr */ +/* Updated: 2023/02/20 11:51:26 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,7 +37,7 @@ void PRIVMSG(std::string buffer, fdList &allFds, int userNbr) cmd_error(allFds, allFds.userData[userNbr].fd, "412 * PRIVMSG :No text to send\n"); return ; } - std::cout << "privmsg =" << msg << std::endl; + //std::cout << "privmsg =" << msg << std::endl; std::vector dest; split(splitBuff[1], ',', dest); for (size_t i = 0; i < dest.size(); i++) @@ -52,18 +52,19 @@ void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr) fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@172.17.0.1 " + msg + "\n"; if (dest[0] == '&' || dest[0] == '#') { - if (is_joined(allFds, dest, userNbr) == -1) - { - cmd_error(allFds, allFds.userData[userNbr].fd, "442 * PRIVMSG " + dest + " :You're not on that channel\n"); - return ; - } - if ((pos = find_channel(allFds, dest)) == -1) + pos = find_channel(allFds, dest); + if (pos == -1) { cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/channel\n"); return ; } + if (allFds.channelList[pos].mode.n && is_joined(allFds, dest, userNbr) == -1 ) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "442 * PRIVMSG " + dest + " :You're not on that channel\n"); + return ; + } // if (allFds.channelList[pos].mode.m && !allFds.userData[userNbr].op && !is_chan_op(allFds, &allFds.channelList[pos], userNbr) && !allFds.channelList[pos].userMode[nbr].v) - // { + // { // cmd_error(allFds, allFds.userData[userNbr].fd, "404 * PRIVMSG " + dest + " :Cannot send to channel\n"); // return ; // } @@ -77,10 +78,13 @@ void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr) return ; } pos = find_user(allFds, dest); //return direct user fd - if (pos != -1) + std::cout << "pos of user = " << pos << std::endl; + if (pos == -1) { cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/channel\n"); return ; } send(allFds.userData[pos].fd, fullMsg.c_str(), fullMsg.size(), 0); + std::cout << "msg send\n"; + std::cout << "msg = " << fullMsg << std::endl; } \ No newline at end of file diff --git a/srcs/commands/channel_op/invite.cpp b/srcs/commands/channel_op/invite.cpp index f3b7183..549c147 100644 --- a/srcs/commands/channel_op/invite.cpp +++ b/srcs/commands/channel_op/invite.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 19:19:56 by apommier #+# #+# */ -/* Updated: 2023/02/16 23:03:43 by apommier ### ########.fr */ +/* Updated: 2023/02/19 22:27:00 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,11 +48,11 @@ void INVITE(std::string buffer, fdList &allFds, int userNbr) 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 (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]; diff --git a/srcs/commands/channel_op/kick.cpp b/srcs/commands/channel_op/kick.cpp index a697fb1..7030c2f 100644 --- a/srcs/commands/channel_op/kick.cpp +++ b/srcs/commands/channel_op/kick.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 19:19:32 by apommier #+# #+# */ -/* Updated: 2023/02/17 21:54:06 by apommier ### ########.fr */ +/* Updated: 2023/02/21 00:42:37 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,6 +18,7 @@ void KICK(std::string buffer, fdList &allFds, int userNbr) { std::vector splitBuff; std::string msg; + std::string kickMsg; int chanPos; int userPos; channelData chan; @@ -43,29 +44,35 @@ void KICK(std::string buffer, fdList &allFds, int userNbr) { chan = allFds.channelList[chanPos]; if (!is_chan_op(allFds, &chan, userNbr) && !allFds.userData[userNbr].op) + { cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); - return ; + return ; + } } msg = ":" + allFds.userData[userNbr].nickname + " KICK " + chan.name + " " + splitBuff[2]; if (splitBuff.size() > 3) msg += ": " + buffer.substr(splitBuff[0].size() + splitBuff[1].size() + splitBuff[2].size() + 1, std::string::npos); if ((userPos = find_user(allFds, splitBuff[2])) == -1) + { return ; - del_user_in_chan(&allFds.userData[userPos], &allFds.channelList[chanPos]); - del_chan_in_user(&allFds.userData[userPos], &allFds.channelList[chanPos]); + } + kickMsg = allFds.userData[userPos].nickname + " have been kicked by " + allFds.userData[userNbr].nickname + "\n"; + PART("PART " + splitBuff[1], allFds, userPos); + //del_user_in_chan(&allFds.userData[userPos], &allFds.channelList[chanPos]); + //del_chan_in_user(&allFds.userData[userPos], &allFds.channelList[chanPos]); + std::cout << "kick msg---" << msg << "---" << std::endl; send(allFds.userData[userPos].fd, msg.c_str(), msg.size(), 0); + //send_msg(allFds, msg, splitBuff[1], userNbr); + for (int i = 0; i < allFds.channelList[chanPos].nbrUser; i++) + { + send(allFds.channelList[chanPos].userList[i]->fd, kickMsg.c_str(), kickMsg.size(), 0); + } + //cmd_reply(allFds, allFds.userData[userPos].fd, msg); // else if (!allFds.userData[userNbr].op) // { // cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); // return ; // } - - - - - - - return ; } \ No newline at end of file diff --git a/srcs/commands/channel_op/topic.cpp b/srcs/commands/channel_op/topic.cpp index 89c699b..e87d0b5 100644 --- a/srcs/commands/channel_op/topic.cpp +++ b/srcs/commands/channel_op/topic.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 19:19:52 by apommier #+# #+# */ -/* Updated: 2023/02/17 21:55:29 by apommier ### ########.fr */ +/* Updated: 2023/02/19 22:07:14 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,6 +18,7 @@ void TOPIC(std::string buffer, fdList &allFds, int userNbr) int chanNbr; std::vector splitBuff; + std::cout << "topic im here1\n";//RPL_NOTOPIC //RPL_TOPIC split(buffer, ' ', splitBuff); if (splitBuff.size() < 2) { @@ -33,20 +34,32 @@ void TOPIC(std::string buffer, fdList &allFds, int userNbr) { chan = allFds.channelList[chanNbr]; if (!is_chan_op(allFds, &chan, userNbr) && !allFds.userData[userNbr].op) + { cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); - return ; + return ; + } } // else if (!allFds.userData[userNbr].op && !allFds.userData[userNbr].op) // { // cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); // return ; // } + std::cout << "topic im here2\n";//RPL_NOTOPIC //RPL_TOPIC if (splitBuff.size() < 3) - std::cout << "PRINT TOPIC here\n";//RPL_NOTOPIC //RPL_TOPIC + { + if (!allFds.channelList[chanNbr].topic.empty()) + cmd_reply(allFds, allFds.userData[userNbr].fd, "332 TOPIC " + splitBuff[1] + " :" + allFds.channelList[chanNbr].topic + "\n"); + else + cmd_error(allFds, allFds.userData[userNbr].fd, "331 TOPIC " + splitBuff[1] + " :No topic is set\n"); + return; + //std::cout << "PRINT TOPIC here\n";//RPL_NOTOPIC //RPL_TOPIC + } else { - allFds.channelList[chanNbr].topic = buffer.substr(6 + splitBuff[1].size() + 1, std::string::npos); - //RPL_TOPIC + allFds.channelList[chanNbr].topic = buffer.substr(6 + splitBuff[1].size() + 2, std::string::npos); + //std::cout << "topic= " << allFds.channelList[chanNbr].topic << std::endl; + cmd_reply(allFds, allFds.userData[userNbr].fd, "332 TOPIC " + splitBuff[1] + " :" + allFds.channelList[chanNbr].topic + "\n"); + //std::cout << "PRINT TOPIC here topic set\n";//RPL_NOTOPIC //RPL_TOPIC } return ; } \ No newline at end of file diff --git a/srcs/commands/not_done_cmd.cpp b/srcs/commands/not_done_cmd.cpp index ef9856b..0466b4d 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/16 18:19:44 by apommier ### ########.fr */ +/* Updated: 2023/02/19 22:11:59 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,13 +28,6 @@ void SERVER(std::string buffer, fdList &allFds, int userNbr) // return ; // } -void PART(std::string buffer, fdList &allFds, int userNbr) -{ - (void)buffer; - (void)allFds; - (void)userNbr; - return ; -} diff --git a/srcs/commands/other/names.cpp b/srcs/commands/other/names.cpp index 273dc8b..3a77a27 100644 --- a/srcs/commands/other/names.cpp +++ b/srcs/commands/other/names.cpp @@ -6,33 +6,63 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/16 18:14:15 by apommier #+# #+# */ -/* Updated: 2023/02/18 00:51:24 by apommier ### ########.fr */ +/* Updated: 2023/02/22 20:04:19 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" +//:irc.server.net 353 user = #channel :@user1 +user2 user3 +//:irc.server.net 366 user #channel :End of /NAMES list. + +void names_reply(fdList &allFds, channelData &chan, int fd, std::string user) +{ + std::string msg; + msg = "353 " + user + " = " + chan.name + " :"; + for (int i = 0; i < chan.nbrUser; i++) + { + if (chan.userList[i]->mode.o)//ischanop + msg += "=" + chan.userList[i]->nickname + " "; + else if (chan.userList[i]->mode.o)//verbose + msg += "@" + chan.userList[i]->nickname + " "; + else + msg += "+" + chan.userList[i]->nickname + " "; + } + msg += "\n"; + std::cout << "name msg= " << msg; + cmd_reply(allFds, fd, msg); +} + void NAMES(std::string buffer, fdList &allFds, int userNbr) { (void)buffer; (void)allFds; (void)userNbr; - // std::vector splitBuff; - // int pos; + std::vector splitBuff; + int pos; - // split(buffer, ' ', splitBuff); - // if (splitBuff.size() == 1 || splitBuff[1] == "0") - // { - // for (int i = 0; i < allFds.nbrUser; i++) - // { - // if (!allFds.userData[i].mode.i) - // { - // //print who - // } - // } - // return ; - // } - // if (pos = find_channel(allFds, splitBuff[1]) != -1) - - // return ; + split(buffer, ' ', splitBuff); + if (splitBuff.size() == 1 || splitBuff[1] == "0") + { + for (size_t i = 0; i < allFds.channelList.size(); i++) + { + if ((!allFds.channelList[i].mode.p && !allFds.channelList[i].mode.s) + || is_joined(allFds, allFds.channelList[i].name, userNbr)) + { + names_reply(allFds, allFds.channelList[i], allFds.userData[userNbr].fd, allFds.userData[userNbr].nickname); + //print who + } + } + return ; + } + if ((pos = find_channel(allFds, splitBuff[1])) != -1) + { + if ((!allFds.channelList[pos].mode.p && !allFds.channelList[pos].mode.s) + || is_joined(allFds, allFds.channelList[pos].name, userNbr)) + { + names_reply(allFds, allFds.channelList[pos], allFds.userData[userNbr].fd, allFds.userData[userNbr].nickname); + } + return; //?? + } + return ; } diff --git a/srcs/commands/other/who.cpp b/srcs/commands/other/who.cpp index 8e7dce3..19e4867 100644 --- a/srcs/commands/other/who.cpp +++ b/srcs/commands/other/who.cpp @@ -6,16 +6,68 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/16 18:14:17 by apommier #+# #+# */ -/* Updated: 2023/02/16 18:19:32 by apommier ### ########.fr */ +/* Updated: 2023/02/22 13:03:30 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" +//void who_reply(fdList &allFds, int userNbr, int fd) +void who_reply(fdList &allFds, clientData &user, int fd) +{ + // std::string msg; + // //: 352 H :0 + // //if (chan.size()) + // msg = "352 " /*+ chan + " " */ + // + allFds.userData[userNbr].userName + " " + // + allFds.userData[userNbr].hostName + " irc.local " + // + allFds.userData[userNbr].nickname + " :0 " + // + allFds.userData[userNbr].realName + "\n"; + + // cmd_reply(allFds, fd, msg); + + + std::string msg; + //: 352 H :0 + //if (chan.size()) + msg = "352 " /*+ chan + " " */ + + user.userName + " " + + user.hostName + " irc.local " + + user.nickname + " :0 " + + user.realName + "\n"; + std::cout << "whoreply= " << msg << std::endl; + cmd_reply(allFds, fd, msg); +} + void WHO(std::string buffer, fdList &allFds, int userNbr) { - (void)buffer; - (void)allFds; - (void)userNbr; + std::vector splitBuff; + int pos; + (void) userNbr; + split(buffer, ' ', splitBuff); + if (splitBuff.size() == 1 || splitBuff[1] == "0") + { + for (int i = 0; i < allFds.nbrUser; i++) + { + if (!allFds.userData[i].mode.i || is_in_same(allFds, userNbr, i)) + { + who_reply(allFds, allFds.userData[i], allFds.userData[userNbr].fd); + //print who + } + } + return ; + } + if ((pos = find_channel(allFds, splitBuff[1])) == -1) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "401 * " + splitBuff[1] + " :No such nick/channel\n"); + return ; + } + for (int i = 0; i < allFds.channelList[pos].nbrUser; i++) + { + who_reply(allFds, *allFds.channelList[pos].userList[i], allFds.userData[userNbr].fd); + } + //" :End of WHOIS list" + cmd_reply(allFds, allFds.userData[userNbr].fd, allFds.userData[userNbr].nickname + " :End of WHOIS list\n"); + //std::cout << return ; } \ No newline at end of file diff --git a/srcs/epoll.cpp b/srcs/epoll.cpp index 8de91a1..54d5cbf 100644 --- a/srcs/epoll.cpp +++ b/srcs/epoll.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 21:38:30 by apommier #+# #+# */ -/* Updated: 2022/12/06 21:50:06 by apommier ### ########.fr */ +/* Updated: 2023/02/22 12:59:31 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ void epoll_add(int epollFd, int fd) { struct epoll_event event; + memset(&event, 0, sizeof(event)); event.events = EPOLLIN; event.data.fd = fd; diff --git a/srcs/utils.cpp b/srcs/utils.cpp index 363032a..2247cc9 100644 --- a/srcs/utils.cpp +++ b/srcs/utils.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 21:46:41 by apommier #+# #+# */ -/* Updated: 2023/02/14 14:27:33 by apommier ### ########.fr */ +/* Updated: 2023/02/22 20:03:09 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -47,6 +47,17 @@ void cmd_error(fdList &allFds, int fd, std::string error) send(fd, error.c_str(), error.size(), 0); } +void cmd_reply(fdList &allFds, int fd, std::string error) +{ + + (void)allFds; //to delete + error = ":irc.local " + error; + //std::cout << cmd_reply= --- << error << "---"; + //write(fd, ":irc.local ", 11); + //write(fd, error.c_str(), error.size()); + send(fd, error.c_str(), error.size(), 0); +} + int contain_any(std::string str, std::string toFind) { for (int i = 0; toFind[i] != 0; i++) @@ -67,8 +78,16 @@ int not_contain_other(std::string str, std::string toFind) return (1); } -// void find_user_in_chan(fdList &allFds, channelData *chan) -// { - -// } +int find_client_list(std::vector list, clientData *client) +{ + std::vector::iterator start = list.begin(); + std::vector::iterator pastEnd = list.end(); + while (start != pastEnd) + { + if (*start == client) + return (start - pastEnd - 1); + start++; + } + return (-1); +}