Merge branch 'apommier' into sadjigui

This commit is contained in:
PrStein 2023-02-15 17:21:17 +01:00
commit e3ac028167
22 changed files with 505 additions and 241 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/13 00:20:18 by apommier ### ########.fr #
# Updated: 2023/02/14 22:21:45 by apommier ### ########.fr #
# #
# **************************************************************************** #
@ -32,9 +32,9 @@ SRCS := main.cpp\
commands/channel/channel_utils.cpp\
commands/channel/join.cpp\
commands/channel/privmsg.cpp\
commands/channel/notice.cpp\
\
commands/other/quit.cpp\
commands/other/squit.cpp\
commands/other/ping_pong.cpp\
\
commands/channel_op/invite.cpp\
@ -42,6 +42,7 @@ SRCS := main.cpp\
commands/channel_op/mode.cpp\
commands/channel_op/topic.cpp\
\
commands/operator/squit.cpp\
commands/operator/oper.cpp\
\
commands/not_done_cmd.cpp #special (temporary)

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/01 17:27:37 by apommier #+# #+# */
/* Updated: 2023/02/13 19:48:40 by apommier ### ########.fr */
/* Updated: 2023/02/15 00:16:02 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,6 +18,9 @@
#include <arpa/inet.h>
#include <cstdlib>
#include <exception>
#include <ctime>
#include <cstring> //std::string
#include <cerrno> //errno
#include <iostream> //std::cout | cerr
@ -37,6 +40,14 @@
#define READ_SIZE 10
#define CMD_NBR 10
// if (!allFds.userData[userNbr].registered)
// {
// /*change error*/
// cmd_error(allFds, allFds.userData[userNbr].fd, "451 * JOIN :You have not registered\n"); //ERR_NEEDMOREPARAMS
// return ;
// }
/* ************************************************************************** */
/* *********************************STRUCT*********************************** */
/* ************************************************************************** */
@ -139,7 +150,8 @@ struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY
accessList<clientData> userData;
int alive;
std::string password;
std::string creation_date;
int nbrUser;
functionTab parsingTab;
};
@ -185,6 +197,7 @@ void split_but_keep(std::string const &str, const char delim, std::vector<std::s
/* *******************************CHAN UTILS********************************* */
/* ************************************************************************** */
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);
void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr); //in privmsg.cpp

View File

