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