Testing the new SyncObjects concept - looking good so far
[quassel.git] / src / common / ircuser.cpp
index 64f5d32..e42bea7 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-08 by the Quassel Project                          *
+ *   Copyright (C) 2005-09 by the Quassel Project                          *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -28,8 +28,8 @@
 #include <QTextCodec>
 #include <QDebug>
 
-IrcUser::IrcUser(const QString &hostmask, Network *network)
-  : SyncableObject(network),
+INIT_SYNCABLE_OBJECT(IrcUser)
+IrcUser::IrcUser(const QString &hostmask, Network *network) : SyncableObject(network),
     _initialized(false),
     _nick(nickFromMask(hostmask)),
     _user(userFromMask(hostmask)),
@@ -38,9 +38,10 @@ IrcUser::IrcUser(const QString &hostmask, Network *network)
     _awayMessage(),
     _away(false),
     _server(),
-    _idleTime(QDateTime::currentDateTime()),
+    // _idleTime(QDateTime::currentDateTime()),
     _ircOperator(),
     _lastAwayMessage(0),
+    _whoisServiceReply(),
     _network(network),
     _codecForEncoding(0),
     _codecForDecoding(0)
@@ -55,54 +56,16 @@ IrcUser::~IrcUser() {
 //  PUBLIC:
 // ====================
 
-QString IrcUser::user() const {
-  return _user;
-}
-
-QString IrcUser::host() const {
-  return _host;
-}
-
-QString IrcUser::nick() const {
-  return _nick;
-}
-
-QString IrcUser::realName() const {
-  return _realName;
-}
-
 QString IrcUser::hostmask() const {
   return QString("%1!%2@%3").arg(nick()).arg(user()).arg(host());
 }
 
-bool IrcUser::isAway() const {
-  return _away;
-}
-
-QString IrcUser::awayMessage() const {
-  return _awayMessage;
-}
-
-QString IrcUser::server() const {
-  return _server;
-}
-
-QDateTime IrcUser::idleTime() const {
+QDateTime IrcUser::idleTime() {
+  if(QDateTime::currentDateTime().toTime_t() - _idleTimeSet.toTime_t() > 1200)
+    _idleTime = QDateTime();
   return _idleTime;
 }
 
-QString IrcUser::ircOperator() const {
-  return _ircOperator;
-}
-
-int IrcUser::lastAwayMessage() const {
-  return _lastAwayMessage;
-}
-
-QString IrcUser::userModes() const {
-  return _userModes;
-}
-
 QStringList IrcUser::channels() const {
   QStringList chanList;
   IrcChannel *channel;
@@ -112,13 +75,6 @@ QStringList IrcUser::channels() const {
   return chanList;
 }
 
-Network* IrcUser::network() const {
-  return _network;
-}
-
-QTextCodec *IrcUser::codecForEncoding() const {
-  return _codecForEncoding;
-}
 
 void IrcUser::setCodecForEncoding(const QString &name) {
   setCodecForEncoding(QTextCodec::codecForName(name.toAscii()));
@@ -128,10 +84,6 @@ void IrcUser::setCodecForEncoding(QTextCodec *codec) {
   _codecForEncoding = codec;
 }
 
-QTextCodec *IrcUser::codecForDecoding() const {
-  return _codecForDecoding;
-}
-
 void IrcUser::setCodecForDecoding(const QString &name) {
   setCodecForDecoding(QTextCodec::codecForName(name.toAscii()));
 }
@@ -145,7 +97,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);
   }
@@ -158,63 +110,71 @@ QByteArray IrcUser::encodeString(const QString string) const {
 void IrcUser::setUser(const QString &user) {
   if(!user.isEmpty() && _user != user) {
     _user = user;
-    emit userSet(user);
+    SYNC(ARG(user));
   }
 }
 
 void IrcUser::setRealName(const QString &realName) {
   if (!realName.isEmpty() && _realName != realName) {
     _realName = realName;
-    emit realNameSet(realName);
+    SYNC(ARG(realName))
   }
 }
 
 void IrcUser::setAway(const bool &away) {
   if(away != _away) {
     _away = away;
-    emit awaySet(away);
+    SYNC(ARG(away))
   }
 }
 
 void IrcUser::setAwayMessage(const QString &awayMessage) {
   if(!awayMessage.isEmpty() && _awayMessage != awayMessage) {
     _awayMessage = awayMessage;
-    emit awayMessageSet(awayMessage);
+    SYNC(ARG(awayMessage))
   }
 }
 
 void IrcUser::setIdleTime(const QDateTime &idleTime) {
   if(idleTime.isValid() && _idleTime != idleTime) {
     _idleTime = idleTime;
-    emit idleTimeSet(idleTime);
+    _idleTimeSet = QDateTime::currentDateTime();
+    SYNC(ARG(idleTime))
+  }
+}
+
+void IrcUser::setLoginTime(const QDateTime &loginTime) {
+  if(loginTime.isValid() && _loginTime != loginTime) {
+    _loginTime = loginTime;
+    SYNC(ARG(loginTime))
   }
 }
 
 void IrcUser::setServer(const QString &server) {
   if(!server.isEmpty() && _server != server) {
     _server = server;
-    emit serverSet(server);
+    SYNC(ARG(server))
   }
 }
 
 void IrcUser::setIrcOperator(const QString &ircOperator) {
   if(!ircOperator.isEmpty() && _ircOperator != ircOperator) {
     _ircOperator = ircOperator;
-    emit ircOperatorSet(ircOperator);
+    SYNC(ARG(ircOperator))
   }
 }
 
 void IrcUser::setLastAwayMessage(const int &lastAwayMessage) {
   if(lastAwayMessage > _lastAwayMessage) {
     _lastAwayMessage = lastAwayMessage;
-    emit lastAwayMessageSet(lastAwayMessage);
+    SYNC(ARG(lastAwayMessage))
   }
 }
 
 void IrcUser::setHost(const QString &host) {
   if(!host.isEmpty() && _host != host) {
     _host = host;
-    emit hostSet(host);
+    SYNC(ARG(host))
   }
 }
 
@@ -222,19 +182,28 @@ void IrcUser::setNick(const QString &nick) {
   if(!nick.isEmpty() && nick != _nick) {
     _nick = nick;
     updateObjectName();
-    emit nickSet(nick);
+    SYNC(ARG(nick))
   }
 }
 
-void IrcUser::updateObjectName() {
-  QString newName = QString::number(network()->networkId().toInt()) + "/" + _nick;
-  QString oldName = objectName();
-  if(oldName != newName) {
-    setObjectName(newName);
-    emit renameObject(oldName, newName);
+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::updateObjectName() {
+  renameObject(QString::number(network()->networkId().toInt()) + "/" + _nick);
+}
+
 void IrcUser::updateHostmask(const QString &mask) {
   if(mask == hostmask())
     return;
@@ -249,9 +218,7 @@ void IrcUser::joinChannel(IrcChannel *channel) {
   Q_ASSERT(channel);
   if(!_channels.contains(channel)) {
     _channels.insert(channel);
-    channel->join(this);
-    connect(channel, SIGNAL(destroyed()), this, SLOT(channelDestroyed()));
-    emit channelJoined(channel->name());
+    channel->joinIrcUsers(this);
   }
 }
 
@@ -265,6 +232,8 @@ void IrcUser::partChannel(IrcChannel *channel) {
     disconnect(channel, 0, this, 0);
     channel->part(this);
     emit channelParted(channel->name());
+    if(_channels.isEmpty() && !network()->isMe(this))
+      quit();
   }
 }
 
@@ -277,38 +246,60 @@ void IrcUser::partChannel(const QString &channelname) {
   }
 }
 
+void IrcUser::quit() {
+  QList<IrcChannel *> channels = _channels.toList();
+  _channels.clear();
+  foreach(IrcChannel *channel, channels) {
+    disconnect(channel, 0, this, 0);
+    channel->part(this);
+  }
+  network()->removeIrcUser(this);
+  emit quited();
+}
+
 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() && !network()->isMe(this))
+      quit();
   }
 }
 
 void IrcUser::setUserModes(const QString &modes) {
   _userModes = modes;
-  emit userModesSet(modes);
+  SYNC(ARG(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;
+
+  for(int i = 0; i < modes.count(); i++) {
+    if(!_userModes.contains(modes[i]))
+      _userModes += modes[i];
   }
+
+  SYNC(ARG(modes))
 }
 
-void IrcUser::removeUserMode(const QString &mode) {
-  if(_userModes.contains(mode)) {
-    _userModes.remove(mode);
-    emit userModeRemoved(mode);
+void IrcUser::removeUserModes(const QString &modes) {
+  if(modes.isEmpty())
+    return;
+
+  for(int i = 0; i < modes.count(); i++) {
+    _userModes.remove(modes[i]);
   }
+  SYNC(ARG(modes))
 }
 
-void IrcUser::initSetChannels(const QStringList channels) {
-  foreach(QString channel, channels) {
-    joinChannel(channel);
-  }
+void IrcUser::setLastChannelActivity(BufferId buffer, const QDateTime &time) {
+  _lastActivity[buffer] = time;
+  emit lastChannelActivityUpdated(buffer, time);
 }
 
+void IrcUser::setLastSpokenTo(BufferId buffer, const QDateTime &time) {
+  _lastSpokenTo[buffer] = time;
+  emit lastSpokenToUpdated(buffer, time);
+}