AWAY messages acted as QUIT by deleting internal user the representation

master
Tomatix 5 years ago
parent 42bcd361d8
commit 7e628017b8
  1. 81
      IRCClient/IRCBase.cpp
  2. 5
      IRCClient/IRCMember.cpp

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

@ -38,12 +38,13 @@ void IRCMember::addChannel(std::weak_ptr<IRCChannel> channel)
void IRCMember::delChannel(std::weak_ptr<IRCChannel> channel)
{
auto newEnd = std::remove_if(m_channels.begin(), m_channels.end(),
auto it = std::find_if(m_channels.begin(), m_channels.end(),
[channel](const std::weak_ptr<IRCChannel>& p){
return p.lock()->name() == channel.lock()->name();
});
m_channels.erase(newEnd, m_channels.end());
if (it != m_channels.end())
m_channels.erase(it);
}
void IRCMember::setNickname(const std::string& nickname)

Loading…
Cancel
Save