From bb2fb307e8e3090899b145564c7351cb0b710655 Mon Sep 17 00:00:00 2001 From: ilia Date: Mon, 10 Nov 2025 21:22:26 +0100 Subject: [PATCH 1/3] Destroy channel when last user on PART KICK or QUIT (JOIN 0 is calling PART) --- srcs/commands/Kick.cpp | 7 +++++++ srcs/commands/Part.cpp | 7 +++++++ srcs/commands/Quit.cpp | 11 +++++++++++ 3 files changed, 25 insertions(+) diff --git a/srcs/commands/Kick.cpp b/srcs/commands/Kick.cpp index 012a59f4..eb781f82 100644 --- a/srcs/commands/Kick.cpp +++ b/srcs/commands/Kick.cpp @@ -50,6 +50,13 @@ void Kick::_kick_users_from_chan(std::string& chanName, std::vector p.response(target, p.get_client(), TRANSFER_KICK, channel->get_name() + " " + target->get_nickname(), _msg); channel->broadcast(*server, TRANSFER_KICK, channel->get_name() + " " + target->get_nickname(), p.get_client(), _msg); p.response(p.get_client(), TRANSFER_KICK, channel->get_name() + " " + target->get_nickname(), _msg); + if (channel->get_nb_members() == 0) { + std::map::iterator it = server->channels.find(channel->get_name()); + if (it != server->channels.end()) { + server->channels.erase(it); + delete channel; + } + } } else { p.response(ERR_USERNOTINCHANNEL, channel->get_name()); } diff --git a/srcs/commands/Part.cpp b/srcs/commands/Part.cpp index 6edf9c50..a51518ee 100644 --- a/srcs/commands/Part.cpp +++ b/srcs/commands/Part.cpp @@ -44,6 +44,13 @@ void Part::execute(Server& server, Client& client) channel->broadcast(server, TRANSFER_PART, _chanNames[i], &client, _message); p.response(TRANSFER_PART, _chanNames[i], _message); channel->remove_member(client); + if (channel->get_nb_members() == 0) { + std::map::iterator it = server.channels.find(channel->get_name()); + if (it != server.channels.end()) { + server.channels.erase(it); + delete channel; + } + } } } } diff --git a/srcs/commands/Quit.cpp b/srcs/commands/Quit.cpp index 4bc1b3e7..842f2840 100644 --- a/srcs/commands/Quit.cpp +++ b/srcs/commands/Quit.cpp @@ -6,6 +6,8 @@ #include "ReplyHandler.hpp" #include "Server.hpp" #include "reply_codes.hpp" +#include "Channel.hpp" +#include "Part.hpp" /************************************************************ * 🥚 CONSTRUCTORS & DESTRUCTOR * @@ -30,5 +32,14 @@ void Quit::execute(Server& server, Client& client) trailingMsg = ircConfig.trailing(TRANSFER_QUIT); client.broadcast_to_all_channels(server, TRANSFER_QUIT, "", trailingMsg); server.add_events_of(client, 0); + + for (std::map::iterator it = server.channels.begin(); it != server.channels.end(); it++) { + Channel* channel = it->second; + if (channel->is_member(client)) { + std::string chanName = channel->get_name(); + Part cmd(chanName); + cmd.execute(server, client); + } + } server.cleanup_socket_and_client(pfdIndex); } From 1f27e5ce9dd8231dd7a650093e7b1dc158834766 Mon Sep 17 00:00:00 2001 From: ilia Date: Mon, 10 Nov 2025 22:29:40 +0100 Subject: [PATCH 2/3] [fix] Quit command trailing message -- QuickFix --- srcs/commands/Quit.cpp | 4 ++-- srcs/server/ReplyHandler.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/srcs/commands/Quit.cpp b/srcs/commands/Quit.cpp index 842f2840..b6405c46 100644 --- a/srcs/commands/Quit.cpp +++ b/srcs/commands/Quit.cpp @@ -30,13 +30,13 @@ void Quit::execute(Server& server, Client& client) std::string trailingMsg = _quitMsg; if (trailingMsg.empty()) trailingMsg = ircConfig.trailing(TRANSFER_QUIT); - client.broadcast_to_all_channels(server, TRANSFER_QUIT, "", trailingMsg); + client.broadcast_to_all_channels(server, TRANSFER_QUIT, trailingMsg); server.add_events_of(client, 0); for (std::map::iterator it = server.channels.begin(); it != server.channels.end(); it++) { Channel* channel = it->second; if (channel->is_member(client)) { - std::string chanName = channel->get_name(); + std::string chanName = it->first; Part cmd(chanName); cmd.execute(server, client); } diff --git a/srcs/server/ReplyHandler.cpp b/srcs/server/ReplyHandler.cpp index 609d2048..50c1e0d2 100644 --- a/srcs/server/ReplyHandler.cpp +++ b/srcs/server/ReplyHandler.cpp @@ -81,7 +81,7 @@ static std::string generate_non_numerical_response( case TRANSFER_INVITE: return (get_user_id_of(*sender) + "INVITE" + separatedParams); case TRANSFER_QUIT: - return (get_user_id_of(*sender) + "QUIT" + separatedParams); + return (get_user_id_of(*sender) + "QUIT" + separatedParams + trailingMessage); case TRANSFER_MODE: return (get_user_id_of(*sender) + "MODE" + separatedParams); case TRANSFER_TOPIC: From 70f3f5b80ce3b0fe5dc0f0d2bfab816bd0fa41a7 Mon Sep 17 00:00:00 2001 From: ilia Date: Mon, 10 Nov 2025 22:39:27 +0100 Subject: [PATCH 3/3] [fix] move the deletion of channel in Kick.cpp --- srcs/commands/Kick.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/srcs/commands/Kick.cpp b/srcs/commands/Kick.cpp index eb781f82..ace381ff 100644 --- a/srcs/commands/Kick.cpp +++ b/srcs/commands/Kick.cpp @@ -50,17 +50,18 @@ void Kick::_kick_users_from_chan(std::string& chanName, std::vector p.response(target, p.get_client(), TRANSFER_KICK, channel->get_name() + " " + target->get_nickname(), _msg); channel->broadcast(*server, TRANSFER_KICK, channel->get_name() + " " + target->get_nickname(), p.get_client(), _msg); p.response(p.get_client(), TRANSFER_KICK, channel->get_name() + " " + target->get_nickname(), _msg); - if (channel->get_nb_members() == 0) { - std::map::iterator it = server->channels.find(channel->get_name()); - if (it != server->channels.end()) { - server->channels.erase(it); - delete channel; - } - } + } else { p.response(ERR_USERNOTINCHANNEL, channel->get_name()); } } + if (channel->get_nb_members() == 0) { + std::map::iterator it = server->channels.find(channel->get_name()); + if (it != server->channels.end()) { + server->channels.erase(it); + delete channel; + } + } } void Kick::execute(Server& server, Client& client)