add nick and pass error add oper cmd not tested add squit

This commit is contained in:
kinou-p 2023-02-15 15:43:54 +01:00
parent 57d78f0857
commit 8e44a304c8
11 changed files with 254 additions and 119 deletions

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/01 17:27:37 by apommier #+# #+# */
/* Updated: 2023/02/14 20:54:22 by apommier ### ########.fr */
/* Updated: 2023/02/15 00:16:02 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -20,6 +20,7 @@
#include <cstdlib>
#include <exception>
#include <ctime>
#include <cstring> //std::string
#include <cerrno> //errno
#include <iostream> //std::cout | cerr
@ -150,6 +151,7 @@ struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY
int alive;
std::string password;
std::string creation_date;
int nbrUser;
functionTab parsingTab;
};

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,54 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/12 23:30:11 by apommier #+# #+# */
/* Updated: 2023/02/14 02:19:19 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)
{

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:28:38 by apommier #+# #+# */
/* Updated: 2023/02/14 01:25:31 by apommier ### ########.fr */
/* Updated: 2023/02/15 15:41:43 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -23,7 +23,16 @@ 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? )

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:40:42 by apommier #+# #+# */
/* Updated: 2023/02/14 18:46:53 by apommier ### ########.fr */
/* Updated: 2023/02/15 15:42:16 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -19,16 +19,16 @@ 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)
// {

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 08:53:03 by apommier #+# #+# */
/* Updated: 2023/02/14 20:58:20 by apommier ### ########.fr */
/* Updated: 2023/02/15 15:18:38 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -74,8 +74,8 @@ void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr)
pos = find_user(allFds, dest); //return direct user fd
if (pos != -1)
{
send(allFds.userData[pos].fd, fullMsg.c_str(), fullMsg.size(), 0);
cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/channel\n");
return ;
}
cmd_error(allFds, allFds.userData[userNbr].fd, "401 * PRIVMSG " + dest + " :No such nick/channel\n");
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/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,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 21:44:20 by apommier #+# #+# */
/* Updated: 2023/02/14 01:51:55 by apommier ### ########.fr */
/* Updated: 2023/02/15 00:14:07 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -60,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);