diff -Naur psi-0.10-test3-orig/iris/xmpp-im/client.cpp psi-0.10-test3/iris/xmpp-im/client.cpp --- psi-0.10-test3-orig/iris/xmpp-im/client.cpp 2005-11-22 22:02:23.000000000 +0000 +++ psi-0.10-test3/iris/xmpp-im/client.cpp 2005-11-23 20:05:56.000000000 +0000 @@ -738,7 +738,7 @@ // we go ahead and fall through in case // we got kicked or something case GroupChat::Closing: - if(us && !s.isAvailable()) { + if(us && !s.isAvailable() && (s.mucUserStatus() != 303)) { Jid j = i.j; d->groupChatList.remove(it); groupChatLeft(j); diff -Naur psi-0.10-test3-orig/src/groupchatdlg.cpp psi-0.10-test3/src/groupchatdlg.cpp --- psi-0.10-test3-orig/src/groupchatdlg.cpp 2005-11-22 22:02:25.000000000 +0000 +++ psi-0.10-test3/src/groupchatdlg.cpp 2005-11-23 20:08:29.000000000 +0000 @@ -659,23 +659,29 @@ { GCUserViewItem *lvi = (GCUserViewItem *)findEntry(nick); if(!lvi && - s.mucUserRole() > MUC::RoleNone) { + (s.mucUserRole() > MUC::RoleNone || s.mucUserRole() == MUC::RoleUnknown)) { QListViewItem *par = roleItem(s.mucUserRole()); - Q_ASSERT(par != NULL); // being safe + if (par == NULL) par = roleItem(MUC::RoleVisitor); lvi = new GCUserViewItem(par); lvi->setText(0, nick); } else { - if(lvi->s.mucUserRole() != s.mucUserRole() && + if(lvi && + lvi->s.mucUserRole() != s.mucUserRole() && s.mucUserRole() > MUC::RoleNone) { QListViewItem *par = lvi->parent(); par->takeItem(lvi); par = roleItem(s.mucUserRole()); - Q_ASSERT(par != NULL); // being safe + if (par == NULL) par = roleItem(MUC::RoleVisitor); par->insertItem(lvi); } } + if (lvi == NULL) { + qDebug("GCUserView::updateEntry(): Refused to updateEntry %s with role of none"); + return; + } + lvi->s = s; lvi->setPixmap(0, is->status(lvi->s)); sort();