diff --git a/includes/ft_irc.hpp b/includes/ft_irc.hpp index 08f0fb5..b559167 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/03/13 02:32:41 by apommier ### ########.fr */ +/* Updated: 2023/03/13 09:50:10 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -194,6 +194,7 @@ void print_registered_msg(fdList &allFds, int userNbr); /* *******************************CMD UTILS********************************** */ /* ************************************************************************** */ +void names_reply(fdList &allFds, channelData &chan, int fd, int userNbr); void split(std::string const &str, const char delim, std::vector &out); void split_but_keep(std::string const &str, const char delim, std::vector &out); //same as split but keep one delimeter @@ -242,9 +243,12 @@ void parse_commands(std::string buffer, fdList &allFds, int userNbr); /* ************************************************************************** */ //bool str_to_int(int &i, const std::string s); +int print_client_list(std::vector &list); void ban_reply(channelData &chan, clientData &user); void chan_reply(channelData &chan, clientData &user); void user_reply(clientData &user); +void chan_mode_reply(fdList &allFds, channelData &chan, int userNbr, std::string mode, int sign); +void user_mode_reply(fdList &allFds, clientData &user, int userNbr, std::string mode); int search_and_erase(std::string &str, std::string toFind); bool str_to_int(int &i, const std::string s); std::string int_to_str(int i); diff --git a/srcs/commands/channel/join.cpp b/srcs/commands/channel/join.cpp index b9fcc2b..7072d6a 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/03/12 21:50:58 by apommier ### ########.fr */ +/* Updated: 2023/03/13 08:56:33 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -94,23 +94,23 @@ void join_or_create(std::string buffer, fdList &allFds, int userNbr) else //chan doesn't exist yet { //std::cout << "new chan\n"; - channelData new_chan; + channelData tmp_chan; + allFds.channelList.push_back(tmp_chan); + channelData &new_chan = allFds.channelList[allFds.channelList.size() - 1]; if (splitBuff[1][0] != '#' && splitBuff[1][0] != '&') cmd_error(allFds, allFds.userData[userNbr].fd, "476 " + allFds.userData[userNbr].nickname + " " + splitBuff[1] + " :Bad Channel Mask\r\n"); - new_chan.name = splitBuff[1]; //new_chan.nbrUser = 1; + + new_chan.name = splitBuff[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); + //new_chan.List.push_back(&allFds.userData[userNbr]); allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList.back());//add chan in user data + joined_chan = allFds.channelList[allFds.channelList.size() - 1]; } - // if (chanNbr == -1) - // { - // chanNbr = - // find_channel(allFds, splitBuff[1]) - // } + + // :kinou3!kinou@172.17.0.1 JOIN :#test //done! std::string fullMsg; fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " JOIN :" + joined_chan.name + "\r\n"; for (size_t i = 0; i < joined_chan.userList.size(); i++) @@ -118,7 +118,10 @@ void join_or_create(std::string buffer, fdList &allFds, int userNbr) send(joined_chan.userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0); //std::cout << "loop here\n"; } - + std::cout << "size uselist=" << joined_chan.userList.size() << std::endl; + names_reply(allFds, joined_chan, allFds.userData[userNbr].fd, userNbr); + // :irc.local 353 kinou3 = #test :@kinou3 + // :irc.local 366 kinou3 #test :End of /NAMES list. if (chanNbr == -1) chanNbr = find_channel(allFds, splitBuff[1]); if (!allFds.channelList[chanNbr].topic.empty()) diff --git a/srcs/commands/channel_op/mode.cpp b/srcs/commands/channel_op/mode.cpp index 948165c..38adddd 100644 --- a/srcs/commands/channel_op/mode.cpp +++ b/srcs/commands/channel_op/mode.cpp @@ -6,48 +6,78 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/11 19:19:30 by apommier #+# #+# */ -/* Updated: 2023/03/13 06:47:29 by apommier ### ########.fr */ +/* Updated: 2023/03/13 10:37:01 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" #include +//:kinou3!kinou@172.17.0.1 MODE #test +o :kinou1 +//:kinou3!kinou@172.17.0.1 MODE #test :+p +//kinou3 = baseop +//kinou1 = newOP + void chan_opt_o(fdList &allFds, int userNbr, std::vector opt, int chanNbr, bool sign) { - (void)allFds; - (void)userNbr; (void)chanNbr; + int pos; - if (opt.size() != 4) + if (opt.size() < 4) { - std::cout << "ERR_NEEDMOREPARAMS" << std::endl; + //std::cout << "ERR_NEEDMOREPARAMS" << std::endl; + cmd_error(allFds, allFds.userData[userNbr].fd, "461 " + allFds.userData[userNbr].nickname + " MODE " + opt[0] + " :Not enough parameters\r\n"); return ; } if ((find_user(allFds, opt[3]) == -1)) { - std::cout << "User :" << opt[3] << " not found" << std::endl; - cmd_error(allFds, allFds.userData[userNbr].fd, "401 *" + opt[1] + " :No such nick/channel\n"); + //std::cout << "User :" << opt[3] << " not found" << std::endl; + cmd_error(allFds, allFds.userData[userNbr].fd, "401 " + allFds.userData[userNbr].nickname + " MODE " + opt[1] + " :No such nick\r\n"); return ; } - //A voir - if (allFds.userData[userNbr].mode.o == true && sign == true) - allFds.userData[find_user(allFds, opt[3])].mode.o = (sign = true) ? true : false; + pos = find_client_list(allFds.channelList[chanNbr].opList, &allFds.userData[userNbr]) != -1; + if (pos == -1 && !allFds.userData[userNbr].op) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "482 " + allFds.userData[userNbr].nickname + " MODE " + opt[1] + " :You're not channel operator\r\n"); + return ; + } + if (sign == false) + allFds.channelList[chanNbr].opList.erase(allFds.channelList[chanNbr].opList.begin() + pos); + else + allFds.channelList[chanNbr].opList.push_back(&allFds.userData[userNbr]); + chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "o", sign); + //retour mode chan + return ; - std::cout << "-------> " << opt[3] << std::endl; + // if (allFds.userData[userNbr].mode.o == true && sign == true) + // allFds.userData[find_user(allFds, opt[3])].mode.o = (sign = true) ? true : false; + + // std::cout << "-------> " << opt[3] << std::endl; } -void chan_opt_k(fdList &allFds, std::vector opt, int chanNbr, bool sign) +void chan_opt_k(fdList &allFds, int userNbr, std::vector opt, int chanNbr, bool sign) { - if (opt.size() != 4) + if (find_client_list(allFds.channelList[chanNbr].opList, &allFds.userData[userNbr]) == -1 && !allFds.userData[userNbr].op) { - std::cout << "ERR_NEEDMOREPARAMS" << std::endl; - std::cout << "how to use it :/MODE +k " << std::endl; + cmd_error(allFds, allFds.userData[userNbr].fd, "482 " + allFds.userData[userNbr].nickname + " MODE " + opt[1] + " :You're not channel operator\n"); + return ; + } + if (opt.size() < 4) + { + //std::cout << "ERR_NEEDMOREPARAMS" << std::endl; + //std::cout << "how to use it :/MODE +k " << std::endl; + cmd_error(allFds, allFds.userData[userNbr].fd, "461 " + allFds.userData[userNbr].nickname + " MODE " + opt[0] + " :Not enough parameters\n"); return ; } if (sign == true) + { + allFds.channelList[chanNbr].mode.k = 1; allFds.channelList[chanNbr].password = opt[3]; + } + else + allFds.channelList[chanNbr].mode.k = 0; + chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "k", sign); } void chan_opt_v(fdList &allFds, int userNbr, std::vector opt, int chanNbr, bool sign) @@ -56,17 +86,23 @@ void chan_opt_v(fdList &allFds, int userNbr, std::vector opt, int c (void)chanNbr; (void)sign; + if (find_client_list(allFds.channelList[chanNbr].opList, &allFds.userData[userNbr]) < 0) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "482 " + allFds.userData[userNbr].nickname + " MODE " + opt[1] + " :You're not channel operator\n"); + return ; + } if (opt.size() < 4) { std::cout << "ERR_NEEDMOREPARAMS" << std::endl; std::cout << "how to use it :/MODE +/-v " << std::endl; + cmd_error(allFds, allFds.userData[userNbr].fd, "461 " + allFds.userData[userNbr].nickname + " MODE " + opt[0] + " :Not enough parameters\n"); return ; } int target = find_user(allFds, opt[3]); if (target == -1) { - cmd_error(allFds, allFds.userData[userNbr].fd, "401 *" + opt[3] + " :No such nick/channel\n"); + cmd_error(allFds, allFds.userData[userNbr].fd, "401 " + allFds.userData[userNbr].nickname + " MODE " + opt[3] + " :No such nick\n"); return ; } @@ -75,57 +111,79 @@ void chan_opt_v(fdList &allFds, int userNbr, std::vector opt, int c allFds.channelList[chanNbr].verboseList.push_back(&allFds.userData[target]); if (sign == false && pos != -1) allFds.channelList[chanNbr].verboseList.erase(allFds.channelList[chanNbr].verboseList.begin() + pos); + chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "v", sign); } void chan_opt_b(fdList &allFds, int userNbr, std::vector opt, int chanNbr, bool sign) { std::vector ban(allFds.channelList[chanNbr].banList); - (void)userNbr; - (void)opt; - (void)chanNbr; - (void)sign; - (void)ban; + std::vector name; int pos; + int target_in_client; + int target_in_ban; if (opt.size() == 3 && sign == true) { - if (ban.empty() == true) - { - std::cout << "Nobody was banned on this channel" << std::endl; - return ; - } - for (long unsigned int i = 0; i < ban.size(); i++) - { - std::cout << ban[i]->nickname << std::endl; - } + // if (ban.empty() == true) + // { + // std::cout << "Nobody was banned on this channel" << std::endl; + // return ; + // } + // for (long unsigned int i = 0; i < ban.size(); ++i) + // { + // std::cout << ban[i]->nickname << std::endl; + // } ban_reply(allFds.channelList[chanNbr], allFds.userData[userNbr]); } + if (opt.size() >= 4) { - int target_in_client = find_user(allFds, opt[3]); - if (target_in_client == -1) + if (find_client_list(allFds.channelList[chanNbr].opList, &allFds.userData[userNbr]) < 0) { - std::cout << "No user found" << std::endl; + cmd_error(allFds, allFds.userData[userNbr].fd, "482 " + allFds.userData[userNbr].nickname + " MODE " + opt[1] + " :You're not channel operator\n"); return ; } - int target_in_ban = find_client_list(allFds.channelList[chanNbr].banList, &allFds.userData[target_in_client]); - if (sign == true && target_in_ban == -1) + split(opt[3], ',', name); + + for (size_t i = 0; i < name.size(); i++) { - allFds.channelList[chanNbr].banList.push_back(&allFds.userData[target_in_client]); - std::cout << "call kick\n"; - KICK("/KICK " + allFds.channelList[chanNbr].name + " " + allFds.userData[target_in_client].nickname + " You have been banned from this channel", allFds, userNbr); - if ((pos = find_client_list(allFds.channelList[chanNbr].userList, &allFds.userData[target_in_client])) != -1) - allFds.channelList[chanNbr].userList.erase(allFds.channelList[chanNbr].userList.begin() + pos); - if ((pos = find_client_list(allFds.channelList[chanNbr].opList, &allFds.userData[target_in_client])) != -1) - allFds.channelList[chanNbr].opList.erase(allFds.channelList[chanNbr].opList.begin() + pos); - } - if (sign == false && target_in_ban != -1) - { - std::cout <<"target in bam == "<< allFds.channelList[chanNbr].banList[target_in_ban]->nickname << std::endl; - allFds.channelList[chanNbr].banList.erase(allFds.channelList[chanNbr].banList.begin() + (target_in_ban)); + // std::cout << "===============>" << i << std::endl; + // std::cout << "===============>" << opt.size() << std::endl; + target_in_client = find_user(allFds, name[i]); + if (target_in_client == -1) + { + std::cout << "No user found" << std::endl; + cmd_error(allFds, allFds.userData[userNbr].fd, "401 " + allFds.userData[userNbr].nickname + " MODE " + name[i] + " :No such nick\n"); + // return ; + } + + target_in_ban = find_client_list(allFds.channelList[chanNbr].banList, &allFds.userData[target_in_client]); + if (sign == true && target_in_ban == -1) + { + if (find_client_list(allFds.channelList[chanNbr].opList, &allFds.userData[target_in_client])) + { + allFds.channelList[chanNbr].banList.push_back(&allFds.userData[target_in_client]); + std::cout << "call kick\n"; + KICK("/KICK " + allFds.channelList[chanNbr].name + " " + allFds.userData[target_in_client].nickname + " You have been banned from this channel", allFds, userNbr); + if ((pos = find_client_list(allFds.channelList[chanNbr].userList, &allFds.userData[target_in_client])) != -1) + allFds.channelList[chanNbr].userList.erase(allFds.channelList[chanNbr].userList.begin() + pos); + if ((pos = find_client_list(allFds.channelList[chanNbr].opList, &allFds.userData[target_in_client])) != -1) + allFds.channelList[chanNbr].opList.erase(allFds.channelList[chanNbr].opList.begin() + pos); + } + else + cmd_error(allFds, allFds.userData[userNbr].fd, "482 " + allFds.userData[userNbr].nickname + " MODE " + opt[0] + " :You're not channel operator\n"); + } + if (sign == false && target_in_ban != -1) + { + std::cout <<"target in bam == "<< allFds.channelList[chanNbr].banList[target_in_ban]->nickname << std::endl; + allFds.channelList[chanNbr].banList.erase(allFds.channelList[chanNbr].banList.begin() + (target_in_ban)); + } + std::cout << "counter" << std::endl; } } + chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "b", sign); + return ; } void do_chan_opt(fdList &allFds, int userNbr, std::vector opt, int chanNbr /*, channel (string or direct reference or pointer but no copy)*/) @@ -136,6 +194,7 @@ void do_chan_opt(fdList &allFds, int userNbr, std::vector opt, int // if (allFds.userData[userNbr].mode.o == false) // { + // cmd_error(allFds, allFds.userData[userNbr].fd, "482 " + allFds.userData[userNbr].nickname + opt[1] + " :You're not channel operator\n"); // return ; // } if (opt[2][0] == '-') @@ -144,29 +203,37 @@ void do_chan_opt(fdList &allFds, int userNbr, std::vector opt, int { switch (opt[2][i]) { - case 'o': chan_opt_o(allFds, userNbr, opt, chanNbr, sign); //std::cout << "launching option: " << opt[2][i] << std::endl; + case 'o': chan_opt_o(allFds, userNbr, opt, chanNbr, sign);//std::cout << "launching option: " << opt[2][i] << std::endl; + //chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "o", sign); break ; case 'p': allFds.channelList[chanNbr].mode.p = (sign == true) ? true : false; + chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "p", sign); break ; case 's': allFds.channelList[chanNbr].mode.s = (sign == true) ? true : false; + chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "s", sign); break ; case 'i': allFds.channelList[chanNbr].mode.i = (sign == true) ? true : false; + chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "i", sign); break ; case 't': allFds.channelList[chanNbr].mode.t = (sign == true) ? true : false; + chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "t", sign); break ; case 'n': allFds.channelList[chanNbr].mode.n = (sign == true) ? true : false; + chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "n", sign); break ; case 'm': allFds.channelList[chanNbr].mode.m = (sign == true) ? true : false; + chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "m", sign); break ; case 'l': if (sign == true) str_to_int(allFds.channelList[chanNbr].maxUser, opt[3]); + chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "l", sign); break ; case 'b': chan_opt_b(allFds, userNbr, opt, chanNbr, sign); break ; case 'v': chan_opt_v(allFds, userNbr, opt, chanNbr, sign); break ; - case 'k': chan_opt_k(allFds, opt, chanNbr, sign); + case 'k': chan_opt_k(allFds, userNbr, opt, chanNbr, sign); break ; default : std::cout << "Not launching option" << std::endl; break ; @@ -180,16 +247,13 @@ void do_chan_opt(fdList &allFds, int userNbr, std::vector opt, int } void do_user_opt(fdList &allFds, int userNbr, std::vector opt, int new_target) -{ - (void)allFds; - (void)userNbr; - (void)new_target; - //char opts[4] = {'i', 's', 'w', 'o'}; +{ bool sign = true; + if (allFds.userData[userNbr].nickname != opt[1]) { std::cout << "not the same user ! don't try to change someone else MODE you stupid bitch\n"; - cmd_error(allFds, allFds.userData[userNbr].fd, "502 *" + opt[1] + " :Cant change mode for other users\n"); + cmd_error(allFds, allFds.userData[userNbr].fd, "502 " + allFds.userData[userNbr].nickname + " MODE " + opt[1] + " :Cant change mode for other users\r\n"); return ; } if (opt[2][0] == '-') @@ -202,6 +266,7 @@ void do_user_opt(fdList &allFds, int userNbr, std::vector opt, int switch(opt[2][i]) { case 'i': allFds.userData[new_target].mode.i = (sign == true) ? true : false; + user_mode_reply(allFds, allFds.userData[new_target]/*clientData &user*/, userNbr, "i"); break ; case 's': allFds.userData[new_target].mode.s = (sign == true) ? true : false; break ; @@ -212,7 +277,7 @@ void do_user_opt(fdList &allFds, int userNbr, std::vector opt, int return ; // if (allFds.userData[userNbr].mode.o == false) // { - // cmd_error(allFds, allFds.userData[userNbr].fd, "482 *" + opt[1] + " :You're not channel operator\n"); + // cmd_error(allFds, allFds.userData[userNbr].fd, "482 " + allFds.userData[userNbr].nickname + opt[1] + " :You're not channel operator\n"); // return ; // } allFds.userData[new_target].mode.o = (sign == true) ? true : false; @@ -230,10 +295,11 @@ void MODE(std::string buffer, fdList &allFds, int userNbr) (void)userNbr; std::vector splitBuff; int pos; + split(buffer, ' ', splitBuff); if (splitBuff.size() < 2) { - cmd_error(allFds, allFds.userData[userNbr].fd, "461 *" + splitBuff[0] + " :Not enough parameters\n"); + cmd_error(allFds, allFds.userData[userNbr].fd, "461 " + allFds.userData[userNbr].nickname + " MODE " + splitBuff[0] + " :Not enough parameters\n"); return ; } if (splitBuff[1][0] == '#' || splitBuff[1][0] == '&') //splitbuff[1] always equal to or @@ -241,7 +307,7 @@ void MODE(std::string buffer, fdList &allFds, int userNbr) if ((pos = find_channel(allFds, splitBuff[1])) == -1) //if true chan doesn't exist { std::cout << splitBuff[1] << ": No such channel" << std::endl; - cmd_error(allFds, allFds.userData[userNbr].fd, "403 *" + splitBuff[1] + " :No such channel\n"); + cmd_error(allFds, allFds.userData[userNbr].fd, "403 " + allFds.userData[userNbr].nickname + " MODE " + splitBuff[1] + " :No such channel\n"); return ; }//else //verify_option(allFds, str, i); //needed? @@ -253,12 +319,18 @@ void MODE(std::string buffer, fdList &allFds, int userNbr) // std::cout << "splitbuff[2] after = " << splitBuff[2] << std::endl; if ((splitBuff[2].size() < 2) || (splitBuff[2][0] != '-' && splitBuff[2][0] != '+')) { + if (splitBuff[2].size() > 2) + { + if (splitBuff[2] == "b") + ban_reply(allFds.channelList[pos], allFds.userData[userNbr]); + } std::cout << "Bad params" << std::endl; return ; } do_chan_opt(allFds, userNbr, splitBuff, pos); } - chan_reply(allFds.channelList[pos], allFds.userData[userNbr]); + else + chan_reply(allFds.channelList[pos], allFds.userData[userNbr]); //do_option one by one here (do_chan_opt)? return ; } @@ -266,7 +338,7 @@ void MODE(std::string buffer, fdList &allFds, int userNbr) else if ((pos = find_user(allFds, splitBuff[1])) == -1) { std::cout << "user doesn't exist" << std::endl; - cmd_error(allFds, allFds.userData[userNbr].fd, "401 *" + splitBuff[1] + " :No such nick\n"); + cmd_error(allFds, allFds.userData[userNbr].fd, "401 " + allFds.userData[userNbr].nickname + " MODE " + splitBuff[1] + " :No such nick\n"); return ; } else @@ -276,12 +348,13 @@ void MODE(std::string buffer, fdList &allFds, int userNbr) search_and_erase(splitBuff[2], "iswo"); if ((splitBuff[2].size() < 2) && (splitBuff[2][0] != '-' || splitBuff[2][0] != '+')) { - cmd_error(allFds, allFds.userData[userNbr].fd, "461 *" + splitBuff[0] + " :Not enough parameters\n"); + cmd_error(allFds, allFds.userData[userNbr].fd, "461 " + allFds.userData[userNbr].nickname + " MODE " + splitBuff[0] + " :Not enough parameters\n"); return ; } do_user_opt(allFds, userNbr, splitBuff, pos); } - user_reply(allFds.userData[userNbr]); + else + user_reply(allFds.userData[userNbr]); } //do_option one by one here (do_user_opt)? diff --git a/srcs/commands/channel_op/utils_mode.cpp b/srcs/commands/channel_op/utils_mode.cpp index 8d956e4..90ddcb9 100644 --- a/srcs/commands/channel_op/utils_mode.cpp +++ b/srcs/commands/channel_op/utils_mode.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/09 00:13:32 by apommier #+# #+# */ -/* Updated: 2023/03/13 06:21:17 by apommier ### ########.fr */ +/* Updated: 2023/03/13 10:23:05 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,8 @@ void ban_reply(channelData &chan, clientData &user) fullReply = reply + chan.banList[i]->nickname + "!" + chan.banList[i]->userName + "@" + chan.banList[i]->hostName + "\r\n"; send(user.fd, fullReply.c_str(), fullReply.size(), 0); } - endReply = ":irc.local 367 " + user.nickname + " " + chan.name + " :End of channel ban list\r\n"; + //:irc.local 368 kinou3 #test :End of channel ban list + endReply = ":irc.local 368 " + user.nickname + " " + chan.name + " :End of channel ban list\r\n"; send(user.fd, endReply.c_str(), endReply.size(), 0); } @@ -32,7 +33,8 @@ void chan_reply(channelData &chan, clientData &user) (void) chan; //int mode; //std::string reply = " +"; - std::string reply = ":irc.local 324 " + user.nickname + " " + chan.name + " +"; + //:irc.local 324 kinou3 #test :+nt + std::string reply = ":irc.local 324 " + user.nickname + " " + chan.name + " :+"; if (chan.mode.p) reply += 'p'; if (chan.mode.s) @@ -60,12 +62,65 @@ void chan_reply(channelData &chan, clientData &user) //return (reply); } +void chan_mode_reply(fdList &allFds, channelData &chan, int userNbr, std::string mode, int sign) +{ + //userNbr = asking client + //client = changed mode client + + //:kinou3!kinou@172.17.0.1 MODE #test +o :kinou1 + //:kinou3!kinou@172.17.0.1 MODE #test :+p + //kinou3 = baseop + //kinou1 = newOP + + + std::string reply = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + + "@" + allFds.userData[userNbr].ip + " MODE " + chan.name;// + " :+" + mode + "\r\n"; + //if (sign) + // reply += " +"; + //else + // reply += " -"; + if (sign) + { + reply += " +"; + if (mode == "o") + reply += mode + " :" + chan.opList.back()->nickname; + else if (mode == "l") + reply += mode + " :" + int_to_str(chan.maxUser); + else if (mode == "b") + reply += mode + " :" + chan.banList.back()->nickname; + else if (mode == "v") + reply += mode + " :" + chan.verboseList.back()->nickname; + else if (mode == "k") + reply += mode + " :" + chan.password; + } + else if (mode == "o") + reply += " -" + mode + " :" + chan.verboseList.back()->nickname; + else if (mode == "b") + reply += " -" + mode + " :" + chan.verboseList.back()->nickname; + else if (mode == "v") + reply += " -" + mode + " :" + chan.verboseList.back()->nickname; + else if (sign) + reply += " :+" + mode; + else + reply += " :-" + mode; + reply += "\r\n"; + std::cout << "reply=" << reply << std::endl; + for (size_t i = 0; i < chan.userList.size(); i++) + { + std::cout << "i=" << i << std::endl; + send(chan.userList[i]->fd, reply.c_str(), reply.size(), 0); + } + //send(allFds.userData[userNbr].fd, reply.c_str(), reply.size(), 0); + //void user_reply(clientData &user) +} + void user_mode_reply(fdList &allFds, clientData &user, int userNbr, std::string mode) { //userNbr = asking client //client = changed mode client std::string reply = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName - + "@" + allFds.userData[userNbr].ip + " MODE " + user.nickname + " :+" + mode; + + "@" + allFds.userData[userNbr].ip + " MODE " + user.nickname + " :+" + mode + "\r\n"; + send(allFds.userData[userNbr].fd, reply.c_str(), reply.size(), 0); //void user_reply(clientData &user) } diff --git a/srcs/commands/other/names.cpp b/srcs/commands/other/names.cpp index 697a336..89c0aa5 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/03/13 06:12:36 by apommier ### ########.fr */ +/* Updated: 2023/03/13 10:24:43 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,17 +19,25 @@ void names_reply(fdList &allFds, channelData &chan, int fd, int userNbr) { //:irc.local 353 kinou3 = #test :@kinou3 std::string msg; + print_client_list(chan.opList); + print_client_list(chan.verboseList); msg = "353 " + allFds.userData[userNbr].nickname + " = " + chan.name + " :"; for (size_t i = 0; i < chan.userList.size(); i++) { if (chan.userList[i]->mode.i && !is_in_same(allFds, userNbr, find_user(allFds, chan.userList[i]->nickname) && !allFds.userData[userNbr].op)/*user secret et pas meme chan*/) ; - else if (find_client_list(chan.opList, chan.userList[i]) || allFds.userData[userNbr].op)//(chan.userList[i]->mode.o)//ischanop + else if (find_client_list(chan.opList, chan.userList[i]) != -1 || allFds.userData[userNbr].op)//(chan.userList[i]->mode.o)//ischanop + { + std::cout << "he is op!!!\n"; msg += "@" + chan.userList[i]->nickname + " "; - else if (find_client_list(chan.verboseList, chan.userList[i]))//(chan.userList[i]->mode.v)//verbose - msg += "=" + chan.userList[i]->nickname + " "; - else + } + else if (find_client_list(chan.verboseList, chan.userList[i]) != -1)//(chan.userList[i]->mode.v)//verbose + { + std::cout << "he is verbose???\n"; msg += "+" + chan.userList[i]->nickname + " "; + } + else + msg += /*"=" +*/ chan.userList[i]->nickname + " "; } msg += "\r\n"; std::cout << "name msg= " << msg; diff --git a/srcs/utils.cpp b/srcs/utils.cpp index bdd7ab0..d9faa61 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/03/13 02:33:08 by apommier ### ########.fr */ +/* Updated: 2023/03/13 08:32:00 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -90,6 +90,17 @@ int find_client_list(std::vector &list, clientData *client) return (-1); } +int print_client_list(std::vector &list) +{ + int size = list.size(); + std::cout << "=PRINT LIST=\n"; + for (int i = 0; i < size; i++) + { + std::cout << i << "= " << list[i]->nickname << std::endl; + } + return (-1); +} + std::string int_to_str(int i) { std::string s;