add PRIVMSG and add reserve for vector of user and chanlist because POINTER VALIDITY
This commit is contained in:
parent
15d3dd47fd
commit
2ae3844245
6
Makefile
6
Makefile
@ -6,7 +6,7 @@
|
||||
# By: apommier <apommier@student.42.fr> +#+ +:+ +#+ #
|
||||
# +#+#+#+#+#+ +#+ #
|
||||
# Created: 2022/12/01 17:27:29 by apommier #+# #+# #
|
||||
# Updated: 2023/02/10 08:18:36 by apommier ### ########.fr #
|
||||
# Updated: 2023/02/11 10:41:15 by apommier ### ########.fr #
|
||||
# #
|
||||
# **************************************************************************** #
|
||||
|
||||
@ -18,13 +18,15 @@ SRCS := main.cpp\
|
||||
client_request.cpp\
|
||||
new_connection.cpp\
|
||||
server_loop.cpp\
|
||||
commands/cmd_utils.cpp\
|
||||
commands/parse_commands.cpp\
|
||||
commands/auth/nick.cpp\
|
||||
commands/auth/pass.cpp\
|
||||
commands/auth/user.cpp\
|
||||
commands/auth/cmd_utils.cpp\
|
||||
commands/auth/auth_utils.cpp\
|
||||
commands/channel/channel_utils.cpp\
|
||||
commands/channel/join.cpp\
|
||||
commands/channel/privmsg.cpp\
|
||||
commands/not_done_cmd.cpp #special (temporary)
|
||||
|
||||
CC = c++
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/12/01 17:27:37 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/10 09:59:10 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 14:48:19 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -20,12 +20,14 @@
|
||||
#include <netinet/in.h> //struct socket
|
||||
#include <sys/epoll.h> //epoll ensemble
|
||||
#include <unistd.h> //close()
|
||||
#include <fcntl.h> //fcntl
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
#include "function_tab.hpp"
|
||||
|
||||
#define MAX_EVENTS 5
|
||||
#define MAX_CHAN 10
|
||||
#define READ_SIZE 10
|
||||
#define CMD_NBR 10
|
||||
|
||||
@ -35,7 +37,7 @@
|
||||
|
||||
struct channelData;
|
||||
|
||||
struct clientData
|
||||
struct clientData //each client have one
|
||||
{
|
||||
bool registered;
|
||||
|
||||
@ -49,38 +51,30 @@ struct clientData
|
||||
std::string serverName;
|
||||
|
||||
std::string cmdBuffer;
|
||||
//std::string joinedChan[20];
|
||||
//channelData *joinedChan; //is there a limit?
|
||||
|
||||
// std::vector<std::string> joinedChan;
|
||||
std::vector<channelData *> joinedChan;
|
||||
int fd;
|
||||
};
|
||||
|
||||
struct channelData
|
||||
struct channelData //each chan have one
|
||||
{
|
||||
//std::string userList[MAX_EVENTS];
|
||||
|
||||
//clientData userList[MAX_EVENTS];
|
||||
std::string name;
|
||||
std::vector<clientData> userList;
|
||||
std::vector<clientData> banList;
|
||||
std::vector<clientData *> userList;
|
||||
std::vector<clientData *> banList;
|
||||
int op;
|
||||
int nbrUser;
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct fdList //&allFds in code
|
||||
struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY
|
||||
{
|
||||
struct epoll_event events[MAX_EVENTS];
|
||||
int epollFd;
|
||||
int serverFd;
|
||||
//int userList[MAX_EVENTS]; //list of userNbr's fd
|
||||
std::vector<int> userList;
|
||||
std::vector<channelData> channelList;
|
||||
//clientData userData[MAX_EVENTS];
|
||||
std::vector<clientData> userData;
|
||||
|
||||
// std::map<int, channelData> channelList;
|
||||
// std::map<int, clientData> userData;
|
||||
|
||||
int nbrUser;
|
||||
functionTab parsingTab;
|
||||
@ -88,30 +82,45 @@ struct fdList //&allFds in code
|
||||
|
||||
|
||||
|
||||
/* ************************************************************************** */
|
||||
/* *********************************UTILS************************************ */
|
||||
/* ************************************************************************** */
|
||||
|
||||
void ft_putstr_fd(int fd, std::string str);
|
||||
void cmd_error(fdList &allFds, int userNbr, std::string error);
|
||||
void ft_error(std::string str);
|
||||
void close_fd(int fd);
|
||||
void del_user_in_chan(clientData *user, channelData *chan);
|
||||
void delete_user(fdList &allFds, int userNbr);
|
||||
|
||||
/* ************************************************************************** */
|
||||
/* *******************************AUTH UTILS********************************* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
void print_registered_msg(fdList &allFds, int userNbr);
|
||||
|
||||
/* ************************************************************************** */
|
||||
/* *******************************CMD UTILS********************************** */
|
||||
/* ************************************************************************** */
|
||||
|
||||
void ft_error(std::string str);
|
||||
void close_fd(int fd);
|
||||
void cmd_error(fdList &allFds, int userNbr, std::string error);
|
||||
void split(std::string const &str, const char delim, std::vector<std::string> &out);
|
||||
void print_registered_msg(fdList &allFds, int userNbr);
|
||||
void split_but_keep(std::string const &str, const char delim, std::vector<std::string> &out); //same as split but keep one delimeter
|
||||
|
||||
|
||||
/* ************************************************************************** */
|
||||
/* *******************************CHAN UTILS********************************* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
int find_channel(fdList &allFds, std::string chanName);
|
||||
int find_user(fdList &allFds, std::string userName);
|
||||
void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr); //in privmsg.cpp
|
||||
|
||||
/* ************************************************************************** */
|
||||
/* ******************************START SERVER******************************** */
|
||||
/* ************************************************************************** */
|
||||
|
||||
void initialize(char **av); //1st
|
||||
void start_loop(fdList &allFds); //3rd
|
||||
void initialize(char **av); //start_server.cpp
|
||||
void start_loop(fdList &allFds); //server_loop.cpp
|
||||
|
||||
/* ************************************************************************** */
|
||||
/* *****************************EPOLL UTILITY******************************** */
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/12/09 22:34:36 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/09 21:39:38 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 13:20:49 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -33,16 +33,24 @@ bool clientRequest(fdList &allFds, int userNbr)//,
|
||||
if (buffer.empty())
|
||||
{
|
||||
//delete client
|
||||
close(allFds.userData[userNbr].fd);
|
||||
allFds.userData.erase(allFds.userData.begin() + userNbr);
|
||||
allFds.userList.erase(allFds.userList.begin() + userNbr);
|
||||
allFds.nbrUser--;
|
||||
std::cout << "buffer empty\n";
|
||||
delete_user(allFds, userNbr);
|
||||
// close(allFds.userData[userNbr].fd);
|
||||
// allFds.userData.erase(allFds.userData.begin() + userNbr);
|
||||
// allFds.userList.erase(allFds.userList.begin() + userNbr);
|
||||
// allFds.nbrUser--;
|
||||
// std::cout << "buffer empty\n";
|
||||
return (1);
|
||||
}
|
||||
std::cout << "BUFFER: ---" << buf << "---" << std::endl;
|
||||
//std::cout << "BUFFER: ---" << buf << "---" << std::endl;
|
||||
|
||||
//split with \n and while (tab de split) -> parsing
|
||||
parse_commands(buf, allFds, userNbr);
|
||||
|
||||
std::vector<std::string> splitBuff;
|
||||
split_but_keep(buffer, '\n', splitBuff);
|
||||
for (size_t i = 0; i < splitBuff.size(); i++)
|
||||
{
|
||||
parse_commands(splitBuff[i], allFds, userNbr);
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
@ -1,42 +1,17 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* cmd_utils.cpp :+: :+: :+: */
|
||||
/* auth_utils.cpp :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2023/02/07 14:45:45 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/10 09:27:27 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 10:40:42 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "../../../includes/ft_irc.hpp"
|
||||
|
||||
void ft_putstr_fd(int fd, std::string str)
|
||||
{
|
||||
write(fd, str.c_str(), str.size());
|
||||
write(fd, "\n", 1);
|
||||
}
|
||||
|
||||
void cmd_error(fdList &allFds, int fd, std::string error)
|
||||
{
|
||||
(void)allFds; //to delete
|
||||
write(fd, ":irc.local ", 11);
|
||||
write(fd, error.c_str(), error.size());
|
||||
}
|
||||
|
||||
void split(std::string const &str, const char delim, std::vector<std::string> &out)
|
||||
{
|
||||
size_t start;
|
||||
size_t end = 0;
|
||||
|
||||
while ((start = str.find_first_not_of(delim, end)) != std::string::npos)
|
||||
{
|
||||
end = str.find(delim, start);
|
||||
out.push_back(str.substr(start, end - start));
|
||||
}
|
||||
}
|
||||
|
||||
void print_registered_msg(fdList &allFds, int userNbr)
|
||||
{
|
||||
ft_putstr_fd(allFds.userData[userNbr].fd, "-------------------WELCOME TO MY PERSONNAL IRC SERVER!-------------------" );
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2023/02/06 14:40:39 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/09 13:19:53 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 12:57:50 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -18,34 +18,38 @@
|
||||
|
||||
void USER(std::string buffer, fdList &allFds, int userNbr)
|
||||
{
|
||||
if (allFds.userData[userNbr].registered == 1)
|
||||
{
|
||||
cmd_error(allFds, allFds.userData[userNbr].fd, "462 * PASS :You may not reregister\n");
|
||||
return ;
|
||||
}
|
||||
|
||||
(void)buffer;
|
||||
(void)allFds;
|
||||
(void)userNbr;
|
||||
// if (allFds.userData[userNbr].registered == 1)
|
||||
// {
|
||||
// cmd_error(allFds, allFds.userData[userNbr].fd, "462 * USER :You may not reregister\n");
|
||||
// return ;
|
||||
// }
|
||||
|
||||
std::string realName = buffer.substr(buffer.find_first_of(":") + 1 , buffer.npos);
|
||||
std::vector<std::string> splitBuff;
|
||||
// std::string realName = buffer.substr(buffer.find_first_of(":") + 1 , buffer.npos);
|
||||
// std::vector<std::string> splitBuff;
|
||||
|
||||
|
||||
buffer.resize(buffer.size() - realName.size());
|
||||
std::cout << "Buffer in userNbr = ---" << buffer << "---" << std::endl;
|
||||
std::cout << "realname in userNbr = ---" << realName << "---" << std::endl;
|
||||
split(buffer, ' ', splitBuff);
|
||||
if (splitBuff.size() < 4)
|
||||
{
|
||||
cmd_error(allFds, allFds.userData[userNbr].fd, "461 * PASS :Not enough parameters\n");
|
||||
//write(allFds.userData[userNbr].fd, "ERR_NEEDMOREPARAMS", 18);
|
||||
return ;
|
||||
}
|
||||
allFds.userData[userNbr].userName = splitBuff[1];
|
||||
allFds.userData[userNbr].hostName = splitBuff[2];
|
||||
allFds.userData[userNbr].serverName = splitBuff[3];
|
||||
// buffer.resize(buffer.size() - realName.size());
|
||||
// std::cout << "Buffer in userNbr = ---" << buffer << "---" << std::endl;
|
||||
// std::cout << "realname in userNbr = ---" << realName << "---" << std::endl;
|
||||
// split(buffer, ' ', splitBuff);
|
||||
// if (splitBuff.size() < 4)
|
||||
// {
|
||||
// cmd_error(allFds, allFds.userData[userNbr].fd, "461 * USER :Not enough parameters\n");
|
||||
// //write(allFds.userData[userNbr].fd, "ERR_NEEDMOREPARAMS", 18);
|
||||
// return ;
|
||||
// }
|
||||
// allFds.userData[userNbr].userName = splitBuff[1];
|
||||
// allFds.userData[userNbr].hostName = splitBuff[2];
|
||||
// allFds.userData[userNbr].serverName = splitBuff[3];
|
||||
|
||||
allFds.userData[userNbr].realName = realName;
|
||||
if (!allFds.userData[userNbr].nickname.empty())
|
||||
{
|
||||
allFds.userData[userNbr].registered = 1;
|
||||
print_registered_msg(allFds, userNbr);
|
||||
}
|
||||
// allFds.userData[userNbr].realName = realName;
|
||||
// if (!allFds.userData[userNbr].nickname.empty())
|
||||
// {
|
||||
// allFds.userData[userNbr].registered = 1;
|
||||
// print_registered_msg(allFds, userNbr);
|
||||
// }
|
||||
}
|
||||
@ -6,22 +6,43 @@
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2023/02/09 17:21:57 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/09 20:56:31 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 12:25:58 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "../../../includes/ft_irc.hpp"
|
||||
|
||||
int find_channel(fdList &allFds, std::string chanName)
|
||||
int find_channel(fdList &allFds, std::string chanName)//return channel nbr
|
||||
{
|
||||
std::vector<channelData>::iterator start = allFds.channelList.begin();
|
||||
std::vector<channelData>::iterator pastEnd = allFds.channelList.end();
|
||||
std::cout << "name1= ---" << chanName << "---\n";
|
||||
while (start != pastEnd)
|
||||
{
|
||||
std::cout << "result in find chan = " << pastEnd - start << std::endl;
|
||||
if (allFds.channelList[pastEnd - start].name == chanName)
|
||||
return (pastEnd - start);
|
||||
std::cout << "name2= ---" << allFds.channelList[pastEnd - start - 1].name << "---\n";
|
||||
if (allFds.channelList[pastEnd - start - 1].name == chanName)
|
||||
return (pastEnd - start - 1);
|
||||
start++;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
std::cout << "chan not found\n";
|
||||
return (-1);
|
||||
}
|
||||
|
||||
int find_user(fdList &allFds, std::string userName)//return direct user fd
|
||||
{
|
||||
std::vector<clientData>::iterator start = allFds.userData.begin();
|
||||
std::vector<clientData>::iterator pastEnd = allFds.userData.end();
|
||||
std::cout << "name1= ---" << userName << "---\n";
|
||||
while (start != pastEnd)
|
||||
{
|
||||
std::cout << "result in find user = " << pastEnd - start << std::endl;
|
||||
std::cout << "name2= ---" << allFds.userData[pastEnd - start - 1].nickname << "---\n";
|
||||
if (allFds.userData[pastEnd - start - 1].nickname == userName)
|
||||
return (allFds.userData[pastEnd - start - 1].fd);
|
||||
start++;
|
||||
}
|
||||
std::cout << "user not found\n";
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2023/02/09 15:40:33 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/09 21:55:57 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 14:55:28 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -16,7 +16,15 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr)
|
||||
{
|
||||
std::vector<std::string> splitBuff;
|
||||
int chanNbr;
|
||||
std::cout << "join start\n";
|
||||
std::cout << "==========join start========\n";
|
||||
|
||||
if (allFds.channelList.size() == MAX_CHAN)
|
||||
{
|
||||
std::cout << "creation of channel refused, maximum number reached" << std::endl; // send msg to user?
|
||||
return ;
|
||||
}
|
||||
|
||||
std::cout << "userNbr= " << userNbr << std::endl;
|
||||
split(buffer, ' ', splitBuff);
|
||||
if (splitBuff.size() < 2)
|
||||
{
|
||||
@ -25,25 +33,48 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr)
|
||||
}
|
||||
|
||||
chanNbr = find_channel(allFds, splitBuff[1]);
|
||||
if (chanNbr)
|
||||
if (chanNbr != -1) //chan already exist
|
||||
{
|
||||
//allFds.userData[userNbr].joinedChan.push_back(splitBuff[1]);
|
||||
allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList[chanNbr]); //add chan in user data
|
||||
allFds.channelList[chanNbr].userList.push_back(&allFds.userData[userNbr]);//add user in chan data
|
||||
allFds.channelList[chanNbr].nbrUser++;
|
||||
std::cout << "join2 nickname " << allFds.channelList.back().userList[0]->nickname << std::endl;
|
||||
std::cout << "join2 fd " << allFds.channelList.back().userList[0]->nickname << std::endl;
|
||||
//allFds.channelList.push_back(new_chan);
|
||||
//std::cout << "nbruser in existent chan / persistence = " << allFds.channelList[chanNbr].nbrUser << std::endl;
|
||||
//std::cout << "nbruser in existent user / persistence = " << allFds.userData[userNbr].joinedChan[0]->nbrUser << std::endl;
|
||||
//message nickname joined the channel?
|
||||
}
|
||||
else
|
||||
else //chan doesn't exist yet
|
||||
{
|
||||
std::cout << "new chan\n";
|
||||
channelData new_chan;
|
||||
|
||||
new_chan.name = splitBuff[1];
|
||||
new_chan.nbrUser = 1;
|
||||
new_chan.userList.push_back(&allFds.userData[userNbr]);
|
||||
//new_chan.userList
|
||||
|
||||
|
||||
allFds.channelList.push_back(new_chan);
|
||||
allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList.back());
|
||||
allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList.back());//add chan in user data
|
||||
//allFds.channelList.back().userList.push_back(&allFds.userData[userNbr]);//add user in chan data
|
||||
|
||||
|
||||
// allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList[chanNbr]); //add chan in user data
|
||||
// allFds.channelList[chanNbr].userList.push_back(&allFds.userData[userNbr]);//add user in chan data
|
||||
// allFds.channelList[chanNbr].nbrUser++;
|
||||
|
||||
|
||||
std::cout << "join nickname " << allFds.channelList[0].userList[0]->nickname << std::endl;
|
||||
std::cout << "join fd " << allFds.channelList[0].userList[0]->fd << std::endl;
|
||||
//ft_putstr_fd(allFds.channelList[fd].userList[i]->fd, fullMsg);
|
||||
//std::cout << "loop here\n";
|
||||
|
||||
//message nickname created the channel?
|
||||
}
|
||||
std::cout << "============persitence test============\n";
|
||||
allFds.channelList.back().name = "new name";
|
||||
std::cout << "newname = " << allFds.userData[userNbr].joinedChan.back()->name << std::endl;
|
||||
//allFds.channelList;
|
||||
// std::cout << "============persitence test============\n";
|
||||
// std::cout << "odlname = " << allFds.userData[userNbr].joinedChan.back()->name << std::endl;
|
||||
// allFds.channelList.back().name = "new name";
|
||||
// std::cout << "newname = " << allFds.userData[userNbr].joinedChan.back()->name << std::endl;
|
||||
// //allFds.channelList;
|
||||
}
|
||||
77
srcs/commands/channel/privmsg.cpp
Normal file
77
srcs/commands/channel/privmsg.cpp
Normal file
@ -0,0 +1,77 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* privmsg.cpp :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2023/02/11 08:53:03 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/11 12:38:51 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "../../../includes/ft_irc.hpp"
|
||||
|
||||
|
||||
void PRIVMSG(std::string buffer, fdList &allFds, int userNbr)
|
||||
{
|
||||
std::vector<std::string> splitBuff;
|
||||
std::string msg;
|
||||
|
||||
split(buffer, ' ', splitBuff);
|
||||
if (splitBuff.size() < 3)
|
||||
{
|
||||
cmd_error(allFds, allFds.userData[userNbr].fd, "431 * PRIVMSG :Not enought argument\n");
|
||||
//write(allFds.userData[user].fd, "ERR_NEEDMOREPARAMS", 18);
|
||||
return ;
|
||||
}
|
||||
|
||||
for (size_t i = 2; i < splitBuff.size(); i++)
|
||||
{
|
||||
msg += (" " + splitBuff[i]);
|
||||
}
|
||||
|
||||
std::vector<std::string> dest;
|
||||
split(splitBuff[1], ',', dest);
|
||||
for (size_t i = 0; i < dest.size(); i++)
|
||||
{
|
||||
send_msg(allFds, msg, dest[i], userNbr);
|
||||
}
|
||||
}
|
||||
|
||||
void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr)
|
||||
{
|
||||
int fd;
|
||||
//find dest
|
||||
std::string fullMsg;
|
||||
fullMsg = "*" + allFds.userData[userNbr].nickname + "* " + msg;
|
||||
fd = find_channel(allFds, dest); //return channel nbr
|
||||
if (fd != -1)
|
||||
{
|
||||
//std::vector<clientData *>::iterator start = allFds.channelList[fd].userList.begin();
|
||||
//std::vector<clientData *>::iterator pastEnd = allFds.channelList[fd].userList.end();
|
||||
// while (start != pastEnd)
|
||||
// {
|
||||
// std::cout << "send nickname" << (*start)->nickname << std::endl;
|
||||
// ft_putstr_fd((*start)->fd, fullMsg);
|
||||
// start++;
|
||||
// std::cout << "loop here\n";
|
||||
// }
|
||||
for (size_t i = 0; i < allFds.channelList[fd].userList.size(); i++)
|
||||
{
|
||||
std::cout << "send nickname " << allFds.channelList[fd].userList[i]->nickname << std::endl;
|
||||
ft_putstr_fd(allFds.channelList[fd].userList[i]->fd, fullMsg);
|
||||
std::cout << "loop here\n";
|
||||
}
|
||||
return ;
|
||||
}
|
||||
|
||||
fd = find_user(allFds, dest); //return direct user fd
|
||||
if (fd != -1)
|
||||
{
|
||||
ft_putstr_fd(fd, fullMsg);
|
||||
return ;
|
||||
}
|
||||
std::cout << "error msg\n";
|
||||
//ft_putstr_fd(fd, msg);
|
||||
}
|
||||
38
srcs/commands/cmd_utils.cpp
Normal file
38
srcs/commands/cmd_utils.cpp
Normal file
@ -0,0 +1,38 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* cmd_utils.cpp :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2023/02/10 15:46:10 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/11 13:51:28 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "../../includes/ft_irc.hpp"
|
||||
|
||||
void split(std::string const &str, const char delim, std::vector<std::string> &out)
|
||||
{
|
||||
size_t start;
|
||||
size_t end = 0;
|
||||
|
||||
while ((start = str.find_first_not_of(delim, end)) != std::string::npos)
|
||||
{
|
||||
end = str.find(delim, start);
|
||||
out.push_back(str.substr(start, end - start));
|
||||
}
|
||||
}
|
||||
|
||||
void split_but_keep(std::string const &str, const char delim, std::vector<std::string> &out)
|
||||
{
|
||||
size_t start;
|
||||
size_t end = 0;
|
||||
|
||||
while ((start = str.find_first_not_of(delim, end)) != std::string::npos)
|
||||
{
|
||||
end = str.find(delim, start); //find end of string
|
||||
out.push_back(str.substr(start, end + 1 - start)); //here
|
||||
//std::cout << "split test = ---" << str.substr(start, end + 1 - start) << "---\n";
|
||||
}
|
||||
}
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2023/02/09 22:04:11 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/10 09:30:45 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 08:53:59 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -164,13 +164,13 @@ void INFO(std::string buffer, fdList &allFds, int userNbr)
|
||||
return ;
|
||||
}
|
||||
|
||||
void PRIVMSG(std::string buffer, fdList &allFds, int userNbr)
|
||||
{
|
||||
(void)buffer;
|
||||
(void)allFds;
|
||||
(void)userNbr;
|
||||
return ;
|
||||
}
|
||||
// void PRIVMSG(std::string buffer, fdList &allFds, int userNbr)
|
||||
// {
|
||||
// (void)buffer;
|
||||
// (void)allFds;
|
||||
// (void)userNbr;
|
||||
// return ;
|
||||
// }
|
||||
|
||||
void NOTICE(std::string buffer, fdList &allFds, int userNbr)
|
||||
{
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/12/06 22:01:25 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/10 09:26:31 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 15:11:24 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -21,6 +21,7 @@ std::string ft_test()
|
||||
void parse_commands(std::string buffer, fdList &allFds, int userNbr)
|
||||
{
|
||||
//std::string cmd = buffer;
|
||||
std::cout << "===========parse command=============" << std::endl;
|
||||
std::vector<std::string> splitBuff;
|
||||
int a = 0;
|
||||
|
||||
@ -30,16 +31,16 @@ void parse_commands(std::string buffer, fdList &allFds, int userNbr)
|
||||
allFds.userData[userNbr].cmdBuffer.erase(allFds.userData[userNbr].cmdBuffer.size() - 1);
|
||||
split(allFds.userData[userNbr].cmdBuffer, ' ', splitBuff);
|
||||
|
||||
std::cout << "BUFFER In PARSING: ---" << allFds.userData[userNbr].cmdBuffer << "---" << std::endl;
|
||||
while (splitBuff[0] != allFds.parsingTab.cmdName[a] && a < allFds.parsingTab.cmdNbr)
|
||||
//std::cout << "BUFFER In PARSING: ---" << allFds.userData[userNbr].cmdBuffer << "---" << std::endl;
|
||||
while (a < allFds.parsingTab.cmdNbr - 1 && splitBuff[0] != allFds.parsingTab.cmdName[a])
|
||||
a++;
|
||||
std::cout << "after while \n";
|
||||
if (a == allFds.parsingTab.cmdNbr)
|
||||
//std::cout << "after while \n";
|
||||
if (a == allFds.parsingTab.cmdNbr - 1)
|
||||
std::cout << "Command not found\n";
|
||||
else
|
||||
{
|
||||
std::cout << "Command name = " << allFds.parsingTab.cmdName[a] << std::endl;
|
||||
std::cout << "Command nbr = " << a << std::endl;
|
||||
//std::cout << "Command name = " << allFds.parsingTab.cmdName[a] << std::endl;
|
||||
//std::cout << "Command nbr = " << a << std::endl;
|
||||
allFds.parsingTab.cmdPtr[a](allFds.userData[userNbr].cmdBuffer, allFds, userNbr);
|
||||
//allFds.parsingTab.cmdPtr[a]
|
||||
//JOIN(allFds.userData[userNbr].cmdBuffer, allFds, userNbr);
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/12/09 22:26:27 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/10 09:19:45 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 14:47:52 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -16,46 +16,38 @@ void new_connection(fdList &allFds)
|
||||
{
|
||||
struct sockaddr_in addr;
|
||||
int addrLen = sizeof(addr);
|
||||
int newFd;
|
||||
|
||||
std::cout << "==========newconnection========\n";
|
||||
//std::cout << "in new adress " << &allFds << std::endl;
|
||||
//std::cout << "new connection !" << std::endl;
|
||||
|
||||
if (MAX_EVENTS == allFds.nbrUser)
|
||||
{
|
||||
std::cout << "new connection refused, already full" << std::endl;
|
||||
return ;
|
||||
}
|
||||
|
||||
int newUserFd;
|
||||
allFds.userList.push_back(newUserFd);
|
||||
allFds.userList[allFds.nbrUser] = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen);
|
||||
|
||||
std::cout << "newConnection | user fd = " << allFds.userList[allFds.nbrUser] << std::endl;
|
||||
|
||||
//int newUserFd;
|
||||
//allFds.userList.push_back(newUserFd);
|
||||
newFd = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen);
|
||||
//allFds.userList[allFds.nbrUser] = newFd;
|
||||
allFds.userList.push_back(newFd);
|
||||
//std::cout << "newConnection | old user fd = " << newFd << std::endl;
|
||||
if (fcntl(newFd, F_SETFL, O_NONBLOCK) == -1)
|
||||
ft_error("fctnl() error");
|
||||
|
||||
|
||||
//std::cout << "fcntl return = " << newFd;
|
||||
//close(newFd);
|
||||
//std::cout << "newConnection | user fd = " << allFds.userList[allFds.nbrUser] << std::endl;
|
||||
|
||||
clientData newElement;
|
||||
newElement.fd = newFd;
|
||||
allFds.userData.push_back(newElement);
|
||||
allFds.userData[allFds.nbrUser].fd = allFds.userList[allFds.nbrUser];
|
||||
|
||||
std::cout << "newConnection | user in data fd = " << allFds.userData[allFds.nbrUser].fd << std::endl;
|
||||
//allFds.userData[allFds.nbrUser].fd = allFds.userList[allFds.nbrUser];
|
||||
//std::cout << "newConnection | user in data fd = " << allFds.userData[allFds.nbrUser].fd << std::endl;
|
||||
|
||||
epoll_add(allFds.epollFd, allFds.userList[allFds.nbrUser]);
|
||||
allFds.nbrUser++;
|
||||
}
|
||||
|
||||
// void new_connection(fdList *allFds, struct epoll_event newClient)
|
||||
// {
|
||||
// struct sockaddr_in addr;
|
||||
// int addrLen = sizeof(addr);
|
||||
|
||||
// std::cout << "new connection !" << std::endl;
|
||||
// if (MAX_EVENTS == (*allFds).nbrUser)
|
||||
// std::cout << "new connection refused, already full" << std::endl;
|
||||
// (*allFds).userList[(*allFds).nbrUser] = accept((*allFds).serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen);
|
||||
|
||||
// std::cout << "newConnection | user fd = " << (*allFds).userList[(*allFds).nbrUser] << std::endl;
|
||||
|
||||
// (*allFds).userData[(*allFds).nbrUser].fd = (*allFds).userList[(*allFds).nbrUser];
|
||||
// std::cout << "newConnection | user in data fd = " << (*allFds).userData[(*allFds).nbrUser].fd << std::endl;
|
||||
|
||||
// epoll_add((*allFds).epollFd, (*allFds).userList[(*allFds).nbrUser]);
|
||||
// (*allFds).nbrUser++;
|
||||
// }
|
||||
}
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/12/06 21:58:13 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/10 09:20:58 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 14:06:49 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -24,13 +24,16 @@ void start_loop(fdList &allFds)
|
||||
std::cout << "serverFd: " << allFds.serverFd << std::endl;
|
||||
while (alive)
|
||||
{
|
||||
//std::cout << "\n\n\nwhile alive event loop" << std::endl;
|
||||
//std::cout << "in loop nbr user = " << allFds.nbrUser << std::endl;
|
||||
eventNbr = epoll_wait(allFds.epollFd, allFds.events, MAX_EVENTS, 5000);
|
||||
//std::cout << "eventNbr: " << eventNbr << std::endl;
|
||||
//std::cout << "in loop adress " << &allFds << std::endl;
|
||||
for (i = 0; i < eventNbr ; i++)
|
||||
{
|
||||
std::cout << "event[i]'s fd: " << allFds.events[i].data.fd << std::endl;
|
||||
std::cout << "i= " << i << std::endl;
|
||||
|
||||
//std::cout << "event[i]'s fd: " << allFds.events[i].data.fd << std::endl;
|
||||
//std::cout << "i= " << i << std::endl;
|
||||
if (allFds.events[i].data.fd == allFds.serverFd)
|
||||
{
|
||||
new_connection(allFds);
|
||||
@ -39,11 +42,10 @@ void start_loop(fdList &allFds)
|
||||
else
|
||||
{
|
||||
nbr = find(allFds.userList.begin(), allFds.userList.end(), allFds.events[i].data.fd) - allFds.userList.begin();
|
||||
std::cout << "fd loop " << allFds.userData[nbr].fd << std::endl;
|
||||
std::cout << "nbr loop " << nbr << std::endl;
|
||||
//if (!clientRequest(allFds, i))
|
||||
if (!clientRequest(allFds, nbr))
|
||||
alive = false;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/12/06 21:44:20 by apommier #+# #+# */
|
||||
/* Updated: 2023/02/10 09:18:45 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 14:49:36 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -28,6 +28,9 @@ void initialize(char **av)
|
||||
//int addrLen = sizeof(addr);
|
||||
fdList allFds;
|
||||
|
||||
allFds.userData.reserve(MAX_EVENTS);
|
||||
allFds.channelList.reserve(MAX_CHAN);
|
||||
|
||||
allFds.nbrUser = 0;
|
||||
allFds.serverFd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (allFds.serverFd == -1)
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2022/12/06 21:46:41 by apommier #+# #+# */
|
||||
/* Updated: 2022/12/07 01:09:12 by apommier ### ########.fr */
|
||||
/* Updated: 2023/02/11 12:24:33 by apommier ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -27,4 +27,47 @@ void close_fd(int fd)
|
||||
{
|
||||
if (close(fd))
|
||||
ft_error("close() error");
|
||||
}
|
||||
|
||||
void ft_putstr_fd(int fd, std::string str)
|
||||
{
|
||||
write(fd, str.c_str(), str.size());
|
||||
write(fd, "\n", 1);
|
||||
}
|
||||
|
||||
void cmd_error(fdList &allFds, int fd, std::string error)
|
||||
{
|
||||
(void)allFds; //to delete
|
||||
write(fd, ":irc.local ", 11);
|
||||
write(fd, error.c_str(), error.size());
|
||||
}
|
||||
|
||||
// void find_user_in_chan(fdList &allFds, channelData *chan)
|
||||
// {
|
||||
|
||||
// }
|
||||
|
||||
void del_user_in_chan(clientData *user, channelData *chan)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; user != chan->userList[i]; i++)
|
||||
;
|
||||
chan->userList.erase(chan->userList.begin() + i);
|
||||
}
|
||||
|
||||
void delete_user(fdList &allFds, int userNbr)
|
||||
{
|
||||
std::cout << "Delete user nbr " << userNbr << std::endl;
|
||||
|
||||
// for (size_t i = 0; i < allFds.userData[userNbr].joinedChan.size(); i++)//all joined chan
|
||||
// {
|
||||
// del_user_in_chan(&allFds.userData[userNbr], allFds.userData[userNbr].joinedChan[i]);
|
||||
// //allFds.userData[userNbr].joinedChan[i].erase(find_user_in_chan(allFds.userData[userNbr].joinedChan[i])/*find user in chan*/)
|
||||
// }
|
||||
close(allFds.userData[userNbr].fd);
|
||||
|
||||
allFds.userData.erase(allFds.userData.begin() + userNbr);
|
||||
allFds.userList.erase(allFds.userList.begin() + userNbr);
|
||||
|
||||
allFds.nbrUser--;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user