diff --git a/Makefile b/Makefile index 5e1611f..242b67d 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: apommier +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/12/01 17:27:29 by apommier #+# #+# # -# Updated: 2023/02/13 00:20:18 by apommier ### ########.fr # +# Updated: 2023/02/14 22:21:45 by apommier ### ########.fr # # # # **************************************************************************** # @@ -32,9 +32,9 @@ SRCS := main.cpp\ commands/channel/channel_utils.cpp\ commands/channel/join.cpp\ commands/channel/privmsg.cpp\ + commands/channel/notice.cpp\ \ commands/other/quit.cpp\ - commands/other/squit.cpp\ commands/other/ping_pong.cpp\ \ commands/channel_op/invite.cpp\ @@ -42,6 +42,7 @@ SRCS := main.cpp\ commands/channel_op/mode.cpp\ commands/channel_op/topic.cpp\ \ + commands/operator/squit.cpp\ commands/operator/oper.cpp\ \ commands/not_done_cmd.cpp #special (temporary) diff --git a/includes/ft_irc.hpp b/includes/ft_irc.hpp index 1d486d8..a6742fe 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/14 02:40:49 by apommier ### ########.fr */ +/* Updated: 2023/02/14 20:54:22 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -195,6 +195,7 @@ void split_but_keep(std::string const &str, const char delim, std::vector +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/06 14:40:42 by apommier #+# #+# */ -/* Updated: 2023/02/14 02:28:03 by apommier ### ########.fr */ +/* Updated: 2023/02/14 18:46:53 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" + + void PASS(std::string buffer, fdList &allFds, int userNbr) { std::string password; @@ -37,4 +39,11 @@ void PASS(std::string buffer, fdList &allFds, int userNbr) password = buffer.substr(5, buffer.npos); allFds.userData[userNbr].password = password; + + if (!allFds.userData[userNbr].userName.empty() && !allFds.userData[userNbr].nickname.empty()) + { + connect_client(allFds, userNbr); + // 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 9ced785..a3fb99a 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/13 17:45:33 by apommier ### ########.fr */ +/* Updated: 2023/02/14 20:13:38 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" +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"; + 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"; + if (allFds.userData[userNbr].joinedChan[pastEnd - start - 1]->name == chanName) + return (pastEnd - start - 1); + start++; + } + std::cout << "chan not found\n"; + return (-1); +} + int find_channel(fdList &allFds, std::string chanName)//return channel nbr { std::_List_iterator start = allFds.channelList.begin(); @@ -39,7 +56,7 @@ int find_user(fdList &allFds, std::string userName)//return direct user fd 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); + return (pastEnd - start - 1); start++; } std::cout << "user not found\n"; diff --git a/srcs/commands/channel/join.cpp b/srcs/commands/channel/join.cpp index 23c97bd..fd11e0d 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 00:41:43 by apommier ### ########.fr */ +/* Updated: 2023/02/14 14:50:57 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -109,6 +109,10 @@ void join_or_create(std::vector splitBuff, fdList &allFds, int user send(joined_chan.userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0); std::cout << "loop here\n"; } + // if (chanNbr == -1) + // { + + // } } diff --git a/srcs/commands/channel/notice.cpp b/srcs/commands/channel/notice.cpp new file mode 100644 index 0000000..cbf40c5 --- /dev/null +++ b/srcs/commands/channel/notice.cpp @@ -0,0 +1,70 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* notice.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/14 21:24:55 by apommier #+# #+# */ +/* Updated: 2023/02/14 21:35:45 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../../includes/ft_irc.hpp" + +// Commande: PRIVMSG +// Paramètres: {,} +// ERR_NORECIPIENT ERR_NOTEXTTOSEND + +// ERR_CANNOTSENDTOCHAN ERR_NOTOPLEVEL +// ERR_WILDTOPLEVEL ERR_TOOMANYTARGETS +// ERR_NOSUCHNICK + +// RPL_AWAY + +void send_notice_msg(fdList &allFds, std::string msg, std::string dest, int userNbr) +{ + int pos; + std::string fullMsg; + + 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) + return ; + if ((pos = find_channel(allFds, dest)) == -1) + 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; + if (i != (size_t)userNbr) + send(allFds.channelList[pos].userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0); + std::cout << "loop here\n"; + } + return ; + } + pos = find_user(allFds, dest); //return direct user fd + if (pos != -1) + { + send(allFds.userData[pos].fd, fullMsg.c_str(), fullMsg.size(), 0); + return ; + } +} + +void NOTICE(std::string buffer, fdList &allFds, int userNbr) +{ + std::vector splitBuff; + std::string msg; + + std::cout << "notice bufer= --" << buffer << std::endl; + split(buffer, ' ', splitBuff); + if (splitBuff.size() < 2) + return ; + if (splitBuff.size() < 3) + return ; + + std::cout << "notice =" << msg << std::endl; + std::vector dest; + split(splitBuff[1], ',', dest); + for (size_t i = 0; i < dest.size(); i++) + send_notice_msg(allFds, buffer, dest[i], userNbr); +} + diff --git a/srcs/commands/channel/privmsg.cpp b/srcs/commands/channel/privmsg.cpp index 6525620..1693456 100644 --- a/srcs/commands/channel/privmsg.cpp +++ b/srcs/commands/channel/privmsg.cpp @@ -6,12 +6,19 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 08:53:03 by apommier #+# #+# */ -/* Updated: 2023/02/13 20:28:11 by apommier ### ########.fr */ +/* Updated: 2023/02/14 20:58:20 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" +// Commande: PRIVMSG +// Paramètres: {,} +// ERR_NORECIPIENT ERR_NOTEXTTOSEND + +// ERR_CANNOTSENDTOCHAN ERR_NOTOPLEVEL +// ERR_WILDTOPLEVEL ERR_TOOMANYTARGETS +// ERR_NOSUCHNICK + +// RPL_AWAY void PRIVMSG(std::string buffer, fdList &allFds, int userNbr) { @@ -20,72 +27,55 @@ void PRIVMSG(std::string buffer, fdList &allFds, int userNbr) std::cout << "privmsg bufer= --" << buffer << std::endl; split(buffer, ' ', splitBuff); - if (splitBuff.size() < 3) + if (splitBuff.size() < 2) { 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]); - // } - //msg = buffer.substr(buffer.find(':') + 1, std::string::npos); + if (splitBuff.size() < 3) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "412 * PRIVMSG :No text to send\n"); + return ; + } std::cout << "privmsg =" << msg << std::endl; - std::vector dest; split(splitBuff[1], ',', dest); for (size_t i = 0; i < dest.size(); i++) - { - // std::cout << "dest[i] =" << dest[i] << "|" << std::endl; - // std::cout << "dest[i] =" << dest[i] << "|" << std::endl; - // std::cout << "dest[i] =" << dest[i] << "|" << std::endl; - // std::cout << "chan =" << allFds.channelList[0].name << "|" << std::endl; - // std::cout << "chan =" << allFds.channelList[0].name << "|" << std::endl; - // std::cout << "chan =" << allFds.channelList[0].name << "|" << std::endl; - // std::cout << "result =" << (allFds.channelList[0].name == dest[i]) << "|" << std::endl; send_msg(allFds, buffer, dest[i], userNbr); - } } void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr) { int pos; - //find dest std::string fullMsg; - //fullMsg = "*" + allFds.userData[userNbr].nickname + "* " + msg; - pos = find_channel(allFds, dest); //return channel nbr - if (pos != -1) + + fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@172.17.0.1 " + msg + "\n"; + if (dest[0] == '&' || dest[0] == '#') { - //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"; - // } + 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) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/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; - //ft_putstr_fd(allFds.channelList[fd].userList[i]->fd, fullMsg); - fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@172.17.0.1 " + msg + "\n"; - //:kinou2!kinou@172.17.0.1 PRIVMSG #test :cc - //send(allFds.channelList[pos].userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0); - send(allFds.channelList[pos].userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0); + if (i != (size_t)userNbr) + send(allFds.channelList[pos].userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0); std::cout << "loop here\n"; } return ; } - pos = find_user(allFds, dest); //return direct user fd if (pos != -1) { - ft_putstr_fd(pos, fullMsg); + send(allFds.userData[pos].fd, fullMsg.c_str(), fullMsg.size(), 0); return ; } - std::cout << "error msg\n"; - //ft_putstr_fd(fd, msg); + cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/channel\n"); } \ No newline at end of file diff --git a/srcs/commands/not_done_cmd.cpp b/srcs/commands/not_done_cmd.cpp index c108255..22f08b2 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/13 16:32:24 by apommier ### ########.fr */ +/* Updated: 2023/02/14 21:28:14 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -131,13 +131,13 @@ void INFO(std::string buffer, fdList &allFds, int userNbr) // return ; // } -void NOTICE(std::string buffer, fdList &allFds, int userNbr) -{ - (void)buffer; - (void)allFds; - (void)userNbr; - return ; -} +// void NOTICE(std::string buffer, fdList &allFds, int userNbr) +// { +// (void)buffer; +// (void)allFds; +// (void)userNbr; +// return ; +// } void WHO(std::string buffer, fdList &allFds, int userNbr) { diff --git a/srcs/commands/other/squit.cpp b/srcs/commands/operator/squit.cpp similarity index 100% rename from srcs/commands/other/squit.cpp rename to srcs/commands/operator/squit.cpp diff --git a/srcs/commands/other/ping_pong.cpp b/srcs/commands/other/ping_pong.cpp index 4729f7d..eb8e993 100644 --- a/srcs/commands/other/ping_pong.cpp +++ b/srcs/commands/other/ping_pong.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/13 00:16:27 by apommier #+# #+# */ -/* Updated: 2023/02/14 00:11:54 by apommier ### ########.fr */ +/* Updated: 2023/02/14 14:27:53 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/server_loop.cpp b/srcs/server_loop.cpp index 35e278e..adb16b2 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/13 16:47:16 by apommier ### ########.fr */ +/* Updated: 2023/02/14 18:11:44 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,15 +23,19 @@ void start_loop(fdList &allFds) allFds.alive = 1; - std::cout << "serverFd: " << allFds.serverFd << std::endl; + //std::cout << "serverFd: " << allFds.serverFd << std::endl; while (allFds.alive) { - + //std::cout << "---------start loop-----------\n"; //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); + + eventNbr = epoll_wait(allFds.epollFd, allFds.events, MAX_EVENTS, 0); + + //eventNbr = epoll_wait(allFds.epollFd, allFds.events, MAX_EVENTS, 5000); + //std::cout << "eventNbr = " << eventNbr << std::endl; - //std::cout << "eventNbr: " << eventNbr << std::endl; + //std::cout << "eventNbr: " << eventNbr << std::endl; //std::cout << "in loop adress " << &allFds << std::endl; for (i = 0; i < eventNbr ; i++) { @@ -50,9 +54,9 @@ void start_loop(fdList &allFds) // if (!clientRequest(allFds, nbr)) // alive = false; clientRequest(allFds, nbr); - } } + //std::cout << "---------end loop-----------\n"; } std::cout << "dead server\n"; diff --git a/srcs/utils.cpp b/srcs/utils.cpp index a5d0803..363032a 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 02:56:48 by apommier ### ########.fr */ +/* Updated: 2023/02/14 14:27:33 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,7 +18,7 @@ void ft_error(std::string str) if (errno) { std::cerr << "errno: " << strerror(errno) << std::endl; - throw std::bad_alloc(); + throw ;//std::bad_alloc(); //exit(errno); } exit(1);