M src/irc/irc_client.cpp => src/irc/irc_client.cpp +24 -0
@@ 89,6 89,8 @@ void IrcClient::parse_in_buffer()
this->on_welcome_message(message);
else if (message.command == "PART")
this->on_part(message);
+ else if (message.command == "QUIT")
+ this->on_quit(message);
}
}
@@ 257,3 259,25 @@ void IrcClient::on_part(const IrcMessage& message)
channel->joined = false;
}
}
+
+void IrcClient::on_quit(const IrcMessage& message)
+{
+ std::string txt;
+ if (message.arguments.size() >= 1)
+ txt = message.arguments[0];
+ for (auto it = this->channels.begin(); it != this->channels.end(); ++it)
+ {
+ const std::string chan_name = it->first;
+ IrcChannel* channel = it->second.get();
+ const IrcUser* user = channel->find_user(message.prefix);
+ if (user)
+ {
+ std::string nick = user->nick;
+ channel->remove_user(user);
+ Iid iid;
+ iid.chan = chan_name;
+ iid.server = this->hostname;
+ this->bridge->send_muc_leave(std::move(iid), std::move(nick), std::move(txt), false);
+ }
+ }
+}
M src/irc/irc_client.hpp => src/irc/irc_client.hpp +4 -0
@@ 114,6 114,10 @@ public:
* When a PART message is received
*/
void on_part(const IrcMessage& message);
+ /**
+ * When a QUIT message is received
+ */
+ void on_quit(const IrcMessage& message);
private:
/**