Before, we would send WHO in regular intervals even if no reply came back yet.
I suspect this, together with network issues, could be the reason for SendQ Exceeded
and similar issues.
Note that if we miss an ENDWHO reply now somehow, we won't ever send WHO again. I hope
this cannot happen.
_autoWhoEnabled(true),
_autoWhoInterval(90),
_autoWhoNickLimit(0), // unlimited
_autoWhoEnabled(true),
_autoWhoInterval(90),
_autoWhoNickLimit(0), // unlimited
{
_autoReconnectTimer.setSingleShot(true);
_socketCloseTimer.setSingleShot(true);
{
_autoReconnectTimer.setSingleShot(true);
_socketCloseTimer.setSingleShot(true);
void CoreNetwork::setChannelParted(const QString &channel) {
removeChannelKey(channel);
_autoWhoQueue.removeAll(channel.toLower());
void CoreNetwork::setChannelParted(const QString &channel) {
removeChannelKey(channel);
_autoWhoQueue.removeAll(channel.toLower());
- _autoWhoInProgress.remove(channel.toLower());
+ _autoWhoPending.remove(channel.toLower());
Core::setChannelPersistent(userId(), networkId(), channel, false);
}
Core::setChannelPersistent(userId(), networkId(), channel, false);
}
}
bool CoreNetwork::setAutoWhoDone(const QString &channel) {
}
bool CoreNetwork::setAutoWhoDone(const QString &channel) {
- if(_autoWhoInProgress.value(channel.toLower(), 0) <= 0)
+ QString chan = channel.toLower();
+ if(_autoWhoPending.value(chan, 0) <= 0)
- _autoWhoInProgress[channel.toLower()]--;
+ if(--_autoWhoPending[chan] <= 0)
+ _autoWhoPending.remove(chan);
_autoWhoCycleTimer.stop();
_autoWhoTimer.stop();
_autoWhoQueue.clear();
_autoWhoCycleTimer.stop();
_autoWhoTimer.stop();
_autoWhoQueue.clear();
- _autoWhoInProgress.clear();
+ _autoWhoPending.clear();
_socketCloseTimer.stop();
_socketCloseTimer.stop();
}
void CoreNetwork::sendAutoWho() {
}
void CoreNetwork::sendAutoWho() {
+ // Don't send autowho if there are still some pending
+ if(_autoWhoPending.count())
+ return;
+
while(!_autoWhoQueue.isEmpty()) {
QString chan = _autoWhoQueue.takeFirst();
IrcChannel *ircchan = ircChannel(chan);
if(!ircchan) continue;
if(_autoWhoNickLimit > 0 && ircchan->ircUsers().count() > _autoWhoNickLimit) continue;
while(!_autoWhoQueue.isEmpty()) {
QString chan = _autoWhoQueue.takeFirst();
IrcChannel *ircchan = ircChannel(chan);
if(!ircchan) continue;
if(_autoWhoNickLimit > 0 && ircchan->ircUsers().count() > _autoWhoNickLimit) continue;
- _autoWhoInProgress[chan]++;
+ _autoWhoPending[chan]++;
putRawLine("WHO " + serverEncode(chan));
if(_autoWhoQueue.isEmpty() && _autoWhoEnabled && !_autoWhoCycleTimer.isActive()) {
// Timer was stopped, means a new cycle is due immediately
putRawLine("WHO " + serverEncode(chan));
if(_autoWhoQueue.isEmpty() && _autoWhoEnabled && !_autoWhoCycleTimer.isActive()) {
// Timer was stopped, means a new cycle is due immediately
inline QString channelKey(const QString &channel) const { return _channelKeys.value(channel.toLower(), QString()); }
inline QString channelKey(const QString &channel) const { return _channelKeys.value(channel.toLower(), QString()); }
- inline bool isAutoWhoInProgress(const QString &channel) const { return _autoWhoInProgress.value(channel.toLower(), 0); }
+ inline bool isAutoWhoInProgress(const QString &channel) const { return _autoWhoPending.value(channel.toLower(), 0); }
inline UserId userId() const { return _coreSession->user(); }
inline UserId userId() const { return _coreSession->user(); }
bool _autoWhoEnabled;
QStringList _autoWhoQueue;
bool _autoWhoEnabled;
QStringList _autoWhoQueue;
- QHash<QString, int> _autoWhoInProgress;
+ QHash<QString, int> _autoWhoPending;
int _autoWhoInterval;
int _autoWhoNickLimit;
int _autoWhoDelay;
int _autoWhoInterval;
int _autoWhoNickLimit;
int _autoWhoDelay;