flemme de fou encore toutes les cmds? sauf invite

This commit is contained in:
kinou-p 2023-02-22 20:05:25 +01:00
parent da5580b615
commit 95370cc0a0
14 changed files with 329 additions and 87 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:29 by apommier #+# #+# # # Created: 2022/12/01 17:27:29 by apommier #+# #+# #
# Updated: 2023/02/17 16:02:14 by apommier ### ########.fr # # Updated: 2023/02/19 22:11:26 by apommier ### ########.fr #
# # # #
# **************************************************************************** # # **************************************************************************** #
@ -33,6 +33,7 @@ SRCS := main.cpp\
commands/channel/join.cpp\ commands/channel/join.cpp\
commands/channel/privmsg.cpp\ commands/channel/privmsg.cpp\
commands/channel/notice.cpp\ commands/channel/notice.cpp\
commands/channel/part.cpp\
\ \
commands/other/quit.cpp\ commands/other/quit.cpp\
commands/other/ping_pong.cpp\ commands/other/ping_pong.cpp\

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/02/17 21:56:13 by apommier ### ########.fr */ /* Updated: 2023/02/22 13:40:08 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -133,6 +133,7 @@ struct channelData //each chan have one
std::vector<clientData *> userList; std::vector<clientData *> userList;
std::vector<clientData *> banList; std::vector<clientData *> banList;
//std::vector<clientData *> invitedList; //std::vector<clientData *> invitedList;
//std::vector<clientData *> verboseList;
std::vector<clientData *> opList; std::vector<clientData *> opList;
chanMode mode; chanMode mode;
@ -179,6 +180,7 @@ void delete_user(fdList &allFds, int userNbr);
void ft_putstr_fd(int fd, std::string str); void ft_putstr_fd(int fd, std::string str);
void cmd_error(fdList &allFds, int userNbr, std::string error); void cmd_error(fdList &allFds, int userNbr, std::string error);
void cmd_reply(fdList &allFds, int userNbr, std::string error);
void ft_error(std::string str); void ft_error(std::string str);
void close_fd(int fd); void close_fd(int fd);
int contain_any(std::string str, std::string toFind); int contain_any(std::string str, std::string toFind);
@ -202,6 +204,7 @@ void split_but_keep(std::string const &str, const char delim, std::vector<std::s
/* *******************************CHAN UTILS********************************* */ /* *******************************CHAN UTILS********************************* */
/* ************************************************************************** */ /* ************************************************************************** */
int is_in_same(fdList &allFds, int userNbr, int userNbr2);
int is_chan_op(fdList &allFds, channelData *chanName, int userNbr); int is_chan_op(fdList &allFds, channelData *chanName, int userNbr);
int is_joined(fdList &allFds, std::string chanName, int userNbr); int is_joined(fdList &allFds, std::string chanName, int userNbr);
int find_channel(fdList &allFds, std::string chanName); int find_channel(fdList &allFds, std::string chanName);

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/09 17:21:57 by apommier #+# #+# */ /* Created: 2023/02/09 17:21:57 by apommier #+# #+# */
/* Updated: 2023/02/16 23:26:08 by apommier ### ########.fr */ /* Updated: 2023/02/21 02:02:38 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -27,7 +27,7 @@ int is_chan_op(fdList &allFds, channelData *chanName, int userNbr)
return (1); return (1);
start++; start++;
} }
std::cout << "chan not found\n"; std::cout << "chan not found in is op\n";
return (0); return (0);
} }
@ -35,16 +35,17 @@ int is_joined(fdList &allFds, std::string chanName, int userNbr)
{ {
std::vector<channelData*>::iterator start = allFds.userData[userNbr].joinedChan.begin(); std::vector<channelData*>::iterator start = allFds.userData[userNbr].joinedChan.begin();
std::vector<channelData*>::iterator pastEnd = allFds.userData[userNbr].joinedChan.end(); std::vector<channelData*>::iterator pastEnd = allFds.userData[userNbr].joinedChan.end();
//std::cout << "name1= ---" << chanName << "---\n"; std::cout << "name1= ---" << chanName << "---\n";
while (start != pastEnd) while (start != pastEnd)
{ {
//std::cout << "result in find chan = " << pastEnd - start << std::endl;
std::cout << "test = " << allFds.userData[userNbr].joinedChan[pastEnd - start - 1]->name << "---\n"; std::cout << "result in find chan = " << pastEnd - start << std::endl;
std::cout << "test is joined= " << allFds.userData[userNbr].joinedChan[pastEnd - start - 1]->name << "---\n";
if (allFds.userData[userNbr].joinedChan[pastEnd - start - 1]->name == chanName) if (allFds.userData[userNbr].joinedChan[pastEnd - start - 1]->name == chanName)
return (pastEnd - start - 1); return (pastEnd - start - 1);
start++; start++;
} }
std::cout << "chan not found\n"; std::cout << "chan not found in is joined\n";
return (-1); return (-1);
} }
@ -52,16 +53,16 @@ int find_channel(fdList &allFds, std::string chanName)//return channel nbr
{ {
std::_List_iterator<channelData> start = allFds.channelList.begin(); std::_List_iterator<channelData> start = allFds.channelList.begin();
std::_List_iterator<channelData> pastEnd = allFds.channelList.end(); std::_List_iterator<channelData> pastEnd = allFds.channelList.end();
//std::cout << "name1= ---" << chanName << "---\n"; std::cout << "name1= ---" << chanName << "---\n";
while (start != pastEnd) while (start != pastEnd)
{ {
//std::cout << "result in find chan = " << pastEnd - start << std::endl; std::cout << "chan = ---" << allFds.channelList[pastEnd - start - 1].name << "---" << std::endl;
std::cout << "test = " << allFds.channelList[pastEnd - start - 1].name << "---\n"; std::cout << "test = " << allFds.channelList[pastEnd - start - 1].name << "---\n";
if (allFds.channelList[pastEnd - start - 1].name == chanName) if (allFds.channelList[pastEnd - start - 1].name == chanName)
return (pastEnd - start - 1); return (pastEnd - start - 1);
start++; start++;
} }
std::cout << "chan not found\n"; std::cout << "chan not found in find \n";
return (-1); return (-1);
} }
@ -82,3 +83,38 @@ int find_user(fdList &allFds, std::string userName)//return direct user fd
return (-1); return (-1);
} }
int is_in_same(fdList &allFds, int userNbr, int userNbr2)
{
size_t size;
if (allFds.userData[userNbr].joinedChan.size() <= allFds.userData[userNbr2].joinedChan.size())
size = allFds.userData[userNbr].joinedChan.size();
else
size = allFds.userData[userNbr2].joinedChan.size();
for (size_t i = 0; i < size; i++)
{
for (size_t j = 0; j < size; j++)
{
if (allFds.userData[userNbr].joinedChan[i] == allFds.userData[userNbr2].joinedChan[j])
return (1);
}
}
return (0);
}
// int is_in_same(fdList &allFds, int userNbr, int userNbr2)
// {
// size_t size;
// if (allFds.userData[userNbr].joinedChan.size() <= allFds.userData[userNbr2].joinedChan.size())
// size = allFds.userData[userNbr].joinedChan.size();
// else
// size = allFds.userData[userNbr2].joinedChan.size();
// for (size_t i = 0; i < size; i++)
// {
// for (size_t j = 0; j < size; j++)
// {
// if (allFds.userData[userNbr].joinedChan[i] == allFds.userData[userNbr2].joinedChan[j])
// return (1);
// }
// }
// return (0);
// }

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/02/16 23:47:14 by apommier ### ########.fr */ /* Updated: 2023/02/19 18:18:29 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -76,6 +76,7 @@ void join_or_create(std::string buffer, fdList &allFds, int userNbr)
channelData joined_chan; channelData joined_chan;
std::vector<std::string> splitBuff; std::vector<std::string> splitBuff;
std::cout << "JOINORCREATE\n";
split(buffer, ' ', splitBuff); split(buffer, ' ', splitBuff);
chanNbr = find_channel(allFds, splitBuff[1]); chanNbr = find_channel(allFds, splitBuff[1]);
if (chanNbr != -1) //chan already exist if (chanNbr != -1) //chan already exist
@ -100,13 +101,20 @@ void join_or_create(std::string buffer, fdList &allFds, int userNbr)
allFds.channelList.push_back(new_chan); allFds.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
} }
for (int i = 0; i < joined_chan.nbrUser; i++)
{
std::string fullMsg; std::string fullMsg;
fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " JOIN :" + joined_chan.name + "\n"; fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " JOIN :" + joined_chan.name + "\n";
for (int i = 0; i < joined_chan.nbrUser; i++)
{
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";
} }
if (chanNbr == -1)
chanNbr = find_channel(allFds, splitBuff[1]);
if (!allFds.channelList[chanNbr].topic.empty())
cmd_reply(allFds, allFds.userData[userNbr].fd, "332 TOPIC " + allFds.channelList[chanNbr].name + " :" + allFds.channelList[chanNbr].topic + "\n");
else
cmd_error(allFds, allFds.userData[userNbr].fd, "331 TOPIC " + allFds.channelList[chanNbr].name + " :No topic is set\n");
// if (chanNbr == -1) // if (chanNbr == -1)
// { // {
@ -122,21 +130,27 @@ void join_loop(fdList &allFds, std::vector<std::string> splitBuff, int userNbr)
std::vector<std::string> splitPwd; std::vector<std::string> splitPwd;
std::string buffer; std::string buffer;
split(buffer, ',', splitChan); std::cout << "join loop buf= " << splitBuff[1] << std::endl;
split(buffer, ',', splitPwd); std::cout << "==========join loop========\n";
split(splitBuff[1], ',', splitChan);
split(splitBuff[1], ',', splitPwd);
if (splitBuff[1] == "0") if (splitBuff[1] == "0")
{ {
leave_all(allFds, userNbr); leave_all(allFds, userNbr);
return ; return ;
} }
std::cout << "==========join loop2========\n";
std::cout << "size= " << splitChan.size() << std::endl;
std::cout << "content= " << splitChan[0] << std::endl;
for (size_t i = 0; i < splitChan.size(); i++) for (size_t i = 0; i < splitChan.size(); i++)
{ {
if (splitBuff[1][0] != '#' && splitBuff[1][0] != '&') if (splitChan[i][0] != '#' && splitChan[i][0] != '&')
{ {
//error bad channel name //error bad channel name
buffer = "476 * JOIN " + splitBuff[1] + " ::Bad Channel Mask\n"; buffer = "476 * JOIN " + splitChan[i] + " ::Bad Channel Mask\n";
cmd_error(allFds, allFds.userData[userNbr].fd, buffer); cmd_error(allFds, allFds.userData[userNbr].fd, buffer);
//:Bad Channel Mask //:Bad Channel Mask
std::cout << "bad chan mask\n";
return ; return ;
} }
if (i < splitPwd.size()) if (i < splitPwd.size())
@ -144,7 +158,9 @@ void join_loop(fdList &allFds, std::vector<std::string> splitBuff, int userNbr)
else else
buffer = "JOIN " + splitChan[i]; buffer = "JOIN " + splitChan[i];
join_or_create(buffer, allFds, userNbr); join_or_create(buffer, allFds, userNbr);
std::cout << "i= " << i << " ==========join loop3========\n";
} }
std::cout << "==========join loop3========\n";
} }
@ -159,7 +175,7 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr)
std::cout << "userNbr= " << userNbr << std::endl; std::cout << "userNbr= " << userNbr << std::endl;
if (!allFds.userData[userNbr].registered) if (!allFds.userData[userNbr].registered)
{ {
/*change error*/ std::cout << "user not registered\n";
cmd_error(allFds, allFds.userData[userNbr].fd, "451 * JOIN :You have not registered\n"); //ERR_NEEDMOREPARAMS cmd_error(allFds, allFds.userData[userNbr].fd, "451 * JOIN :You have not registered\n"); //ERR_NEEDMOREPARAMS
return ; return ;
} }
@ -167,6 +183,7 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr)
if (splitBuff.size() < 2) if (splitBuff.size() < 2)
{ {
/*change error*/ /*change error*/
std::cout << "JOIN : need more param\n";
cmd_error(allFds, allFds.userData[userNbr].fd, "461 * JOIN :Not enough parameters\n"); //ERR_NEEDMOREPARAMS cmd_error(allFds, allFds.userData[userNbr].fd, "461 * JOIN :Not enough parameters\n"); //ERR_NEEDMOREPARAMS
return ; return ;
} }

