On a client error, do not QUIT, just make the resource leave all channels
This should fix #3205
This commit is contained in:
+15
-1
@@ -60,6 +60,20 @@ void Bridge::shutdown(const std::string& exit_message)
|
||||
}
|
||||
}
|
||||
|
||||
void Bridge::remove_resource(const std::string& resource,
|
||||
const std::string& part_message)
|
||||
{
|
||||
const auto resources_in_chan_copy = this->resources_in_chan;
|
||||
for (const auto& chan_pair: resources_in_chan_copy)
|
||||
{
|
||||
const ChannelKey& channel_key = chan_pair.first;
|
||||
const std::set<Resource>& resources = chan_pair.second;
|
||||
if (resources.count(resource))
|
||||
this->leave_irc_channel({std::get<0>(channel_key), std::get<1>(channel_key), {}},
|
||||
part_message, resource);
|
||||
}
|
||||
}
|
||||
|
||||
void Bridge::clean()
|
||||
{
|
||||
auto it = this->irc_clients.begin();
|
||||
@@ -330,7 +344,7 @@ void Bridge::send_raw_message(const std::string& hostname, const std::string& bo
|
||||
irc->send_raw(body);
|
||||
}
|
||||
|
||||
void Bridge::leave_irc_channel(Iid&& iid, std::string&& status_message, const std::string& resource)
|
||||
void Bridge::leave_irc_channel(Iid&& iid, const std::string& status_message, const std::string& resource)
|
||||
{
|
||||
IrcClient* irc = this->get_irc_client(iid.get_server());
|
||||
const auto key = iid.to_tuple();
|
||||
|
||||
@@ -44,6 +44,10 @@ public:
|
||||
* QUIT all connected IRC servers.
|
||||
*/
|
||||
void shutdown(const std::string& exit_message);
|
||||
/**
|
||||
* PART the given resource from all the channels
|
||||
*/
|
||||
void remove_resource(const std::string& resource, const std::string& part_message);
|
||||
/**
|
||||
* Remove all inactive IrcClients
|
||||
*/
|
||||
@@ -70,7 +74,7 @@ public:
|
||||
void send_channel_message(const Iid& iid, const std::string& body);
|
||||
void send_private_message(const Iid& iid, const std::string& body, const std::string& type="PRIVMSG");
|
||||
void send_raw_message(const std::string& hostname, const std::string& body);
|
||||
void leave_irc_channel(Iid&& iid, std::string&& status_message, const std::string& resource);
|
||||
void leave_irc_channel(Iid&& iid, const std::string& status_message, const std::string& resource);
|
||||
void send_irc_nick_change(const Iid& iid, const std::string& new_nick);
|
||||
void send_irc_kick(const Iid& iid, const std::string& target, const std::string& reason,
|
||||
const std::string& iq_id, const std::string& to_jid);
|
||||
|
||||
Reference in New Issue
Block a user