From 7c75677cecec01260ecf1e44a6506d46cc6ee1ad Mon Sep 17 00:00:00 2001 From: Tomatix Date: Sun, 7 Nov 2021 13:42:44 +0100 Subject: [PATCH] #127 Fixed removing and adding of members of channels --- IRCClient/IRCBasePriv.h | 4 ++-- IRCClient/IRCMember.cpp | 11 +++++++++-- IRCClient/IRCMember.h | 2 ++ IRCClient/Private/delMemberFromChannel.cpp | 23 +++++++++++++++------- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/IRCClient/IRCBasePriv.h b/IRCClient/IRCBasePriv.h index 605d039..093be9a 100644 --- a/IRCClient/IRCBasePriv.h +++ b/IRCClient/IRCBasePriv.h @@ -24,8 +24,8 @@ namespace { /* Debug/development options */ -constexpr bool DumpReadData = true; -constexpr bool DumpWriteData = true; +constexpr bool DumpReadData = false; +constexpr bool DumpWriteData = false; const std::vector V3Support { "account-notify", diff --git a/IRCClient/IRCMember.cpp b/IRCClient/IRCMember.cpp index 5b9819d..ee84184 100644 --- a/IRCClient/IRCMember.cpp +++ b/IRCClient/IRCMember.cpp @@ -7,6 +7,7 @@ #include "IRCMember.h" #include "IRCChannel.h" +#include "Utilities.h" #include IRCMember::IRCMember(const IRCPrefix& prefix) @@ -36,7 +37,10 @@ void IRCMember::addChannel(std::weak_ptr channel) { auto it = std::find_if(m_channels.begin(), m_channels.end(), [channel](const std::weak_ptr& p){ - return p.lock()->name() == channel.lock()->name(); + if (p.expired()) + return false; + else + return strEquals(p.lock()->name(), channel.lock()->name()); }); if (it == m_channels.end()) @@ -47,7 +51,10 @@ void IRCMember::delChannel(std::weak_ptr channel) { auto it = std::find_if(m_channels.begin(), m_channels.end(), [channel](const std::weak_ptr& p){ - return p.lock()->name() == channel.lock()->name(); + if (p.expired()) + return false; + else + return strEquals(p.lock()->name(), channel.lock()->name()); }); if (it != m_channels.end()) diff --git a/IRCClient/IRCMember.h b/IRCClient/IRCMember.h index ed97e58..67f1bc3 100644 --- a/IRCClient/IRCMember.h +++ b/IRCClient/IRCMember.h @@ -29,6 +29,8 @@ public: void setNickname(const std::string& nickname); + bool isDangling() const { return !m_channels.empty(); } + private: IRCPrefix m_prefix; std::vector> m_channels; diff --git a/IRCClient/Private/delMemberFromChannel.cpp b/IRCClient/Private/delMemberFromChannel.cpp index 4524fe0..8e1792b 100644 --- a/IRCClient/Private/delMemberFromChannel.cpp +++ b/IRCClient/Private/delMemberFromChannel.cpp @@ -7,6 +7,7 @@ #include "../IRCBase.h" #include "../IRCBasePriv.h" +#include "../Utilities.h" void IRCBasePriv::delMemberFromChannel(const IRCPrefix& prefix, const std::string& channel) { @@ -31,13 +32,21 @@ void IRCBasePriv::delMemberFromChannel(const IRCPrefix& prefix, const std::strin } /* If us, delete everything we know about this channel. */ - if (prefix.nickname() == nickname) { + else if (prefix.nickname() == nickname) { /* We also need to remove this channel from every member in that channel. */ - for (const auto& m : chanentry->members()) { - IRCPrefix mp = m.member()->prefix(); - if (mp.nickname() == nickname) - continue; - delMemberFromChannel(mp, channel); + for (const auto& mptr : chanentry->members()) { + const auto& m = mptr.member(); + IRCPrefix p = m->prefix(); + if (p.nickname() != nickname) { + m->delChannel(chanentry); + if (m->isDangling()) { + auto amit = std::find_if(allMembers.begin(), allMembers.end(), [&p](const auto& ptr){ + return ptr->prefix() == p; + }); + if (amit != allMembers.end()) + allMembers.erase(amit); + } + } } chanentry->delMember(member); @@ -45,7 +54,7 @@ void IRCBasePriv::delMemberFromChannel(const IRCPrefix& prefix, const std::strin /* Erase this channel */ auto it = std::find_if(channels.begin(), channels.end(), [&channel](auto cptr) { - return channel == cptr->name(); + return strEquals(channel, cptr->name()); }); if (it != channels.end())