From e88d706ae08f59ab1bced7441f96f49506b5af6e Mon Sep 17 00:00:00 2001 From: Samy BEN TAYEB Date: Sat, 14 Jun 2025 23:39:40 +0200 Subject: [PATCH] split lines before commands dispatch + irssi recev code 001 + command PING ok-tiers --- include/server.hpp | 9 +++++---- sources/commands/ping.cpp | 9 ++++----- sources/core/Server.cpp | 32 +++++++++++++++++++++++++------- sources/user/user.cpp | 17 +++++++++-------- 4 files changed, 43 insertions(+), 24 deletions(-) diff --git a/include/server.hpp b/include/server.hpp index fea3efc..c07fe61 100644 --- a/include/server.hpp +++ b/include/server.hpp @@ -1,14 +1,14 @@ -/******************************************************************************/ +/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* server.hpp :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: omoudni +#+ +:+ +#+ */ +/* By: sben-tay +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/20 21:50:32 by rparodi #+# #+# */ -/* Updated: 2025/05/29 12:17:55 by rparodi ### ########.fr */ +/* Updated: 2025/06/14 23:08:11 by sben-tay ### ########.fr */ /* */ -/******************************************************************************/ +/* ************************************************************************** */ #pragma once @@ -21,6 +21,7 @@ class User; class Channel; class Server + { private: int _port; diff --git a/sources/commands/ping.cpp b/sources/commands/ping.cpp index acf0e6c..c6c442e 100644 --- a/sources/commands/ping.cpp +++ b/sources/commands/ping.cpp @@ -6,7 +6,7 @@ /* By: sben-tay +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/24 17:29:48 by rparodi #+# #+# */ -/* Updated: 2025/06/12 13:24:55 by sben-tay ### ########.fr */ +/* Updated: 2025/06/14 23:25:45 by sben-tay ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ using namespace cmd; e_code Ping::checkArgs() { - if (_args.size() < 3) { + if (_args.size() < 2) { WARNING_MSG("Not enough arguments for PING command"); return ERR_NEEDMOREPARAMS; } @@ -32,11 +32,10 @@ e_code Ping::checkArgs() { */ void Ping::execute() { - clock_t start = clock() / CLOCKS_PER_SEC; if (checkArgs() != _PARSING_OK) { ERROR_MSG("Invalid arguments for PRIVMSG command (see warning message)"); return; } - clock_t diff = Pong().answer(start); - INFO_MSG(diff); + _sender->appendToWriteBuffer("PONG " + _args[1] + "\r\n"); + DEBUG_MSG(_sender->getWriteBuffer()); } diff --git a/sources/core/Server.cpp b/sources/core/Server.cpp index b31653f..c465308 100644 --- a/sources/core/Server.cpp +++ b/sources/core/Server.cpp @@ -6,7 +6,7 @@ /* By: sben-tay +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/13 11:11:07 by rparodi #+# #+# */ -/* Updated: 2025/06/12 18:03:53 by sben-tay ### ########.fr */ +/* Updated: 2025/06/14 23:16:54 by sben-tay ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,7 @@ #include #include #include +#include /** * @brief The constructor of the Server class. @@ -48,6 +49,8 @@ Server::~Server() } } +std::vector splitLines(const std::string& input); + void Server::start() { _serverFd = socket(AF_INET, SOCK_STREAM, 0); @@ -102,12 +105,15 @@ void Server::start() if (_users.count(fd)) { _users[fd]->appendToReadBuffer(data); - std::string cmd; - while (!(cmd = _users[fd]->extractFullCommand()).empty()) + std::string rawCmd; + while (!(rawCmd = _users[fd]->extractFullCommand()).empty()) { + std::vector lines = splitLines(rawCmd); + for (size_t i = 0; i < lines.size(); ++i) { + std::cout << "Client " << fd << " says: " << lines[i] << std::endl; + cmd::dispatch(_users[fd], NULL, this, lines[i]); + } // This prints every command/message received from any client - std::cout << "Client " << fd << " says: " << cmd << std::endl; - cmd::dispatch(_users[fd], NULL, this, cmd); } } } @@ -122,8 +128,7 @@ void Server::start() { std::cerr << "Erreur send" << std::endl; } - else - { + else { _users[fd]->clearWriteBuffer(); } } @@ -186,3 +191,16 @@ std::list Server::getUsersList() const { std::list Server::getChannelsList() const { return this->_channels; } + +std::vector splitLines(const std::string& input) { + std::vector lines; + std::istringstream stream(input); + std::string line; + + while (std::getline(stream, line)) { + if (!line.empty() && line[line.length() - 1] == '\r') + line.erase(line.length() - 1); // retirer le \r final + lines.push_back(line); + } + return lines; +} \ No newline at end of file diff --git a/sources/user/user.cpp b/sources/user/user.cpp index 7609fc4..bb8fc5f 100644 --- a/sources/user/user.cpp +++ b/sources/user/user.cpp @@ -6,7 +6,7 @@ /* By: sben-tay +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/21 20:37:12 by omoudni #+# #+# */ -/* Updated: 2025/06/14 22:34:59 by sben-tay ### ########.fr */ +/* Updated: 2025/06/14 23:27:43 by sben-tay ### ########.fr */ /* */ /* ************************************************************************** */ @@ -83,7 +83,7 @@ void User::appendToWriteBuffer(const std::string &data) // Check registration void User::checkRegistration() { - if (!_registered && _hasNick && _hasUser) // without _hasPass check + if (!_registered && _hasNick && _hasUser && _hasPass) { std::cout << "JE SUIS ENREGISTRE" << std::endl; _registered = true; @@ -102,18 +102,19 @@ bool User::isReadyToSend() const // Extract full command from read buffer std::string User::extractFullCommand() { - std::string command; size_t pos = _read_buffer.find("\r\n"); if (pos == std::string::npos) pos = _read_buffer.find("\n"); // fallback if (pos != std::string::npos) { - command = _read_buffer.substr(0, pos); - _read_buffer.erase(0, pos + 1); - if (_read_buffer[pos] == '\r') // clean up stray \r - _read_buffer.erase(0, 1); + std::string command = _read_buffer.substr(0, pos); + if (_read_buffer.substr(pos, 2) == "\r\n") + _read_buffer.erase(0, pos + 2); + else + _read_buffer.erase(0, pos + 1); + return command; } - return command; + return ""; } void User::setHasNick(bool value) { _hasNick = value; }