View File

@ -0,0 +1,66 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* part.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/19 22:10:07 by apommier #+# #+# */
/* Updated: 2023/02/20 17:50:46 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
void leave_chan(fdList &allFds, std::string chan, int userNbr, std::string msg)
{
int chanPos;
std::string reply;
if ((chanPos = find_channel(allFds, chan)) == -1)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PART " + chan + " :No such nick/channel\n");
return ;
}
if (is_joined(allFds, chan, userNbr) == -1)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "422 * " + chan + " :You're not on that channel\n");
return ;
}
del_user_in_chan(&allFds.userData[userNbr], &allFds.channelList[chanPos]);
del_chan_in_user(&allFds.userData[userNbr], &allFds.channelList[chanPos]);
//:WiZ!jto@tolsun.oulu.fi PART #playzone :I lost
//:awd!kinou@kinou PART #test
//reply = ":" + allFds.userData[userNbr].nickname + "!" +
//reply = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " PART " + allFds.channelList[chanPos].name;
reply = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].hostName + " PART " + allFds.channelList[chanPos].name + "\n";
//:awd!kinou@172.17.0.1 PART :#test tcpdump
//:awd!kinou@127.0.0.1 PART :#test
(void )msg;
//if (!msg.empty())
// reply += " :" + msg;
std::cout << "leave msg=" << reply << std::endl;
send(allFds.userData[userNbr].fd, reply.c_str(), reply.size(), 0);
//cmd_reply(allFds, allFds.userData[userNbr].fd, reply + "\n");
}
void PART(std::string buffer, fdList &allFds, int userNbr)
{
std::vector<std::string> splitBuff;
std::vector<std::string> splitChan;
std::string msg;
split(buffer, ' ', splitBuff);
if (splitBuff.size() < 2)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "431 * PART :Not enought argument\n");
return ;
}
split(splitBuff[1], ',', splitChan);
if (splitBuff.size() > 2)
msg = buffer.substr(splitBuff[0].size() + splitBuff[1].size() + 2, std::string::npos);
for (size_t i = 0; i < splitChan.size(); i++)
leave_chan(allFds, splitChan[i], userNbr, msg);
return ;
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 08:53:03 by apommier #+# #+# */ /* Created: 2023/02/11 08:53:03 by apommier #+# #+# */
/* Updated: 2023/02/16 23:20:25 by apommier ### ########.fr */ /* Updated: 2023/02/20 11:51:26 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -37,7 +37,7 @@ void PRIVMSG(std::string buffer, fdList &allFds, int userNbr)
cmd_error(allFds, allFds.userData[userNbr].fd, "412 * PRIVMSG :No text to send\n"); cmd_error(allFds, allFds.userData[userNbr].fd, "412 * PRIVMSG :No text to send\n");
return ; return ;
} }
std::cout << "privmsg =" << msg << std::endl; //std::cout << "privmsg =" << msg << std::endl;
std::vector<std::string> dest; std::vector<std::string> dest;
split(splitBuff[1], ',', dest); split(splitBuff[1], ',', dest);
for (size_t i = 0; i < dest.size(); i++) for (size_t i = 0; i < dest.size(); i++)
@ -52,16 +52,17 @@ void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr)
fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@172.17.0.1 " + msg + "\n"; fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@172.17.0.1 " + msg + "\n";
if (dest[0] == '&' || dest[0] == '#') if (dest[0] == '&' || dest[0] == '#')
{ {
if (is_joined(allFds, dest, userNbr) == -1) pos = find_channel(allFds, dest);
{ if (pos == -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"); cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/channel\n");
return ; return ;
} }
if (allFds.channelList[pos].mode.n && is_joined(allFds, dest, userNbr) == -1 )
{
cmd_error(allFds, allFds.userData[userNbr].fd, "442 * PRIVMSG " + dest + " :You're not on that channel\n");
return ;
}
// if (allFds.channelList[pos].mode.m && !allFds.userData[userNbr].op && !is_chan_op(allFds, &allFds.channelList[pos], userNbr) && !allFds.channelList[pos].userMode[nbr].v) // if (allFds.channelList[pos].mode.m && !allFds.userData[userNbr].op && !is_chan_op(allFds, &allFds.channelList[pos], userNbr) && !allFds.channelList[pos].userMode[nbr].v)
// { // {
// cmd_error(allFds, allFds.userData[userNbr].fd, "404 * PRIVMSG " + dest + " :Cannot send to channel\n"); // cmd_error(allFds, allFds.userData[userNbr].fd, "404 * PRIVMSG " + dest + " :Cannot send to channel\n");
@ -77,10 +78,13 @@ void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr)
return ; return ;
} }
pos = find_user(allFds, dest); //return direct user fd pos = find_user(allFds, dest); //return direct user fd
if (pos != -1) std::cout << "pos of user = " << pos << std::endl;
if (pos == -1)
{ {
cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/channel\n"); cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/channel\n");
return ; return ;
} }
send(allFds.userData[pos].fd, fullMsg.c_str(), fullMsg.size(), 0); send(allFds.userData[pos].fd, fullMsg.c_str(), fullMsg.size(), 0);
std::cout << "msg send\n";
std::cout << "msg = " << fullMsg << std::endl;
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 19:19:56 by apommier #+# #+# */ /* Created: 2023/02/11 19:19:56 by apommier #+# #+# */
/* Updated: 2023/02/16 23:03:43 by apommier ### ########.fr */ /* Updated: 2023/02/19 22:27:00 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -48,11 +48,11 @@ void INVITE(std::string buffer, fdList &allFds, int userNbr)
cmd_error(allFds, allFds.userData[userNbr].fd, "443 * " + splitBuff[1] + " " + splitBuff[2] + " :is already on channel\n"); cmd_error(allFds, allFds.userData[userNbr].fd, "443 * " + splitBuff[1] + " " + splitBuff[2] + " :is already on channel\n");
return ; return ;
} }
if (is_joined(allFds, splitBuff[2], invitedNbr) != -1) // if (is_joined(allFds, splitBuff[2], invitedNbr) != -1)
{ // {
cmd_error(allFds, allFds.userData[userNbr].fd, "443 * " + splitBuff[1] + " " + splitBuff[2] + " :is already on channel\n"); // cmd_error(allFds, allFds.userData[userNbr].fd, "443 * " + splitBuff[1] + " " + splitBuff[2] + " :is already on channel\n");
return ; // return ;
} // }
if ((chanNbr = find_channel(allFds, splitBuff[2])) != -1) if ((chanNbr = find_channel(allFds, splitBuff[2])) != -1)
{ {
chan = allFds.channelList[chanNbr]; chan = allFds.channelList[chanNbr];

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 19:19:32 by apommier #+# #+# */ /* Created: 2023/02/11 19:19:32 by apommier #+# #+# */
/* Updated: 2023/02/17 21:54:06 by apommier ### ########.fr */ /* Updated: 2023/02/21 00:42:37 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -18,6 +18,7 @@ void KICK(std::string buffer, fdList &allFds, int userNbr)
{ {
std::vector<std::string> splitBuff; std::vector<std::string> splitBuff;
std::string msg; std::string msg;
std::string kickMsg;
int chanPos; int chanPos;
int userPos; int userPos;
channelData chan; channelData chan;
@ -43,29 +44,35 @@ void KICK(std::string buffer, fdList &allFds, int userNbr)
{ {
chan = allFds.channelList[chanPos]; chan = allFds.channelList[chanPos];
if (!is_chan_op(allFds, &chan, userNbr) && !allFds.userData[userNbr].op) if (!is_chan_op(allFds, &chan, userNbr) && !allFds.userData[userNbr].op)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n");
return ; return ;
} }
}
msg = ":" + allFds.userData[userNbr].nickname + " KICK " + chan.name + " " + splitBuff[2]; msg = ":" + allFds.userData[userNbr].nickname + " KICK " + chan.name + " " + splitBuff[2];
if (splitBuff.size() > 3) if (splitBuff.size() > 3)
msg += ": " + buffer.substr(splitBuff[0].size() + splitBuff[1].size() + splitBuff[2].size() + 1, std::string::npos); msg += ": " + buffer.substr(splitBuff[0].size() + splitBuff[1].size() + splitBuff[2].size() + 1, std::string::npos);
if ((userPos = find_user(allFds, splitBuff[2])) == -1) if ((userPos = find_user(allFds, splitBuff[2])) == -1)
{
return ; return ;
del_user_in_chan(&allFds.userData[userPos], &allFds.channelList[chanPos]); }
del_chan_in_user(&allFds.userData[userPos], &allFds.channelList[chanPos]); kickMsg = allFds.userData[userPos].nickname + " have been kicked by " + allFds.userData[userNbr].nickname + "\n";
PART("PART " + splitBuff[1], allFds, userPos);
//del_user_in_chan(&allFds.userData[userPos], &allFds.channelList[chanPos]);
//del_chan_in_user(&allFds.userData[userPos], &allFds.channelList[chanPos]);
std::cout << "kick msg---" << msg << "---" << std::endl;
send(allFds.userData[userPos].fd, msg.c_str(), msg.size(), 0); send(allFds.userData[userPos].fd, msg.c_str(), msg.size(), 0);
//send_msg(allFds, msg, splitBuff[1], userNbr);
for (int i = 0; i < allFds.channelList[chanPos].nbrUser; i++)
{
send(allFds.channelList[chanPos].userList[i]->fd, kickMsg.c_str(), kickMsg.size(), 0);
}
//cmd_reply(allFds, allFds.userData[userPos].fd, msg);
// else if (!allFds.userData[userNbr].op) // else if (!allFds.userData[userNbr].op)
// { // {
// cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); // cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n");
// return ; // return ;
// } // }
return ; return ;
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 19:19:52 by apommier #+# #+# */ /* Created: 2023/02/11 19:19:52 by apommier #+# #+# */
/* Updated: 2023/02/17 21:55:29 by apommier ### ########.fr */ /* Updated: 2023/02/19 22:07:14 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -18,6 +18,7 @@ void TOPIC(std::string buffer, fdList &allFds, int userNbr)
int chanNbr; int chanNbr;
std::vector<std::string> splitBuff; std::vector<std::string> splitBuff;
std::cout << "topic im here1\n";//RPL_NOTOPIC //RPL_TOPIC
split(buffer, ' ', splitBuff); split(buffer, ' ', splitBuff);
if (splitBuff.size() < 2) if (splitBuff.size() < 2)
{ {
@ -33,20 +34,32 @@ void TOPIC(std::string buffer, fdList &allFds, int userNbr)
{ {
chan = allFds.channelList[chanNbr]; chan = allFds.channelList[chanNbr];
if (!is_chan_op(allFds, &chan, userNbr) && !allFds.userData[userNbr].op) if (!is_chan_op(allFds, &chan, userNbr) && !allFds.userData[userNbr].op)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n");
return ; return ;
} }
}
// else if (!allFds.userData[userNbr].op && !allFds.userData[userNbr].op) // else if (!allFds.userData[userNbr].op && !allFds.userData[userNbr].op)
// { // {
// cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n"); // cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[1] + " :You're not channel operator\n");
// return ; // return ;
// } // }
std::cout << "topic im here2\n";//RPL_NOTOPIC //RPL_TOPIC
if (splitBuff.size() < 3) if (splitBuff.size() < 3)
std::cout << "PRINT TOPIC here\n";//RPL_NOTOPIC //RPL_TOPIC {
if (!allFds.channelList[chanNbr].topic.empty())
cmd_reply(allFds, allFds.userData[userNbr].fd, "332 TOPIC " + splitBuff[1] + " :" + allFds.channelList[chanNbr].topic + "\n");
else
cmd_error(allFds, allFds.userData[userNbr].fd, "331 TOPIC " + splitBuff[1] + " :No topic is set\n");
return;
//std::cout << "PRINT TOPIC here\n";//RPL_NOTOPIC //RPL_TOPIC
}
else else
{ {
allFds.channelList[chanNbr].topic = buffer.substr(6 + splitBuff[1].size() + 1, std::string::npos); allFds.channelList[chanNbr].topic = buffer.substr(6 + splitBuff[1].size() + 2, std::string::npos);
//RPL_TOPIC //std::cout << "topic= " << allFds.channelList[chanNbr].topic << std::endl;
cmd_reply(allFds, allFds.userData[userNbr].fd, "332 TOPIC " + splitBuff[1] + " :" + allFds.channelList[chanNbr].topic + "\n");
//std::cout << "PRINT TOPIC here topic set\n";//RPL_NOTOPIC //RPL_TOPIC
} }
return ; return ;
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/09 22:04:11 by apommier #+# #+# */ /* Created: 2023/02/09 22:04:11 by apommier #+# #+# */
/* Updated: 2023/02/16 18:19:44 by apommier ### ########.fr */ /* Updated: 2023/02/19 22:11:59 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -28,13 +28,6 @@ void SERVER(std::string buffer, fdList &allFds, int userNbr)
// return ; // return ;
// } // }
void PART(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
return ;
}

View File

@ -6,33 +6,63 @@
/* 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/02/18 00:51:24 by apommier ### ########.fr */ /* Updated: 2023/02/22 20:04:19 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "../../../includes/ft_irc.hpp" #include "../../../includes/ft_irc.hpp"
//:irc.server.net 353 user = #channel :@user1 +user2 user3
//:irc.server.net 366 user #channel :End of /NAMES list.
void names_reply(fdList &allFds, channelData &chan, int fd, std::string user)
{
std::string msg;
msg = "353 " + user + " = " + chan.name + " :";
for (int i = 0; i < chan.nbrUser; i++)
{
if (chan.userList[i]->mode.o)//ischanop
msg += "=" + chan.userList[i]->nickname + " ";
else if (chan.userList[i]->mode.o)//verbose
msg += "@" + chan.userList[i]->nickname + " ";
else
msg += "+" + chan.userList[i]->nickname + " ";
}
msg += "\n";
std::cout << "name msg= " << msg;
cmd_reply(allFds, fd, msg);
}
void NAMES(std::string buffer, fdList &allFds, int userNbr) void NAMES(std::string buffer, fdList &allFds, int userNbr)
{ {
(void)buffer; (void)buffer;
(void)allFds; (void)allFds;
(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() == 1 || splitBuff[1] == "0") if (splitBuff.size() == 1 || splitBuff[1] == "0")
// { {
// for (int i = 0; i < allFds.nbrUser; i++) for (size_t i = 0; i < allFds.channelList.size(); i++)
// { {
// if (!allFds.userData[i].mode.i) if ((!allFds.channelList[i].mode.p && !allFds.channelList[i].mode.s)
// { || is_joined(allFds, allFds.channelList[i].name, userNbr))
// //print who {
// } names_reply(allFds, allFds.channelList[i], allFds.userData[userNbr].fd, allFds.userData[userNbr].nickname);
// } //print who
// return ; }
// } }
// if (pos = find_channel(allFds, splitBuff[1]) != -1) return ;
}
// return ; if ((pos = find_channel(allFds, splitBuff[1])) != -1)
{
if ((!allFds.channelList[pos].mode.p && !allFds.channelList[pos].mode.s)
|| is_joined(allFds, allFds.channelList[pos].name, userNbr))
{
names_reply(allFds, allFds.channelList[pos], allFds.userData[userNbr].fd, allFds.userData[userNbr].nickname);
}
return; //??
}
return ;
} }

View File

@ -6,16 +6,68 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/16 18:14:17 by apommier #+# #+# */ /* Created: 2023/02/16 18:14:17 by apommier #+# #+# */
/* Updated: 2023/02/16 18:19:32 by apommier ### ########.fr */ /* Updated: 2023/02/22 13:03:30 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "../../../includes/ft_irc.hpp" #include "../../../includes/ft_irc.hpp"
//void who_reply(fdList &allFds, int userNbr, int fd)
void who_reply(fdList &allFds, clientData &user, int fd)
{
// std::string msg;
// //:<server> 352 <channel> <username> <hostname> <server> <nick> H :0 <realname>
// //if (chan.size())
// msg = "352 " /*+ chan + " " */
// + allFds.userData[userNbr].userName + " "
// + allFds.userData[userNbr].hostName + " irc.local "
// + allFds.userData[userNbr].nickname + " :0 "
// + allFds.userData[userNbr].realName + "\n";
// cmd_reply(allFds, fd, msg);
std::string msg;
//:<server> 352 <channel> <username> <hostname> <server> <nick> H :0 <realname>
//if (chan.size())
msg = "352 " /*+ chan + " " */
+ user.userName + " "
+ user.hostName + " irc.local "
+ user.nickname + " :0 "
+ user.realName + "\n";
std::cout << "whoreply= " << msg << std::endl;
cmd_reply(allFds, fd, msg);
}
void WHO(std::string buffer, fdList &allFds, int userNbr) void WHO(std::string buffer, fdList &allFds, int userNbr)
{ {
(void)buffer; std::vector<std::string> splitBuff;
(void)allFds; int pos;
(void) userNbr; (void) userNbr;
split(buffer, ' ', splitBuff);
if (splitBuff.size() == 1 || splitBuff[1] == "0")
{
for (int i = 0; i < allFds.nbrUser; i++)
{
if (!allFds.userData[i].mode.i || is_in_same(allFds, userNbr, i))
{
who_reply(allFds, allFds.userData[i], allFds.userData[userNbr].fd);
//print who
}
}
return ;
}
if ((pos = find_channel(allFds, splitBuff[1])) == -1)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "401 * " + splitBuff[1] + " :No such nick/channel\n");
return ;
}
for (int i = 0; i < allFds.channelList[pos].nbrUser; i++)
{
who_reply(allFds, *allFds.channelList[pos].userList[i], allFds.userData[userNbr].fd);
}
//"<nick> :End of WHOIS list"
cmd_reply(allFds, allFds.userData[userNbr].fd, allFds.userData[userNbr].nickname + " :End of WHOIS list\n");
//std::cout <<
return ; return ;
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:38:30 by apommier #+# #+# */ /* Created: 2022/12/06 21:38:30 by apommier #+# #+# */
/* Updated: 2022/12/06 21:50:06 by apommier ### ########.fr */ /* Updated: 2023/02/22 12:59:31 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -15,6 +15,7 @@
void epoll_add(int epollFd, int fd) void epoll_add(int epollFd, int fd)
{ {
struct epoll_event event; struct epoll_event event;
memset(&event, 0, sizeof(event));
event.events = EPOLLIN; event.events = EPOLLIN;
event.data.fd = fd; event.data.fd = fd;

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/02/14 14:27:33 by apommier ### ########.fr */ /* Updated: 2023/02/22 20:03:09 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -47,6 +47,17 @@ void cmd_error(fdList &allFds, int fd, std::string error)
send(fd, error.c_str(), error.size(), 0); send(fd, error.c_str(), error.size(), 0);
} }
void cmd_reply(fdList &allFds, int fd, std::string error)
{
(void)allFds; //to delete
error = ":irc.local " + error;
//std::cout << cmd_reply= --- << error << "---";
//write(fd, ":irc.local ", 11);
//write(fd, error.c_str(), error.size());
send(fd, error.c_str(), error.size(), 0);
}
int contain_any(std::string str, std::string toFind) int contain_any(std::string str, std::string toFind)
{ {
for (int i = 0; toFind[i] != 0; i++) for (int i = 0; toFind[i] != 0; i++)
@ -67,8 +78,16 @@ int not_contain_other(std::string str, std::string toFind)
return (1); return (1);
} }
// void find_user_in_chan(fdList &allFds, channelData *chan) int find_client_list(std::vector<clientData *> list, clientData *client)
// { {
std::vector<clientData*>::iterator start = list.begin();
// } std::vector<clientData*>::iterator pastEnd = list.end();
while (start != pastEnd)
{
if (*start == client)
return (start - pastEnd - 1);
start++;
}
return (-1);
}