Closing BR #126
[quassel.git] / src / common / ircuser.cpp
index 99f2ae3..ed875e0 100644 (file)
@@ -28,8 +28,7 @@
 #include <QTextCodec>
 #include <QDebug>
 
-IrcUser::IrcUser(const QString &hostmask, Network *network)
-  : SyncableObject(network),
+IrcUser::IrcUser(const QString &hostmask, Network *network) : SyncableObject(network),
     _initialized(false),
     _nick(nickFromMask(hostmask)),
     _user(userFromMask(hostmask)),
@@ -49,10 +48,6 @@ IrcUser::IrcUser(const QString &hostmask, Network *network)
 }
 
 IrcUser::~IrcUser() {
-  QList<IrcChannel *> channels = _channels.toList();
-  foreach(IrcChannel *channel, channels) {
-    partChannel(channel);
-  }
 }
 
 // ====================
@@ -149,7 +144,7 @@ QString IrcUser::decodeString(const QByteArray &text) const {
   return ::decodeString(text, codecForDecoding());
 }
 
-QByteArray IrcUser::encodeString(const QString string) const {
+QByteArray IrcUser::encodeString(const QString &string) const {
   if(codecForEncoding()) {
     return codecForEncoding()->fromUnicode(string);
   }
@@ -231,12 +226,7 @@ void IrcUser::setNick(const QString &nick) {
 }
 
 void IrcUser::updateObjectName() {
-  QString newName = QString::number(network()->networkId().toInt()) + "/" + _nick;
-  QString oldName = objectName();
-  if(oldName != newName) {
-    setObjectName(newName);
-    emit renameObject(oldName, newName);
-  }
+  renameObject(QString::number(network()->networkId().toInt()) + "/" + _nick);
 }
 
 void IrcUser::updateHostmask(const QString &mask) {
@@ -253,9 +243,8 @@ void IrcUser::joinChannel(IrcChannel *channel) {
   Q_ASSERT(channel);
   if(!_channels.contains(channel)) {
     _channels.insert(channel);
-    channel->join(this);
+    channel->joinIrcUsers(this);
     connect(channel, SIGNAL(destroyed()), this, SLOT(channelDestroyed()));
-    emit channelJoined(channel->name());
   }
 }
 
@@ -269,6 +258,8 @@ void IrcUser::partChannel(IrcChannel *channel) {
     disconnect(channel, 0, this, 0);
     channel->part(this);
     emit channelParted(channel->name());
+    if(_channels.isEmpty() && network()->isMe(this))
+      deleteLater();
   }
 }
 
@@ -284,10 +275,10 @@ void IrcUser::partChannel(const QString &channelname) {
 void IrcUser::channelDestroyed() {
   // private slot!
   IrcChannel *channel = static_cast<IrcChannel*>(sender());
-  Q_ASSERT(channel);
   if(_channels.contains(channel)) {
     _channels.remove(channel);
-    disconnect(channel, 0, this, 0);
+    if(_channels.isEmpty())
+      deleteLater();
   }
 }
 
@@ -296,23 +287,24 @@ void IrcUser::setUserModes(const QString &modes) {
   emit userModesSet(modes);
 }
 
-void IrcUser::addUserMode(const QString &mode) {
-  if(!_userModes.contains(mode)) {
-    _userModes += mode;
-    emit userModeAdded(mode);
-  }
-}
+void IrcUser::addUserModes(const QString &modes) {
+  if(modes.isEmpty())
+    return;
 
-void IrcUser::removeUserMode(const QString &mode) {
-  if(_userModes.contains(mode)) {
-    _userModes.remove(mode);
-    emit userModeRemoved(mode);
+  for(int i = 0; i < modes.count(); i++) {
+    if(!_userModes.contains(modes[i]))
+      _userModes += modes[i];
   }
+
+  emit userModesAdded(modes);
 }
 
-void IrcUser::initSetChannels(const QStringList channels) {
-  foreach(QString channel, channels) {
-    joinChannel(channel);
+void IrcUser::removeUserModes(const QString &modes) {
+  if(modes.isEmpty())
+    return;
+
+  for(int i = 0; i < modes.count(); i++) {
+    _userModes.remove(modes[i]);
   }
+  emit userModesRemoved(modes);
 }
-