}
#endif /* HAVE_QCA2 */
-bool CoreNetwork::setAutoWhoDone(const QString &channel)
+bool CoreNetwork::setAutoWhoDone(const QString &name)
{
- QString chan = channel.toLower();
- if (_autoWhoPending.value(chan, 0) <= 0)
+ QString chanOrNick = name.toLower();
+ if (_autoWhoPending.value(chanOrNick, 0) <= 0)
return false;
- if (--_autoWhoPending[chan] <= 0)
- _autoWhoPending.remove(chan);
+ if (--_autoWhoPending[chanOrNick] <= 0)
+ _autoWhoPending.remove(chanOrNick);
return true;
}
_autoWhoQueue = channels();
}
-void CoreNetwork::queueAutoWhoOneshot(const QString &channelOrNick)
+void CoreNetwork::queueAutoWhoOneshot(const QString &name)
{
// Prepend so these new channels/nicks are the first to be checked
// Don't allow duplicates
- if (!_autoWhoQueue.contains(channelOrNick.toLower())) {
- _autoWhoQueue.prepend(channelOrNick.toLower());
+ if (!_autoWhoQueue.contains(name.toLower())) {
+ _autoWhoQueue.prepend(name.toLower());
}
if (capEnabled(IrcCap::AWAY_NOTIFY)) {
// When away-notify is active, the timer's stopped. Start a new cycle to who this channel.
}
if (supports("WHOX")) {
// Use WHO extended to poll away users and/or user accounts
+ // Explicitly only match on nickname ("n"), don't rely on server defaults
+ //
+ // WHO <nickname> n%chtsunfra,<unique_number>
+ //
// See http://faerion.sourceforge.net/doc/irc/whox.var
- // And https://github.com/hexchat/hexchat/blob/c874a9525c9b66f1d5ddcf6c4107d046eba7e2c5/src/common/proto-irc.c#L750
- putRawLine(serverEncode(QString("WHO %1 %%chtsunfra,%2")
- .arg(serverEncode(chanOrNick), QString::number(IrcCap::ACCOUNT_NOTIFY_WHOX_NUM))));
+ // And https://github.com/quakenet/snircd/blob/master/doc/readme.who
+ // And https://github.com/hexchat/hexchat/blob/57478b65758e6b697b1d82ce21075e74aa475efc/src/common/proto-irc.c#L752
+ putRawLine(serverEncode(QString("WHO %1 n%chtsunfra,%2")
+ .arg(serverEncode(chanOrNick),
+ QString::number(IrcCap::ACCOUNT_NOTIFY_WHOX_NUM))));
} else {
+ // Fall back to normal WHO
+ //
+ // Note: According to RFC 1459, "WHO <phrase>" can fall back to searching realname,
+ // hostmask, etc. There's nothing we can do about that :(
+ //
+ // See https://tools.ietf.org/html/rfc1459#section-4.5.1
putRawLine(serverEncode(QString("WHO %1").arg(chanOrNick)));
}
break;