changed the behavior of RPL_AWAY server messages:
authorAlexander von Renteln <phon@quassel-irc.org>
Sun, 3 Feb 2008 04:24:19 +0000 (04:24 +0000)
committerAlexander von Renteln <phon@quassel-irc.org>
Sun, 3 Feb 2008 04:24:19 +0000 (04:24 +0000)
-away messages from whois request get into the status buffer
-away messages from query/msg replies will now be answered in a query
-away messages in queries will only be displayed once - and again after a one minute silence

added "/j channel" (only temporary until plugins are avaiable)

yeah, a "schnapszahl" version :-)

src/common/ircuser.cpp
src/common/ircuser.h
src/core/ircserverhandler.cpp
src/core/ircserverhandler.h
src/core/userinputhandler.cpp
src/core/userinputhandler.h
version.inc

index e8ccc37..704934b 100644 (file)
@@ -40,6 +40,7 @@ IrcUser::IrcUser(const QString &hostmask, Network *network)
     _server(),
     _idleTime(QDateTime::currentDateTime()),
     _ircOperator(),
     _server(),
     _idleTime(QDateTime::currentDateTime()),
     _ircOperator(),
+    _lastAwayMessage(0),
     _network(network),
     _codecForEncoding(0),
     _codecForDecoding(0)
     _network(network),
     _codecForEncoding(0),
     _codecForDecoding(0)
@@ -95,6 +96,10 @@ QString IrcUser::ircOperator() const {
   return _ircOperator;
 }
 
   return _ircOperator;
 }
 
+int IrcUser::lastAwayMessage() const {
+  return _lastAwayMessage;
+}
+
 QString IrcUser::userModes() const {
   return _userModes;
 }
 QString IrcUser::userModes() const {
   return _userModes;
 }
@@ -200,6 +205,13 @@ void IrcUser::setIrcOperator(const QString &ircOperator) {
   }
 }
 
   }
 }
 
