mirror of
https://github.com/Ladebeze66/ft_irc.git
synced 2026-11-09 13:17:13 +01:00
modif3005soir
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/05/16 15:27:29 by fgras-ca #+# #+# */
|
||||
/* Updated: 2024/05/30 13:07:33 by fgras-ca ### ########.fr */
|
||||
/* Updated: 2024/05/30 17:12:30 by fgras-ca ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@@ -40,6 +40,11 @@ void AdditionalCommands::processCommand(Client *client, const std::string &comma
|
||||
InviteHandler inviteHandler(_server);
|
||||
inviteHandler.handleInviteCommand(client, command);
|
||||
}
|
||||
else if (command.find("TOPIC") == 0)
|
||||
{
|
||||
TopicHandler topichandler(_server);
|
||||
topichandler.handleTopicCommand(client, command);
|
||||
}
|
||||
else if (command.find("LIST") == 0)
|
||||
{
|
||||
broadcastChannelList(client, _server);
|
||||
@@ -57,9 +62,9 @@ void AdditionalCommands::broadcastChannelList(Client *client, Server *server)
|
||||
std::map<std::string, Channel *> &channels = server->getChannels();
|
||||
for (std::map<std::string, Channel *>::iterator it = channels.begin(); it != channels.end(); ++it)
|
||||
{
|
||||
server->sendToClient(client->getFd(), RPL_LIST(client->getFd(), it->first, it->second->getClients().size(), "Existing channel"));
|
||||
server->sendToClient(client->getFd(), RPL_LIST(client, it->first, it->second->getClients().size(), "Existing channel"));
|
||||
}
|
||||
server->sendToClient(client->getFd(), RPL_LISTEND(client->getFd()));
|
||||
server->sendToClient(client->getFd(), RPL_LISTEND(client));
|
||||
}
|
||||
|
||||
// Fonction pour gérer la commande PART
|
||||
@@ -80,13 +85,13 @@ void AdditionalCommands::handlePartCommand(Server *server, Client *client, const
|
||||
for (size_t i = 0; i < channels.size(); ++i) {
|
||||
std::string &channelName = channels[i];
|
||||
if (channelMap.find(channelName) == channelMap.end()) {
|
||||
server->sendToClient(client->getFd(), ERR_NOSUCHCHANNEL(client->getFd(), channelName));
|
||||
server->sendToClient(client->getFd(), ERR_NOSUCHCHANNEL(client, channelName));
|
||||
continue;
|
||||
}
|
||||
|
||||
Channel *channel = channelMap[channelName];
|
||||
if (!channel->hasClient(client)) {
|
||||
server->sendToClient(client->getFd(), ERR_NOTONCHANNEL(client->getFd(), channelName));
|
||||
server->sendToClient(client->getFd(), ERR_NOTONCHANNEL(client, channelName));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -119,12 +124,12 @@ void AdditionalCommands::handlePrivmsgCommand(Server *server, Client *client, co
|
||||
message = message.substr(1);
|
||||
|
||||
if (target.empty()) {
|
||||
server->sendToClient(client->getFd(), ERR_NORECIPIENT(client->getFd(), "PRIVMSG"));
|
||||
server->sendToClient(client->getFd(), ERR_NORECIPIENT(client, "PRIVMSG"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (message.empty()) {
|
||||
server->sendToClient(client->getFd(), ERR_NOTEXTTOSEND(client->getFd()));
|
||||
server->sendToClient(client->getFd(), ERR_NOTEXTTOSEND(client));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -138,7 +143,7 @@ void AdditionalCommands::handlePrivmsgCommand(Server *server, Client *client, co
|
||||
|
||||
// Vérifier les conditions spéciales du canal (ex: ban, modération)
|
||||
if (channel->isBanned(client)) {
|
||||
server->sendToClient(client->getFd(), ERR_CANNOTSENDTOCHAN(client->getFd(), target));
|
||||
server->sendToClient(client->getFd(), ERR_CANNOTSENDTOCHAN(client, target));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -167,13 +172,13 @@ void AdditionalCommands::handlePrivmsgCommand(Server *server, Client *client, co
|
||||
server->sendToClient(targetClient->getFd(), privMsg.str());
|
||||
|
||||
if (targetClient->isAway()) {
|
||||
server->sendToClient(client->getFd(), RPL_AWAY(client->getFd(), targetClient->getNickname(), targetClient->getAwayMessage()));
|
||||
server->sendToClient(client->getFd(), RPL_AWAY(client, targetClient->getNickname(), targetClient->getAwayMessage()));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Si la cible n'est ni un canal ni un utilisateur existant, envoyer un message d'erreur
|
||||
server->sendToClient(client->getFd(), ERR_NOSUCHNICK(client->getFd(), target));
|
||||
server->sendToClient(client->getFd(), ERR_NOSUCHNICK(client, target));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/05/15 12:42:57 by fgras-ca #+# #+# */
|
||||
/* Updated: 2024/05/30 13:09:45 by fgras-ca ### ########.fr */
|
||||
/* Updated: 2024/05/30 18:33:19 by fgras-ca ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "Channel.hpp"
|
||||
|
||||
Channel::Channel(const std::string &name)
|
||||
: _name(name), _clients(), _operators(), _bannedClients(), _invitedClients(), _key(""), _topic(""), _topicSetter(""), _topicTime(0), _clientLimit(50), _inviteOnly(false) {}
|
||||
: _name(name), _clients(), _operators(), _bannedClients(), _invitedClients(), _key(""), _topic(""), _topicSetter(""), _topicTime(0), _clientLimit(50), _inviteOnly(false), _topicProtection(false) {}
|
||||
|
||||
Channel::~Channel() {}
|
||||
|
||||
@@ -52,6 +52,11 @@ bool Channel::isOperator(Client *client) const
|
||||
return std::find(_operators.begin(), _operators.end(), client) != _operators.end();
|
||||
}
|
||||
|
||||
void Channel::removeOperator(Client *client)
|
||||
{
|
||||
_operators.erase(std::remove(_operators.begin(), _operators.end(), client), _operators.end());
|
||||
}
|
||||
|
||||
bool Channel::hasClient(Client *client) const
|
||||
{
|
||||
return std::find(_clients.begin(), _clients.end(), client) != _clients.end();
|
||||
@@ -148,3 +153,8 @@ std::string Channel::getModes() const {
|
||||
if (_topicProtection) modes += 't';
|
||||
return modes;
|
||||
}
|
||||
|
||||
bool Channel::getTopicProtection() const
|
||||
{
|
||||
return _topicProtection;
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/05/15 18:26:34 by fgras-ca #+# #+# */
|
||||
/* Updated: 2024/05/30 12:39:58 by fgras-ca ### ########.fr */
|
||||
/* Updated: 2024/05/30 16:53:35 by fgras-ca ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@@ -83,11 +83,11 @@ void CommandHandler::handleCapCommand(Client* client, const std::vector<std::str
|
||||
|
||||
if (subcommand == "LS")
|
||||
{
|
||||
_server->sendToClient(client->getFd(), RPL_CAP(client->getFd(), "LS", capabilities));
|
||||
_server->sendToClient(client->getFd(), RPL_CAP(client, "LS", capabilities));
|
||||
}
|
||||
else if (subcommand == "LIST")
|
||||
{
|
||||
_server->sendToClient(client->getFd(), RPL_CAP(client->getFd(), "LIST", capabilities));
|
||||
_server->sendToClient(client->getFd(), RPL_CAP(client, "LIST", capabilities));
|
||||
}
|
||||
else if (subcommand == "REQ")
|
||||
{
|
||||
@@ -98,11 +98,11 @@ void CommandHandler::handleCapCommand(Client* client, const std::vector<std::str
|
||||
}
|
||||
std::string requestedCapabilities = tokens[2];
|
||||
// For simplicity, we assume all requested capabilities are accepted
|
||||
_server->sendToClient(client->getFd(), RPL_CAP(client->getFd(), "ACK", requestedCapabilities));
|
||||
_server->sendToClient(client->getFd(), RPL_CAP(client, "ACK", requestedCapabilities));
|
||||
}
|
||||
else if (subcommand == "END")
|
||||
{
|
||||
_server->sendToClient(client->getFd(), RPL_CAPEND(client->getFd()));
|
||||
_server->sendToClient(client->getFd(), RPL_CAPEND(client));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/05/30 13:02:09 by fgras-ca #+# #+# */
|
||||
/* Updated: 2024/05/30 13:08:33 by fgras-ca ### ########.fr */
|
||||
/* Updated: 2024/05/30 16:53:59 by fgras-ca ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@@ -26,23 +26,23 @@ void InviteHandler::handleInviteCommand(Client* client, const std::string& comma
|
||||
|
||||
Channel* channel = _server->getChannelByName(channelName);
|
||||
if (!channel) {
|
||||
_server->sendToClient(client->getFd(), ERR_NOSUCHCHANNEL(client->getFd(), channelName));
|
||||
_server->sendToClient(client->getFd(), ERR_NOSUCHCHANNEL(client, channelName));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!channel->hasClient(client)) {
|
||||
_server->sendToClient(client->getFd(), ERR_NOTONCHANNEL(client->getFd(), channelName));
|
||||
_server->sendToClient(client->getFd(), ERR_NOTONCHANNEL(client, channelName));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!channel->isOperator(client) && channel->isInviteOnly()) {
|
||||
_server->sendToClient(client->getFd(), ERR_CHANOPRIVSNEEDED(client->getFd(), channelName));
|
||||
_server->sendToClient(client->getFd(), ERR_CHANOPRIVSNEEDED(client, channelName));
|
||||
return;
|
||||
}
|
||||
|
||||
Client* targetClient = _server->getClientByName(nickname);
|
||||
if (!targetClient) {
|
||||
_server->sendToClient(client->getFd(), ERR_NOSUCHNICK(client->getFd(), nickname));
|
||||
_server->sendToClient(client->getFd(), ERR_NOSUCHNICK(client, nickname));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ void JoinHandler::handleJoinCommand(Client *client, const std::string &channelNa
|
||||
|
||||
if (channelName[0] != '#' && channelName[0] != '&')
|
||||
{
|
||||
server->sendToClient(client->getFd(), ERR_NOSUCHCHANNEL(client->getFd(), channelName));
|
||||
server->sendToClient(client->getFd(), ERR_NOSUCHCHANNEL(client, channelName));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -191,4 +191,3 @@ std::string JoinHandler::getUsersList(Channel *channel)
|
||||
oss << RPL_ENDOFNAMES(clients[0], channel->getName());
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/05/30 11:13:08 by fgras-ca #+# #+# */
|
||||
/* Updated: 2024/05/30 13:33:36 by fgras-ca ### ########.fr */
|
||||
/* Updated: 2024/05/30 18:46:37 by fgras-ca ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@@ -14,141 +14,184 @@
|
||||
|
||||
ModeHandler::ModeHandler(Server* server) : _server(server) {}
|
||||
|
||||
void ModeHandler::handleModeCommand(Client* client, const std::string& command) {
|
||||
void ModeHandler::handleModeCommand(Client* client, const std::string& command)
|
||||
{
|
||||
_server->log("Received MODE command: " + command, "\033[1;34m");
|
||||
std::vector<std::string> tokens = split(command, " \n\r\t");
|
||||
std::vector<std::string> tokens = split(command, " \n\r\t");
|
||||
|
||||
if (tokens.size() < 2) {
|
||||
_server->sendToClient(client->getFd(), ERR_NEEDMOREPARAMS(client, "MODE"));
|
||||
if (tokens.size() < 2) {
|
||||
_server->sendToClient(client->getFd(), ERR_NEEDMOREPARAMS(client, "MODE"));
|
||||
_server->log("MODE command error: Need more parameters", "\033[1;31m");
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
std::string target = tokens[1];
|
||||
if (target[0] == '#' || target[0] == '&') {
|
||||
std::string target = tokens[1];
|
||||
if (target[0] == '#' || target[0] == '&') {
|
||||
_server->log("Handling channel mode for target: " + target, "\033[1;34m");
|
||||
handleChannelMode(client, tokens);
|
||||
} else {
|
||||
handleChannelMode(client, tokens);
|
||||
} else {
|
||||
_server->log("Handling user mode for target: " + target, "\033[1;34m");
|
||||
handleUserMode(client, tokens);
|
||||
}
|
||||
handleUserMode(client, tokens);
|
||||
}
|
||||
}
|
||||
|
||||
void ModeHandler::handleUserMode(Client* client, const std::vector<std::string>& tokens) {
|
||||
std::string target = tokens[1];
|
||||
if (target != client->getNickname()) {
|
||||
_server->sendToClient(client->getFd(), ERR_USERSDONTMATCH(client->getFd()));
|
||||
void ModeHandler::handleUserMode(Client* client, const std::vector<std::string>& tokens)
|
||||
{
|
||||
_server->log("Entered handleUserMode", "\033[1;34m");
|
||||
std::string target = tokens[1];
|
||||
_server->log("User mode target: " + target, "\033[1;34m");
|
||||
if (target != client->getNickname()) {
|
||||
_server->sendToClient(client->getFd(), ERR_USERSDONTMATCH(client));
|
||||
_server->log("User mode error: Users don't match", "\033[1;31m");
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (tokens.size() == 2) {
|
||||
_server->sendToClient(client->getFd(), RPL_UMODEIS(client->getFd(), "")); // Ajout de la chaîne vide pour les modes utilisateur
|
||||
_server->log("Sent user modes to client", "\033[1;32m");
|
||||
} else {
|
||||
std::string modeString = tokens[2];
|
||||
// Gestion des modes utilisateur (ajout ou suppression)
|
||||
// Par exemple, vous pouvez gérer l'ajout ou la suppression du mode invisible ici
|
||||
_server->log("Updating user modes: " + modeString, "\033[1;34m");
|
||||
}
|
||||
if (tokens.size() == 2) {
|
||||
_server->sendToClient(client->getFd(), RPL_UMODEIS(client, ""));
|
||||
_server->log("Sent user modes to client", "\033[1;32m");
|
||||
} else {
|
||||
std::string modeString = tokens[2];
|
||||
_server->log("Updating user modes: " + modeString, "\033[1;34m");
|
||||
// Additional logging or mode handling logic can be added here
|
||||
}
|
||||
}
|
||||
|
||||
void ModeHandler::handleChannelMode(Client* client, const std::vector<std::string>& tokens) {
|
||||
std::string channelName = tokens[1];
|
||||
Channel* channel = _server->getChannelByName(channelName);
|
||||
if (!channel) {
|
||||
_server->sendToClient(client->getFd(), ERR_NOSUCHCHANNEL(client->getFd(), channelName));
|
||||
void ModeHandler::handleChannelMode(Client* client, const std::vector<std::string>& tokens)
|
||||
{
|
||||
_server->log("Entered handleChannelMode", "\033[1;34m");
|
||||
std::string channelName = tokens[1];
|
||||
_server->log("Channel mode target: " + channelName, "\033[1;34m");
|
||||
Channel* channel = _server->getChannelByName(channelName);
|
||||
if (!channel) {
|
||||
_server->sendToClient(client->getFd(), ERR_NOSUCHCHANNEL(client, channelName));
|
||||
_server->log("Channel mode error: No such channel " + channelName, "\033[1;31m");
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (tokens.size() == 2) {
|
||||
// Retourner les modes actuels du canal
|
||||
std::ostringstream oss;
|
||||
oss << RPL_CHANNELMODEIS(client->getFd(), channel->getName(), channel->getModes());
|
||||
oss << RPL_CREATIONTIME(client->getFd(), channel->getName(), channel->getTopicTime());
|
||||
_server->sendToClient(client->getFd(), oss.str());
|
||||
_server->log("Sent channel modes to client", "\033[1;32m");
|
||||
return;
|
||||
}
|
||||
if (tokens.size() == 2) {
|
||||
std::ostringstream oss;
|
||||
oss << RPL_CHANNELMODEIS(client, channel->getName(), channel->getModes());
|
||||
oss << RPL_CREATIONTIME(client, channel->getName(), channel->getTopicTime());
|
||||
_server->sendToClient(client->getFd(), oss.str());
|
||||
_server->log("Sent channel modes to client", "\033[1;32m");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!channel->isOperator(client)) {
|
||||
_server->sendToClient(client->getFd(), ERR_CHANOPRIVSNEEDED(client->getFd(), channelName));
|
||||
if (!channel->isOperator(client)) {
|
||||
_server->sendToClient(client->getFd(), ERR_CHANOPRIVSNEEDED(client, channelName));
|
||||
_server->log("Channel mode error: Channel operator privileges needed for " + channelName, "\033[1;31m");
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
std::string modeString = tokens[2];
|
||||
bool adding = true;
|
||||
size_t argIndex = 3;
|
||||
std::string modeString = tokens[2];
|
||||
bool adding = true;
|
||||
size_t argIndex = 3;
|
||||
|
||||
for (size_t i = 0; i < modeString.length(); ++i) {
|
||||
char mode = modeString[i];
|
||||
if (mode == '+') {
|
||||
adding = true;
|
||||
} else if (mode == '-') {
|
||||
adding = false;
|
||||
} else if (mode == 'b' || mode == 'l' || mode == 'i' || mode == 'k' || mode == 't') {
|
||||
std::string argument;
|
||||
if (argIndex < tokens.size()) {
|
||||
argument = tokens[argIndex++];
|
||||
}
|
||||
setChannelMode(channel, std::string(1, mode), adding, argument);
|
||||
} else {
|
||||
_server->sendToClient(client->getFd(), ERR_UNKNOWNMODE(client, mode, channelName));
|
||||
}
|
||||
}
|
||||
for (size_t i = 0; i < modeString.length(); ++i) {
|
||||
char mode = modeString[i];
|
||||
if (mode == '+') {
|
||||
adding = true;
|
||||
_server->log("Adding mode: " + std::string(1, mode), "\033[1;34m");
|
||||
} else if (mode == '-') {
|
||||
adding = false;
|
||||
_server->log("Removing mode: " + std::string(1, mode), "\033[1;34m");
|
||||
} else if (mode == 'b' || mode == 'l' || mode == 'i' || mode == 'k' || mode == 't') {
|
||||
std::string argument;
|
||||
if (argIndex < tokens.size()) {
|
||||
argument = tokens[argIndex++];
|
||||
}
|
||||
setChannelMode(client, channel, std::string(1, mode), adding, argument);
|
||||
} else {
|
||||
_server->sendToClient(client->getFd(), ERR_UNKNOWNMODE(client, mode, channelName));
|
||||
_server->log("Unknown mode: " + std::string(1, mode), "\033[1;31m");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ModeHandler::setChannelMode(Channel* channel, const std::string& mode, bool adding, const std::string& argument) {
|
||||
/*if (mode == "b") {
|
||||
applyModeB(channel, adding, argument);
|
||||
}*/
|
||||
if (mode == "l") {
|
||||
applyModeL(channel, adding, argument);
|
||||
} else if (mode == "i") {
|
||||
applyModeI(channel, adding);
|
||||
} else if (mode == "k") {
|
||||
applyModeK(channel, adding, argument);
|
||||
} else if (mode == "t") {
|
||||
applyModeT(channel, adding);
|
||||
}
|
||||
void ModeHandler::setChannelMode(Client *client, Channel* channel, const std::string& mode, bool adding, const std::string& argument)
|
||||
{
|
||||
_server->log("Setting channel mode: " + mode + " Adding: " + (adding ? "true" : "false") + " Argument: " + argument, "\033[1;32m");
|
||||
if (mode == "l")
|
||||
{
|
||||
applyModeL(channel, adding, argument);
|
||||
}
|
||||
else if (mode == "i")
|
||||
{
|
||||
applyModeI(channel, adding);
|
||||
}
|
||||
else if (mode == "k")
|
||||
{
|
||||
applyModeK(channel, adding, argument);
|
||||
}
|
||||
else if (mode == "t")
|
||||
{
|
||||
applyModeT(channel, adding);
|
||||
}
|
||||
else if (mode == "o")
|
||||
applyModeO(client, channel, adding, argument);
|
||||
}
|
||||
|
||||
/*void ModeHandler::applyModeB(Channel* channel, bool adding, const std::string& argument) {
|
||||
// Implémentation de l'ajout ou de la suppression de bannissements
|
||||
// Note : Vous pouvez ajouter des méthodes à la classe Channel pour gérer la liste des bannissements
|
||||
if (adding) {
|
||||
// Ajouter le masque à la liste des bannissements
|
||||
// channel->banClient(argument);
|
||||
} else {
|
||||
// Supprimer le masque de la liste des bannissements
|
||||
// channel->unbanClient(argument);
|
||||
}
|
||||
}*/
|
||||
|
||||
void ModeHandler::applyModeL(Channel* channel, bool adding, const std::string& argument) {
|
||||
if (adding) {
|
||||
int limit = std::atoi(argument.c_str());
|
||||
channel->setClientLimit(limit);
|
||||
} else {
|
||||
channel->setClientLimit(0); // Retirer la limite
|
||||
}
|
||||
void ModeHandler::applyModeL(Channel* channel, bool adding, const std::string& argument)
|
||||
{
|
||||
if (adding) {
|
||||
int limit = std::atoi(argument.c_str());
|
||||
std::ostringstream oss;
|
||||
oss << limit;
|
||||
_server->log("Applying mode L: Setting limit to " + oss.str(), "\033[1;32m");
|
||||
channel->setClientLimit(limit);
|
||||
} else {
|
||||
_server->log("Applying mode L: Removing limit", "\033[1;31m");
|
||||
channel->setClientLimit(0);
|
||||
}
|
||||
}
|
||||
|
||||
void ModeHandler::applyModeI(Channel* channel, bool adding) {
|
||||
channel->setInviteOnly(adding);
|
||||
void ModeHandler::applyModeI(Channel* channel, bool adding)
|
||||
{
|
||||
_server->log("Applying mode I: " + std::string(adding ? "Setting invite-only" : "Removing invite-only"), "\033[1;32m");
|
||||
channel->setInviteOnly(adding);
|
||||
}
|
||||
|
||||
void ModeHandler::applyModeK(Channel* channel, bool adding, const std::string& argument) {
|
||||
if (adding) {
|
||||
channel->setKey(argument);
|
||||
} else {
|
||||
channel->setKey("");
|
||||
}
|
||||
void ModeHandler::applyModeK(Channel* channel, bool adding, const std::string& argument)
|
||||
{
|
||||
if (adding) {
|
||||
_server->log("Applying mode K: Setting key to " + argument, "\033[1;32m");
|
||||
channel->setKey(argument);
|
||||
} else {
|
||||
_server->log("Applying mode K: Removing key", "\033[1;31m");
|
||||
channel->setKey("");
|
||||
}
|
||||
}
|
||||
|
||||
void ModeHandler::applyModeT(Channel* channel, bool adding) {
|
||||
channel->setTopicProtection(adding);
|
||||
void ModeHandler::applyModeT(Channel* channel, bool adding)
|
||||
{
|
||||
_server->log("Applying mode T: " + std::string(adding ? "Setting topic protection" : "Removing topic protection"), "\033[1;32m");
|
||||
channel->setTopicProtection(adding);
|
||||
}
|
||||
|
||||
void ModeHandler::applyModeO(Client* client, Channel* channel, bool adding, const std::string& argument)
|
||||
{
|
||||
Client* targetClient = _server->getClientByName(argument);
|
||||
if (!targetClient) {
|
||||
_server->sendToClient(client->getFd(), ERR_NOSUCHNICK(client, argument));
|
||||
_server->log("Mode o error: No such client " + argument, "\033[1;31m");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!channel->hasClient(targetClient)) {
|
||||
_server->sendToClient(client->getFd(), ERR_USERNOTINCHANNEL(client, argument, channel->getName()));
|
||||
_server->log("Mode o error: Client " + argument + " not in channel " + channel->getName(), "\033[1;31m");
|
||||
return;
|
||||
}
|
||||
|
||||
if (adding) {
|
||||
_server->log("Applying mode o: Adding operator " + argument, "\033[1;32m");
|
||||
channel->addOperator(targetClient);
|
||||
std::string message = ":" + client->getNickname() + " MODE " + channel->getName() + " +o " + targetClient->getNickname() + "\r\n";
|
||||
channel->broadcast(message, NULL, _server);
|
||||
} else {
|
||||
_server->log("Applying mode o: Removing operator " + argument, "\033[1;31m");
|
||||
channel->removeOperator(targetClient);
|
||||
std::string message = ":" + client->getNickname() + " MODE " + channel->getName() + " -o " + targetClient->getNickname() + "\r\n";
|
||||
channel->broadcast(message, NULL, _server);
|
||||
}
|
||||
}
|
||||
@@ -6,14 +6,14 @@
|
||||
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/05/15 12:17:12 by fgras-ca #+# #+# */
|
||||
/* Updated: 2024/05/30 12:18:40 by fgras-ca ### ########.fr */
|
||||
/* Updated: 2024/05/30 17:14:19 by fgras-ca ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "Server.hpp"
|
||||
|
||||
Server::Server(int port, const std::string &password)
|
||||
: _port(port), _password(password), _clientManager(new ClientManager(this)), _commandHandler(new CommandHandler(this)), _modeHandler(new ModeHandler(this))
|
||||
: _port(port), _password(password), _clientManager(new ClientManager(this)), _commandHandler(new CommandHandler(this)), _modeHandler(new ModeHandler(this)), _topicHandler(new TopicHandler(this))
|
||||
{
|
||||
initServer();
|
||||
}
|
||||
@@ -164,7 +164,7 @@ void Server::handleServerCommands()
|
||||
|
||||
void Server::log(const std::string &message, const std::string &color)
|
||||
{
|
||||
std::cout << color << message << "\033[0m" << std::endl;
|
||||
std::cout << color << message << std::endl;
|
||||
}
|
||||
|
||||
void Server::sendToClient(int client_fd, const std::string &message)
|
||||
@@ -221,9 +221,9 @@ void Server::sendChannelListToClient(Client *client)
|
||||
std::map<std::string, Channel *> &channels = getChannels();
|
||||
for (std::map<std::string, Channel *>::iterator it = channels.begin(); it != channels.end(); ++it)
|
||||
{
|
||||
sendToClient(client->getFd(), RPL_LIST(client->getFd(), it->first, it->second->getClients().size(), "Existing channel"));
|
||||
sendToClient(client->getFd(), RPL_LIST(client, it->first, it->second->getClients().size(), "Existing channel"));
|
||||
}
|
||||
sendToClient(client->getFd(), RPL_LISTEND(client->getFd()));
|
||||
sendToClient(client->getFd(), RPL_LISTEND(client));
|
||||
}
|
||||
|
||||
bool Server::MatchFd(const pollfd& pfd, int clientFd)
|
||||
|
||||
84
ft_irc3/src/TopicHandler.cpp
Normal file
84
ft_irc3/src/TopicHandler.cpp
Normal file
@@ -0,0 +1,84 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* TopicHandler.cpp :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/05/30 17:04:58 by fgras-ca #+# #+# */
|
||||
/* Updated: 2024/05/30 18:05:42 by fgras-ca ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "TopicHandler.hpp"
|
||||
|
||||
TopicHandler::TopicHandler(Server* server) : _server(server) {}
|
||||
|
||||
void TopicHandler::handleTopicCommand(Client* client, const std::string& command)
|
||||
{
|
||||
_server->log("Received TOPIC command: " + command, "\033[1;34m");
|
||||
std::vector<std::string> tokens = split(command, " \n\r\t");
|
||||
|
||||
if (tokens.size() < 2) {
|
||||
_server->sendToClient(client->getFd(), ERR_NEEDMOREPARAMS(client, "TOPIC"));
|
||||
_server->log("TOPIC command error: Need more parameters", "\033[1;31m");
|
||||
return;
|
||||
}
|
||||
|
||||
std::string channelName = tokens[1];
|
||||
Channel* channel = _server->getChannelByName(channelName);
|
||||
if (!channel) {
|
||||
_server->sendToClient(client->getFd(), ERR_NOSUCHCHANNEL(client, channelName));
|
||||
_server->log("TOPIC command error: No such channel " + channelName, "\033[1;31m");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!channel->hasClient(client)) {
|
||||
_server->sendToClient(client->getFd(), ERR_NOTONCHANNEL(client, channelName));
|
||||
_server->log("TOPIC command error: Client not on channel " + channelName, "\033[1;31m");
|
||||
return;
|
||||
}
|
||||
|
||||
if (tokens.size() == 2) {
|
||||
viewTopic(client, channel);
|
||||
} else {
|
||||
size_t topicStart = command.find(" :");
|
||||
std::string topic = (topicStart != std::string::npos) ? command.substr(topicStart + 2) : "";
|
||||
changeTopic(client, channel, topic);
|
||||
}
|
||||
}
|
||||
|
||||
void TopicHandler::viewTopic(Client* client, Channel* channel)
|
||||
{
|
||||
if (channel->getTopic().empty()) {
|
||||
_server->sendToClient(client->getFd(), RPL_NOTOPIC(client, channel->getName()));
|
||||
_server->log("No topic set for channel " + channel->getName(), "\033[1;32m");
|
||||
} else {
|
||||
_server->sendToClient(client->getFd(), RPL_TOPIC(client, channel->getName(), channel->getTopic()));
|
||||
_server->sendToClient(client->getFd(), RPL_TOPICWHOTIME(client, channel->getName(), channel->getTopicSetter(), channel->getTopicTime()));
|
||||
_server->log("Sent topic info for channel " + channel->getName(), "\033[1;32m");
|
||||
}
|
||||
}
|
||||
|
||||
void TopicHandler::changeTopic(Client* client, Channel* channel, const std::string& topic)
|
||||
{
|
||||
if (channel->getTopicProtection() && !channel->isOperator(client)) {
|
||||
_server->sendToClient(client->getFd(), ERR_CHANOPRIVSNEEDED(client, channel->getName()));
|
||||
_server->log("TOPIC command error: Channel operator privileges needed for " + channel->getName(), "\033[1;31m");
|
||||
return;
|
||||
}
|
||||
|
||||
if (topic == channel->getTopic()) {
|
||||
_server->sendToClient(client->getFd(), RPL_TOPIC(client, channel->getName(), channel->getTopic()));
|
||||
_server->log("TOPIC unchanged for channel " + channel->getName(), "\033[1;32m");
|
||||
return;
|
||||
}
|
||||
|
||||
channel->setTopic(topic, client->getNickname());
|
||||
std::vector<Client*> clients = channel->getClients();
|
||||
for (std::vector<Client*>::iterator it = clients.begin(); it != clients.end(); ++it) {
|
||||
_server->sendToClient((*it)->getFd(), ":" + client->getNickname() + " TOPIC " + channel->getName() + " :" + topic + "\r\n");
|
||||
}
|
||||
|
||||
_server->log("Changed topic for channel " + channel->getName() + " to: " + topic, GREEN);
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/05/21 17:53:52 by fgras-ca #+# #+# */
|
||||
/* Updated: 2024/05/21 19:54:48 by fgras-ca ### ########.fr */
|
||||
/* Updated: 2024/05/30 16:43:14 by fgras-ca ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@@ -18,7 +18,7 @@ void WelcomeHandler::sendWelcomeMessages(Client *client, Server *server)
|
||||
server->sendToClient(client->getFd(), RPL_YOURHOST(client));
|
||||
server->sendToClient(client->getFd(), RPL_CREATED(client));
|
||||
server->sendToClient(client->getFd(), RPL_MYINFO(client));
|
||||
server->sendToClient(client->getFd(), RPL_ISUPPORT(client, "MODES=EXAMPLE"));
|
||||
server->sendToClient(client->getFd(), RPL_ISUPPORT(client, "i/t/k/o/l"));
|
||||
|
||||
sendMotd(client, server);
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
/* By: fgras-ca <fgras-ca@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/05/17 16:09:20 by fgras-ca #+# #+# */
|
||||
/* Updated: 2024/05/28 14:33:29 by fgras-ca ### ########.fr */
|
||||
/* Updated: 2024/05/30 16:56:03 by fgras-ca ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@@ -43,7 +43,7 @@ void WhoHandler::handleWhoCommand(Client *client, const std::string &command)
|
||||
}
|
||||
}
|
||||
|
||||
_server->sendToClient(client->getFd(), RPL_ENDOFWHO(client->getFd(), mask));
|
||||
_server->sendToClient(client->getFd(), RPL_ENDOFWHO(client, mask));
|
||||
}
|
||||
|
||||
void WhoHandler::handleWhoisCommand(Client *client, const std::string &command)
|
||||
@@ -61,11 +61,11 @@ void WhoHandler::handleWhoisCommand(Client *client, const std::string &command)
|
||||
Client *targetClient = _server->getClientByName(target);
|
||||
if (!targetClient)
|
||||
{
|
||||
_server->sendToClient(client->getFd(), ERR_NOSUCHNICK(client->getFd(), target));
|
||||
_server->sendToClient(client->getFd(), ERR_NOSUCHNICK(client, target));
|
||||
return;
|
||||
}
|
||||
|
||||
_server->sendToClient(client->getFd(), RPL_WHOISUSER(client->getFd(), targetClient));
|
||||
_server->sendToClient(client->getFd(), RPL_WHOISSERVER(client->getFd(), target, "IRC server info"));
|
||||
_server->sendToClient(client->getFd(), RPL_ENDOFWHOIS(client->getFd(), target));
|
||||
_server->sendToClient(client->getFd(), RPL_WHOISUSER(client, targetClient));
|
||||
_server->sendToClient(client->getFd(), RPL_WHOISSERVER(client, target, "IRC server info"));
|
||||
_server->sendToClient(client->getFd(), RPL_ENDOFWHOIS(client, target));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user