@ -6,50 +6,13 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/07 14:45:45 by apommier #+# #+# */
/* Updated: 2023/02/13 12:54:35 by apommier ### ########.fr */
/* Updated: 2023/02/15 00:14:50 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
void print_registered_msg(fdList &allFds, int userNbr)
{
(void)allFds;
(void)userNbr;
std::string msg;
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";
send(allFds.userData[userNbr].fd, msg.c_str(), msg.size(), 0);
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)
// {

View File

@ -6,18 +6,63 @@
/* 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 */
/* Updated: 2023/02/15 00:15:32 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
void print_registered_msg(fdList &allFds, int userNbr)
{
(void)allFds;
(void)userNbr;
std::string msg;
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";
send(allFds.userData[userNbr].fd, msg.c_str(), msg.size(), 0);
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 " + allFds.creation_date + "\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 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");
if (allFds.userData[userNbr].password.empty() || allFds.userData[userNbr].password != allFds.password)
{
std::cout << "password= " << allFds.userData[userNbr].password << std::endl;
cmd_error(allFds, allFds.userData[userNbr].fd, "464 * :Password incorrect\n");
return ;
}
//464 ERR_PASSWDMISMATCH
//":Password incorrect"
allFds.userData[userNbr].registered = 1;
print_registered_msg(allFds, userNbr);

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:28:38 by apommier #+# #+# */
/* Updated: 2023/02/12 23:37:37 by apommier ### ########.fr */
/* Updated: 2023/02/15 15:41:43 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -23,13 +23,22 @@ void NICK(std::string buffer, fdList &allFds, int userNbr)
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 ;
}
if (!not_contain_other(splitBuff[1], "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`|^_-{}[]\\"))
{
cmd_error(allFds, allFds.userData[userNbr].fd, "432 * " + splitBuff[1] + " :Erroneous nickname\n");
return ;
}
if (find_user(allFds, splitBuff[1]) != -1)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "433 * " + splitBuff[1] + " :Nickname is already in use\n");
return ;
}
//if nickname ok then (another user has it? )
//ERR_NONICKNAMEGIVEN
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].password.empty()*/)
{
connect_client(allFds, userNbr);
// allFds.userData[userNbr].registered = 1;

View File

@ -6,27 +6,29 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:40:42 by apommier #+# #+# */
/* Updated: 2023/02/13 17:33:51 by apommier ### ########.fr */
/* Updated: 2023/02/15 15:42:16 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
void PASS(std::string buffer, fdList &allFds, int userNbr)
{
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 ---
{
cmd_error(allFds, allFds.userData[userNbr].fd, "461 * PASS :Not enough parameters\n");
return ;
}
if (allFds.userData[userNbr].registered)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "462 * PASS :You may not reregister\n");
return ;
}
// if (splitBuff.size() != 2)
// {
@ -36,5 +38,12 @@ void PASS(std::string buffer, fdList &allFds, int userNbr)
// }
password = buffer.substr(5, buffer.npos);
allFds.userData[userNbr].password = buffer;
allFds.userData[userNbr].password = password;
if (!allFds.userData[userNbr].userName.empty() && !allFds.userData[userNbr].nickname.empty())
{
connect_client(allFds, userNbr);
// allFds.userData[userNbr].registered = 1;
// print_registered_msg(allFds, userNbr);
}
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:40:39 by apommier #+# #+# */
/* Updated: 2023/02/13 20:05:39 by apommier ### ########.fr */
/* Updated: 2023/02/14 01:25:22 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -44,7 +44,7 @@ void USER(std::string buffer, fdList &allFds, int userNbr)
allFds.userData[userNbr].serverName = splitBuff[3];
allFds.userData[userNbr].realName = realName;
if (!allFds.userData[userNbr].nickname.empty())
if (!allFds.userData[userNbr].nickname.empty() /*&& !allFds.userData[userNbr].password.empty()*/)
{
connect_client(allFds, userNbr);
// allFds.userData[userNbr].registered = 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/13 17:45:33 by apommier ### ########.fr */
/* Updated: 2023/02/14 20:13:38 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
int is_joined(fdList &allFds, std::string chanName, int userNbr)
{
std::vector<channelData*>::iterator start = allFds.userData[userNbr].joinedChan.begin();
std::vector<channelData*>::iterator pastEnd = allFds.userData[userNbr].joinedChan.end();
//std::cout << "name1= ---" << chanName << "---\n";
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";
if (allFds.userData[userNbr].joinedChan[pastEnd - start - 1]->name == chanName)
return (pastEnd - start - 1);
start++;
}
std::cout << "chan not found\n";
return (-1);
}
int find_channel(fdList &allFds, std::string chanName)//return channel nbr
{
std::_List_iterator<channelData> start = allFds.channelList.begin();
@ -39,7 +56,7 @@ int find_user(fdList &allFds, std::string userName)//return direct user fd
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);
return (pastEnd - start - 1);
start++;
}
std::cout << "user not found\n";

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/09 15:40:33 by apommier #+# #+# */
/* Updated: 2023/02/13 20:21:28 by apommier ### ########.fr */
/* Updated: 2023/02/14 14:50:57 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,7 +18,7 @@
// 1459
// ERR_NEEDMOREPARAMS + ERR_BANNEDFROMCHAN
// ERR_INVITEONLYCHAN + ERR_BADCHANNELKEY
// ERR_CHANNELISFULL x ERR_BADCHANMASK ?
// ERR_CHANNELISFULL x ERR_BADCHANMASK ? +
// ERR_NOSUCHCHANNEL x ERR_TOOMANYCHANNELS x
// RPL_TOPIC
@ -74,48 +74,11 @@ int chan_check(fdList &allFds, int userNbr, int chanNbr, std::vector<std::string
void JOIN(std::string buffer, fdList &allFds, int userNbr)
void join_or_create(std::vector<std::string> splitBuff, fdList &allFds, int userNbr)
{
std::vector<std::string> splitBuff;
int chanNbr;
channelData joined_chan;
std::cout << "==========join start========\n";
std::cout << "userNbr= " << userNbr << std::endl;
if (!allFds.userData[userNbr].registered)
{
/*change error*/
cmd_error(allFds, allFds.userData[userNbr].fd, "451 * JOIN :You have not registered\n"); //ERR_NEEDMOREPARAMS
return ;
}
split(buffer, ' ', splitBuff);
if (splitBuff.size() < 2)
{
/*change error*/
cmd_error(allFds, allFds.userData[userNbr].fd, "461 * JOIN :Not enough parameters\n"); //ERR_NEEDMOREPARAMS
return ;
}
//if (splitBuff[1].find(' ') != std::string::npos || splitBuff[1].find(7) != std::string::npos)
if (splitBuff[1][0] != '#' && splitBuff[1][0] != '&')
{
//leave_all(allFds, userNbr);
return ;
}
if (splitBuff[1] == "0")
{
leave_all(allFds, userNbr);
return ;
}
chanNbr = find_channel(allFds, splitBuff[1]);
if (chanNbr != -1) //chan already exist
{
@ -146,5 +109,54 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr)
send(joined_chan.userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0);
std::cout << "loop here\n";
}
// if (chanNbr == -1)
// {
// }
}
void JOIN(std::string buffer, fdList &allFds, int userNbr)
{
std::vector<std::string> splitBuff;
std::string msg;
std::cout << "==========join start========\n";
std::cout << "userNbr= " << userNbr << std::endl;
if (!allFds.userData[userNbr].registered)
{
/*change error*/
cmd_error(allFds, allFds.userData[userNbr].fd, "451 * JOIN :You have not registered\n"); //ERR_NEEDMOREPARAMS
return ;
}
split(buffer, ' ', splitBuff);
if (splitBuff.size() < 2)
{
/*change error*/
cmd_error(allFds, allFds.userData[userNbr].fd, "461 * JOIN :Not enough parameters\n"); //ERR_NEEDMOREPARAMS
return ;
}
//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

@ -0,0 +1,70 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* notice.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/14 21:24:55 by apommier #+# #+# */
/* Updated: 2023/02/14 21:35:45 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
// Commande: PRIVMSG
// Paramètres: <destinataire>{,<destinataire>} <texte à envoyer >
// ERR_NORECIPIENT ERR_NOTEXTTOSEND +
// ERR_CANNOTSENDTOCHAN ERR_NOTOPLEVEL
// ERR_WILDTOPLEVEL ERR_TOOMANYTARGETS
// ERR_NOSUCHNICK +
// RPL_AWAY
void send_notice_msg(fdList &allFds, std::string msg, std::string dest, int userNbr)
{
int pos;
std::string fullMsg;
fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@172.17.0.1 " + msg + "\n";
if (dest[0] == '&' || dest[0] == '#')
{
if (is_joined(allFds, dest, userNbr) == -1)
return ;
if ((pos = find_channel(allFds, dest)) == -1)
return ;
for (size_t i = 0; i < allFds.channelList[pos].userList.size(); i++)
{
std::cout << "send nickname " << allFds.channelList[pos].userList[i]->nickname << std::endl;
if (i != (size_t)userNbr)
send(allFds.channelList[pos].userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0);
std::cout << "loop here\n";
}
return ;
}
pos = find_user(allFds, dest); //return direct user fd
if (pos != -1)
{
send(allFds.userData[pos].fd, fullMsg.c_str(), fullMsg.size(), 0);
return ;
}
}
void NOTICE(std::string buffer, fdList &allFds, int userNbr)
{
std::vector<std::string> splitBuff;
std::string msg;
std::cout << "notice bufer= --" << buffer << std::endl;
split(buffer, ' ', splitBuff);
if (splitBuff.size() < 2)
return ;
if (splitBuff.size() < 3)
return ;
std::cout << "notice =" << msg << std::endl;
std::vector<std::string> dest;
split(splitBuff[1], ',', dest);
for (size_t i = 0; i < dest.size(); i++)
send_notice_msg(allFds, buffer, dest[i], userNbr);
}

View File

@ -6,12 +6,19 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 08:53:03 by apommier #+# #+# */
/* Updated: 2023/02/13 20:28:11 by apommier ### ########.fr */
/* Updated: 2023/02/15 15:18:38 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
// Commande: PRIVMSG
// Paramètres: <destinataire>{,<destinataire>} <texte à envoyer >
// ERR_NORECIPIENT ERR_NOTEXTTOSEND +
// ERR_CANNOTSENDTOCHAN ERR_NOTOPLEVEL
// ERR_WILDTOPLEVEL ERR_TOOMANYTARGETS
// ERR_NOSUCHNICK +
// RPL_AWAY
void PRIVMSG(std::string buffer, fdList &allFds, int userNbr)
{
@ -20,72 +27,55 @@ void PRIVMSG(std::string buffer, fdList &allFds, int userNbr)
std::cout << "privmsg bufer= --" << buffer << std::endl;
split(buffer, ' ', splitBuff);
if (splitBuff.size() < 3)
if (splitBuff.size() < 2)
{
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]);
// }
//msg = buffer.substr(buffer.find(':') + 1, std::string::npos);
if (splitBuff.size() < 3)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "412 * PRIVMSG :No text to send\n");
return ;
}
std::cout << "privmsg =" << msg << std::endl;
std::vector<std::string> dest;
split(splitBuff[1], ',', dest);
for (size_t i = 0; i < dest.size(); i++)
{
// 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)
{
int pos;
//find dest
std::string fullMsg;
//fullMsg = "*" + allFds.userData[userNbr].nickname + "* " + msg;
pos = find_channel(allFds, dest); //return channel nbr
if (pos != -1)
fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@172.17.0.1 " + msg + "\n";
if (dest[0] == '&' || dest[0] == '#')
{
//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";
// }
if (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 ((pos = find_channel(allFds, dest)) == -1)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/channel\n");
return ;
}
for (size_t i = 0; i < allFds.channelList[pos].userList.size(); i++)
{
std::cout << "send nickname " << allFds.channelList[pos].userList[i]->nickname << std::endl;
//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);
if (i != (size_t)userNbr)
send(allFds.channelList[pos].userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0);
std::cout << "loop here\n";
}
return ;
}
pos = find_user(allFds, dest); //return direct user fd
if (pos != -1)
{
ft_putstr_fd(pos, fullMsg);
cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/channel\n");
return ;
}
std::cout << "error msg\n";
//ft_putstr_fd(fd, msg);
send(allFds.userData[pos].fd, fullMsg.c_str(), fullMsg.size(), 0);
}

View File

@ -3,10 +3,10 @@
/* ::: :::::::: */
/* mode.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: sadjigui <sadjigui@student.42.fr> +#+ +:+ +#+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 19:19:30 by apommier #+# #+# */
/* Updated: 2023/02/13 00:23:55 by sadjigui ### ########.fr */
/* Updated: 2023/02/14 23:28:49 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -15,7 +15,7 @@
int search_and_erase(std::string &str, std::string toFind)
{
// std::vector<string>::iterator i = str.begin;
int i = 0;
int i = 1; //1 instead of 0 to skip +/-
while (str[i] != 0)
{
if (toFind.find(str[i]) == std::string::npos)
@ -23,73 +23,130 @@ int search_and_erase(std::string &str, std::string toFind)
else
i++;
}
std::cout << "splitbuff[2]after? = " << str << std::endl;
return 1;
}
void verify_option(fdList &allFds, std::string str, int i)
void do_chan_option(fdList &allFds, int userNbr, std::string opt /*, channel (string or direct reference or pointer but no copy)*/)
{
(void)allFds;
(void)i;
(void)str;
std::string find = "opsitnmlbvk";
std::cout << "1 str = "<< str << std::endl;
search_and_erase(str, find);
std::cout << "2 str = "<< str << std::endl;
use_option(allFds, str, )
(void)userNbr;
for (int i = 0; opt[i]; i++)
{
//call option
//switch ? if forest? map container ? 2 tab (name and function pointer) ?
// opt_i(int signe (= ou -), channel, user);
}
return;
}
// int look_for_channel(fdList &allFds, std::string str)
// {
// if (allFds.chanelList[chanNbr.mode.k])
// {
// if (splitBuff.size() < 3 || allFdschannelList[chanNbr].password != splitBuff[2])
// {
// errorStr ="475* JOIN" + allFds.channelList[chanNbr].name+" :Cannot join channel(+k)\n";
// cmd_error(allFds, allFds.userData[userNbr].fd, errorStr);
// }
// return 0;
// }
// }
void do_user_option(fdList &allFds, int userNbr, std::string opt)
{
(void)allFds;
(void)userNbr;
for (int i = 0; opt[i]; i++)
{
//call option
//switch ? if forest? map container ? 2 tab (name and function pointer) ?
// opt_i(int signe (= ou -), user);
}
return;
}
void MODE(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
int i = 1;
std::vector<std::string> splitBuff;
std::cout << "---------------->" << std::endl;
split(buffer, ' ', splitBuff);
std::vector<std::string>::iterator ptr = splitBuff.begin();
std::cout << "-------->" << splitBuff.size() << std::endl;
if (splitBuff.size() != 6)
if (splitBuff.size() < 3)
{
std::cout << "ERR_NEEDMOREPARAMS" << std::endl;
return ;
}
ptr++;
std::string str = *ptr;
if (str[0] == '#' || str[0] == '&')
//check if user is op? else error
//check if (splitBuff[2][0] == +/-) //splitbuff[2] always equal to {[+|-]|o|p|s|i|t|n|b|v}
//else ??? erreur j'imagine mais j'ai pas trouvé
if (splitBuff[1][0] == '#' || splitBuff[1][0] == '&') //splitbuff[1] always equal to <channel> or <nickname>
{
std::string cmd = str.substr(1, str.npos);
std::cout << "test = "<< str << std::endl;
if (find_channel(allFds, cmd) < 0)
std::cout << "Channel " << cmd <<" Not found" << std::endl;
while (ptr != splitBuff.end())
if (find_channel(allFds, splitBuff[1]) == -1) //if true chan doesn't exist
{
std::string str = *ptr;
if (str[0] == '#' || str[0] == '&')
{
// if (find_channel(allFds, str+1))
std::cout << "test = "<< str << std::endl;
std::cout << "chan doesn't exist" << std::endl;
// 403 ERR_NOSUCHCHANNEL
// "<nom de canal> :No such channel"
return ;
}//else
//verify_option(allFds, str, i); //needed?
}
verify_option(allFds, str, i);
ptr++;
i++;
}
}
std::cout << "splitbuff[2] = " << splitBuff[2] << std::endl;
search_and_erase(splitBuff[2], "opsitnmlbvk");
std::cout << "splitbuff[2] after = " << splitBuff[2] << std::endl;
//do_option one by one here (do_chan_opt)?
return ;
}
else if ((find_user(allFds, splitBuff[1]) == -1))
{
std::cout << "user doesn't exist" << std::endl;
// 401 ERR_NOSUCHNICK
// "<pseudonyme> :No such nick/channel"
return ;
}
search_and_erase(splitBuff[2], "iwso");
//do_option one by one here (do_user_opt)?
}
// void verify_option(fdList &allFds, std::string str, int i)
// {
// (void)allFds;
// (void)i;
// (void)str;
// std::string find = "opsitnmlbvk";
// std::cout << "1 str = "<< str << std::endl;
// search_and_erase(str, find);
// std::cout << "2 str = "<< str << std::endl;
// //use_option(allFds, str, )
// }
// void MODE(std::string buffer, fdList &allFds, int userNbr)
// {
// (void)buffer;
// (void)allFds;
// (void)userNbr;
// int i = 1;
// std::vector<std::string> splitBuff;
// std::cout << "---------------->" << std::endl;
// split(buffer, ' ', splitBuff);
// std::vector<std::string>::iterator ptr = splitBuff.begin();
// std::cout << "-------->" << splitBuff.size() << std::endl;
// if (splitBuff.size() != 6)
// {
// std::cout << "ERR_NEEDMOREPARAMS" << std::endl;
// return ;
// }
// ptr++;
// std::string str = *ptr; /*std::string str = splitBuff[1]; ⚠️ */ /*STR sert a rien |*ptr = str|*/
// if (str[0] == '#' || str[0] == '&')
// {
// std::string cmd = str.substr(1, str.npos); //std::string cmd = (*ptr).substr(1, str.npos); //Not needed? need full channel's name with # or &
// std::cout << "test = "<< str << std::endl; //std::cout << "test = "<< *ptr << std::endl;
// if (find_channel(allFds, cmd) < 0) //find_channel(allFds, cmd)
// std::cout << "Channel " << cmd <<" Not found" << std::endl;
// while (ptr != splitBuff.end())
// {
// std::string str = *ptr;
// if (str[0] == '#' || str[0] == '&')
// {
// // if (find_channel(allFds, str+1))
// std::cout << "test = "<< str << std::endl;
// }
// verify_option(allFds, str, i);
// ptr++;
// i++;
// }
// }
// 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/13 16:32:24 by apommier ### ########.fr */
/* Updated: 2023/02/14 21:28:14 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -131,13 +131,13 @@ void INFO(std::string buffer, fdList &allFds, int userNbr)
// return ;
// }
void NOTICE(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
return ;
}
// void NOTICE(std::string buffer, fdList &allFds, int userNbr)
// {
// (void)buffer;
// (void)allFds;
// (void)userNbr;
// return ;
// }
void WHO(std::string buffer, fdList &allFds, int userNbr)
{

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 19:04:47 by apommier #+# #+# */
/* Updated: 2023/02/11 20:04:53 by apommier ### ########.fr */
/* Updated: 2023/02/15 15:23:13 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -14,11 +14,28 @@
void OPER(std::string buffer, fdList &allFds, int userNbr)
{
int pos;
std::vector<std::string> splitBuff;
std::string msg;
split(buffer, ' ', splitBuff);
if (splitBuff.size() < 2)
if (splitBuff.size() < 3)
{
/*change error*/cmd_error(allFds, allFds.userData[userNbr].fd, "431 * OPER :No nickname given\n");
cmd_error(allFds, allFds.userData[userNbr].fd, "461 * OPER :Not enough parameters\n");
return ;
}
if (splitBuff[2] != allFds.password)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "464 * :Password incorrect\n");
return ;
}
pos = find_user(allFds, splitBuff[1]); //return direct user fd
if (pos != -1)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "401 * SQUIT " + splitBuff[1] + " :No such nick/channel\n");
return ;
}
allFds.userData[pos].op = 1;
msg = "381 * " + allFds.userData[pos].nickname + " :You are now an IRC operator\n";
send(allFds.userData[pos].fd, msg.c_str(), msg.size(), 0);
}

