fix mode (verbose operator) fix mode reply and error

This commit is contained in:
kinou-p 2023-03-13 10:41:53 +01:00
commit a16ccf5611
6 changed files with 238 additions and 84 deletions

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/01 17:27:37 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********************************** */ /* *******************************CMD UTILS********************************** */
/* ************************************************************************** */ /* ************************************************************************** */
void names_reply(fdList &allFds, channelData &chan, int fd, int userNbr);
void split(std::string const &str, const char delim, std::vector<std::string> &out); void split(std::string const &str, const char delim, std::vector<std::string> &out);
void split_but_keep(std::string const &str, const char delim, std::vector<std::string> &out); //same as split but keep one delimeter void split_but_keep(std::string const &str, const char delim, std::vector<std::string> &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); //bool str_to_int(int &i, const std::string s);
int print_client_list(std::vector<clientData *> &list);
void ban_reply(channelData &chan, clientData &user); void ban_reply(channelData &chan, clientData &user);
void chan_reply(channelData &chan, clientData &user); void chan_reply(channelData &chan, clientData &user);
void user_reply(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); int search_and_erase(std::string &str, std::string toFind);
bool str_to_int(int &i, const std::string s); bool str_to_int(int &i, const std::string s);
std::string int_to_str(int i); std::string int_to_str(int i);

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/09 15:40:33 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 else //chan doesn't exist yet
{ {
//std::cout << "new chan\n"; //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] != '&') 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"); 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.nbrUser = 1;
new_chan.name = splitBuff[1];
new_chan.opList.push_back(&allFds.userData[userNbr]); new_chan.opList.push_back(&allFds.userData[userNbr]);
new_chan.userList.push_back(&allFds.userData[userNbr]); new_chan.userList.push_back(&allFds.userData[userNbr]);
joined_chan = new_chan; //new_chan.List.push_back(&allFds.userData[userNbr]);
allFds.channelList.push_back(new_chan);
allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList.back());//add chan in user data 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; std::string fullMsg;
fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " JOIN :" + joined_chan.name + "\r\n"; 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++) 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); send(joined_chan.userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0);
//std::cout << "loop here\n"; //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) if (chanNbr == -1)
chanNbr = find_channel(allFds, splitBuff[1]); chanNbr = find_channel(allFds, splitBuff[1]);
if (!allFds.channelList[chanNbr].topic.empty()) if (!allFds.channelList[chanNbr].topic.empty())

View File

