{
bool isvalid = true;
if (mode.size() > 1) {
- qWarning() << "Channel" << name() << "received Channel User Mode which is longer then 1 Char:" << mode;
+ qWarning() << "Channel" << name() << "received Channel User Mode which is longer than 1 Char:" << mode;
isvalid = false;
}
return isvalid;
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()));
- // if you wonder why there is no counterpart to ircUserJoined:
- // the joines are propagted by the ircuser. the signal ircUserJoined is only for convenience
+ // If you wonder why there is no counterpart to ircUserJoined:
+ // the joins are propagated by the ircuser. The signal ircUserJoined is only for convenience
+
+ // Also update the IRC user's record of modes; this allows easier tracking
+ ircuser->addUserModes(modes[i]);
newNicks << ircuser->nick();
newModes << modes[i];
if (isKnownUser(ircuser)) {
_userModes.remove(ircuser);
ircuser->partChannel(this);
- // if you wonder why there is no counterpart to ircUserParted:
- // the joines are propagted by the ircuser. the signal ircUserParted is only for convenience
+ // If you wonder why there is no counterpart to ircUserParted:
+ // the joins are propagted by the ircuser. The signal ircUserParted is only for convenience
disconnect(ircuser, 0, this, 0);
emit ircUserParted(ircuser);
if (!_userModes[ircuser].contains(mode)) {
_userModes[ircuser] += mode;
+ // Also update the IRC user's record of modes; this allows easier tracking
+ ircuser->addUserModes(mode);
QString nick = ircuser->nick();
SYNC_OTHER(addUserMode, ARG(nick), ARG(mode))
emit ircUserModeAdded(ircuser, mode);
if (_userModes[ircuser].contains(mode)) {
_userModes[ircuser].remove(mode);
+ // Also update the IRC user's record of modes; this allows easier tracking
+ ircuser->removeUserModes(mode);
QString nick = ircuser->nick();
SYNC_OTHER(removeUserMode, ARG(nick), ARG(mode));
emit ircUserModeRemoved(ircuser, mode);
* C --> set value or remove
* D --> on/off
*
- * B and C behave very similar... we store the data in different datastructes
+ * B and C behave very similar... we store the data in different datastructures
* for future compatibility
******************************************************************************/