View File

@ -6,24 +6,44 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 19:11:03 by apommier #+# #+# */
/* Updated: 2023/02/12 14:23:39 by apommier ### ########.fr */
/* Updated: 2023/02/15 15:10:43 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
//ERR_NOPRIVILEGES ERR_NOSUCHSERVER
void SQUIT(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
if (allFds.userData[userNbr].op)
allFds.alive = 0;
else
std::vector<std::string> splitBuff;
split(buffer, ' ', splitBuff);
if (splitBuff.size() < 2)
{
std::cout << "Not op but okay i'll do it\n";
allFds.alive = 0;
}
cmd_error(allFds, allFds.userData[userNbr].fd, "431 * SQUIT :Not enought argument\n");
return ;
}
if (!allFds.userData[userNbr].op)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "481 * :Permission Denied- You're not an IRC operator\n");
return ;
}
if (splitBuff[2] != "irc.local")
{
cmd_error(allFds, allFds.userData[userNbr].fd, "402 * " + splitBuff[2] + " :No such server\n");
return ;
}
allFds.alive = 0;
// if (allFds.userData[userNbr].op)
// allFds.alive = 0;
// else
// {
// std::cout << "Not op but okay i'll do it\n";
// allFds.alive = 0;
// }
return ;
}

View File

@ -6,7 +6,7 @@
/* 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 */
/* Updated: 2023/02/14 14:27:53 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -51,8 +51,13 @@ void PING(std::string buffer, fdList &allFds, int userNbr)
std::string msg;
std::vector<std::string> splitBuff;
split(buffer, ' ', splitBuff);
msg = ":irc.local PONG irc.local :irc.local";
msg = ":irc.local PONG irc.local :" + splitBuff[1] + "\n";
//msg = "PONG irc.local " + splitBuff[1];
send(allFds.userData[userNbr].fd, msg.c_str(), msg.size(), 0);
std::cout << "pong send\n";
std::cout << "/r = " << (int)'\r' << "\n";
std::cout << "/n = " << (int)'\n' << "\n";
std::cout << "msg=" << msg << "\n";
// if (splitBuff.size() < 2)
// {
// cmd_error(allFds, allFds.userData[userNbr].fd, "431 * NICK :No nickname given\n");

View File

@ -6,20 +6,49 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 19:10:26 by apommier #+# #+# */
/* Updated: 2023/02/12 14:09:33 by apommier ### ########.fr */
/* Updated: 2023/02/15 13:27:15 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
void send_quit_msg(fdList &allFds, int userNbr, std::string msg)
{
std::string fullMsg;
// if (msg.empty())
// fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " QUIT :" + joined_chan.name + "\n";
// else
fullMsg = ":" + allFds.userData[userNbr].nickname + "!" + allFds.userData[userNbr].userName + "@" + allFds.userData[userNbr].ip + " QUIT :" + msg + "\n";
for (size_t i = 0; i < allFds.userData[userNbr].joinedChan.size(); i++)
{
//allFds.userData[userNbr].joinedChan[i]->
//send(joined_chan.userList[i]->fd, fullMsg.c_str(), fullMsg.size(), 0);
for (size_t j = 0; j < allFds.userData[userNbr].joinedChan[i]->userList.size(); j++)
{
//std::cout << "send nickname " << allFds.userData[userNbr].joinedChan[i]->userList[j]->nickname << std::endl;
if (allFds.userData[userNbr].joinedChan[i]->userList[j] != &allFds.userData[userNbr])
send(allFds.userData[userNbr].joinedChan[i]->userList[j]->fd, fullMsg.c_str(), fullMsg.size(), 0);
else
std::cout << "hehe je quitte\n";
std::cout << "loop here\n";
}
}
}
void QUIT(std::string buffer, fdList &allFds, int userNbr)
{
std::vector<std::string> splitBuff;
split(buffer, ' ', splitBuff);
if (splitBuff.size() == 2)
{
send_quit_msg(allFds, userNbr, splitBuff[2]);
//print message?
//:kinou2!kinou@172.17.0.1 QUIT :Quit: leaving
}
else
send_quit_msg(allFds, userNbr, allFds.userData[userNbr].nickname);
delete_user(allFds, userNbr);
return ;
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 22:01:25 by apommier #+# #+# */
/* Updated: 2023/02/13 19:44:43 by apommier ### ########.fr */
/* Updated: 2023/02/14 01:16:34 by apommier ### ########.fr */
/* */
/* ************************************************************************** */

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/01 17:27:33 by apommier #+# #+# */
/* Updated: 2023/02/12 22:35:11 by apommier ### ########.fr */
/* Updated: 2023/02/14 03:00:42 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -14,21 +14,20 @@
int main(int ac, char **av)
{
if (!(ac == 3 || ac == 2))
if (!(ac == 3))
{
//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;
// try
// {
// initialize(av);
// }
// catch
// {
// }
try
{
initialize(av);
}
catch(std::exception &e)
{
std::cout << "Fatal error causing the end of the program :/\n";
}
return (0);
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:58:13 by apommier #+# #+# */
/* Updated: 2023/02/13 16:47:16 by apommier ### ########.fr */
/* Updated: 2023/02/14 18:11:44 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -23,13 +23,17 @@ void start_loop(fdList &allFds)
allFds.alive = 1;
std::cout << "serverFd: " << allFds.serverFd << std::endl;
//std::cout << "serverFd: " << allFds.serverFd << std::endl;
while (allFds.alive)
{
//std::cout << "---------start loop-----------\n";
//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);
eventNbr = epoll_wait(allFds.epollFd, allFds.events, MAX_EVENTS, 0);
//eventNbr = epoll_wait(allFds.epollFd, allFds.events, MAX_EVENTS, 5000);
//std::cout << "eventNbr = " << eventNbr << std::endl;
//std::cout << "eventNbr: " << eventNbr << std::endl;
//std::cout << "in loop adress " << &allFds << std::endl;
@ -50,9 +54,9 @@ void start_loop(fdList &allFds)
// if (!clientRequest(allFds, nbr))
// alive = false;
clientRequest(allFds, nbr);
}
}
//std::cout << "---------end loop-----------\n";
}
std::cout << "dead server\n";

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:44:20 by apommier #+# #+# */
/* Updated: 2023/02/13 00:04:55 by apommier ### ########.fr */
/* Updated: 2023/02/15 00:14:07 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -30,7 +30,8 @@ void initialize(char **av)
//allFds.userData.reserve(MAX_EVENTS);
//allFds.channelList.reserve(MAX_CHAN);
allFds.password = av[2];
std::cout << "pass= " << av[2] << std::endl;
allFds.nbrUser = 0;
allFds.serverFd = socket(AF_INET, SOCK_STREAM, 0);
if (allFds.serverFd == -1)
@ -59,7 +60,9 @@ void initialize(char **av)
// {
// nbrRead = read()
// }
time_t timer;
time(&timer);
allFds.creation_date = ctime(&timer);
allFds.epollFd = epoll_start();
//allFds.userData
epoll_add(allFds.epollFd, allFds.serverFd);

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:46:41 by apommier #+# #+# */
/* Updated: 2023/02/13 10:52:07 by apommier ### ########.fr */
/* Updated: 2023/02/14 14:27:33 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,7 +18,8 @@ void ft_error(std::string str)
if (errno)
{
std::cerr << "errno: " << strerror(errno) << std::endl;
exit(errno);
throw ;//std::bad_alloc();
//exit(errno);
}
exit(1);
}