Reset the preferred private JID when all resources leave a room

For example if we are talking in private with nick Joe from
room #foo, and then we leave that room, we start receiving Joe’s
message from the server-wide JID

e2e tests included!!!
This commit is contained in:
louiz’
2016-06-10 10:00:48 +02:00
parent 7540f67933
commit 272c0e4995
3 changed files with 35 additions and 1 deletions
+18 -1
View File
@@ -344,7 +344,12 @@ void Bridge::leave_irc_channel(Iid&& iid, std::string&& status_message, const st
const auto resources = this->number_of_resources_in_chan(key);
if (resources == 1)
irc->send_part_command(iid.get_local(), status_message);
{
irc->send_part_command(iid.get_local(), status_message);
// Since there are no resources left in that channel, we don't
// want to receive private messages using this room's JID
this->remove_all_preferred_from_jid_of_room(iid.get_local());
}
else
{
IrcChannel* chan = irc->get_channel(iid.get_local());
@@ -767,6 +772,18 @@ void Bridge::remove_preferred_from_jid(const std::string& nick)
this->preferred_user_from.erase(it);
}
void Bridge::remove_all_preferred_from_jid_of_room(const std::string& channel_name)
{
for (auto it = this->preferred_user_from.begin(); it != this->preferred_user_from.end();)
{
Iid iid(Jid(it->second).local);
if (iid.get_local() == channel_name)
it = this->preferred_user_from.erase(it);
else
++it;
}
}
void Bridge::add_waiting_irc(irc_responder_callback_t&& callback)
{
this->waiting_irc.emplace_back(std::move(callback));