From 2ae384424531ddb5be7cbb8aa3c594da02cf7ac2 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Sat, 11 Feb 2023 15:13:56 +0100 Subject: [PATCH] add PRIVMSG and add reserve for vector of user and chanlist because POINTER VALIDITY --- Makefile | 6 +- includes/ft_irc.hpp | 55 +++++++------ srcs/client_request.cpp | 24 ++++-- .../auth/{cmd_utils.cpp => auth_utils.cpp} | 29 +------ srcs/commands/auth/user.cpp | 58 +++++++------- srcs/commands/channel/channel_utils.cpp | 33 ++++++-- srcs/commands/channel/join.cpp | 53 ++++++++++--- srcs/commands/channel/privmsg.cpp | 77 +++++++++++++++++++ srcs/commands/cmd_utils.cpp | 38 +++++++++ srcs/commands/not_done_cmd.cpp | 16 ++-- srcs/commands/parse_commands.cpp | 15 ++-- srcs/new_connection.cpp | 52 ++++++------- srcs/server_loop.cpp | 12 +-- srcs/start_server.cpp | 5 +- srcs/utils.cpp | 45 ++++++++++- 15 files changed, 362 insertions(+), 156 deletions(-) rename srcs/commands/auth/{cmd_utils.cpp => auth_utils.cpp} (70%) create mode 100644 srcs/commands/channel/privmsg.cpp create mode 100644 srcs/commands/cmd_utils.cpp diff --git a/Makefile b/Makefile index 27f1d72..2400002 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: apommier +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/12/01 17:27:29 by apommier #+# #+# # -# Updated: 2023/02/10 08:18:36 by apommier ### ########.fr # +# Updated: 2023/02/11 10:41:15 by apommier ### ########.fr # # # # **************************************************************************** # @@ -18,13 +18,15 @@ SRCS := main.cpp\ client_request.cpp\ new_connection.cpp\ server_loop.cpp\ + commands/cmd_utils.cpp\ commands/parse_commands.cpp\ commands/auth/nick.cpp\ commands/auth/pass.cpp\ commands/auth/user.cpp\ - commands/auth/cmd_utils.cpp\ + commands/auth/auth_utils.cpp\ commands/channel/channel_utils.cpp\ commands/channel/join.cpp\ + commands/channel/privmsg.cpp\ commands/not_done_cmd.cpp #special (temporary) CC = c++ diff --git a/includes/ft_irc.hpp b/includes/ft_irc.hpp index 78103ab..0ce6a98 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/10 09:59:10 by apommier ### ########.fr */ +/* Updated: 2023/02/11 14:48:19 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,12 +20,14 @@ #include //struct socket #include //epoll ensemble #include //close() +#include //fcntl #include #include #include "function_tab.hpp" #define MAX_EVENTS 5 +#define MAX_CHAN 10 #define READ_SIZE 10 #define CMD_NBR 10 @@ -35,7 +37,7 @@ struct channelData; -struct clientData +struct clientData //each client have one { bool registered; @@ -49,38 +51,30 @@ struct clientData std::string serverName; std::string cmdBuffer; - //std::string joinedChan[20]; - //channelData *joinedChan; //is there a limit? - - // std::vector joinedChan; std::vector joinedChan; int fd; }; -struct channelData +struct channelData //each chan have one { - //std::string userList[MAX_EVENTS]; - - //clientData userList[MAX_EVENTS]; std::string name; - std::vector userList; - std::vector banList; + std::vector userList; + std::vector banList; int op; int nbrUser; }; - - -struct fdList //&allFds in code +struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY { struct epoll_event events[MAX_EVENTS]; int epollFd; int serverFd; - //int userList[MAX_EVENTS]; //list of userNbr's fd std::vector userList; std::vector channelList; - //clientData userData[MAX_EVENTS]; std::vector userData; + + // std::map channelList; + // std::map userData; int nbrUser; functionTab parsingTab; @@ -88,30 +82,45 @@ struct fdList //&allFds in code +/* ************************************************************************** */ +/* *********************************UTILS************************************ */ +/* ************************************************************************** */ +void ft_putstr_fd(int fd, std::string str); +void cmd_error(fdList &allFds, int userNbr, std::string error); +void ft_error(std::string str); +void close_fd(int fd); +void del_user_in_chan(clientData *user, channelData *chan); +void delete_user(fdList &allFds, int userNbr); + +/* ************************************************************************** */ +/* *******************************AUTH UTILS********************************* */ +/* ************************************************************************** */ + +void print_registered_msg(fdList &allFds, int userNbr); /* ************************************************************************** */ /* *******************************CMD UTILS********************************** */ /* ************************************************************************** */ -void ft_error(std::string str); -void close_fd(int fd); -void cmd_error(fdList &allFds, int userNbr, std::string error); void split(std::string const &str, const char delim, std::vector &out); -void print_registered_msg(fdList &allFds, int userNbr); +void split_but_keep(std::string const &str, const char delim, std::vector &out); //same as split but keep one delimeter + /* ************************************************************************** */ /* *******************************CHAN UTILS********************************* */ /* ************************************************************************** */ int find_channel(fdList &allFds, std::string chanName); +int find_user(fdList &allFds, std::string userName); +void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr); //in privmsg.cpp /* ************************************************************************** */ /* ******************************START SERVER******************************** */ /* ************************************************************************** */ -void initialize(char **av); //1st -void start_loop(fdList &allFds); //3rd +void initialize(char **av); //start_server.cpp +void start_loop(fdList &allFds); //server_loop.cpp /* ************************************************************************** */ /* *****************************EPOLL UTILITY******************************** */ diff --git a/srcs/client_request.cpp b/srcs/client_request.cpp index 9f62fc0..e034879 100644 --- a/srcs/client_request.cpp +++ b/srcs/client_request.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/09 22:34:36 by apommier #+# #+# */ -/* Updated: 2023/02/09 21:39:38 by apommier ### ########.fr */ +/* Updated: 2023/02/11 13:20:49 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,16 +33,24 @@ bool clientRequest(fdList &allFds, int userNbr)//, if (buffer.empty()) { //delete client - close(allFds.userData[userNbr].fd); - allFds.userData.erase(allFds.userData.begin() + userNbr); - allFds.userList.erase(allFds.userList.begin() + userNbr); - allFds.nbrUser--; - std::cout << "buffer empty\n"; + delete_user(allFds, userNbr); + // close(allFds.userData[userNbr].fd); + // allFds.userData.erase(allFds.userData.begin() + userNbr); + // allFds.userList.erase(allFds.userList.begin() + userNbr); + // allFds.nbrUser--; + // std::cout << "buffer empty\n"; return (1); } - std::cout << "BUFFER: ---" << buf << "---" << std::endl; + //std::cout << "BUFFER: ---" << buf << "---" << std::endl; //split with \n and while (tab de split) -> parsing - parse_commands(buf, allFds, userNbr); + + std::vector splitBuff; + split_but_keep(buffer, '\n', splitBuff); + for (size_t i = 0; i < splitBuff.size(); i++) + { + parse_commands(splitBuff[i], allFds, userNbr); + } + return (1); } \ No newline at end of file diff --git a/srcs/commands/auth/cmd_utils.cpp b/srcs/commands/auth/auth_utils.cpp similarity index 70% rename from srcs/commands/auth/cmd_utils.cpp rename to srcs/commands/auth/auth_utils.cpp index 282d087..1c6e5ca 100644 --- a/srcs/commands/auth/cmd_utils.cpp +++ b/srcs/commands/auth/auth_utils.cpp @@ -1,42 +1,17 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* cmd_utils.cpp :+: :+: :+: */ +/* auth_utils.cpp :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/07 14:45:45 by apommier #+# #+# */ -/* Updated: 2023/02/10 09:27:27 by apommier ### ########.fr */ +/* Updated: 2023/02/11 10:40:42 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" -void ft_putstr_fd(int fd, std::string str) -{ - write(fd, str.c_str(), str.size()); - write(fd, "\n", 1); -} - -void cmd_error(fdList &allFds, int fd, std::string error) -{ - (void)allFds; //to delete - write(fd, ":irc.local ", 11); - write(fd, error.c_str(), error.size()); -} - -void split(std::string const &str, const char delim, std::vector &out) -{ - size_t start; - size_t end = 0; - - while ((start = str.find_first_not_of(delim, end)) != std::string::npos) - { - end = str.find(delim, start); - out.push_back(str.substr(start, end - start)); - } -} - void print_registered_msg(fdList &allFds, int userNbr) { ft_putstr_fd(allFds.userData[userNbr].fd, "-------------------WELCOME TO MY PERSONNAL IRC SERVER!-------------------" ); diff --git a/srcs/commands/auth/user.cpp b/srcs/commands/auth/user.cpp index 2869ce2..ff8dee3 100644 --- a/srcs/commands/auth/user.cpp +++ b/srcs/commands/auth/user.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/06 14:40:39 by apommier #+# #+# */ -/* Updated: 2023/02/09 13:19:53 by apommier ### ########.fr */ +/* Updated: 2023/02/11 12:57:50 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,34 +18,38 @@ void USER(std::string buffer, fdList &allFds, int userNbr) { - if (allFds.userData[userNbr].registered == 1) - { - cmd_error(allFds, allFds.userData[userNbr].fd, "462 * PASS :You may not reregister\n"); - return ; - } + + (void)buffer; + (void)allFds; + (void)userNbr; + // if (allFds.userData[userNbr].registered == 1) + // { + // cmd_error(allFds, allFds.userData[userNbr].fd, "462 * USER :You may not reregister\n"); + // return ; + // } - std::string realName = buffer.substr(buffer.find_first_of(":") + 1 , buffer.npos); - std::vector splitBuff; + // std::string realName = buffer.substr(buffer.find_first_of(":") + 1 , buffer.npos); + // std::vector splitBuff; - buffer.resize(buffer.size() - realName.size()); - std::cout << "Buffer in userNbr = ---" << buffer << "---" << std::endl; - std::cout << "realname in userNbr = ---" << realName << "---" << std::endl; - split(buffer, ' ', splitBuff); - if (splitBuff.size() < 4) - { - cmd_error(allFds, allFds.userData[userNbr].fd, "461 * PASS :Not enough parameters\n"); - //write(allFds.userData[userNbr].fd, "ERR_NEEDMOREPARAMS", 18); - return ; - } - allFds.userData[userNbr].userName = splitBuff[1]; - allFds.userData[userNbr].hostName = splitBuff[2]; - allFds.userData[userNbr].serverName = splitBuff[3]; + // buffer.resize(buffer.size() - realName.size()); + // std::cout << "Buffer in userNbr = ---" << buffer << "---" << std::endl; + // std::cout << "realname in userNbr = ---" << realName << "---" << std::endl; + // split(buffer, ' ', splitBuff); + // if (splitBuff.size() < 4) + // { + // cmd_error(allFds, allFds.userData[userNbr].fd, "461 * USER :Not enough parameters\n"); + // //write(allFds.userData[userNbr].fd, "ERR_NEEDMOREPARAMS", 18); + // return ; + // } + // allFds.userData[userNbr].userName = splitBuff[1]; + // allFds.userData[userNbr].hostName = splitBuff[2]; + // allFds.userData[userNbr].serverName = splitBuff[3]; - allFds.userData[userNbr].realName = realName; - if (!allFds.userData[userNbr].nickname.empty()) - { - allFds.userData[userNbr].registered = 1; - print_registered_msg(allFds, userNbr); - } + // allFds.userData[userNbr].realName = realName; + // if (!allFds.userData[userNbr].nickname.empty()) + // { + // allFds.userData[userNbr].registered = 1; + // print_registered_msg(allFds, userNbr); + // } } \ No newline at end of file diff --git a/srcs/commands/channel/channel_utils.cpp b/srcs/commands/channel/channel_utils.cpp index c864350..ad12b54 100644 --- a/srcs/commands/channel/channel_utils.cpp +++ b/srcs/commands/channel/channel_utils.cpp @@ -6,22 +6,43 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/09 17:21:57 by apommier #+# #+# */ -/* Updated: 2023/02/09 20:56:31 by apommier ### ########.fr */ +/* Updated: 2023/02/11 12:25:58 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" -int find_channel(fdList &allFds, std::string chanName) +int find_channel(fdList &allFds, std::string chanName)//return channel nbr { std::vector::iterator start = allFds.channelList.begin(); std::vector::iterator pastEnd = allFds.channelList.end(); + std::cout << "name1= ---" << chanName << "---\n"; while (start != pastEnd) { std::cout << "result in find chan = " << pastEnd - start << std::endl; - if (allFds.channelList[pastEnd - start].name == chanName) - return (pastEnd - start); + std::cout << "name2= ---" << allFds.channelList[pastEnd - start - 1].name << "---\n"; + if (allFds.channelList[pastEnd - start - 1].name == chanName) + return (pastEnd - start - 1); start++; } - return (0); -} \ No newline at end of file + std::cout << "chan not found\n"; + return (-1); +} + +int find_user(fdList &allFds, std::string userName)//return direct user fd +{ + std::vector::iterator start = allFds.userData.begin(); + std::vector::iterator pastEnd = allFds.userData.end(); + std::cout << "name1= ---" << userName << "---\n"; + while (start != pastEnd) + { + std::cout << "result in find user = " << pastEnd - start << std::endl; + std::cout << "name2= ---" << allFds.userData[pastEnd - start - 1].nickname << "---\n"; + if (allFds.userData[pastEnd - start - 1].nickname == userName) + return (allFds.userData[pastEnd - start - 1].fd); + start++; + } + std::cout << "user not found\n"; + return (-1); +} + diff --git a/srcs/commands/channel/join.cpp b/srcs/commands/channel/join.cpp index a527cc5..79c7a4e 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/09 21:55:57 by apommier ### ########.fr */ +/* Updated: 2023/02/11 14:55:28 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,15 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr) { std::vector splitBuff; int chanNbr; - std::cout << "join start\n"; + std::cout << "==========join start========\n"; + + if (allFds.channelList.size() == MAX_CHAN) + { + std::cout << "creation of channel refused, maximum number reached" << std::endl; // send msg to user? + return ; + } + + std::cout << "userNbr= " << userNbr << std::endl; split(buffer, ' ', splitBuff); if (splitBuff.size() < 2) { @@ -25,25 +33,48 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr) } chanNbr = find_channel(allFds, splitBuff[1]); - if (chanNbr) + if (chanNbr != -1) //chan already exist { - //allFds.userData[userNbr].joinedChan.push_back(splitBuff[1]); + allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList[chanNbr]); //add chan in user data + allFds.channelList[chanNbr].userList.push_back(&allFds.userData[userNbr]);//add user in chan data + allFds.channelList[chanNbr].nbrUser++; + std::cout << "join2 nickname " << allFds.channelList.back().userList[0]->nickname << std::endl; + std::cout << "join2 fd " << allFds.channelList.back().userList[0]->nickname << std::endl; + //allFds.channelList.push_back(new_chan); + //std::cout << "nbruser in existent chan / persistence = " << allFds.channelList[chanNbr].nbrUser << std::endl; + //std::cout << "nbruser in existent user / persistence = " << allFds.userData[userNbr].joinedChan[0]->nbrUser << std::endl; //message nickname joined the channel? } - else + else //chan doesn't exist yet { 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 - + allFds.channelList.push_back(new_chan); - allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList.back()); + allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList.back());//add chan in user data + //allFds.channelList.back().userList.push_back(&allFds.userData[userNbr]);//add user in chan data + + + // allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList[chanNbr]); //add chan in user data + // allFds.channelList[chanNbr].userList.push_back(&allFds.userData[userNbr]);//add user in chan data + // allFds.channelList[chanNbr].nbrUser++; + + + std::cout << "join nickname " << allFds.channelList[0].userList[0]->nickname << std::endl; + std::cout << "join fd " << allFds.channelList[0].userList[0]->fd << std::endl; + //ft_putstr_fd(allFds.channelList[fd].userList[i]->fd, fullMsg); + //std::cout << "loop here\n"; + //message nickname created the channel? } - std::cout << "============persitence test============\n"; - allFds.channelList.back().name = "new name"; - std::cout << "newname = " << allFds.userData[userNbr].joinedChan.back()->name << std::endl; - //allFds.channelList; + // std::cout << "============persitence test============\n"; + // std::cout << "odlname = " << allFds.userData[userNbr].joinedChan.back()->name << std::endl; + // allFds.channelList.back().name = "new name"; + // std::cout << "newname = " << allFds.userData[userNbr].joinedChan.back()->name << std::endl; + // //allFds.channelList; } \ No newline at end of file diff --git a/srcs/commands/channel/privmsg.cpp b/srcs/commands/channel/privmsg.cpp new file mode 100644 index 0000000..1a64a08 --- /dev/null +++ b/srcs/commands/channel/privmsg.cpp @@ -0,0 +1,77 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* privmsg.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/11 08:53:03 by apommier #+# #+# */ +/* Updated: 2023/02/11 12:38:51 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../../includes/ft_irc.hpp" + + +void PRIVMSG(std::string buffer, fdList &allFds, int userNbr) +{ + std::vector splitBuff; + std::string msg; + + split(buffer, ' ', splitBuff); + if (splitBuff.size() < 3) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "431 * PRIVMSG :Not enought argument\n"); + //write(allFds.userData[user].fd, "ERR_NEEDMOREPARAMS", 18); + return ; + } + + for (size_t i = 2; i < splitBuff.size(); i++) + { + msg += (" " + splitBuff[i]); + } + + std::vector dest; + split(splitBuff[1], ',', dest); + for (size_t i = 0; i < dest.size(); i++) + { + send_msg(allFds, msg, dest[i], userNbr); + } +} + +void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr) +{ + int fd; + //find dest + std::string fullMsg; + fullMsg = "*" + allFds.userData[userNbr].nickname + "* " + msg; + fd = find_channel(allFds, dest); //return channel nbr + if (fd != -1) + { + //std::vector::iterator start = allFds.channelList[fd].userList.begin(); + //std::vector::iterator pastEnd = allFds.channelList[fd].userList.end(); + // while (start != pastEnd) + // { + // std::cout << "send nickname" << (*start)->nickname << std::endl; + // ft_putstr_fd((*start)->fd, fullMsg); + // start++; + // std::cout << "loop here\n"; + // } + for (size_t i = 0; i < allFds.channelList[fd].userList.size(); i++) + { + std::cout << "send nickname " << allFds.channelList[fd].userList[i]->nickname << std::endl; + ft_putstr_fd(allFds.channelList[fd].userList[i]->fd, fullMsg); + std::cout << "loop here\n"; + } + return ; + } + + fd = find_user(allFds, dest); //return direct user fd + if (fd != -1) + { + ft_putstr_fd(fd, fullMsg); + return ; + } + std::cout << "error msg\n"; + //ft_putstr_fd(fd, msg); +} \ No newline at end of file diff --git a/srcs/commands/cmd_utils.cpp b/srcs/commands/cmd_utils.cpp new file mode 100644 index 0000000..2aab5db --- /dev/null +++ b/srcs/commands/cmd_utils.cpp @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cmd_utils.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/10 15:46:10 by apommier #+# #+# */ +/* Updated: 2023/02/11 13:51:28 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../includes/ft_irc.hpp" + +void split(std::string const &str, const char delim, std::vector &out) +{ + size_t start; + size_t end = 0; + + while ((start = str.find_first_not_of(delim, end)) != std::string::npos) + { + end = str.find(delim, start); + out.push_back(str.substr(start, end - start)); + } +} + +void split_but_keep(std::string const &str, const char delim, std::vector &out) +{ + size_t start; + size_t end = 0; + + while ((start = str.find_first_not_of(delim, end)) != std::string::npos) + { + end = str.find(delim, start); //find end of string + out.push_back(str.substr(start, end + 1 - start)); //here + //std::cout << "split test = ---" << str.substr(start, end + 1 - start) << "---\n"; + } +} \ No newline at end of file diff --git a/srcs/commands/not_done_cmd.cpp b/srcs/commands/not_done_cmd.cpp index ae20e12..af02cba 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/10 09:30:45 by apommier ### ########.fr */ +/* Updated: 2023/02/11 08:53:59 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -164,13 +164,13 @@ void INFO(std::string buffer, fdList &allFds, int userNbr) return ; } -void PRIVMSG(std::string buffer, fdList &allFds, int userNbr) -{ - (void)buffer; - (void)allFds; - (void)userNbr; - return ; -} +// void PRIVMSG(std::string buffer, fdList &allFds, int userNbr) +// { +// (void)buffer; +// (void)allFds; +// (void)userNbr; +// return ; +// } void NOTICE(std::string buffer, fdList &allFds, int userNbr) { diff --git a/srcs/commands/parse_commands.cpp b/srcs/commands/parse_commands.cpp index 4aa3402..fc7ffde 100644 --- a/srcs/commands/parse_commands.cpp +++ b/srcs/commands/parse_commands.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 22:01:25 by apommier #+# #+# */ -/* Updated: 2023/02/10 09:26:31 by apommier ### ########.fr */ +/* Updated: 2023/02/11 15:11:24 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,7 @@ std::string ft_test() void parse_commands(std::string buffer, fdList &allFds, int userNbr) { //std::string cmd = buffer; + std::cout << "===========parse command=============" << std::endl; std::vector splitBuff; int a = 0; @@ -30,16 +31,16 @@ void parse_commands(std::string buffer, fdList &allFds, int userNbr) allFds.userData[userNbr].cmdBuffer.erase(allFds.userData[userNbr].cmdBuffer.size() - 1); split(allFds.userData[userNbr].cmdBuffer, ' ', splitBuff); - std::cout << "BUFFER In PARSING: ---" << allFds.userData[userNbr].cmdBuffer << "---" << std::endl; - while (splitBuff[0] != allFds.parsingTab.cmdName[a] && a < allFds.parsingTab.cmdNbr) + //std::cout << "BUFFER In PARSING: ---" << allFds.userData[userNbr].cmdBuffer << "---" << std::endl; + while (a < allFds.parsingTab.cmdNbr - 1 && splitBuff[0] != allFds.parsingTab.cmdName[a]) a++; - std::cout << "after while \n"; - if (a == allFds.parsingTab.cmdNbr) + //std::cout << "after while \n"; + if (a == allFds.parsingTab.cmdNbr - 1) std::cout << "Command not found\n"; else { - std::cout << "Command name = " << allFds.parsingTab.cmdName[a] << std::endl; - std::cout << "Command nbr = " << a << std::endl; + //std::cout << "Command name = " << allFds.parsingTab.cmdName[a] << std::endl; + //std::cout << "Command nbr = " << a << std::endl; allFds.parsingTab.cmdPtr[a](allFds.userData[userNbr].cmdBuffer, allFds, userNbr); //allFds.parsingTab.cmdPtr[a] //JOIN(allFds.userData[userNbr].cmdBuffer, allFds, userNbr); diff --git a/srcs/new_connection.cpp b/srcs/new_connection.cpp index cd5fa74..17e6bc5 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/10 09:19:45 by apommier ### ########.fr */ +/* Updated: 2023/02/11 14:47:52 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,46 +16,38 @@ void new_connection(fdList &allFds) { struct sockaddr_in addr; int addrLen = sizeof(addr); + int newFd; + std::cout << "==========newconnection========\n"; //std::cout << "in new adress " << &allFds << std::endl; //std::cout << "new connection !" << std::endl; + if (MAX_EVENTS == allFds.nbrUser) { std::cout << "new connection refused, already full" << std::endl; return ; } - - int newUserFd; - allFds.userList.push_back(newUserFd); - allFds.userList[allFds.nbrUser] = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen); - - std::cout << "newConnection | user fd = " << allFds.userList[allFds.nbrUser] << std::endl; + + //int newUserFd; + //allFds.userList.push_back(newUserFd); + newFd = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen); + //allFds.userList[allFds.nbrUser] = newFd; + allFds.userList.push_back(newFd); + //std::cout << "newConnection | old user fd = " << newFd << std::endl; + if (fcntl(newFd, F_SETFL, O_NONBLOCK) == -1) + ft_error("fctnl() error"); + + + //std::cout << "fcntl return = " << newFd; + //close(newFd); + //std::cout << "newConnection | user fd = " << allFds.userList[allFds.nbrUser] << std::endl; clientData newElement; + newElement.fd = newFd; allFds.userData.push_back(newElement); - allFds.userData[allFds.nbrUser].fd = allFds.userList[allFds.nbrUser]; - - std::cout << "newConnection | user in data fd = " << allFds.userData[allFds.nbrUser].fd << std::endl; + //allFds.userData[allFds.nbrUser].fd = allFds.userList[allFds.nbrUser]; + //std::cout << "newConnection | user in data fd = " << allFds.userData[allFds.nbrUser].fd << std::endl; epoll_add(allFds.epollFd, allFds.userList[allFds.nbrUser]); allFds.nbrUser++; -} - -// void new_connection(fdList *allFds, struct epoll_event newClient) -// { -// struct sockaddr_in addr; -// int addrLen = sizeof(addr); - -// std::cout << "new connection !" << std::endl; -// if (MAX_EVENTS == (*allFds).nbrUser) -// std::cout << "new connection refused, already full" << std::endl; -// (*allFds).userList[(*allFds).nbrUser] = accept((*allFds).serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen); - -// std::cout << "newConnection | user fd = " << (*allFds).userList[(*allFds).nbrUser] << std::endl; - -// (*allFds).userData[(*allFds).nbrUser].fd = (*allFds).userList[(*allFds).nbrUser]; -// std::cout << "newConnection | user in data fd = " << (*allFds).userData[(*allFds).nbrUser].fd << std::endl; - -// epoll_add((*allFds).epollFd, (*allFds).userList[(*allFds).nbrUser]); -// (*allFds).nbrUser++; -// } \ No newline at end of file +} \ No newline at end of file diff --git a/srcs/server_loop.cpp b/srcs/server_loop.cpp index d60ed24..cb944e4 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/10 09:20:58 by apommier ### ########.fr */ +/* Updated: 2023/02/11 14:06:49 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,13 +24,16 @@ void start_loop(fdList &allFds) std::cout << "serverFd: " << allFds.serverFd << std::endl; while (alive) { + //std::cout << "\n\n\nwhile alive event loop" << std::endl; + //std::cout << "in loop nbr user = " << allFds.nbrUser << std::endl; eventNbr = epoll_wait(allFds.epollFd, allFds.events, MAX_EVENTS, 5000); //std::cout << "eventNbr: " << eventNbr << std::endl; //std::cout << "in loop adress " << &allFds << std::endl; for (i = 0; i < eventNbr ; i++) { - std::cout << "event[i]'s fd: " << allFds.events[i].data.fd << std::endl; - std::cout << "i= " << i << std::endl; + + //std::cout << "event[i]'s fd: " << allFds.events[i].data.fd << std::endl; + //std::cout << "i= " << i << std::endl; if (allFds.events[i].data.fd == allFds.serverFd) { new_connection(allFds); @@ -39,11 +42,10 @@ void start_loop(fdList &allFds) else { nbr = find(allFds.userList.begin(), allFds.userList.end(), allFds.events[i].data.fd) - allFds.userList.begin(); - std::cout << "fd loop " << allFds.userData[nbr].fd << std::endl; - std::cout << "nbr loop " << nbr << std::endl; //if (!clientRequest(allFds, i)) if (!clientRequest(allFds, nbr)) alive = false; + } } } diff --git a/srcs/start_server.cpp b/srcs/start_server.cpp index ff4accf..70e65d6 100644 --- a/srcs/start_server.cpp +++ b/srcs/start_server.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 21:44:20 by apommier #+# #+# */ -/* Updated: 2023/02/10 09:18:45 by apommier ### ########.fr */ +/* Updated: 2023/02/11 14:49:36 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,6 +28,9 @@ void initialize(char **av) //int addrLen = sizeof(addr); fdList allFds; + allFds.userData.reserve(MAX_EVENTS); + allFds.channelList.reserve(MAX_CHAN); + allFds.nbrUser = 0; allFds.serverFd = socket(AF_INET, SOCK_STREAM, 0); if (allFds.serverFd == -1) diff --git a/srcs/utils.cpp b/srcs/utils.cpp index 5db8ddf..d559e3a 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: 2022/12/07 01:09:12 by apommier ### ########.fr */ +/* Updated: 2023/02/11 12:24:33 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,4 +27,47 @@ void close_fd(int fd) { if (close(fd)) ft_error("close() error"); +} + +void ft_putstr_fd(int fd, std::string str) +{ + write(fd, str.c_str(), str.size()); + write(fd, "\n", 1); +} + +void cmd_error(fdList &allFds, int fd, std::string error) +{ + (void)allFds; //to delete + write(fd, ":irc.local ", 11); + write(fd, error.c_str(), error.size()); +} + +// void find_user_in_chan(fdList &allFds, channelData *chan) +// { + +// } + +void del_user_in_chan(clientData *user, channelData *chan) +{ + size_t i; + for (i = 0; user != chan->userList[i]; i++) + ; + chan->userList.erase(chan->userList.begin() + i); +} + +void delete_user(fdList &allFds, int userNbr) +{ + std::cout << "Delete user nbr " << userNbr << std::endl; + + // for (size_t i = 0; i < allFds.userData[userNbr].joinedChan.size(); i++)//all joined chan + // { + // del_user_in_chan(&allFds.userData[userNbr], allFds.userData[userNbr].joinedChan[i]); + // //allFds.userData[userNbr].joinedChan[i].erase(find_user_in_chan(allFds.userData[userNbr].joinedChan[i])/*find user in chan*/) + // } + close(allFds.userData[userNbr].fd); + + allFds.userData.erase(allFds.userData.begin() + userNbr); + allFds.userList.erase(allFds.userList.begin() + userNbr); + + allFds.nbrUser--; } \ No newline at end of file