Merge branch 'apommier' into sadjigui

This commit is contained in:
PrStein 2023-02-13 23:40:15 +01:00
commit 1319c01746
21 changed files with 290 additions and 118 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/12 20:53:25 by apommier ### ########.fr # # Updated: 2023/02/13 00:20:18 by apommier ### ########.fr #
# # # #
# **************************************************************************** # # **************************************************************************** #
@ -27,6 +27,7 @@ SRCS := main.cpp\
commands/auth/pass.cpp\ commands/auth/pass.cpp\
commands/auth/user.cpp\ commands/auth/user.cpp\
commands/auth/auth_utils.cpp\ commands/auth/auth_utils.cpp\
commands/auth/connect_client.cpp\
\ \
commands/channel/channel_utils.cpp\ commands/channel/channel_utils.cpp\
commands/channel/join.cpp\ commands/channel/join.cpp\
@ -34,6 +35,7 @@ SRCS := main.cpp\
\ \
commands/other/quit.cpp\ commands/other/quit.cpp\
commands/other/squit.cpp\ commands/other/squit.cpp\
commands/other/ping_pong.cpp\
\ \
commands/channel_op/invite.cpp\ commands/channel_op/invite.cpp\
commands/channel_op/kick.cpp\ commands/channel_op/kick.cpp\

View File

