-void IrcUser::channelDestroyed() {
- // private slot!
- IrcChannel *channel = static_cast<IrcChannel*>(sender());
- if(_channels.contains(channel)) {
- _channels.remove(channel);
- if(_channels.isEmpty() && !network()->isMe(this))
- quit();
- }
+void IrcUser::partChannelInternal(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 (!skip_sync) SYNC_OTHER(partChannel, ARG(channelName))
+ if (_channels.isEmpty() && !network()->isMe(this))
+ quitInternal(skip_sync);
+ }
+}
+
+void IrcUser::quit()
+{
+ quitInternal(false);
+}
+
+void IrcUser::quitInternal(bool skip_sync)
+{
+ QList<IrcChannel*> channels = _channels.values();
+ _channels.clear();
+ foreach (IrcChannel* channel, channels) {
+ disconnect(channel, nullptr, this, nullptr);
+ channel->part(this);
+ }
+ network()->removeIrcUser(this);
+ if (!skip_sync) SYNC(NO_ARG)
+ emit quited();
+}
+
+void IrcUser::channelDestroyed()
+{
+ // private slot!
+ auto* channel = static_cast<IrcChannel*>(sender());
+ if (_channels.contains(channel)) {
+ _channels.remove(channel);
+ if (_channels.isEmpty() && !network()->isMe(this))
+ quit();
+ }