|
|
|
@ -360,24 +360,43 @@ struct IRCBasePriv |
|
|
|
|
{ |
|
|
|
|
auto member = super.getMember(prefix.nickname()); |
|
|
|
|
auto chanentry = super.getChannel(channel); |
|
|
|
|
if (member && chanentry) { |
|
|
|
|
member->delChannel(chanentry); |
|
|
|
|
chanentry->delMember(member); |
|
|
|
|
|
|
|
|
|
/* If not us and the member isn't known on any channels anymore, remove it. */ |
|
|
|
|
if (prefix.nickname() != nickname && member->channels().empty()) { |
|
|
|
|
auto it = std::find(allMembers.begin(), allMembers.end(), member); |
|
|
|
|
allMembers.erase(it); |
|
|
|
|
} |
|
|
|
|
if (member && chanentry) { |
|
|
|
|
member->delChannel(chanentry); |
|
|
|
|
|
|
|
|
|
/* Delete only if not us. */ |
|
|
|
|
if (member->channels().empty() && prefix.nickname() != nickname) { |
|
|
|
|
chanentry->delMember(member); |
|
|
|
|
auto it = std::find_if(allMembers.begin(), allMembers.end(), |
|
|
|
|
[&prefix](auto mem) { |
|
|
|
|
return prefix == mem->prefix(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
if (it != allMembers.end()) |
|
|
|
|
allMembers.erase(it); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* If us, delete everything we know about this channel */ |
|
|
|
|
else if (prefix.nickname() == nickname) |
|
|
|
|
channels.erase( |
|
|
|
|
std::find_if(channels.begin(), channels.end(), |
|
|
|
|
[&channel](std::weak_ptr<IRCChannel> cptr) { |
|
|
|
|
return channel == cptr.lock()->name(); |
|
|
|
|
} |
|
|
|
|
)); |
|
|
|
|
/* If us, delete everything we know about this channel. */ |
|
|
|
|
if (prefix.nickname() == nickname) { |
|
|
|
|
/* We also need to remove this channel from every member in that channel. */ |
|
|
|
|
for (auto m : chanentry->members()) { |
|
|
|
|
IRCPrefix mp = m.member()->prefix(); |
|
|
|
|
if (mp.nickname() == nickname) |
|
|
|
|
continue; |
|
|
|
|
delMemberFromChannel(mp, channel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
chanentry->delMember(member); |
|
|
|
|
|
|
|
|
|
/* Erase this channel */ |
|
|
|
|
auto it = std::find_if(channels.begin(), channels.end(), |
|
|
|
|
[&channel](auto cptr) { |
|
|
|
|
return channel == cptr->name(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
if (it != channels.end()) |
|
|
|
|
channels.erase(it); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -527,16 +546,6 @@ struct IRCBasePriv |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void delChannel(const std::string& name) |
|
|
|
|
{ |
|
|
|
|
auto iter = std::remove_if(channels.begin(), channels.end(), |
|
|
|
|
[name](const auto& ptr){ |
|
|
|
|
return ptr->name() == name; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
channels.erase(iter, channels.end()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void parseIncoming(const std::string& line); |
|
|
|
|
|
|
|
|
|
}; // IRCBasePriv
|
|
|
|
@ -1237,8 +1246,6 @@ void IRCBasePriv::parseIncoming(const std::string& line) |
|
|
|
|
else if (command == PART) { |
|
|
|
|
super.onMsgPart(sender, args[0], msg); |
|
|
|
|
delMemberFromChannel(sender, args[0]); |
|
|
|
|
if (sender.toString() == nickname) |
|
|
|
|
delChannel(args[0]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else if (command == TOPIC) { |
|
|
|
@ -1251,9 +1258,8 @@ void IRCBasePriv::parseIncoming(const std::string& line) |
|
|
|
|
|
|
|
|
|
else if (command == KICK) { |
|
|
|
|
super.onMsgKick(sender, args[0], args[1], msg); |
|
|
|
|
delMemberFromChannel(sender, args[0]); |
|
|
|
|
if (args[1] == nickname) |
|
|
|
|
delChannel(args[0]); |
|
|
|
|
auto prefix = IRCPrefix::fromNickname(args[1]); |
|
|
|
|
delMemberFromChannel(prefix, args[0]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else if (command == PRIVMSG) { |
|
|
|
|