diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bridge/bridge.cpp | 10 | ||||
-rw-r--r-- | src/irc/irc_channel.cpp | 6 | ||||
-rw-r--r-- | src/irc/irc_channel.hpp | 15 |
3 files changed, 18 insertions, 13 deletions
diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp index 7724ba7..fb7ea42 100644 --- a/src/bridge/bridge.cpp +++ b/src/bridge/bridge.cpp @@ -360,7 +360,15 @@ void Bridge::leave_irc_channel(Iid&& iid, const std::string& status_message, con const auto resources = this->number_of_resources_in_chan(key); if (resources == 1) { - irc->send_part_command(iid.get_local(), status_message); + // Do not send a PART message if we actually are not in that channel + // or if we already sent a PART but we are just waiting for the + // acknowledgment from the server + IrcChannel* channel = irc->get_channel(iid.get_local()); + if (channel->joined && !channel->parting) + { + irc->send_part_command(iid.get_local(), status_message); + channel->parting = true; + } // 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()); diff --git a/src/irc/irc_channel.cpp b/src/irc/irc_channel.cpp index e769245..40d7f54 100644 --- a/src/irc/irc_channel.cpp +++ b/src/irc/irc_channel.cpp @@ -1,12 +1,6 @@ #include <irc/irc_channel.hpp> #include <algorithm> -IrcChannel::IrcChannel(): - joined(false), - self(nullptr) -{ -} - void IrcChannel::set_self(const std::string& name) { this->self = std::make_unique<IrcUser>(name); diff --git a/src/irc/irc_channel.hpp b/src/irc/irc_channel.hpp index 2bcefaf..7c269b9 100644 --- a/src/irc/irc_channel.hpp +++ b/src/irc/irc_channel.hpp @@ -14,16 +14,19 @@ class IrcChannel { public: - explicit IrcChannel(); + IrcChannel() = default; IrcChannel(const IrcChannel&) = delete; IrcChannel(IrcChannel&&) = delete; IrcChannel& operator=(const IrcChannel&) = delete; IrcChannel& operator=(IrcChannel&&) = delete; - bool joined; - std::string topic; - std::string topic_author; + bool joined{false}; + // Set to true if we sent a PART but didn’t yet receive the PART ack from + // the server + bool parting{false}; + std::string topic{}; + std::string topic_author{}; void set_self(const std::string& name); IrcUser* get_self() const; IrcUser* add_user(const std::string& name, @@ -35,8 +38,8 @@ public: { return this->users; } protected: - std::unique_ptr<IrcUser> self; - std::vector<std::unique_ptr<IrcUser>> users; + std::unique_ptr<IrcUser> self{}; + std::vector<std::unique_ptr<IrcUser>> users{}; }; /** |