@ -6,13 +6,17 @@
/* 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/12 21:10:18 by apommier ### ########.fr */ /* Updated: 2023/02/13 19:48:40 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#pragma once #pragma once
#include <sys/socket.h> //socket function #include <sys/socket.h> //socket function
#include <netinet/in.h>//inet
#include <arpa/inet.h>
#include <cstdlib> #include <cstdlib>
#include <cstring> //std::string #include <cstring> //std::string
#include <cerrno> //errno #include <cerrno> //errno
@ -85,7 +89,9 @@ struct clientData //each client have one
{ {
bool registered; bool registered;
clientData() { registered = 0; } struct sockaddr_in addr;
std::string ip;
std::string nickname; std::string nickname;
std::string password; std::string password;
@ -101,6 +107,8 @@ struct clientData //each client have one
int fd; int fd;
int op; int op;
clientData() : registered(0), op(0) {}
// { registered = 0; op = 0;}
}; };
struct channelData //each chan have one struct channelData //each chan have one
@ -157,6 +165,7 @@ void cmd_error(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);
int not_contain_other(std::string str, std::string toFind);
/* ************************************************************************** */ /* ************************************************************************** */
/* *******************************AUTH UTILS********************************* */ /* *******************************AUTH UTILS********************************* */
@ -200,6 +209,7 @@ int epoll_start(); //2nd
void new_connection(fdList &allFds); void new_connection(fdList &allFds);
bool clientRequest(fdList &allFds, int userNbr); bool clientRequest(fdList &allFds, int userNbr);
void connect_client(fdList &allFds, int userNbr);
/* ************************************************************************** */ /* ************************************************************************** */
/* ***************************COMMANDS PARSING******************************* */ /* ***************************COMMANDS PARSING******************************* */

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/09 22:34:36 by apommier #+# #+# */ /* Created: 2022/12/09 22:34:36 by apommier #+# #+# */
/* Updated: 2023/02/12 21:40:10 by apommier ### ########.fr */ /* Updated: 2023/02/13 19:21:07 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -18,6 +18,7 @@ bool clientRequest(fdList &allFds, int userNbr)//,
char buf[1024] = {0}; char buf[1024] = {0};
std::string buffer; std::string buffer;
size_t len = 1024; size_t len = 1024;
int ret = 0;
//buf.reserve(1024); //buf.reserve(1024);
//se demerder pour join quand pas \n //se demerder pour join quand pas \n
@ -27,9 +28,10 @@ bool clientRequest(fdList &allFds, int userNbr)//,
//std::cout << "client request!" << std::endl; //std::cout << "client request!" << std::endl;
//if (recv(allFds.userData[userNbr].fd, buf, len, 0) == -1) //if (recv(allFds.userData[userNbr].fd, buf, len, 0) == -1)
if (recv(allFds.userData[userNbr].fd, buf, len, 0) == -1) if ((ret = recv(allFds.userData[userNbr].fd, buf, len, 0)) == -1)
ft_error("recv() error"); ft_error("recv() error");
buffer = buf; buffer = buf;
buffer[ret] = 0;
if (buffer.empty()) if (buffer.empty())
{ {
//delete client //delete client
@ -42,6 +44,10 @@ bool clientRequest(fdList &allFds, int userNbr)//,
return (1); return (1);
} }
std::cout << "BUFFER: ---" << buf << "---" << std::endl; std::cout << "BUFFER: ---" << buf << "---" << std::endl;
// for (int i = 0; buffer[i]; i++)
// {
// std::cout << i << " = " << (int)buffer[i] << std::endl;
// }
//split with \n and while (tab de split) -> parsing //split with \n and while (tab de split) -> parsing

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/07 14:45:45 by apommier #+# #+# */ /* Created: 2023/02/07 14:45:45 by apommier #+# #+# */
/* Updated: 2023/02/11 10:40:42 by apommier ### ########.fr */ /* Updated: 2023/02/13 12:54:35 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -14,13 +14,41 @@
void print_registered_msg(fdList &allFds, int userNbr) void print_registered_msg(fdList &allFds, int userNbr)
{ {
ft_putstr_fd(allFds.userData[userNbr].fd, "-------------------WELCOME TO MY PERSONNAL IRC SERVER!-------------------" ); (void)allFds;
ft_putstr_fd(allFds.userData[userNbr].fd, "your nickname is |" + allFds.userData[userNbr].nickname ); (void)userNbr;
ft_putstr_fd(allFds.userData[userNbr].fd, "your password is |" + allFds.userData[userNbr].password );
ft_putstr_fd(allFds.userData[userNbr].fd, "your username is |" + allFds.userData[userNbr].userName ); std::string msg;
ft_putstr_fd(allFds.userData[userNbr].fd, "your realname is |" + allFds.userData[userNbr].realName ); msg = ":irc.local 001 " + allFds.userData[userNbr].nickname + " : Welcome to the Internet Relay Network " + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].hostName + "\n";
ft_putstr_fd(allFds.userData[userNbr].fd, "your hostname is |" + allFds.userData[userNbr].hostName ); send(allFds.userData[userNbr].fd, msg.c_str(), msg.size(), 0);
ft_putstr_fd(allFds.userData[userNbr].fd, "your servername is |" + allFds.userData[userNbr].serverName ); msg = ":irc.local 002 " + allFds.userData[userNbr].nickname + " : Your host is irc.local" + ", running version InspIRCd-3\n"; //+ allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].hostName;
send(allFds.userData[userNbr].fd, msg.c_str(), msg.size(), 0);
msg = ":irc.local 003 " + allFds.userData[userNbr].nickname + " : This server was created " + "09:58:11 Feb 13 2023\n";//<date>;
send(allFds.userData[userNbr].fd, msg.c_str(), msg.size(), 0);
msg = ":irc.local 004 " + allFds.userData[userNbr].nickname + "irc.local " + "InspIRCd-3 " + "iosw " + "biklmnopstv\n";
//<servername> <version> <available user modes> <available channel modes
send(allFds.userData[userNbr].fd, msg.c_str(), msg.size(), 0);
// 001 RPL_WELCOME
// "Welcome to the Internet Relay Network
// <nick>!<user>@<host>"
// 002 RPL_YOURHOST
// "Your host is <servername>, running version <ver>"
// 003 RPL_CREATED
// "This server was created <date>"
// 004 RPL_MYINFO
// "<servername> <version> <available user modes>
// <available channel modes>"
// ft_putstr_fd(allFds.userData[userNbr].fd, "-------------------WELCOME TO MY PERSONNAL IRC SERVER!-------------------" );
// ft_putstr_fd(allFds.userData[userNbr].fd, "your nickname is |" + allFds.userData[userNbr].nickname );
// ft_putstr_fd(allFds.userData[userNbr].fd, "your password is |" + allFds.userData[userNbr].password );
// ft_putstr_fd(allFds.userData[userNbr].fd, "your username is |" + allFds.userData[userNbr].userName );
// ft_putstr_fd(allFds.userData[userNbr].fd, "your realname is |" + allFds.userData[userNbr].realName );
// ft_putstr_fd(allFds.userData[userNbr].fd, "your hostname is |" + allFds.userData[userNbr].hostName );
// ft_putstr_fd(allFds.userData[userNbr].fd, "your servername is |" + allFds.userData[userNbr].serverName );
} }
// void delete_client(fdList &allFds) // void delete_client(fdList &allFds)

View File

@ -0,0 +1,26 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* connect_client.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/12 23:30:11 by apommier #+# #+# */
/* Updated: 2023/02/13 11:04:52 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
void connect_client(fdList &allFds, int userNbr)
{
// allFds.userData[userNbr].fd
std::cout << "connect client start\n";
// if (-1 == connect(allFds.userData[userNbr].fd, (struct sockaddr *)&allFds.userData[userNbr].addr, sizeof(allFds.userData[userNbr].addr)))
// ft_error("connect() error");
allFds.userData[userNbr].registered = 1;
print_registered_msg(allFds, userNbr);
std::cout << "connect client end\n";
//ft_putstr_fd(allFds.userData[userNbr].fd, ":irc.local NOTICE kinou :*** Could not resolve your hostname: Request timed out; using your IP address (172.17.0.1) instead.\nirc.local 376 kinou :End of message of the day.");
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:28:38 by apommier #+# #+# */ /* Created: 2023/02/06 14:28:38 by apommier #+# #+# */
/* Updated: 2023/02/09 13:19:51 by apommier ### ########.fr */ /* Updated: 2023/02/12 23:37:37 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -31,8 +31,9 @@ void NICK(std::string buffer, fdList &allFds, int userNbr)
allFds.userData[userNbr].nickname = splitBuff[1]; allFds.userData[userNbr].nickname = splitBuff[1];
if (!allFds.userData[userNbr].registered && !allFds.userData[userNbr].userName.empty()) if (!allFds.userData[userNbr].registered && !allFds.userData[userNbr].userName.empty())
{ {
allFds.userData[userNbr].registered = 1; connect_client(allFds, userNbr);
print_registered_msg(allFds, userNbr); // allFds.userData[userNbr].registered = 1;
// print_registered_msg(allFds, userNbr);
} }
return ; return ;

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:40:42 by apommier #+# #+# */ /* Created: 2023/02/06 14:40:42 by apommier #+# #+# */
/* Updated: 2023/02/09 13:20:00 by apommier ### ########.fr */ /* Updated: 2023/02/13 17:33:51 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -16,6 +16,12 @@ void PASS(std::string buffer, fdList &allFds, int userNbr)
{ {
std::string password; std::string password;
if (allFds.userData[userNbr].registered)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "462 * PASS :You may not reregister\n");
return ;
}
if (buffer.size() < 6)// ---PASS --- if (buffer.size() < 6)// ---PASS ---
{ {
cmd_error(allFds, allFds.userData[userNbr].fd, "461 * PASS :Not enough parameters\n"); cmd_error(allFds, allFds.userData[userNbr].fd, "461 * PASS :Not enough parameters\n");
@ -28,11 +34,7 @@ void PASS(std::string buffer, fdList &allFds, int userNbr)
// //write(allFds.userData[userNbr].fd, "ERR_NEEDMOREPARAMS", 18); // //write(allFds.userData[userNbr].fd, "ERR_NEEDMOREPARAMS", 18);
// return ; // return ;
// } // }
else if (allFds.userData[userNbr].registered)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "462 * PASS :You may not reregister\n");
return ;
}
password = buffer.substr(5, buffer.npos); password = buffer.substr(5, buffer.npos);
allFds.userData[userNbr].password = buffer; allFds.userData[userNbr].password = buffer;
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:40:39 by apommier #+# #+# */ /* Created: 2023/02/06 14:40:39 by apommier #+# #+# */
/* Updated: 2023/02/12 16:26:48 by apommier ### ########.fr */ /* Updated: 2023/02/13 20:05:39 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -17,32 +17,6 @@
//ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED //ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED
struct modeChan
{
bool o;
bool p;
bool s;
bool i;
bool t;
bool n;
bool m;
bool l;
bool b;
bool v;
bool k;
};
struct modeUser
{
bool i;
bool s;
bool w;
bool o;
};
void USER(std::string buffer, fdList &allFds, int userNbr) void USER(std::string buffer, fdList &allFds, int userNbr)
{ {
if (allFds.userData[userNbr].registered == 1) if (allFds.userData[userNbr].registered == 1)
@ -72,7 +46,8 @@ void USER(std::string buffer, fdList &allFds, int userNbr)
allFds.userData[userNbr].realName = realName; allFds.userData[userNbr].realName = realName;
if (!allFds.userData[userNbr].nickname.empty()) if (!allFds.userData[userNbr].nickname.empty())
{ {
allFds.userData[userNbr].registered = 1; connect_client(allFds, userNbr);
print_registered_msg(allFds, userNbr); // allFds.userData[userNbr].registered = 1;
// print_registered_msg(allFds, userNbr);
} }
} }

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/12 15:23:10 by apommier ### ########.fr */ /* Updated: 2023/02/13 17:45:33 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -16,11 +16,11 @@ 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 << "result in find chan = " << pastEnd - start << std::endl;
std::cout << "name2= ---" << 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++;

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/12 22:03:21 by apommier ### ########.fr */ /* Updated: 2023/02/13 20:21:28 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -69,17 +69,33 @@ int chan_check(fdList &allFds, int userNbr, int chanNbr, std::vector<std::string
return (1); return (1);
} }
void JOIN(std::string buffer, fdList &allFds, int userNbr) void JOIN(std::string buffer, fdList &allFds, int userNbr)
{ {
std::vector<std::string> splitBuff; std::vector<std::string> splitBuff;
int chanNbr; int chanNbr;
channelData joined_chan;
std::cout << "==========join start========\n"; std::cout << "==========join start========\n";
std::cout << "userNbr= " << userNbr << std::endl; std::cout << "userNbr= " << userNbr << std::endl;
if (!allFds.userData[userNbr].registered) if (!allFds.userData[userNbr].registered)
{ {
/*change error*/ /*change error*/
cmd_error(allFds, allFds.userData[userNbr].fd, "451 * JOIN :You have not regestered\n"); //ERR_NEEDMOREPARAMS cmd_error(allFds, allFds.userData[userNbr].fd, "451 * JOIN :You have not registered\n"); //ERR_NEEDMOREPARAMS
return ; return ;
} }
split(buffer, ' ', splitBuff); split(buffer, ' ', splitBuff);
@ -108,9 +124,7 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr)
allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList[chanNbr]); //add chan in user 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].userList.push_back(&allFds.userData[userNbr]);//add user in chan data
allFds.channelList[chanNbr].nbrUser++; allFds.channelList[chanNbr].nbrUser++;
//std::cout << "join2 nickname " << allFds.channelList.back().userList[0]->nickname << std::endl; joined_chan = *(allFds.userData[userNbr].joinedChan.back());
//std::cout << "join2 fd " << allFds.channelList.back().userList[0]->nickname << std::endl;
//message nickname joined the channel?
} }
else //chan doesn't exist yet else //chan doesn't exist yet
{ {
@ -121,11 +135,16 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr)
new_chan.nbrUser = 1; new_chan.nbrUser = 1;
new_chan.userList.push_back(&allFds.userData[userNbr]); new_chan.userList.push_back(&allFds.userData[userNbr]);
//new_chan.userList //new_chan.userList
joined_chan = new_chan;
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
//std::cout << "join nickname " << allFds.channelList[0].userList[0]->nickname << std::endl;
//std::cout << "join fd " << allFds.channelList[0].userList[0]->fd << std::endl;
//message nickname created the channel?
} }
for (int i = 0; i < joined_chan.nbrUser; i++)
{
std::string fullMsg;
fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " JOIN :" + joined_chan.name + "\n";
send(joined_chan.userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0);
std::cout << "loop here\n";
}
//send 352 and 315 or 353 and 366 (WHO or NAME)
} }

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/11 12:38:51 by apommier ### ########.fr */ /* Updated: 2023/02/13 20:28:11 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -18,6 +18,7 @@ void PRIVMSG(std::string buffer, fdList &allFds, int userNbr)
std::vector<std::string> splitBuff; std::vector<std::string> splitBuff;
std::string msg; std::string msg;
std::cout << "privmsg bufer= --" << buffer << std::endl;
split(buffer, ' ', splitBuff); split(buffer, ' ', splitBuff);
if (splitBuff.size() < 3) if (splitBuff.size() < 3)
{ {
@ -26,27 +27,36 @@ void PRIVMSG(std::string buffer, fdList &allFds, int userNbr)
return ; return ;
} }
for (size_t i = 2; i < splitBuff.size(); i++) // for (size_t i = 2; i < splitBuff.size(); i++)
{ // {
msg += (" " + splitBuff[i]); // msg += (" " + splitBuff[i]);
} // }
//msg = buffer.substr(buffer.find(':') + 1, std::string::npos);
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++)
{ {
send_msg(allFds, msg, dest[i], userNbr); // std::cout << "dest[i] =" << dest[i] << "|" << std::endl;
// std::cout << "dest[i] =" << dest[i] << "|" << std::endl;
// std::cout << "dest[i] =" << dest[i] << "|" << std::endl;
// std::cout << "chan =" << allFds.channelList[0].name << "|" << std::endl;
// std::cout << "chan =" << allFds.channelList[0].name << "|" << std::endl;
// std::cout << "chan =" << allFds.channelList[0].name << "|" << std::endl;
// std::cout << "result =" << (allFds.channelList[0].name == dest[i]) << "|" << std::endl;
send_msg(allFds, buffer, dest[i], userNbr);
} }
} }
void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr) void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr)
{ {
int fd; int pos;
//find dest //find dest
std::string fullMsg; std::string fullMsg;
fullMsg = "*" + allFds.userData[userNbr].nickname + "* " + msg; //fullMsg = "*" + allFds.userData[userNbr].nickname + "* " + msg;
fd = find_channel(allFds, dest); //return channel nbr pos = find_channel(allFds, dest); //return channel nbr
if (fd != -1) if (pos != -1)
{ {
//std::vector<clientData *>::iterator start = allFds.channelList[fd].userList.begin(); //std::vector<clientData *>::iterator start = allFds.channelList[fd].userList.begin();
//std::vector<clientData *>::iterator pastEnd = allFds.channelList[fd].userList.end(); //std::vector<clientData *>::iterator pastEnd = allFds.channelList[fd].userList.end();
@ -57,19 +67,23 @@ void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr)
// start++; // start++;
// std::cout << "loop here\n"; // std::cout << "loop here\n";
// } // }
for (size_t i = 0; i < allFds.channelList[fd].userList.size(); i++) for (size_t i = 0; i < allFds.channelList[pos].userList.size(); i++)
{ {
std::cout << "send nickname " << allFds.channelList[fd].userList[i]->nickname << std::endl; std::cout << "send nickname " << allFds.channelList[pos].userList[i]->nickname << std::endl;
ft_putstr_fd(allFds.channelList[fd].userList[i]->fd, fullMsg); //ft_putstr_fd(allFds.channelList[fd].userList[i]->fd, fullMsg);
fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@172.17.0.1 " + msg + "\n";
//:kinou2!kinou@172.17.0.1 PRIVMSG #test :cc
//send(allFds.channelList[pos].userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0);
send(allFds.channelList[pos].userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0);
std::cout << "loop here\n"; std::cout << "loop here\n";
} }
return ; return ;
} }
fd = find_user(allFds, dest); //return direct user fd pos = find_user(allFds, dest); //return direct user fd
if (fd != -1) if (pos != -1)
{ {
ft_putstr_fd(fd, fullMsg); ft_putstr_fd(pos, fullMsg);
return ; return ;
} }
std::cout << "error msg\n"; std::cout << "error msg\n";

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/10 15:46:10 by apommier #+# #+# */ /* Created: 2023/02/10 15:46:10 by apommier #+# #+# */
/* Updated: 2023/02/11 13:51:28 by apommier ### ########.fr */ /* Updated: 2023/02/13 18:22:37 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

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/12 17:30:37 by apommier ### ########.fr */ /* Updated: 2023/02/13 16:32:24 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -171,21 +171,15 @@ void KILL(std::string buffer, fdList &allFds, int userNbr)
return ; return ;
} }
void PING(std::string buffer, fdList &allFds, int userNbr) // void PING(std::string buffer, fdList &allFds, int userNbr)
{ // {
(void)buffer; // (void)buffer;
(void)allFds; // (void)allFds;
(void)userNbr; // (void)userNbr;
return ; // return ;
} // }
void PONG(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
return ;
}
void ERROR(std::string buffer, fdList &allFds, int userNbr) void ERROR(std::string buffer, fdList &allFds, int userNbr)
{ {

View File

@ -0,0 +1,64 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ping_pong.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/13 00:16:27 by apommier #+# #+# */
/* Updated: 2023/02/13 22:54:14 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 PONG(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
std::string msg;
std::vector<std::string> splitBuff;
split(buffer, ' ', splitBuff);
msg = ":irc.local PONG irc.local :irc.local";
// ":irc.local PONG irc.local :irc.local"
send(allFds.userData[userNbr].fd, msg.c_str(), msg.size(), 0);
// if (splitBuff.size() < 2)
// {
// cmd_error(allFds, allFds.userData[userNbr].fd, "431 * NICK :No nickname given\n");
// //write(allFds.userData[user].fd, "ERR_NEEDMOREPARAMS", 18);
// return ;
// }
return ;
}
void PING(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
std::string msg;
std::vector<std::string> splitBuff;
split(buffer, ' ', splitBuff);
msg = ":irc.local PONG irc.local :irc.local";
send(allFds.userData[userNbr].fd, msg.c_str(), msg.size(), 0);
// if (splitBuff.size() < 2)
// {
// cmd_error(allFds, allFds.userData[userNbr].fd, "431 * NICK :No nickname given\n");
// //write(allFds.userData[user].fd, "ERR_NEEDMOREPARAMS", 18);
// return ;
// }
return ;
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 22:01:25 by apommier #+# #+# */ /* Created: 2022/12/06 22:01:25 by apommier #+# #+# */
/* Updated: 2023/02/12 16:19:20 by apommier ### ########.fr */ /* Updated: 2023/02/13 19:44:43 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -25,6 +25,17 @@ void parse_commands(std::string buffer, fdList &allFds, int userNbr)
std::vector<std::string> splitBuff; std::vector<std::string> splitBuff;
int a = 0; int a = 0;
if (buffer.find(13) != std::string::npos) //change that pls
{
std::cout << "pos of bitch= " << buffer.find(13) << std::endl;
std::cout << "size= " << buffer.size() << std::endl;
if (buffer.find(13) != buffer.size() - 2)
std::cout << "BE CAREFUL CHAR 10 (line feed) not at end\n";
buffer.erase(buffer.find(13), 1);
}
allFds.userData[userNbr].cmdBuffer += buffer; allFds.userData[userNbr].cmdBuffer += buffer;
if (allFds.userData[userNbr].cmdBuffer.find('\n') == std::string::npos) if (allFds.userData[userNbr].cmdBuffer.find('\n') == std::string::npos)
return ; return ;
@ -39,8 +50,6 @@ void parse_commands(std::string buffer, fdList &allFds, int userNbr)
std::cout << "Command not found\n"; std::cout << "Command not found\n";
else else
{ {
//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](allFds.userData[userNbr].cmdBuffer, allFds, userNbr);
//allFds.parsingTab.cmdPtr[a] //allFds.parsingTab.cmdPtr[a]
//JOIN(allFds.userData[userNbr].cmdBuffer, allFds, userNbr); //JOIN(allFds.userData[userNbr].cmdBuffer, allFds, userNbr);

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/12 20:38:50 by apommier #+# #+# */ /* Created: 2023/02/12 20:38:50 by apommier #+# #+# */
/* Updated: 2023/02/12 20:39:10 by apommier ### ########.fr */ /* Updated: 2023/02/13 20:25:45 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -18,6 +18,7 @@ void del_user_in_chan(clientData *user, channelData *chan)
for (i = 0; user != chan->userList[i]; i++) for (i = 0; user != chan->userList[i]; i++)
; ;
chan->userList.erase(chan->userList.begin() + i); chan->userList.erase(chan->userList.begin() + i);
chan->nbrUser--;
} }
void delete_user(fdList &allFds, int userNbr) void delete_user(fdList &allFds, int userNbr)

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/01 17:27:33 by apommier #+# #+# */ /* Created: 2022/12/01 17:27:33 by apommier #+# #+# */
/* Updated: 2023/02/09 14:39:07 by apommier ### ########.fr */ /* Updated: 2023/02/12 22:35:11 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -15,7 +15,11 @@
int main(int ac, char **av) int main(int ac, char **av)
{ {
if (!(ac == 3 || ac == 2)) if (!(ac == 3 || ac == 2))
ft_error("wrong number of arguments\nFORMAT: ./ircserv <port> <password>"); {
//ft_error("wrong number of arguments\nFORMAT: ./ircserv <port> <password>");
std::cout << "wrong number of arguments\nFORMAT: ./ircserv <port> <password>\n";
exit(1);
}
std::cout << "============Homemade IRC Server start============" << std::endl; std::cout << "============Homemade IRC Server start============" << std::endl;
// try // try
// { // {

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/09 22:26:27 by apommier #+# #+# */ /* Created: 2022/12/09 22:26:27 by apommier #+# #+# */
/* Updated: 2023/02/12 21:42:07 by apommier ### ########.fr */ /* Updated: 2023/02/13 19:46:41 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -44,7 +44,9 @@ void new_connection(fdList &allFds)
clientData newElement; clientData newElement;
newElement.fd = newFd; newElement.fd = newFd;
newElement.op = 0; newElement.addr = addr;
newElement.ip = inet_ntoa(addr.sin_addr);
//newElement.op = 0;
allFds.userData.push_back(newElement); allFds.userData.push_back(newElement);
//allFds.userData[allFds.nbrUser].fd = allFds.userList[allFds.nbrUser]; //allFds.userData[allFds.nbrUser].fd = allFds.userList[allFds.nbrUser];
//std::cout << "newConnection | user in data fd = " << allFds.userData[allFds.nbrUser].fd << std::endl; //std::cout << "newConnection | user in data fd = " << allFds.userData[allFds.nbrUser].fd << std::endl;

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:58:13 by apommier #+# #+# */ /* Created: 2022/12/06 21:58:13 by apommier #+# #+# */
/* Updated: 2023/02/12 14:21:04 by apommier ### ########.fr */ /* Updated: 2023/02/13 16:47:16 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -26,10 +26,11 @@ void start_loop(fdList &allFds)
std::cout << "serverFd: " << allFds.serverFd << std::endl; std::cout << "serverFd: " << allFds.serverFd << std::endl;
while (allFds.alive) while (allFds.alive)
{ {
//std::cout << "loop" << std::endl;
//std::cout << "\n\n\nwhile alive event loop" << std::endl; //std::cout << "\n\n\nwhile alive event loop" << std::endl;
//std::cout << "in loop nbr user = " << allFds.nbrUser << std::endl; //std::cout << "in loop nbr user = " << allFds.nbrUser << std::endl;
eventNbr = epoll_wait(allFds.epollFd, allFds.events, MAX_EVENTS, 5000); eventNbr = epoll_wait(allFds.epollFd, allFds.events, MAX_EVENTS, 5000);
//std::cout << "eventNbr = " << eventNbr << std::endl;
//std::cout << "eventNbr: " << eventNbr << std::endl; //std::cout << "eventNbr: " << eventNbr << std::endl;
//std::cout << "in loop adress " << &allFds << std::endl; //std::cout << "in loop adress " << &allFds << std::endl;
for (i = 0; i < eventNbr ; i++) for (i = 0; i < eventNbr ; i++)

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:44:20 by apommier #+# #+# */ /* Created: 2022/12/06 21:44:20 by apommier #+# #+# */
/* Updated: 2023/02/12 15:00:19 by apommier ### ########.fr */ /* Updated: 2023/02/13 00:04:55 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -46,7 +46,7 @@ void initialize(char **av)
ft_error("wrong format for <port>\nneed to be an positive integer"); ft_error("wrong format for <port>\nneed to be an positive integer");
if (bind(allFds.serverFd, (struct sockaddr *)&addr, sizeof(addr)) < 0) if (bind(allFds.serverFd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
ft_error("bind() error"); ft_error("bind() error");
if (listen(allFds.serverFd, 100) == -1) if (listen(allFds.serverFd, 10) == -1)
ft_error("listen() error"); ft_error("listen() error");
// newSockFd = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen); // newSockFd = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen);

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/12 20:52:45 by apommier ### ########.fr */ /* Updated: 2023/02/13 10:52:07 by apommier ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -17,7 +17,7 @@ void ft_error(std::string str)
std::cerr << str << std::endl; std::cerr << str << std::endl;
if (errno) if (errno)
{ {
std::cerr << "errno: " << strerror(errno); std::cerr << "errno: " << strerror(errno) << std::endl;
exit(errno); exit(errno);
} }
exit(1); exit(1);
@ -31,20 +31,24 @@ void close_fd(int fd)
void ft_putstr_fd(int fd, std::string str) void ft_putstr_fd(int fd, std::string str)
{ {
write(fd, str.c_str(), str.size()); // write(fd, str.c_str(), str.size());
write(fd, "\n", 1); // write(fd, "\n", 1);
str += "\n";
send(fd, str.c_str(), str.size(), 0);
} }
void cmd_error(fdList &allFds, int fd, std::string error) void cmd_error(fdList &allFds, int fd, std::string error)
{ {
(void)allFds; //to delete (void)allFds; //to delete
write(fd, ":irc.local ", 11); error = ":irc.local " + error;
write(fd, error.c_str(), error.size()); //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] != -1; i++) for (int i = 0; toFind[i] != 0; i++)
{ {
if (str.find(toFind[i]) != std::string::npos) if (str.find(toFind[i]) != std::string::npos)
return (1); return (1);
@ -52,6 +56,16 @@ int contain_any(std::string str, std::string toFind)
return (0); return (0);
} }
int not_contain_other(std::string str, std::string toFind)
{
for (int i = 0; str[i] != 0; i++)
{
if (toFind.find(str[i]) == std::string::npos)
return (0);
}
return (1);
}
// void find_user_in_chan(fdList &allFds, channelData *chan) // void find_user_in_chan(fdList &allFds, channelData *chan)
// { // {