#127 Fixed removing and adding of members of channels

master
Tomatix 4 years ago
parent cde36f9fea
commit 7c75677cec
  1. 4
      IRCClient/IRCBasePriv.h
  2. 11
      IRCClient/IRCMember.cpp
  3. 2
      IRCClient/IRCMember.h
  4. 23
      IRCClient/Private/delMemberFromChannel.cpp

@ -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<std::string> V3Support {
"account-notify",

@ -7,6 +7,7 @@
#include "IRCMember.h"
#include "IRCChannel.h"
#include "Utilities.h"
#include <algorithm>
IRCMember::IRCMember(const IRCPrefix& prefix)
@ -36,7 +37,10 @@ void IRCMember::addChannel(std::weak_ptr<IRCChannel> channel)
{
auto it = std::find_if(m_channels.begin(), m_channels.end(),
[channel](const std::weak_ptr<IRCChannel>& 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<IRCChannel> channel)
{
auto it = std::find_if(m_channels.begin(), m_channels.end(),
[channel](const std::weak_ptr<IRCChannel>& 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())

@ -29,6 +29,8 @@ public:
void setNickname(const std::string& nickname);
bool isDangling() const { return !m_channels.empty(); }
private:
IRCPrefix m_prefix;
std::vector<std::weak_ptr<IRCChannel>> m_channels;

@ -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())

Loading…
Cancel
Save