diff options
author | louiz’ <louiz@louiz.org> | 2016-08-17 20:44:00 +0200 |
---|---|---|
committer | louiz’ <louiz@louiz.org> | 2016-08-17 20:47:33 +0200 |
commit | 5406de35a39c935a19460da06bf3dcd3948a00d5 (patch) | |
tree | ab40950828e7d7060826e2189a71880f5aa10886 /src/bridge | |
parent | a4ab1db55f8ca8e130528eed01eeee04ffc8369d (diff) | |
download | biboumi-5406de35a39c935a19460da06bf3dcd3948a00d5.tar.gz biboumi-5406de35a39c935a19460da06bf3dcd3948a00d5.tar.bz2 biboumi-5406de35a39c935a19460da06bf3dcd3948a00d5.tar.xz biboumi-5406de35a39c935a19460da06bf3dcd3948a00d5.zip |
On a client error, do not QUIT, just make the resource leave all channels
This should fix #3205
Diffstat (limited to 'src/bridge')
-rw-r--r-- | src/bridge/bridge.cpp | 16 | ||||
-rw-r--r-- | src/bridge/bridge.hpp | 6 |
2 files changed, 20 insertions, 2 deletions
diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp index 8323c77..f6fefd9 100644 --- a/src/bridge/bridge.cpp +++ b/src/bridge/bridge.cpp @@ -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(); diff --git a/src/bridge/bridge.hpp b/src/bridge/bridge.hpp index a1ff3ad..bcad030 100644 --- a/src/bridge/bridge.hpp +++ b/src/bridge/bridge.hpp @@ -45,6 +45,10 @@ public: */ 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 */ void clean(); @@ -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); |