From 95370cc0a0d094792b108c7225df46cb0888c92d Mon Sep 17 00:00:00 2001 From: kinou-p Date: Wed, 22 Feb 2023 20:05:25 +0100 Subject: [PATCH] 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); +}