Properly remove the resource from the server when we leave the last channel

This commit is contained in:
louiz’
2016-07-03 16:01:15 +02:00
parent dadfc349d9
commit 0ce75ab521
3 changed files with 59 additions and 3 deletions
+14 -1
View File
@@ -349,9 +349,11 @@ void Bridge::leave_irc_channel(Iid&& iid, std::string&& status_message, const st
this->send_muc_leave(std::move(iid), std::move(nick),
"Biboumi note: "s + std::to_string(resources - 1) + " resources are still in this channel.",
true, resource);
if (this->number_of_channels_the_resource_is_in(iid.get_server(), resource) == 0)
this->remove_resource_from_server(iid.get_server(), resource);
}
}
}
}
void Bridge::send_irc_nick_change(const Iid& iid, const std::string& new_nick)
{
@@ -868,6 +870,17 @@ std::size_t Bridge::number_of_resources_in_chan(const Bridge::ChannelKey& channe
return it->second.size();
}
std::size_t Bridge::number_of_channels_the_resource_is_in(const std::string& irc_hostname, const std::string& resource) const
{
std::size_t res = 0;
for (auto pair: this->resources_in_chan)
{
if (std::get<0>(pair.first) == irc_hostname && pair.second.count(resource) != 0)
res++;
}
return res;
}
void Bridge::generate_channel_join_for_resource(const Iid& iid, const std::string& resource)
{
IrcClient* irc = this->get_irc_client(iid.get_server());
+1
View File
@@ -278,6 +278,7 @@ private:
void add_resource_to_server(const IrcHostname& irc_hostname, const std::string& resource);
void remove_resource_from_server(const IrcHostname& irc_hostname, const std::string& resource);
bool is_resource_in_server(const IrcHostname& irc_hostname, const std::string& resource) const;
size_t number_of_channels_the_resource_is_in(const std::string& irc_hostname, const std::string& resource) const;
/**
* Generate all the stanzas to be sent to this resource, simulating a join on this channel.