common: Make frequently called util methods more efficient
[quassel.git] / src / common / ircchannel.cpp
index be1347b..a5d5c82 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2015 by the Quassel Project                        *
+ *   Copyright (C) 2005-2016 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -178,12 +178,20 @@ void IrcChannel::joinIrcUsers(const QList<IrcUser *> &users, const QStringList &
     for (int i = 0; i < users.count(); i++) {
         ircuser = users[i];
         if (!ircuser || _userModes.contains(ircuser)) {
-            addUserMode(ircuser, modes[i]);
+            if (modes[i].count() > 1) {
+                // Multiple modes received, do it one at a time
+                // TODO Better way of syncing this without breaking protocol?
+                for (int i_m = 0; i_m < modes[i].count(); ++i_m) {
+                    addUserMode(ircuser, modes[i][i_m]);
+                }
+            } else {
+                addUserMode(ircuser, modes[i]);
+            }
             continue;
         }
 
         _userModes[ircuser] = modes[i];
-        ircuser->joinChannel(this);
+        ircuser->joinChannel(this, true);
         connect(ircuser, SIGNAL(nickSet(QString)), this, SLOT(ircUserNickSet(QString)));
 
         // connect(ircuser, SIGNAL(destroyed()), this, SLOT(ircUserDestroyed()));
@@ -321,7 +329,7 @@ QVariantMap IrcChannel::initUserModes() const
     QHash<IrcUser *, QString>::const_iterator iter = _userModes.constBegin();
     while (iter != _userModes.constEnd()) {
         usermodes[iter.key()->nick()] = iter.value();
-        iter++;
+        ++iter;
     }
     return usermodes;
 }
@@ -335,7 +343,7 @@ void IrcChannel::initSetUserModes(const QVariantMap &usermodes)
     while (iter != usermodes.constEnd()) {
         users << network()->newIrcUser(iter.key());
         modes << iter.value().toString();
-        iter++;
+        ++iter;
     }
     joinIrcUsers(users, modes);
 }
@@ -349,7 +357,7 @@ QVariantMap IrcChannel::initChanModes() const
     QHash<QChar, QStringList>::const_iterator A_iter = _A_channelModes.constBegin();
     while (A_iter != _A_channelModes.constEnd()) {
         A_modes[A_iter.key()] = A_iter.value();
-        A_iter++;
+        ++A_iter;
     }
     channelModes["A"] = A_modes;
 
@@ -357,7 +365,7 @@ QVariantMap IrcChannel::initChanModes() const
     QHash<QChar, QString>::const_iterator B_iter = _B_channelModes.constBegin();
     while (B_iter != _B_channelModes.constEnd()) {
         B_modes[B_iter.key()] = B_iter.value();
-        B_iter++;
+        ++B_iter;
     }
     channelModes["B"] = B_modes;
 
@@ -365,7 +373,7 @@ QVariantMap IrcChannel::initChanModes() const
     QHash<QChar, QString>::const_iterator C_iter = _C_channelModes.constBegin();
     while (C_iter != _C_channelModes.constEnd()) {
         C_modes[C_iter.key()] = C_iter.value();
-        C_iter++;
+        ++C_iter;
     }
     channelModes["C"] = C_modes;
 
@@ -373,7 +381,7 @@ QVariantMap IrcChannel::initChanModes() const
     QSet<QChar>::const_iterator D_iter = _D_channelModes.constBegin();
     while (D_iter != _D_channelModes.constEnd()) {
         D_modes += *D_iter;
-        D_iter++;
+        ++D_iter;
     }
     channelModes["D"] = D_modes;
 
@@ -387,21 +395,21 @@ void IrcChannel::initSetChanModes(const QVariantMap &channelModes)
     QVariantMap::const_iterator iterEnd = channelModes["A"].toMap().constEnd();
     while (iter != iterEnd) {
         _A_channelModes[iter.key()[0]] = iter.value().toStringList();
-        iter++;
+        ++iter;
     }
 
     iter = channelModes["B"].toMap().constBegin();
     iterEnd = channelModes["B"].toMap().constEnd();
     while (iter != iterEnd) {
         _B_channelModes[iter.key()[0]] = iter.value().toString();
-        iter++;
+        ++iter;
     }
 
     iter = channelModes["C"].toMap().constBegin();
     iterEnd = channelModes["C"].toMap().constEnd();
     while (iter != iterEnd) {
         _C_channelModes[iter.key()[0]] = iter.value().toString();
-        iter++;
+        ++iter;
     }
 
     QString D_modes = channelModes["D"].toString();
@@ -596,21 +604,21 @@ QString IrcChannel::channelModeString() const
     QSet<QChar>::const_iterator D_iter = _D_channelModes.constBegin();
     while (D_iter != _D_channelModes.constEnd()) {
         modeString += *D_iter;
-        D_iter++;
+        ++D_iter;
     }
 
     QHash<QChar, QString>::const_iterator BC_iter = _C_channelModes.constBegin();
     while (BC_iter != _C_channelModes.constEnd()) {
         modeString += BC_iter.key();
         params << BC_iter.value();
-        BC_iter++;
+        ++BC_iter;
     }
 
     BC_iter = _B_channelModes.constBegin();
     while (BC_iter != _B_channelModes.constEnd()) {
         modeString += BC_iter.key();
         params << BC_iter.value();
-        BC_iter++;
+        ++BC_iter;
     }
     if (modeString.isEmpty())
         return modeString;