From 9074d655a5ec5a2639b68318a6f0201be6e73d68 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Wed, 8 Mar 2023 23:39:57 +0100 Subject: [PATCH] all done ? --- includes/ft_irc.hpp | 11 +++-------- srcs/commands/channel/join.cpp | 11 ++++++----- srcs/commands/channel/part.cpp | 24 +++++++++++++++++++----- srcs/commands/channel/privmsg.cpp | 8 +++++--- srcs/commands/channel_op/kick.cpp | 5 +++-- srcs/commands/operator/squit.cpp | 15 ++++++++++++++- srcs/commands/other/quit.cpp | 7 +++++-- srcs/delete_user.cpp | 27 ++++++++++++++++++++++----- srcs/main.cpp | 9 +++++++-- srcs/start_server.cpp | 6 ++++-- srcs/utils.cpp | 17 +++++++++-------- 11 files changed, 97 insertions(+), 43 deletions(-) diff --git a/includes/ft_irc.hpp b/includes/ft_irc.hpp index ff22092..f16303e 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/23 21:12:34 by apommier ### ########.fr */ +/* Updated: 2023/03/03 22:19:08 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -94,7 +94,7 @@ struct userMode userMode() : i(0), - s(0), + s(1), w(0), o(0) {} }; @@ -129,7 +129,7 @@ struct channelData //each chan have one { std::string name; std::string topic; -6 + std::vector userList; std::vector banList; std::vector invitedList; @@ -161,11 +161,6 @@ struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY functionTab parsingTab; }; - - - - - /* ************************************************************************** */ /* *******************************DEL USER*********************************** */ /* ************************************************************************** */ diff --git a/srcs/commands/channel/join.cpp b/srcs/commands/channel/join.cpp index 8be3f27..eb36478 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/23 20:33:50 by apommier ### ########.fr */ +/* Updated: 2023/03/03 19:37:23 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,7 +39,7 @@ void leave_all(fdList &allFds, int userNbr) int chan_check(fdList &allFds, int userNbr, int chanNbr, std::vector splitBuff) { std::string errorStr; - if (find_client_list(allFds.channelList[chanNbr].banList, &allFds.userData[userNbr]) == -1) + if (find_client_list(allFds.channelList[chanNbr].banList, &allFds.userData[userNbr]) != -1) { errorStr = "474 * JOIN " + allFds.channelList[chanNbr].name + " :Cannot join channel (+b)\n"; cmd_error(allFds, allFds.userData[userNbr].fd, errorStr); //ERR_INVITEONLYCHAN @@ -99,6 +99,7 @@ void join_or_create(std::string buffer, fdList &allFds, int userNbr) 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.opList.push_back(&allFds.userData[userNbr]); new_chan.userList.push_back(&allFds.userData[userNbr]); joined_chan = new_chan; allFds.channelList.push_back(new_chan); @@ -118,12 +119,12 @@ void join_or_create(std::string buffer, fdList &allFds, int userNbr) std::cout << "loop here\n"; } - if (chanNbr == -1) + 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"); + //else + // cmd_error(allFds, allFds.userData[userNbr].fd, "NOTICE 331 TOPIC " + allFds.channelList[chanNbr].name + " :No topic is set\n"); // if (chanNbr == -1) // { diff --git a/srcs/commands/channel/part.cpp b/srcs/commands/channel/part.cpp index b72d2a1..cdbdc1b 100644 --- a/srcs/commands/channel/part.cpp +++ b/srcs/commands/channel/part.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/19 22:10:07 by apommier #+# #+# */ -/* Updated: 2023/02/23 17:46:29 by apommier ### ########.fr */ +/* Updated: 2023/03/03 22:18:44 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,14 +34,28 @@ void leave_chan(fdList &allFds, std::string chan, int userNbr, std::string msg) //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"; + //reply = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " PART :" + allFds.channelList[chanPos].name + "\n"; + reply = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip; + if (!msg.empty()) + reply += " PART " + allFds.channelList[chanPos].name + " " + msg + "\n"; + else + reply += " 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; + //(void )msg; + // reply += " " + msg; + //else + // reply += "\n"; std::cout << "leave msg=" << reply << std::endl; send(allFds.userData[userNbr].fd, reply.c_str(), reply.size(), 0); + for (int i = 0; i < allFds.channelList[chanPos].nbrUser; i++) + { + if (allFds.channelList[chanPos].userList[i]->mode.s) + send(allFds.channelList[chanPos].userList[i]->fd, reply.c_str(), reply.size(), 0); + std::cout << "loop here\n"; + } + //cmd_reply(allFds, allFds.userData[userNbr].fd, reply + "\n"); } diff --git a/srcs/commands/channel/privmsg.cpp b/srcs/commands/channel/privmsg.cpp index de2f1f4..e08bad1 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/23 17:46:47 by apommier ### ########.fr */ +/* Updated: 2023/03/03 22:28:18 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -82,7 +82,8 @@ void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr) 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) + + if (i != (size_t)userNbr && allFds.channelList[pos].userList[i]->mode.s) send(allFds.channelList[pos].userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0); std::cout << "loop here\n"; } @@ -95,7 +96,8 @@ 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 ; } - send(allFds.userData[pos].fd, fullMsg.c_str(), fullMsg.size(), 0); + if (allFds.userData[pos].mode.s) + 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/kick.cpp b/srcs/commands/channel_op/kick.cpp index f7f61df..a2881fc 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/23 17:47:18 by apommier ### ########.fr */ +/* Updated: 2023/03/03 22:24:11 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -70,7 +70,8 @@ void KICK(std::string buffer, fdList &allFds, int userNbr) //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); + if (allFds.channelList[chanPos].userList[i]->mode.s) + send(allFds.channelList[chanPos].userList[i]->fd, kickMsg.c_str(), kickMsg.size(), 0); } //cmd_reply(allFds, allFds.userData[userPos].fd, msg); diff --git a/srcs/commands/operator/squit.cpp b/srcs/commands/operator/squit.cpp index 8cd30cd..1b0df1b 100644 --- a/srcs/commands/operator/squit.cpp +++ b/srcs/commands/operator/squit.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 19:11:03 by apommier #+# #+# */ -/* Updated: 2023/02/23 17:48:11 by apommier ### ########.fr */ +/* Updated: 2023/03/08 02:09:55 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,7 +44,20 @@ void SQUIT(std::string buffer, fdList &allFds, int userNbr) cmd_error(allFds, allFds.userData[userNbr].fd, "402 * " + splitBuff[2] + " :No such server\n"); return ; } + std::string fullMsg; + for (int pos = 0; pos < allFds.nbrUser; pos++) + { + fullMsg = ":irc.local NOTICE " + allFds.userData[pos].userName + "." + allFds.userData[pos].nickname + " :*** You have been disconnected from the server"; + //fullMsg = ":" + allFds.userData[pos].nickname + "!" + + "@" + allFds.userData[pos].ip + " QUIT :Server shutdown\n"; + send(allFds.userData[pos].fd, fullMsg.c_str(), fullMsg.size(), 0); + if (close(allFds.userData[pos].fd) != 0) + ft_error("close() error"); + } std::cout << "squit | alive = 0\n"; + if (close(allFds.serverFd) != 0) + ft_error("close() error"); + if (close(allFds.epollFd) != 0) + ft_error("close() error"); allFds.alive = 0; // if (allFds.userData[userNbr].op) // allFds.alive = 0; diff --git a/srcs/commands/other/quit.cpp b/srcs/commands/other/quit.cpp index 225e8d5..d3934e9 100644 --- a/srcs/commands/other/quit.cpp +++ b/srcs/commands/other/quit.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 19:10:26 by apommier #+# #+# */ -/* Updated: 2023/02/16 22:25:37 by apommier ### ########.fr */ +/* Updated: 2023/03/03 22:24:47 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,10 @@ void send_quit_msg(fdList &allFds, int userNbr, std::string msg) { //std::cout << "send nickname " << allFds.userData[userNbr].joinedChan[i]->userList[j]->nickname << std::endl; if (allFds.userData[userNbr].joinedChan[i]->userList[j] != &allFds.userData[userNbr]) - send(allFds.userData[userNbr].joinedChan[i]->userList[j]->fd, fullMsg.c_str(), fullMsg.size(), 0); + { + if (allFds.userData[userNbr].joinedChan[i]->userList[j]->mode.s) + send(allFds.userData[userNbr].joinedChan[i]->userList[j]->fd, fullMsg.c_str(), fullMsg.size(), 0); + } else std::cout << "hehe je quitte\n"; std::cout << "loop here\n"; diff --git a/srcs/delete_user.cpp b/srcs/delete_user.cpp index 4cd0b74..5f8f645 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/17 21:49:52 by apommier ### ########.fr */ +/* Updated: 2023/03/08 01:08:10 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,10 +14,27 @@ 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); + // size_t i; + int pos; + // for (i = 0; user != chan->userList[i]; i++) + // ; + // chan->userList.erase(chan->userList.begin() + i); + + if ((pos = find_client_list(chan->userList, user)) != -1) + chan->userList.erase(chan->userList.begin() + pos); + + if ((pos = find_client_list(chan->banList, user)) != -1) + chan->userList.erase(chan->banList.begin() + pos); + + if ((pos = find_client_list(chan->invitedList, user)) != -1) + chan->userList.erase(chan->invitedList.begin() + pos); + + if ((pos = find_client_list(chan->verboseList, user)) != -1) + chan->userList.erase(chan->verboseList.begin() + pos); + + if ((pos = find_client_list(chan->opList, user)) != -1) + chan->userList.erase(chan->opList.begin() + pos); + chan->nbrUser--; } diff --git a/srcs/main.cpp b/srcs/main.cpp index 9068700..00a0bb8 100644 --- a/srcs/main.cpp +++ b/srcs/main.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/01 17:27:33 by apommier #+# #+# */ -/* Updated: 2023/02/14 03:00:42 by apommier ### ########.fr */ +/* Updated: 2023/03/03 22:57:10 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,9 +25,14 @@ int main(int ac, char **av) { initialize(av); } + // catch() + // { + // std::cout << "Fatal error causing the end of the program :/\n"; + // } catch(std::exception &e) { - std::cout << "Fatal error causing the end of the program :/\n"; + if (errno) + std::cerr << "Fatal error: " << strerror(errno) << std::endl; } return (0); } \ No newline at end of file diff --git a/srcs/start_server.cpp b/srcs/start_server.cpp index 3ba032a..c586d25 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/15 00:14:07 by apommier ### ########.fr */ +/* Updated: 2023/03/03 22:53:28 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -36,7 +36,9 @@ void initialize(char **av) allFds.serverFd = socket(AF_INET, SOCK_STREAM, 0); if (allFds.serverFd == -1) ft_error("socket() error"); - if (setsockopt(allFds.serverFd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) + // if (setsockopt(allFds.serverFd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) + // ft_error("setsockopt() error"); + if (setsockopt(allFds.serverFd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) ft_error("setsockopt() error"); addr.sin_port = htons(atoi(av[1])); diff --git a/srcs/utils.cpp b/srcs/utils.cpp index e2185c9..59f81ae 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/23 20:29:25 by apommier ### ########.fr */ +/* Updated: 2023/03/03 22:56:34 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,13 +15,14 @@ void ft_error(std::string str) { std::cerr << str << std::endl; - if (errno) - { - std::cerr << "errno: " << strerror(errno) << std::endl; - throw ;//std::bad_alloc(); - //exit(errno); - } - exit(1); + throw std::exception(); + // if (errno) + // { + // std::cerr << "errno: " << strerror(errno) << std::endl; + // throw std::exception(); + // //exit(errno); + // } + //exit(1); } void close_fd(int fd)