void IrcChannel::joinIrcUsers(const QList<IrcUser *> &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<IrcUser *> newUsers; IrcUser *ircuser; for (int i = 0; i < users.count(); i++) { ircuser = users[i]; if (!ircuser || _userModes.contains(ircuser)) { addUserMode(ircuser, modes[i]); continue; } _userModes[ircuser] = modes[i]; ircuser->joinChannel(this); 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 newNicks << ircuser->nick(); newModes << modes[i]; newUsers << ircuser; } if (newNicks.isEmpty()) return; SYNC_OTHER(joinIrcUsers, ARG(newNicks), ARG(newModes)); emit ircUsersJoined(newUsers); }