diff --git a/includes/ft_irc.hpp b/includes/ft_irc.hpp index 05cf6ea..112eff2 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/12 15:48:37 by apommier ### ########.fr */ +/* Updated: 2023/02/12 17:31:11 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ #include //std::cout | cerr #include //struct socket #include //epoll ensemble -#include //close() +#include //close(0) #include //fcntl #include #include @@ -39,6 +39,48 @@ struct channelData; +struct chanMode +{ + bool o; //- donne/retire les privilèges d'opérateur de canal + bool p; //- drapeau de canal privé + bool s; //- drapeau de canal secret + bool i; //- drapeau de canal accessible uniquement sur invitation + bool t; //- drapeau de sujet de canal modifiable uniquement par les opérateurs + bool n; //- pas de messages dans un canal provenant de clients à l'extérieur du canal + bool m; //- canal modéré + bool l; //- définit le nombre maximal de personnes dans un canal + bool b; //- définit un masque de bannissement pour interdire l'accès à des utilisateurs + bool v; //- donne/retire la possibilité de parler dans un canal modéré + bool k; //- définit la clé du canal (mot de passe) + chanMode() + : o(0), + p(0), + s(0), + i(0), + t(0), + n(0), + m(0), + l(0), + b(0), + v(0), + k(0) {} + +}; + +struct userMode +{ + bool i; //- marque un utilisateur comme invisible ; + bool s; //- marque un utilisateur comme recevant les notifications du serveur ; + bool w; //- l'utilisateur reçoit les WALLOPs ; + bool o; //- drapeau d'opérateur. + + userMode() + : i(0), + s(0), + w(0), + o(0) {} +}; + struct clientData //each client have one { bool registered; @@ -54,6 +96,9 @@ struct clientData //each client have one std::string cmdBuffer; std::vector joinedChan; + + userMode mode; + int fd; int op; }; @@ -61,9 +106,16 @@ struct clientData //each client have one struct channelData //each chan have one { std::string name; + std::vector userList; std::vector banList; - int op; + std::vector opList; + + chanMode mode; + std::string password; + int maxUser; + //int banMask ??? + int nbrUser; }; @@ -73,15 +125,11 @@ struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY int epollFd; int serverFd; std::vector userList; - // std::vector channelList; - // std::vector userData; accessList channelList; accessList userData; - + int alive; - // std::map channelList; - // std::map userData; int nbrUser; functionTab parsingTab; diff --git a/srcs/commands/auth/user.cpp b/srcs/commands/auth/user.cpp index 5339476..c737ad6 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/12 13:36:30 by apommier ### ########.fr */ +/* Updated: 2023/02/12 16:26:48 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,33 @@ //Paramètres: : //ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED + + +struct modeChan +{ + bool o; + bool p; + bool s; + bool i; + bool t; + bool n; + bool m; + bool l; + bool b; + bool v; + bool k; +}; + +struct modeUser +{ + bool i; + bool s; + bool w; + bool o; +}; + + + void USER(std::string buffer, fdList &allFds, int userNbr) { if (allFds.userData[userNbr].registered == 1) diff --git a/srcs/commands/channel/join.cpp b/srcs/commands/channel/join.cpp index 79c7a4e..a5c10d2 100644 --- a/srcs/commands/channel/join.cpp +++ b/srcs/commands/channel/join.cpp @@ -6,43 +6,98 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/09 15:40:33 by apommier #+# #+# */ -/* Updated: 2023/02/11 14:55:28 by apommier ### ########.fr */ +/* Updated: 2023/02/12 17:33:31 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" + +// Commande: JOIN +// Paramètres: {,} [{,}] +// 1459 +// ERR_NEEDMOREPARAMS + ERR_BANNEDFROMCHAN +// ERR_INVITEONLYCHAN + ERR_BADCHANNELKEY +// ERR_CHANNELISFULL x ERR_BADCHANMASK ? +// ERR_NOSUCHCHANNEL x ERR_TOOMANYCHANNELS x +// RPL_TOPIC + + // 2812 + // ERR_NEEDMOREPARAMS ERR_BANNEDFROMCHAN + // ERR_INVITEONLYCHAN ERR_BADCHANNELKEY + // ERR_CHANNELISFULL ERR_BADCHANMASK + // ERR_NOSUCHCHANNEL ERR_TOOMANYCHANNELS + // ERR_TOOMANYTARGETS ERR_UNAVAILRESOURCE + // RPL_TOPIC + +void leave_all(fdList &allFds, int userNbr) +{ + (void)allFds; + (void)userNbr; +} + +int chan_check(fdList &allFds, int userNbr, int chanNbr, std::vector splitBuff) +{ + std::string errorStr; + if (0/*banned*/) + { + errorStr = "474 * JOIN " + allFds.channelList[chanNbr].name + " :Cannot join channel (+b)\n"; + cmd_error(allFds, allFds.userData[userNbr].fd, errorStr); //ERR_INVITEONLYCHAN + return (0); + } + if (allFds.channelList[chanNbr].mode.i) + { + errorStr = "461 * JOIN " + allFds.channelList[chanNbr].name + " :Cannot join channel (+i)\n"; + cmd_error(allFds, allFds.userData[userNbr].fd, errorStr); //ERR_INVITEONLYCHAN + return (0); + } + if (allFds.channelList[chanNbr].mode.k) + { + if (splitBuff.size() < 3 || allFds.channelList[chanNbr].password != splitBuff[2]) + { + errorStr = "475 * JOIN " + allFds.channelList[chanNbr].name + " :Cannot join channel (+k)\n"; + cmd_error(allFds, allFds.userData[userNbr].fd, errorStr); //ERR_BADCHANNELKEY + } + return (0); + } + if (allFds.channelList[chanNbr].mode.l && allFds.channelList[chanNbr].nbrUser == allFds.channelList[chanNbr].maxUser) + { + errorStr = "471 * JOIN " + allFds.channelList[chanNbr].name + " :Cannot join channel (+l)\n"; + cmd_error(allFds, allFds.userData[userNbr].fd, errorStr); //ERR_CHANNELISFULL + return (0); + } + return (1); +} + void JOIN(std::string buffer, fdList &allFds, int userNbr) { std::vector splitBuff; int chanNbr; 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) + if (splitBuff.size() < 2) { - /*change error*/cmd_error(allFds, allFds.userData[userNbr].fd, "431 * NICK :No nickname given\n"); + /*change error*/ + cmd_error(allFds, allFds.userData[userNbr].fd, "461 * JOIN :Not enough parameters\n"); //ERR_NEEDMOREPARAMS + return ; + } + if (splitBuff[1] == "0") + { + leave_all(allFds, userNbr); return ; } - chanNbr = find_channel(allFds, splitBuff[1]); if (chanNbr != -1) //chan already exist { + if (!chan_check(allFds, userNbr, chanNbr, splitBuff)) + return ; 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; + //std::cout << "join2 nickname " << allFds.channelList.back().userList[0]->nickname << std::endl; + //std::cout << "join2 fd " << allFds.channelList.back().userList[0]->nickname << std::endl; //message nickname joined the channel? } else //chan doesn't exist yet @@ -57,24 +112,8 @@ void JOIN(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 - //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"; - + //std::cout << "join nickname " << allFds.channelList[0].userList[0]->nickname << std::endl; + //std::cout << "join fd " << allFds.channelList[0].userList[0]->fd << std::endl; //message nickname created the channel? } - // 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/not_done_cmd.cpp b/srcs/commands/not_done_cmd.cpp index ece4d8c..0e67271 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/11 20:06:45 by apommier ### ########.fr */ +/* Updated: 2023/02/12 17:30:37 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/commands/parse_commands.cpp b/srcs/commands/parse_commands.cpp index 63a68bf..d141004 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/12 14:21:56 by apommier ### ########.fr */ +/* Updated: 2023/02/12 16:19:20 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,5 +45,6 @@ void parse_commands(std::string buffer, fdList &allFds, int userNbr) //allFds.parsingTab.cmdPtr[a] //JOIN(allFds.userData[userNbr].cmdBuffer, allFds, userNbr); } - allFds.userData[userNbr].cmdBuffer.clear(); + if (splitBuff[0] != "QUIT") + allFds.userData[userNbr].cmdBuffer.clear(); } \ No newline at end of file