@ -6,48 +6,78 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 19:19:30 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 "../../../includes/ft_irc.hpp"
#include <sstream> #include <sstream>
//: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<std::string> opt, int chanNbr, bool sign) void chan_opt_o(fdList &allFds, int userNbr, std::vector<std::string> opt, int chanNbr, bool sign)
{ {
(void)allFds;
(void)userNbr;
(void)chanNbr; (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 ; return ;
} }
if ((find_user(allFds, opt[3]) == -1)) if ((find_user(allFds, opt[3]) == -1))
{ {
std::cout << "User :" << opt[3] << " not found" << std::endl; //std::cout << "User :" << opt[3] << " not found" << std::endl;
cmd_error(allFds, allFds.userData[userNbr].fd, "401 *" + opt[1] + " :No such nick/channel\n"); cmd_error(allFds, allFds.userData[userNbr].fd, "401 " + allFds.userData[userNbr].nickname + " MODE " + opt[1] + " :No such nick\r\n");
return ; return ;
} }
//A voir //A voir
if (allFds.userData[userNbr].mode.o == true && sign == true) pos = find_client_list(allFds.channelList[chanNbr].opList, &allFds.userData[userNbr]) != -1;
allFds.userData[find_user(allFds, opt[3])].mode.o = (sign = true) ? true : false; 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<std::string> opt, int chanNbr, bool sign) void chan_opt_k(fdList &allFds, int userNbr, std::vector<std::string> 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; cmd_error(allFds, allFds.userData[userNbr].fd, "482 " + allFds.userData[userNbr].nickname + " MODE " + opt[1] + " :You're not channel operator\n");
std::cout << "how to use it :/MODE <channel >+k <password>" << std::endl; return ;
}
if (opt.size() < 4)
{
//std::cout << "ERR_NEEDMOREPARAMS" << std::endl;
//std::cout << "how to use it :/MODE <channel >+k <password>" << std::endl;
cmd_error(allFds, allFds.userData[userNbr].fd, "461 " + allFds.userData[userNbr].nickname + " MODE " + opt[0] + " :Not enough parameters\n");
return ; return ;
} }
if (sign == true) if (sign == true)
{
allFds.channelList[chanNbr].mode.k = 1;
allFds.channelList[chanNbr].password = opt[3]; 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<std::string> opt, int chanNbr, bool sign) void chan_opt_v(fdList &allFds, int userNbr, std::vector<std::string> opt, int chanNbr, bool sign)
@ -56,17 +86,23 @@ void chan_opt_v(fdList &allFds, int userNbr, std::vector<std::string> opt, int c
(void)chanNbr; (void)chanNbr;
(void)sign; (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) if (opt.size() < 4)
{ {
std::cout << "ERR_NEEDMOREPARAMS" << std::endl; std::cout << "ERR_NEEDMOREPARAMS" << std::endl;
std::cout << "how to use it :/MODE <channel> +/-v <user>" << std::endl; std::cout << "how to use it :/MODE <channel> +/-v <user>" << std::endl;
cmd_error(allFds, allFds.userData[userNbr].fd, "461 " + allFds.userData[userNbr].nickname + " MODE " + opt[0] + " :Not enough parameters\n");
return ; return ;
} }
int target = find_user(allFds, opt[3]); int target = find_user(allFds, opt[3]);
if (target == -1) 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 ; return ;
} }
@ -75,57 +111,79 @@ void chan_opt_v(fdList &allFds, int userNbr, std::vector<std::string> opt, int c
allFds.channelList[chanNbr].verboseList.push_back(&allFds.userData[target]); allFds.channelList[chanNbr].verboseList.push_back(&allFds.userData[target]);
if (sign == false && pos != -1) if (sign == false && pos != -1)
allFds.channelList[chanNbr].verboseList.erase(allFds.channelList[chanNbr].verboseList.begin() + pos); 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<std::string> opt, int chanNbr, bool sign) void chan_opt_b(fdList &allFds, int userNbr, std::vector<std::string> opt, int chanNbr, bool sign)
{ {
std::vector<clientData *> ban(allFds.channelList[chanNbr].banList); std::vector<clientData *> ban(allFds.channelList[chanNbr].banList);
(void)userNbr; std::vector<std::string> name;
(void)opt;
(void)chanNbr;
(void)sign;
(void)ban;
int pos; int pos;
int target_in_client;
int target_in_ban;
if (opt.size() == 3 && sign == true) if (opt.size() == 3 && sign == true)
{ {
if (ban.empty() == true) // if (ban.empty() == true)
{ // {
std::cout << "Nobody was banned on this channel" << std::endl; // std::cout << "Nobody was banned on this channel" << std::endl;
return ; // return ;
} // }
for (long unsigned int i = 0; i < ban.size(); i++) // for (long unsigned int i = 0; i < ban.size(); ++i)
{ // {
std::cout << ban[i]->nickname << std::endl; // std::cout << ban[i]->nickname << std::endl;
} // }
ban_reply(allFds.channelList[chanNbr], allFds.userData[userNbr]); ban_reply(allFds.channelList[chanNbr], allFds.userData[userNbr]);
} }
if (opt.size() >= 4) if (opt.size() >= 4)
{ {
int target_in_client = find_user(allFds, opt[3]); if (find_client_list(allFds.channelList[chanNbr].opList, &allFds.userData[userNbr]) < 0)
if (target_in_client == -1)
{ {
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 ; return ;
} }
int target_in_ban = find_client_list(allFds.channelList[chanNbr].banList, &allFds.userData[target_in_client]); split(opt[3], ',', name);
if (sign == true && target_in_ban == -1)
for (size_t i = 0; i < name.size(); i++)
{ {
allFds.channelList[chanNbr].banList.push_back(&allFds.userData[target_in_client]); // std::cout << "===============>" << i << std::endl;
std::cout << "call kick\n"; // std::cout << "===============>" << opt.size() << std::endl;
KICK("/KICK " + allFds.channelList[chanNbr].name + " " + allFds.userData[target_in_client].nickname + " You have been banned from this channel", allFds, userNbr); target_in_client = find_user(allFds, name[i]);
if ((pos = find_client_list(allFds.channelList[chanNbr].userList, &allFds.userData[target_in_client])) != -1) if (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) std::cout << "No user found" << std::endl;
allFds.channelList[chanNbr].opList.erase(allFds.channelList[chanNbr].opList.begin() + pos); cmd_error(allFds, allFds.userData[userNbr].fd, "401 " + allFds.userData[userNbr].nickname + " MODE " + name[i] + " :No such nick\n");
} // return ;
if (sign == false && target_in_ban != -1) }
{
std::cout <<"target in bam == "<< allFds.channelList[chanNbr].banList[target_in_ban]->nickname << std::endl; target_in_ban = find_client_list(allFds.channelList[chanNbr].banList, &allFds.userData[target_in_client]);
allFds.channelList[chanNbr].banList.erase(allFds.channelList[chanNbr].banList.begin() + (target_in_ban)); 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<std::string> opt, int chanNbr /*, channel (string or direct reference or pointer but no copy)*/) void do_chan_opt(fdList &allFds, int userNbr, std::vector<std::string> 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<std::string> opt, int
// if (allFds.userData[userNbr].mode.o == false) // 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 ; // return ;
// } // }
if (opt[2][0] == '-') if (opt[2][0] == '-')
@ -144,29 +203,37 @@ void do_chan_opt(fdList &allFds, int userNbr, std::vector<std::string> opt, int
{ {
switch (opt[2][i]) 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 ; break ;
case 'p': allFds.channelList[chanNbr].mode.p = (sign == true) ? true : false; case 'p': allFds.channelList[chanNbr].mode.p = (sign == true) ? true : false;
chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "p", sign);
break ; break ;
case 's': allFds.channelList[chanNbr].mode.s = (sign == true) ? true : false; case 's': allFds.channelList[chanNbr].mode.s = (sign == true) ? true : false;
chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "s", sign);
break ; break ;
case 'i': allFds.channelList[chanNbr].mode.i = (sign == true) ? true : false; case 'i': allFds.channelList[chanNbr].mode.i = (sign == true) ? true : false;
chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "i", sign);
break ; break ;
case 't': allFds.channelList[chanNbr].mode.t = (sign == true) ? true : false; case 't': allFds.channelList[chanNbr].mode.t = (sign == true) ? true : false;
chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "t", sign);
break ; break ;
case 'n': allFds.channelList[chanNbr].mode.n = (sign == true) ? true : false; case 'n': allFds.channelList[chanNbr].mode.n = (sign == true) ? true : false;
chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "n", sign);
break ; break ;
case 'm': allFds.channelList[chanNbr].mode.m = (sign == true) ? true : false; case 'm': allFds.channelList[chanNbr].mode.m = (sign == true) ? true : false;
chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "m", sign);
break ; break ;
case 'l': case 'l':
if (sign == true) if (sign == true)
str_to_int(allFds.channelList[chanNbr].maxUser, opt[3]); str_to_int(allFds.channelList[chanNbr].maxUser, opt[3]);
chan_mode_reply(allFds, allFds.channelList[chanNbr], userNbr, "l", sign);
break ; break ;
case 'b': chan_opt_b(allFds, userNbr, opt, chanNbr, sign); case 'b': chan_opt_b(allFds, userNbr, opt, chanNbr, sign);
break ; break ;
case 'v': chan_opt_v(allFds, userNbr, opt, chanNbr, sign); case 'v': chan_opt_v(allFds, userNbr, opt, chanNbr, sign);
break ; break ;
case 'k': chan_opt_k(allFds, opt, chanNbr, sign); case 'k': chan_opt_k(allFds, userNbr, opt, chanNbr, sign);
break ; break ;
default : std::cout << "Not launching option" << std::endl; default : std::cout << "Not launching option" << std::endl;
break ; break ;
@ -181,15 +248,12 @@ void do_chan_opt(fdList &allFds, int userNbr, std::vector<std::string> opt, int
void do_user_opt(fdList &allFds, int userNbr, std::vector<std::string> opt, int new_target) void do_user_opt(fdList &allFds, int userNbr, std::vector<std::string> opt, int new_target)
{ {
(void)allFds;
(void)userNbr;
(void)new_target;
//char opts[4] = {'i', 's', 'w', 'o'};
bool sign = true; bool sign = true;
if (allFds.userData[userNbr].nickname != opt[1]) 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"; 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 ; return ;
} }
if (opt[2][0] == '-') if (opt[2][0] == '-')
@ -202,6 +266,7 @@ void do_user_opt(fdList &allFds, int userNbr, std::vector<std::string> opt, int
switch(opt[2][i]) switch(opt[2][i])
{ {
case 'i': allFds.userData[new_target].mode.i = (sign == true) ? true : false; 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 ; break ;
case 's': allFds.userData[new_target].mode.s = (sign == true) ? true : false; case 's': allFds.userData[new_target].mode.s = (sign == true) ? true : false;
break ; break ;
@ -212,7 +277,7 @@ void do_user_opt(fdList &allFds, int userNbr, std::vector<std::string> opt, int
return ; return ;
// if (allFds.userData[userNbr].mode.o == false) // 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 ; // return ;
// } // }
allFds.userData[new_target].mode.o = (sign == true) ? true : false; 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; (void)userNbr;
std::vector<std::string> splitBuff; std::vector<std::string> splitBuff;
int pos; int pos;
split(buffer, ' ', splitBuff); split(buffer, ' ', splitBuff);
if (splitBuff.size() < 2) 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 ; return ;
} }
if (splitBuff[1][0] == '#' || splitBuff[1][0] == '&') //splitbuff[1] always equal to <channel> or <nickname> if (splitBuff[1][0] == '#' || splitBuff[1][0] == '&') //splitbuff[1] always equal to <channel> or <nickname>
@ -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 if ((pos = find_channel(allFds, splitBuff[1])) == -1) //if true chan doesn't exist
{ {
std::cout << splitBuff[1] << ": No such channel" << std::endl; 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 ; return ;
}//else }//else
//verify_option(allFds, str, i); //needed? //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; // 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) || (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; std::cout << "Bad params" << std::endl;
return ; return ;
} }
do_chan_opt(allFds, userNbr, splitBuff, pos); 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)? //do_option one by one here (do_chan_opt)?
return ; return ;
} }
@ -266,7 +338,7 @@ void MODE(std::string buffer, fdList &allFds, int userNbr)
else if ((pos = find_user(allFds, splitBuff[1])) == -1) else if ((pos = find_user(allFds, splitBuff[1])) == -1)
{ {
std::cout << "user doesn't exist" << std::endl; 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 ; return ;
} }
else else
@ -276,12 +348,13 @@ void MODE(std::string buffer, fdList &allFds, int userNbr)
search_and_erase(splitBuff[2], "iswo"); search_and_erase(splitBuff[2], "iswo");
if ((splitBuff[2].size() < 2) && (splitBuff[2][0] != '-' || splitBuff[2][0] != '+')) 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 ; return ;
} }
do_user_opt(allFds, userNbr, splitBuff, pos); 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)? //do_option one by one here (do_user_opt)?

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/03/09 00:13:32 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"; 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); 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); send(user.fd, endReply.c_str(), endReply.size(), 0);
} }
@ -32,7 +33,8 @@ void chan_reply(channelData &chan, clientData &user)
(void) chan; (void) chan;
//int mode; //int mode;
//std::string reply = " +"; //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) if (chan.mode.p)
reply += 'p'; reply += 'p';
if (chan.mode.s) if (chan.mode.s)
@ -60,12 +62,65 @@ void chan_reply(channelData &chan, clientData &user)
//return (reply); //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) void user_mode_reply(fdList &allFds, clientData &user, int userNbr, std::string mode)
{ {
//userNbr = asking client //userNbr = asking client
//client = changed mode client //client = changed mode client
std::string reply = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName 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) //void user_reply(clientData &user)
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/16 18:14:15 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 //:irc.local 353 kinou3 = #test :@kinou3
std::string msg; std::string msg;
print_client_list(chan.opList);
print_client_list(chan.verboseList);
msg = "353 " + allFds.userData[userNbr].nickname + " = " + chan.name + " :"; msg = "353 " + allFds.userData[userNbr].nickname + " = " + chan.name + " :";
for (size_t i = 0; i < chan.userList.size(); i++) 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*/) 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 + " "; 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 if (find_client_list(chan.verboseList, chan.userList[i]) != -1)//(chan.userList[i]->mode.v)//verbose
else {
std::cout << "he is verbose???\n";
msg += "+" + chan.userList[i]->nickname + " "; msg += "+" + chan.userList[i]->nickname + " ";
}
else
msg += /*"=" +*/ chan.userList[i]->nickname + " ";
} }
msg += "\r\n"; msg += "\r\n";
std::cout << "name msg= " << msg; std::cout << "name msg= " << msg;

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:46:41 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<clientData *> &list, clientData *client)
return (-1); return (-1);
} }
int print_client_list(std::vector<clientData *> &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 int_to_str(int i)
{ {
std::string s; std::string s;