X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fircchannel.cpp;h=57be4e79c3c64087e0e42cf7b8f2cb822319177e;hp=832a5a993b05cdf01b3c02bd5241d30d186c8868;hb=ef12cc4010e853348474b4ea15c383dd596d4858;hpb=da3aa4136fe01e142238f0f42fe1273481037b9d diff --git a/src/common/ircchannel.cpp b/src/common/ircchannel.cpp index 832a5a99..57be4e79 100644 --- a/src/common/ircchannel.cpp +++ b/src/common/ircchannel.cpp @@ -125,21 +125,62 @@ void IrcChannel::setPassword(const QString &password) { emit passwordSet(password); } -void IrcChannel::join(IrcUser *ircuser) { - if(!_userModes.contains(ircuser) && ircuser) { - _userModes[ircuser] = QString(); +void IrcChannel::joinIrcUsers(const QList &users, const QStringList &modes) { + if(users.isEmpty()) + return; + + if(users.count() != modes.count()) { + qWarning() << "IrcChannel::addUsers(): number of nicks does not match number of modes!"; + return; + } + + QStringList newNicks; + QStringList newModes; + QList newUsers; + + IrcUser *ircuser; + for(int i = 0; i < users.count(); i++) { + ircuser = users[i]; + if(!ircuser || _userModes.contains(ircuser)) + continue; + + _userModes[ircuser] = modes[i]; ircuser->joinChannel(this); //qDebug() << "JOIN" << name() << ircuser->nick() << ircUsers().count(); connect(ircuser, SIGNAL(nickSet(QString)), this, SLOT(ircUserNickSet(QString))); connect(ircuser, SIGNAL(destroyed()), this, SLOT(ircUserDestroyed())); // if you wonder why there is no counterpart to ircUserJoined: // the joines are propagted by the ircuser. the signal ircUserJoined is only for convenience - emit ircUserJoined(ircuser); + + newNicks << ircuser->nick(); + newModes << modes[i]; + newUsers << ircuser; } + + if(newNicks.isEmpty()) + return; + + emit ircUsersJoined(newUsers); + emit ircUsersJoined(newNicks, newModes); } -void IrcChannel::join(const QString &nick) { - join(network->ircUser(nick)); +void IrcChannel::joinIrcUsers(const QStringList &nicks, const QStringList &modes) { + QList users; + foreach(QString nick, nicks) + users << network->newIrcUser(nick); + joinIrcUsers(users, modes); +} + +void IrcChannel::joinIrcUsers(IrcUser *ircuser) { + QList users; + users << ircuser; + QStringList modes; + modes << QString(); + joinIrcUsers(users, modes); +} + +void IrcChannel::joinIrcUsers(const QString &nick) { + joinIrcUsers(network->newIrcUser(nick)); } void IrcChannel::part(IrcUser *ircuser) { @@ -219,11 +260,15 @@ QVariantMap IrcChannel::initUserModes() const { } void IrcChannel::initSetUserModes(const QVariantMap &usermodes) { - QMapIterator iter(usermodes); - while(iter.hasNext()) { - iter.next(); - setUserModes(iter.key(), iter.value().toString()); + QList users; + QStringList modes; + QVariantMap::const_iterator iter = usermodes.constBegin(); + while(iter != usermodes.constEnd()) { + users << network->newIrcUser(iter.key()); + modes << iter.value().toString(); + iter++; } + joinIrcUsers(users, modes); } void IrcChannel::ircUserDestroyed() {