Fix protocol spam on part/quit/disconnect
authorJanne Koschinski <janne@kuschku.de>
Tue, 28 May 2019 11:04:06 +0000 (13:04 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Thu, 9 Jan 2020 19:10:01 +0000 (20:10 +0100)
src/common/ircchannel.cpp
src/common/ircuser.cpp
src/common/ircuser.h

index 15093b3..2b95518 100644 (file)
@@ -231,7 +231,7 @@ void IrcChannel::part(IrcUser* ircuser)
             _userModes.clear();
             foreach (IrcUser* user, users) {
                 disconnect(user, nullptr, this, nullptr);
             _userModes.clear();
             foreach (IrcUser* user, users) {
                 disconnect(user, nullptr, this, nullptr);
-                user->partChannel(this);
+                user->partChannel(this, true);
             }
             emit parted();
             network()->removeIrcChannel(this);
             }
             emit parted();
             network()->removeIrcChannel(this);
index d7b65f0..94d404d 100644 (file)
@@ -291,16 +291,16 @@ void IrcUser::joinChannel(const QString& channelname)
     joinChannel(network()->newIrcChannel(channelname));
 }
 
     joinChannel(network()->newIrcChannel(channelname));
 }
 
-void IrcUser::partChannel(IrcChannel* channel)
+void IrcUser::partChannel(IrcChannel* channel, bool skip_sync)
 {
     if (_channels.contains(channel)) {
         _channels.remove(channel);
         disconnect(channel, nullptr, this, nullptr);
         channel->part(this);
         QString channelName = channel->name();
 {
     if (_channels.contains(channel)) {
         _channels.remove(channel);
         disconnect(channel, nullptr, this, nullptr);
         channel->part(this);
         QString channelName = channel->name();
-        SYNC_OTHER(partChannel, ARG(channelName))
+        if (!skip_sync) SYNC_OTHER(partChannel, ARG(channelName))
         if (_channels.isEmpty() && !network()->isMe(this))
         if (_channels.isEmpty() && !network()->isMe(this))
-            quit();
+            quit(skip_sync);
     }
 }
 
     }
 }
 
@@ -315,7 +315,7 @@ void IrcUser::partChannel(const QString& channelname)
     }
 }
 
     }
 }
 
-void IrcUser::quit()
+void IrcUser::quit(bool skip_sync)
 {
     QList<IrcChannel*> channels = _channels.values();
     _channels.clear();
 {
     QList<IrcChannel*> channels = _channels.values();
     _channels.clear();
@@ -324,7 +324,7 @@ void IrcUser::quit()
         channel->part(this);
     }
     network()->removeIrcUser(this);
         channel->part(this);
     }
     network()->removeIrcUser(this);
-    SYNC(NO_ARG)
+    if (!skip_sync) SYNC(NO_ARG)
     emit quited();
 }
 
     emit quited();
 }
 
index 8184770..2aa2c17 100644 (file)
@@ -166,9 +166,9 @@ public slots:
      */
     void joinChannel(IrcChannel* channel, bool skip_channel_join = false);
     void joinChannel(const QString& channelname);
      */
     void joinChannel(IrcChannel* channel, bool skip_channel_join = false);
     void joinChannel(const QString& channelname);
-    void partChannel(IrcChannel* channel);
+    void partChannel(IrcChannel* channel, bool skip_sync = false);
     void partChannel(const QString& channelname);
     void partChannel(const QString& channelname);
-    void quit();
+    void quit(bool skip_sync = false);
 
     void addUserModes(const QString& modes);
     void removeUserModes(const QString& modes);
 
     void addUserModes(const QString& modes);
     void removeUserModes(const QString& modes);