The complete source code of IdealIRC
http://www.idealirc.org/
63 lines
2.1 KiB
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);
|
|
}
|
|
}
|
|
|