+void IrcUser::setLastAwayMessage(const int &lastAwayMessage) {
+  if(lastAwayMessage > _lastAwayMessage) {
+    _lastAwayMessage = lastAwayMessage;
+    emit lastAwayMessageSet(lastAwayMessage);
+  }
+}
+
 void IrcUser::setHost(const QString &host) {
   if(!host.isEmpty() && _host != host) {
     _host = host;
 void IrcUser::setHost(const QString &host) {
   if(!host.isEmpty() && _host != host) {
     _host = host;
index 5fd4594..da96323 100644 (file)
@@ -45,6 +45,7 @@ class IrcUser : public SyncableObject {
   Q_PROPERTY(QDateTime idleTime READ idleTime WRITE setIdleTime STORED false)
   Q_PROPERTY(QString server READ server WRITE setServer STORED false)
   Q_PROPERTY(QString ircOperator READ ircOperator WRITE setIrcOperator STORED false)
   Q_PROPERTY(QDateTime idleTime READ idleTime WRITE setIdleTime STORED false)
   Q_PROPERTY(QString server READ server WRITE setServer STORED false)
   Q_PROPERTY(QString ircOperator READ ircOperator WRITE setIrcOperator STORED false)
+  Q_PROPERTY(int lastAwayMessage READ lastAwayMessage WRITE setLastAwayMessage STORED false)
 
   Q_PROPERTY(QStringList channels READ channels STORED false)
   //  Q_PROPERTY(QStringList usermodes READ usermodes WRITE setUsermodes)
 
   Q_PROPERTY(QStringList channels READ channels STORED false)
   //  Q_PROPERTY(QStringList usermodes READ usermodes WRITE setUsermodes)
@@ -63,6 +64,7 @@ public:
   QDateTime idleTime() const;
   QString server() const;
   QString ircOperator() const;
   QDateTime idleTime() const;
   QString server() const;
   QString ircOperator() const;
+  int lastAwayMessage() const;
   Network *network() const;
 
   QString userModes() const;
   Network *network() const;
 
   QString userModes() const;
@@ -90,6 +92,7 @@ public slots:
   void setIdleTime(const QDateTime &idleTime);
   void setServer(const QString &server);
   void setIrcOperator(const QString &ircOperator);
   void setIdleTime(const QDateTime &idleTime);
   void setServer(const QString &server);
   void setIrcOperator(const QString &ircOperator);
+  void setLastAwayMessage(const int &lastAwayMessage);
   void updateHostmask(const QString &mask);
 
   void setUserModes(const QString &modes);
   void updateHostmask(const QString &mask);
 
   void setUserModes(const QString &modes);
@@ -115,6 +118,7 @@ signals:
   void idleTimeSet(QDateTime idleTime);
   void serverSet(QString server);
   void ircOperatorSet(QString ircOperator);
   void idleTimeSet(QDateTime idleTime);
   void serverSet(QString server);
   void ircOperatorSet(QString ircOperator);
+  void lastAwayMessageSet(int lastAwayMessage);
   void hostmaskUpdated(QString mask);
 
   void userModesSet(QString modes);
   void hostmaskUpdated(QString mask);
 
   void userModesSet(QString modes);
@@ -154,6 +158,7 @@ private:
   QString _server;
   QDateTime _idleTime;
   QString _ircOperator;
   QString _server;
   QDateTime _idleTime;
   QString _ircOperator;
+  int _lastAwayMessage;
   
   // QSet<QString> _channels;
   QSet<IrcChannel *> _channels;
   
   // QSet<QString> _channels;
   QSet<IrcChannel *> _channels;
index 438404c..cb4c153 100644 (file)
@@ -35,7 +35,7 @@
 IrcServerHandler::IrcServerHandler(NetworkConnection *parent)
   : BasicHandler(parent),
     networkConnection(parent) {
 IrcServerHandler::IrcServerHandler(NetworkConnection *parent)
   : BasicHandler(parent),
     networkConnection(parent) {
-      _whowas = false;
+      _whois = false;
 }
 
 IrcServerHandler::~IrcServerHandler() {
 }
 
 IrcServerHandler::~IrcServerHandler() {
@@ -405,18 +405,32 @@ WHOWAS-Message:
 
 /*   RPL_AWAY - "<nick> :<away message>" */
 void IrcServerHandler::handle301(QString prefix, QList<QByteArray> params) {
 
 /*   RPL_AWAY - "<nick> :<away message>" */
 void IrcServerHandler::handle301(QString prefix, QList<QByteArray> params) {
-  Q_UNUSED(prefix)
-  IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
+  Q_UNUSED(prefix);
+  QString nickName = serverDecode(params[0]);
+  QString awayMessage = serverDecode(params.last());
+
+  IrcUser *ircuser = network()->ircUser(nickName);
   if(ircuser) {
   if(ircuser) {
-    ircuser->setAwayMessage(serverDecode(params.last()));
+    ircuser->setAwayMessage(awayMessage);
     ircuser->setAway(true);
   }
     ircuser->setAway(true);
   }
-  emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+
+  if(_whois) {
+    emit displayMsg(Message::Server, "", tr("[Whois] %1 is away: \"%2\"").arg(nickName).arg(awayMessage));
+  } else {
+    int now = QDateTime::currentDateTime().toTime_t();
+    int silenceTime = 60;
+    if(ircuser && ircuser->lastAwayMessage() + silenceTime < now) {
+      emit displayMsg(Message::Server, params[0], tr("%1 is away: \"%2\"").arg(nickName).arg(awayMessage));
+    }
+    ircuser->setLastAwayMessage(now);
+  }
 }
 
 /*  RPL_WHOISUSER - "<nick> <user> <host> * :<real name>" */
 void IrcServerHandler::handle311(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
 }
 
 /*  RPL_WHOISUSER - "<nick> <user> <host> * :<real name>" */
 void IrcServerHandler::handle311(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
+  _whois = true;
   IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
   if(ircuser) {
     ircuser->setUser(serverDecode(params[1]));
   IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
   if(ircuser) {
     ircuser->setUser(serverDecode(params[1]));
@@ -434,10 +448,10 @@ void IrcServerHandler::handle312(QString prefix, QList<QByteArray> params) {
   if(ircuser) {
     ircuser->setServer(serverDecode(params[1]));
   }
   if(ircuser) {
     ircuser->setServer(serverDecode(params[1]));
   }
-  if(_whowas) {
-    emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
-  } else {
+  if(_whois) {
     emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
     emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+  } else {
+    emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
   }
 }
 
   }
 }
 
@@ -454,7 +468,6 @@ void IrcServerHandler::handle313(QString prefix, QList<QByteArray> params) {
 /*  RPL_WHOWASUSER - "<nick> <user> <host> * :<real name>" */
 void IrcServerHandler::handle314(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
 /*  RPL_WHOWASUSER - "<nick> <user> <host> * :<real name>" */
 void IrcServerHandler::handle314(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
-  _whowas = true;
   emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
 }
 
   emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
 }
 
@@ -464,7 +477,9 @@ void IrcServerHandler::handle315(QString prefix, QList<QByteArray> params) {
   emit displayMsg(Message::Server, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
 }
 
   emit displayMsg(Message::Server, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
 }
 
-/*  RPL_WHOISIDLE - "<nick> <integer> :seconds idle" */
+/*  RPL_WHOISIDLE - "<nick> <integer> :seconds idle" 
+   (real life: "<nick> <integer> <integer> :seconds idle, signon time) */
+   //TODO: parse real life message
 void IrcServerHandler::handle317(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
   IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
 void IrcServerHandler::handle317(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
   IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
@@ -473,15 +488,16 @@ void IrcServerHandler::handle317(QString prefix, QList<QByteArray> params) {
     int idleSecs = serverDecode(params[1]).toInt();
     idleSecs *= -1;
     ircuser->setIdleTime(now.addSecs(idleSecs));
     int idleSecs = serverDecode(params[1]).toInt();
     idleSecs *= -1;
     ircuser->setIdleTime(now.addSecs(idleSecs));
-    emit displayMsg(Message::Server, "", tr("[Whois] %1 %2").arg(ircuser->nick()).arg(ircuser->idleTime().secsTo(now)));
+    emit displayMsg(Message::Server, "", tr("[Whois] %1 is idling for %2 seconds").arg(ircuser->nick()).arg(ircuser->idleTime().secsTo(now)));
   } else {
   } else {
-    emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+    emit displayMsg(Message::Server, "", tr("[Whois] idle message: %1").arg(serverDecode(params).join(" ")));
   }
 }
 
 /*  RPL_ENDOFWHOIS - "<nick> :End of WHOIS list" */
 void IrcServerHandler::handle318(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
   }
 }
 
 /*  RPL_ENDOFWHOIS - "<nick> :End of WHOIS list" */
 void IrcServerHandler::handle318(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
+  _whois = false;
   emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
 }
 
   emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
 }
 
@@ -558,7 +574,6 @@ void IrcServerHandler::handle353(QString prefix, QList<QByteArray> params) {
 /*  RPL_ENDOFWHOWAS - "<nick> :End of WHOWAS" */
 void IrcServerHandler::handle369(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
 /*  RPL_ENDOFWHOWAS - "<nick> :End of WHOWAS" */
 void IrcServerHandler::handle369(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
-  _whowas = false;
   emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
 }
 
   emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
 }
 
index 6149d15..ec9f201 100644 (file)
@@ -76,7 +76,7 @@ public slots:
 
 private:
   void tryNextNick(const QString &errnick);
 
 private:
   void tryNextNick(const QString &errnick);
-  bool _whowas;
+  bool _whois;
   NetworkConnection *networkConnection;
 };
 
   NetworkConnection *networkConnection;
 };
 
index b4a74ae..232c8cd 100644 (file)
@@ -104,6 +104,14 @@ void UserInputHandler::handleInvite(QString bufname, QString msg) {
   emit putCmd("INVITE", params);
 }
 
   emit putCmd("INVITE", params);
 }
 
+void UserInputHandler::handleJ(QString bufname, QString msg) {
+  QStringList params = msg.split(" ");
+  if(params.size() > 0 && !params[0].startsWith("#")) {
+    params[0] = QString("#%1").arg(params[0]);
+  }
+  emit putCmd("JOIN", params);
+}
+
 void UserInputHandler::handleJoin(QString bufname, QString msg) {
   emit putCmd("JOIN", msg.split(" "));
 }
 void UserInputHandler::handleJoin(QString bufname, QString msg) {
   emit putCmd("JOIN", msg.split(" "));
 }
index 1ead7c5..4070b40 100644 (file)
@@ -40,6 +40,7 @@ public slots:
   void handleDeop(QString, QString);
   void handleDevoice(QString, QString);
   void handleInvite(QString, QString);
   void handleDeop(QString, QString);
   void handleDevoice(QString, QString);
   void handleInvite(QString, QString);
+  void handleJ(QString, QString);
   void handleJoin(QString, QString);
   void handleKick(QString, QString);
   void handleList(QString, QString);
   void handleJoin(QString, QString);
   void handleKick(QString, QString);
   void handleList(QString, QString);
index 665f571..8c69ffd 100644 (file)
@@ -5,7 +5,7 @@
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-02";
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-02";
-  quasselBuild = 441;
+  quasselBuild = 444;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 435;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 435;