add invite cmd and prepare cpp file for who ? names? wallops? add multiple join not tested

This commit is contained in:
kinou-p 2023-02-16 23:06:21 +01:00
parent a66fa92aa3
commit 68466e609a
14 changed files with 193 additions and 64 deletions

View File

@ -6,7 +6,7 @@
# By: apommier <apommier@student.42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2022/12/01 17:27:29 by apommier #+# #+# #
# Updated: 2023/02/15 17:14:51 by apommier ### ########.fr #
# Updated: 2023/02/16 18:21:46 by apommier ### ########.fr #
# #
# **************************************************************************** #
@ -36,6 +36,8 @@ SRCS := main.cpp\
\
commands/other/quit.cpp\
commands/other/ping_pong.cpp\
commands/other/who.cpp\
commands/other/names.cpp\
\
commands/channel_op/invite.cpp\
commands/channel_op/kick.cpp\

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/01 17:27:37 by apommier #+# #+# */
/* Updated: 2023/02/15 19:54:47 by apommier ### ########.fr */
/* Updated: 2023/02/16 23:01:17 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -147,7 +147,7 @@ struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY
struct epoll_event events[MAX_EVENTS];
int epollFd;
int serverFd;
std::vector<int> userList;
std::vector<int> userFdList;
accessList<channelData> channelList;
accessList<clientData> userData;
@ -200,6 +200,7 @@ void split_but_keep(std::string const &str, const char delim, std::vector<std::s
/* *******************************CHAN UTILS********************************* */
/* ************************************************************************** */
int is_chan_op(fdList &allFds, channelData *chanName, int userNbr);
int is_joined(fdList &allFds, std::string chanName, int userNbr);
int find_channel(fdList &allFds, std::string chanName);
int find_user(fdList &allFds, std::string userName);

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/09 22:34:36 by apommier #+# #+# */
/* Updated: 2023/02/13 19:21:07 by apommier ### ########.fr */
/* Updated: 2023/02/16 23:01:04 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -23,7 +23,7 @@ bool clientRequest(fdList &allFds, int userNbr)//,
//buf.reserve(1024);
//se demerder pour join quand pas \n
// std::cout << "fd in client request " << allFds.userData[userNbr].fd << std::endl;
// std::cout << "fd of list in client request " << allFds.userList[userNbr] << std::endl;
// std::cout << "fd of list in client request " << allFds.userFdList[userNbr] << std::endl;
// std::cout << "user nbr " << userNbr << std::endl;
//std::cout << "client request!" << std::endl;
@ -38,7 +38,7 @@ bool clientRequest(fdList &allFds, int userNbr)//,
delete_user(allFds, userNbr);
// close(allFds.userData[userNbr].fd);
// allFds.userData.erase(allFds.userData.begin() + userNbr);
// allFds.userList.erase(allFds.userList.begin() + userNbr);
// allFds.userFdList.erase(allFds.userFdList.begin() + userNbr);
// allFds.nbrUser--;
// std::cout << "buffer empty\n";
return (1);

View File

@ -6,12 +6,29 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/09 17:21:57 by apommier #+# #+# */
/* Updated: 2023/02/14 20:13:38 by apommier ### ########.fr */
/* Updated: 2023/02/16 22:52:31 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
int is_chan_op(fdList &allFds, channelData *chanName, int userNbr)
{
std::vector<clientData*>::iterator start = chanName->opList.begin();
std::vector<clientData*>::iterator pastEnd = chanName->opList.end();
//std::cout << "name1= ---" << chanName << "---\n";
while (start != pastEnd)
{
//std::cout << "result in find chan = " << pastEnd - start << std::endl;
std::cout << "test = " << chanName->opList[pastEnd - start - 1]->nickname << "---\n";
if (chanName->opList[pastEnd - start - 1]->nickname == allFds.userData[userNbr].nickname)
return (1);
start++;
}
std::cout << "chan not found\n";
return (0);
}
int is_joined(fdList &allFds, std::string chanName, int userNbr)
{
std::vector<channelData*>::iterator start = allFds.userData[userNbr].joinedChan.begin();

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/09 15:40:33 by apommier #+# #+# */
/* Updated: 2023/02/14 14:50:57 by apommier ### ########.fr */
/* Updated: 2023/02/16 18:47:49 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -70,15 +70,13 @@ int chan_check(fdList &allFds, int userNbr, int chanNbr, std::vector<std::string
}
void join_or_create(std::vector<std::string> splitBuff, fdList &allFds, int userNbr)
void join_or_create(std::string buffer, fdList &allFds, int userNbr)
{
int chanNbr;
channelData joined_chan;
std::vector<std::string> splitBuff;
split(buffer, ' ', splitBuff);
chanNbr = find_channel(allFds, splitBuff[1]);
if (chanNbr != -1) //chan already exist
{
@ -97,7 +95,6 @@ void join_or_create(std::vector<std::string> splitBuff, fdList &allFds, int user
new_chan.name = splitBuff[1];
new_chan.nbrUser = 1;
new_chan.userList.push_back(&allFds.userData[userNbr]);
//new_chan.userList
joined_chan = new_chan;
allFds.channelList.push_back(new_chan);
allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList.back());//add chan in user data
@ -118,7 +115,36 @@ void join_or_create(std::vector<std::string> splitBuff, fdList &allFds, int user
void join_loop(fdList &allFds, std::vector<std::string> splitBuff, int userNbr)
{
std::vector<std::string> splitChan;
std::vector<std::string> splitPwd;
std::string buffer;
split(buffer, ',', splitChan);
split(buffer, ',', splitPwd);
if (splitBuff[1] == "0")
{
leave_all(allFds, userNbr);
return ;
}
for (size_t i = 0; i < splitChan.size(); i++)
{
if (splitBuff[1][0] != '#' && splitBuff[1][0] != '&')
{
//error bad channel name
buffer = "476 * JOIN " + splitBuff[1] + " ::Bad Channel Mask\n";
cmd_error(allFds, allFds.userData[userNbr].fd, buffer);
//:Bad Channel Mask
return ;
}
if (i < splitPwd.size())
buffer = "JOIN " + splitChan[i] + " " + splitPwd[i];
else
buffer = "JOIN " + splitChan[i];
join_or_create(buffer, allFds, userNbr);
}
}
@ -143,20 +169,8 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr)
cmd_error(allFds, allFds.userData[userNbr].fd, "461 * JOIN :Not enough parameters\n"); //ERR_NEEDMOREPARAMS
return ;
}
join_loop(allFds, splitBuff, userNbr);
//if (splitBuff[1].find(' ') != std::string::npos || splitBuff[1].find(7) != std::string::npos)
if (splitBuff[1][0] != '#' && splitBuff[1][0] != '&')
{
//error bad channel name
msg = "476 * JOIN " + splitBuff[1] + " ::Bad Channel Mask\n";
cmd_error(allFds, allFds.userData[userNbr].fd, msg);
//:Bad Channel Mask
return ;
}
if (splitBuff[1] == "0")
{
leave_all(allFds, userNbr);
return ;
}
join_or_create(splitBuff, allFds, userNbr);
//send 352 and 315 or 353 and 366 (WHO or NAME)
}

View File

@ -6,16 +6,68 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 19:19:56 by apommier #+# #+# */
/* Updated: 2023/02/11 20:06:47 by apommier ### ########.fr */
/* Updated: 2023/02/16 23:03:43 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
// Commande: INVITE
// Paramètres: <pseudonyme> <canal>
// ERR_NEEDMOREPARAMS ERR_NOSUCHNICK
// ERR_NOTONCHANNEL ERR_USERONCHANNEL
// ERR_CHANOPRIVSNEEDED
// RPL_INVITING RPL_AWAY
void INVITE(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
std::vector<std::string> splitBuff;
int invitedNbr;
channelData chan;
int chanNbr;
split(buffer, ' ', splitBuff);
if (splitBuff.size() < 3)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "461 * INVITE :Not enough parameters\n");
return ;
}
if ((invitedNbr = find_user(allFds, splitBuff[1])) == -1)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "401 * " + splitBuff[1] + " :No such nick/channel\n");
return ;
}
if (is_joined(allFds, splitBuff[2], userNbr) == -1)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "422 * " + splitBuff[2] + " :You're not on that channel\n");
return ;
}
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");
return ;
}
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");
return ;
}
if ((chanNbr = find_channel(allFds, splitBuff[2])) != -1)
{
chan = allFds.channelList[chanNbr];
if (!is_chan_op(allFds, &chan, userNbr))
cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[2] + " :You're not channel operator\n");
return ;
}
else if (!allFds.userData[userNbr].op)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "482 * " + splitBuff[2] + " :You're not channel operator\n");
return ;
}
std::cout << "invite him !!!!" << splitBuff[1] << " to " << splitBuff[2] << std::endl;
//RPL_INVITING
//RPL_AWAY
//set authorization to join
return ;
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/09 22:04:11 by apommier #+# #+# */
/* Updated: 2023/02/15 17:00:46 by apommier ### ########.fr */
/* Updated: 2023/02/16 18:19:44 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -39,13 +39,6 @@ void PART(std::string buffer, fdList &allFds, int userNbr)
void NAMES(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
return ;
}
void LIST(std::string buffer, fdList &allFds, int userNbr)
{
@ -139,13 +132,7 @@ void INFO(std::string buffer, fdList &allFds, int userNbr)
// return ;
// }
void WHO(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
return ;
}
void WHOIS(std::string buffer, fdList &allFds, int userNbr)
{

View File

@ -0,0 +1,13 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* wallops.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/16 17:09:38 by apommier #+# #+# */
/* Updated: 2023/02/16 17:09:45 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"

View File

@ -0,0 +1,21 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* names.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/16 18:14:15 by apommier #+# #+# */
/* Updated: 2023/02/16 18:19:48 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
void NAMES(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
return ;
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 19:10:26 by apommier #+# #+# */
/* Updated: 2023/02/15 20:15:13 by apommier ### ########.fr */
/* Updated: 2023/02/16 22:25:37 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -40,10 +40,11 @@ void send_quit_msg(fdList &allFds, int userNbr, std::string msg)
void QUIT(std::string buffer, fdList &allFds, int userNbr)
{
std::vector<std::string> splitBuff;
split(buffer, ' ', splitBuff);
if (splitBuff.size() == 2)
if (splitBuff.size() > 2)
{
send_quit_msg(allFds, userNbr, splitBuff[1]);
send_quit_msg(allFds, userNbr, buffer.substr(5, std::string::npos));//to test
//print message?
//:kinou2!kinou@172.17.0.1 QUIT :Quit: leaving
}

View File

@ -0,0 +1,21 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* who.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/16 18:14:17 by apommier #+# #+# */
/* Updated: 2023/02/16 18:19:32 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
void WHO(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
return ;
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/12 20:38:50 by apommier #+# #+# */
/* Updated: 2023/02/13 20:25:45 by apommier ### ########.fr */
/* Updated: 2023/02/16 23:01:04 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -33,7 +33,7 @@ void delete_user(fdList &allFds, int userNbr)
close(allFds.userData[userNbr].fd);
allFds.userData.erase(allFds.userData.begin() + userNbr);
allFds.userList.erase(allFds.userList.begin() + userNbr);
allFds.userFdList.erase(allFds.userFdList.begin() + userNbr);
allFds.nbrUser--;
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/09 22:26:27 by apommier #+# #+# */
/* Updated: 2023/02/13 19:46:41 by apommier ### ########.fr */
/* Updated: 2023/02/16 23:01:04 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -29,10 +29,10 @@ void new_connection(fdList &allFds)
// }
//int newUserFd;
//allFds.userList.push_back(newUserFd);
//allFds.userFdList.push_back(newUserFd);
newFd = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen);
//allFds.userList[allFds.nbrUser] = newFd;
allFds.userList.push_back(newFd);
//allFds.userFdList[allFds.nbrUser] = newFd;
allFds.userFdList.push_back(newFd);
//std::cout << "newConnection | old user fd = " << newFd << std::endl;
if (fcntl(newFd, F_SETFL, O_NONBLOCK) == -1)
ft_error("fctnl() error");
@ -40,7 +40,7 @@ void new_connection(fdList &allFds)
//std::cout << "fcntl return = " << newFd;
//close(newFd);
//std::cout << "newConnection | user fd = " << allFds.userList[allFds.nbrUser] << std::endl;
//std::cout << "newConnection | user fd = " << allFds.userFdList[allFds.nbrUser] << std::endl;
clientData newElement;
newElement.fd = newFd;
@ -48,9 +48,9 @@ void new_connection(fdList &allFds)
newElement.ip = inet_ntoa(addr.sin_addr);
//newElement.op = 0;
allFds.userData.push_back(newElement);
//allFds.userData[allFds.nbrUser].fd = allFds.userList[allFds.nbrUser];
//allFds.userData[allFds.nbrUser].fd = allFds.userFdList[allFds.nbrUser];
//std::cout << "newConnection | user in data fd = " << allFds.userData[allFds.nbrUser].fd << std::endl;
epoll_add(allFds.epollFd, allFds.userList[allFds.nbrUser]);
epoll_add(allFds.epollFd, allFds.userFdList[allFds.nbrUser]);
allFds.nbrUser++;
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:58:13 by apommier #+# #+# */
/* Updated: 2023/02/14 18:11:44 by apommier ### ########.fr */
/* Updated: 2023/02/16 23:01:04 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -49,7 +49,7 @@ void start_loop(fdList &allFds)
}
else
{
nbr = find(allFds.userList.begin(), allFds.userList.end(), allFds.events[i].data.fd) - allFds.userList.begin();
nbr = find(allFds.userFdList.begin(), allFds.userFdList.end(), allFds.events[i].data.fd) - allFds.userFdList.begin();
//if (!clientRequest(allFds, i))
// if (!clientRequest(allFds, nbr))
// alive = false;