diff --git a/srcs/commands/Kick.cpp b/srcs/commands/Kick.cpp index 012a59f4..ace381ff 100644 --- a/srcs/commands/Kick.cpp +++ b/srcs/commands/Kick.cpp @@ -50,10 +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); + } 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) 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..b6405c46 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 * @@ -28,7 +30,16 @@ 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 = it->first; + Part cmd(chanName); + cmd.execute(server, client); + } + } server.cleanup_socket_and_client(pfdIndex); } 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: