+void IrcUser::setWhoisServiceReply(const QString& whoisServiceReply)
+{
+ if (!whoisServiceReply.isEmpty() && whoisServiceReply != _whoisServiceReply) {
+ _whoisServiceReply = whoisServiceReply;
+ SYNC(ARG(whoisServiceReply))
+ }
+}
+
+void IrcUser::setSuserHost(const QString& suserHost)
+{
+ if (!suserHost.isEmpty() && suserHost != _suserHost) {
+ _suserHost = suserHost;
+ SYNC(ARG(suserHost))
+ }
+}
+
+void IrcUser::setEncrypted(bool encrypted)
+{
+ _encrypted = encrypted;
+ emit encryptedSet(encrypted);
+ SYNC(ARG(encrypted))
+}
+
+void IrcUser::updateObjectName()
+{
+ setObjectName(QString::number(network()->networkId().toInt()) + "/" + _nick);
+}
+
+void IrcUser::updateHostmask(const QString& mask)
+{
+ if (mask == hostmask())
+ return;
+
+ QString user = userFromMask(mask);
+ QString host = hostFromMask(mask);
+ setUser(user);
+ setHost(host);
+}
+
+void IrcUser::joinChannel(IrcChannel* channel, bool skip_channel_join)
+{
+ Q_ASSERT(channel);
+ if (!_channels.contains(channel)) {
+ _channels.insert(channel);
+ if (!skip_channel_join)
+ channel->joinIrcUser(this);
+ }
+}
+
+void IrcUser::joinChannel(const QString& channelname)
+{
+ joinChannel(network()->newIrcChannel(channelname));
+}
+
+void IrcUser::partChannel(IrcChannel* channel)
+{
+ partChannelInternal(channel, false);
+}
+
+void IrcUser::partChannel(const QString& channelname)
+{
+ IrcChannel* channel = network()->ircChannel(channelname);
+ if (channel == nullptr) {
+ qWarning() << "IrcUser::partChannel(): received part for unknown Channel" << channelname;
+ }
+ else {
+ partChannel(channel);
+ }
+}
+
+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_OTHER(quit, NO_ARG)
+ emit quited();