Properly remove the resource from the server when we leave the last channel
This commit is contained in:
+14
-1
@@ -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());
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user