: BasicHandler("handleCtcp", session),
_coreSession(session)
{
- connect(coreSession(), SIGNAL(networkDisconnected(NetworkId)), this, SLOT(destroyNetsplits(NetworkId)));
- connect(this, SIGNAL(newEvent(Event *)), coreSession()->eventManager(), SLOT(postEvent(Event *)));
+ connect(coreSession(), &CoreSession::networkDisconnected, this, &CoreSessionEventProcessor::destroyNetsplits);
+ connect(this, &CoreSessionEventProcessor::newEvent, coreSession()->eventManager(), &EventManager::postEvent);
}
break;
}
- // If using away-notify, check new users. Works around buggy IRC servers
- // forgetting to send :away messages for users who join channels when away.
- if (net->capEnabled(IrcCap::AWAY_NOTIFY)) {
- net->queueAutoWhoOneshot(ircuser->nick());
- }
+ // With "away-notify" enabled, some IRC servers forget to send :away messages for users who join
+ // channels while away. Unfortunately, working around this involves WHO'ng every single user as
+ // they join, which is not very efficient. If at all possible, it's better to get the issue
+ // fixed in the IRC server instead.
+ //
+ // If pursuing a workaround instead, this is where you'd do it. Check the version control
+ // history for the commit that added this comment to see how to implement it - there's some
+ // unexpected situations to watch out for!
+ //
+ // See https://ircv3.net/specs/extensions/away-notify-3.1.html
if (!handledByNetsplit)
ircuser->joinChannel(channel);
QString modes = e->params()[1];
bool add = true;
int paramOffset = 2;
- for (int c = 0; c < modes.length(); c++) {
- if (modes[c] == '+') {
+ for (auto mode : modes) {
+ if (mode == '+') {
add = true;
continue;
}
- if (modes[c] == '-') {
+ if (mode == '-') {
add = false;
continue;
}
- if (e->network()->prefixModes().contains(modes[c])) {
+ if (e->network()->prefixModes().contains(mode)) {
// user channel modes (op, voice, etc...)
if (paramOffset < e->params().count()) {
IrcUser *ircUser = e->network()->ircUser(e->params()[paramOffset]);
foreach(Netsplit* n, _netsplits.value(e->network())) {
handledByNetsplit = n->userAlreadyJoined(ircUser->hostmask(), channel->name());
if (handledByNetsplit) {
- n->addMode(ircUser->hostmask(), channel->name(), QString(modes[c]));
+ n->addMode(ircUser->hostmask(), channel->name(), QString(mode));
break;
}
}
if (!handledByNetsplit)
- channel->addUserMode(ircUser, QString(modes[c]));
+ channel->addUserMode(ircUser, QString(mode));
}
else
- channel->removeUserMode(ircUser, QString(modes[c]));
+ channel->removeUserMode(ircUser, QString(mode));
}
}
else {
else {
// regular channel modes
QString value;
- Network::ChannelModeType modeType = e->network()->channelModeType(modes[c]);
+ Network::ChannelModeType modeType = e->network()->channelModeType(mode);
if (modeType == Network::A_CHANMODE || modeType == Network::B_CHANMODE || (modeType == Network::C_CHANMODE && add)) {
if (paramOffset < e->params().count()) {
value = e->params()[paramOffset];
}
if (add)
- channel->addChannelMode(modes[c], value);
+ channel->addChannelMode(mode, value);
else
- channel->removeChannelMode(modes[c], value);
+ channel->removeChannelMode(mode, value);
}
}
}
Netsplit *n;
if (!_netsplits[e->network()].contains(msg)) {
n = new Netsplit(e->network(), this);
- connect(n, SIGNAL(finished()), this, SLOT(handleNetsplitFinished()));
- connect(n, SIGNAL(netsplitJoin(Network*, QString, QStringList, QStringList, QString)),
- this, SLOT(handleNetsplitJoin(Network*, QString, QStringList, QStringList, QString)));
- connect(n, SIGNAL(netsplitQuit(Network*, QString, QStringList, QString)),
- this, SLOT(handleNetsplitQuit(Network*, QString, QStringList, QString)));
- connect(n, SIGNAL(earlyJoin(Network*, QString, QStringList, QStringList)),
- this, SLOT(handleEarlyNetsplitJoin(Network*, QString, QStringList, QStringList)));
+ connect(n, &Netsplit::finished, this, &CoreSessionEventProcessor::handleNetsplitFinished);
+ connect(n, &Netsplit::netsplitJoin,
+ this, &CoreSessionEventProcessor::handleNetsplitJoin);
+ connect(n, &Netsplit::netsplitQuit,
+ this, &CoreSessionEventProcessor::handleNetsplitQuit);
+ connect(n, &Netsplit::earlyJoin,
+ this, &CoreSessionEventProcessor::handleEarlyNetsplitJoin);
_netsplits[e->network()].insert(msg, n);
}
else {
if (!ircuser)
return;
- // Clear the user from the AutoWho queue if in it
- // This avoids needlessly checking a user that quickly joins then parts
- coreNetwork(e)->cancelAutoWhoOneshot(ircuser->nick());
-
ircuser->quit();
}
emit newEvent(new MessageEvent(Message::Error, e->network(), tr("Unable to perform key exchange, missing qca-ossl plugin."), e->prefix(), e->target(), Message::None, e->timestamp()));
return;
}
- CoreNetwork *net = qobject_cast<CoreNetwork*>(e->network());
+ auto *net = qobject_cast<CoreNetwork*>(e->network());
Cipher *c = net->cipher(e->target());
if (!c) // happens when there is no CoreIrcChannel for the target (i.e. never?)
return;
return;
QString channel = e->params()[0];
- // Store the nick separate from ircuser for AutoWho check below
- QString nick = e->params()[4];
- IrcUser *ircuser = e->network()->ircUser(nick);
+ IrcUser *ircuser = e->network()->ircUser(e->params()[4]);
if (ircuser) {
// Only process the WHO information if an IRC user exists. Don't create an IRC user here;
// there's no way to track when the user quits, which would leave a phantom IrcUser lying
}
// Check if channel name has a who in progress.
- // If not, then check if user nickname has a who in progress. Use nick directly; don't use
- // ircuser as that may be deleted (e.g. nick joins channel, leaves before WHO reply received).
- if (coreNetwork(e)->isAutoWhoInProgress(channel) ||
- (coreNetwork(e)->isAutoWhoInProgress(nick))) {
+ if (coreNetwork(e)->isAutoWhoInProgress(channel)) {
e->setFlag(EventManager::Silent);
}
}
return;
QString channel = e->params()[1];
- QString nick = e->params()[5];
- IrcUser *ircuser = e->network()->ircUser(nick);
+ IrcUser *ircuser = e->network()->ircUser(e->params()[5]);
if (ircuser) {
// Only process the WHO information if an IRC user exists. Don't create an IRC user here;
// there's no way to track when the user quits, which would leave a phantom IrcUser lying
}
// Check if channel name has a who in progress.
- // If not, then check if user nickname has a who in progress. Use nick directly; don't use
- // ircuser as that may be deleted (e.g. nick joins channel, leaves before WHO reply received).
- if (coreNetwork(e)->isAutoWhoInProgress(channel) ||
- (coreNetwork(e)->isAutoWhoInProgress(nick))) {
+ if (coreNetwork(e)->isAutoWhoInProgress(channel)) {
e->setFlag(EventManager::Silent);
}
}
void CoreSessionEventProcessor::handleNetsplitFinished()
{
- Netsplit *n = qobject_cast<Netsplit *>(sender());
+ auto *n = qobject_cast<Netsplit *>(sender());
Q_ASSERT(n);
QHash<QString, Netsplit *> splithash = _netsplits.take(n->network());
splithash.remove(splithash.key(n));