~singpolyma/biboumi

3620d533ee88a8804317d2745320c0186192ddaa — louiz’ 7 years ago 55daa3e
Avoid sending PART command for unjoined channels

fix #3205
3 files changed, 18 insertions(+), 13 deletions(-)

M src/bridge/bridge.cpp
M src/irc/irc_channel.cpp
M src/irc/irc_channel.hpp
M src/bridge/bridge.cpp => src/bridge/bridge.cpp +9 -1
@@ 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());

M src/irc/irc_channel.cpp => src/irc/irc_channel.cpp +0 -6
@@ 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);

M src/irc/irc_channel.hpp => src/irc/irc_channel.hpp +9 -6
@@ 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{};
};

/**