The complete source code of IdealIRC http://www.idealirc.org/
 
 
 
 
idealirc/IRCClient/Private/delMemberFromChannel.cpp

63 lines
2.1 KiB

/*
* IdealIRC Core - Internet Relay Chat API
* Copyright (C) 2021 Tom-Andre Barstad.
* This software is licensed under the Software Attribution License.
* See LICENSE for more information.
*/
#include "../IRCBase.h"
#include "../IRCBasePriv.h"
#include "../Utilities.h"
void IRCBasePriv::delMemberFromChannel(const IRCPrefix& prefix, const std::string& channel)
{
auto member = super.getMember(prefix.nickname());
auto chanentry = super.getChannel(channel);
if (!member || !chanentry)
return;
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) {
/* We also need to remove this channel from every member in that 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);
/* Erase this channel */
auto it = std::find_if(channels.begin(), channels.end(),
[&channel](auto cptr) {
return strEquals(channel, cptr->name());
});
if (it != channels.end())
channels.erase(it);
}
}