QUIT the irc server when the last channel is left
This commit is contained in:
@@ -42,7 +42,7 @@ void Bridge::shutdown()
|
|||||||
{
|
{
|
||||||
for (auto it = this->irc_clients.begin(); it != this->irc_clients.end(); ++it)
|
for (auto it = this->irc_clients.begin(); it != this->irc_clients.end(); ++it)
|
||||||
{
|
{
|
||||||
it->second->send_quit_command();
|
it->second->send_quit_command("Gateway shutdown");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,6 +193,9 @@ void Bridge::send_message(const Iid& iid, const std::string& nick, const std::st
|
|||||||
void Bridge::send_muc_leave(Iid&& iid, std::string&& nick, const std::string& message, const bool self)
|
void Bridge::send_muc_leave(Iid&& iid, std::string&& nick, const std::string& message, const bool self)
|
||||||
{
|
{
|
||||||
this->xmpp->send_muc_leave(std::move(iid.chan) + "%" + std::move(iid.server), std::move(nick), this->make_xmpp_body(message), this->user_jid, self);
|
this->xmpp->send_muc_leave(std::move(iid.chan) + "%" + std::move(iid.server), std::move(nick), this->make_xmpp_body(message), this->user_jid, self);
|
||||||
|
IrcClient* irc = this->get_irc_client(iid.server);
|
||||||
|
if (irc && irc->number_of_joined_channels() == 0)
|
||||||
|
irc->send_quit_command("");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bridge::send_nick_change(Iid&& iid,
|
void Bridge::send_nick_change(Iid&& iid,
|
||||||
|
|||||||
@@ -134,9 +134,9 @@ void IrcClient::send_topic_command(const std::string& chan_name, const std::stri
|
|||||||
this->send_message(IrcMessage("TOPIC", {chan_name, topic}));
|
this->send_message(IrcMessage("TOPIC", {chan_name, topic}));
|
||||||
}
|
}
|
||||||
|
|
||||||
void IrcClient::send_quit_command()
|
void IrcClient::send_quit_command(const std::string& reason)
|
||||||
{
|
{
|
||||||
this->send_message(IrcMessage("QUIT", {"gateway shutdown"}));
|
this->send_message(IrcMessage("QUIT", {reason}));
|
||||||
}
|
}
|
||||||
|
|
||||||
void IrcClient::send_join_command(const std::string& chan_name)
|
void IrcClient::send_join_command(const std::string& chan_name)
|
||||||
@@ -403,7 +403,6 @@ void IrcClient::on_part(const IrcMessage& message)
|
|||||||
iid.chan = chan_name;
|
iid.chan = chan_name;
|
||||||
iid.server = this->hostname;
|
iid.server = this->hostname;
|
||||||
bool self = channel->get_self()->nick == nick;
|
bool self = channel->get_self()->nick == nick;
|
||||||
this->bridge->send_muc_leave(std::move(iid), std::move(nick), std::move(txt), self);
|
|
||||||
if (self)
|
if (self)
|
||||||
{
|
{
|
||||||
channel->joined = false;
|
channel->joined = false;
|
||||||
@@ -411,6 +410,7 @@ void IrcClient::on_part(const IrcMessage& message)
|
|||||||
// channel pointer is now invalid
|
// channel pointer is now invalid
|
||||||
channel = nullptr;
|
channel = nullptr;
|
||||||
}
|
}
|
||||||
|
this->bridge->send_muc_leave(std::move(iid), std::move(nick), std::move(txt), self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -608,3 +608,8 @@ void IrcClient::on_user_mode(const IrcMessage& message)
|
|||||||
std::string("User mode for ") + message.arguments[0] +
|
std::string("User mode for ") + message.arguments[0] +
|
||||||
" is [" + message.arguments[1] + "]");
|
" is [" + message.arguments[1] + "]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t IrcClient::number_of_joined_channels() const
|
||||||
|
{
|
||||||
|
return this->channels.size();
|
||||||
|
}
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Send the QUIT irc command
|
* Send the QUIT irc command
|
||||||
*/
|
*/
|
||||||
void send_quit_command();
|
void send_quit_command(const std::string& reason);
|
||||||
/**
|
/**
|
||||||
* Send a message to the gateway user, not generated by the IRC server,
|
* Send a message to the gateway user, not generated by the IRC server,
|
||||||
* but that might be useful because we want to be verbose (for example we
|
* but that might be useful because we want to be verbose (for example we
|
||||||
@@ -186,6 +186,10 @@ public:
|
|||||||
*/
|
*/
|
||||||
void on_channel_mode(const IrcMessage& message);
|
void on_channel_mode(const IrcMessage& message);
|
||||||
void on_quit(const IrcMessage& message);
|
void on_quit(const IrcMessage& message);
|
||||||
|
/**
|
||||||
|
* Return the number of joined channels
|
||||||
|
*/
|
||||||
|
size_t number_of_joined_channels() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user