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;