|
|
|
@ -18,7 +18,7 @@ using asio::ip::tcp; |
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
/* Debug/development options */ |
|
|
|
|
constexpr bool DumpReadData = true; |
|
|
|
|
constexpr bool DumpReadData = false; |
|
|
|
|
constexpr bool DumpWriteData = false; |
|
|
|
|
|
|
|
|
|
const std::vector<std::string> V3Support { |
|
|
|
@ -361,43 +361,44 @@ struct IRCBasePriv |
|
|
|
|
auto member = super.getMember(prefix.nickname()); |
|
|
|
|
auto chanentry = super.getChannel(channel); |
|
|
|
|
|
|
|
|
|
if (member && chanentry) { |
|
|
|
|
member->delChannel(chanentry); |
|
|
|
|
if (!member || !chanentry) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
/* 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(); |
|
|
|
|
}); |
|
|
|
|
member->delChannel(chanentry); |
|
|
|
|
|
|
|
|
|
if (it != allMembers.end()) |
|
|
|
|
allMembers.erase(it); |
|
|
|
|
} |
|
|
|
|
/* 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 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); |
|
|
|
|
if (it != allMembers.end()) |
|
|
|
|
allMembers.erase(it); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* 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 (const 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); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
IRCError verify_X509(X509* cert) |
|
|
|
@ -964,7 +965,7 @@ void IRCBasePriv::parseIncoming(const std::string& line) |
|
|
|
|
std::string msg; |
|
|
|
|
IRCPrefix sender(hostname); |
|
|
|
|
|
|
|
|
|
if (line[0] == ':') { |
|
|
|
|
if (line[0] == ':') { |
|
|
|
|
// :server.addr cmd arg :msg
|
|
|
|
|
enum class S { |
|
|
|
|
Prefix, |
|
|
|
@ -1235,14 +1236,15 @@ void IRCBasePriv::parseIncoming(const std::string& line) |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
/* We are joining a channel */ |
|
|
|
|
auto channelName = msg.empty() ? args[0] : msg; |
|
|
|
|
if (sender.nickname() == nickname) { |
|
|
|
|
auto chanentry = super.getChannel(msg); |
|
|
|
|
auto chanentry = super.getChannel(channelName); |
|
|
|
|
if (!chanentry) |
|
|
|
|
channels.emplace_back(std::make_shared<IRCChannel>(msg, super)); |
|
|
|
|
channels.emplace_back(std::make_shared<IRCChannel>(channelName, super)); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
addMemberToChannel(sender, msg); |
|
|
|
|
super.onMsgJoin(sender, msg); |
|
|
|
|
addMemberToChannel(sender, channelName); |
|
|
|
|
super.onMsgJoin(sender, channelName); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1396,7 +1398,6 @@ void IRCBasePriv::parseIncoming(const std::string& line) |
|
|
|
|
for (const auto& c : chans) { |
|
|
|
|
const auto cptr = c.lock(); |
|
|
|
|
channelsAffected.push_back(cptr->name()); |
|
|
|
|
cptr->delMember(member); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
super.v3onMsgAway(sender, msg, channelsAffected); |
|
|
|
|