We now send WHO every 60 seconds for all channels we are in. This keeps the nicklist,
authorManuel Nickschas <sputnick@quassel-irc.org>
Tue, 19 Feb 2008 23:30:24 +0000 (23:30 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 19 Feb 2008 23:30:24 +0000 (23:30 +0000)
especially the away status, current. Temporarily RPL_WHO output is completely disabled to not
spam the status buffer. We need to find a way to distinguish auto queries from user-generated ones...
Also made the networkmodel aware of away status changes in IrcUser.

src/client/networkmodel.cpp
src/client/networkmodel.h
src/core/ircserverhandler.cpp
src/core/networkconnection.cpp
src/core/networkconnection.h

index 05340a3..e96e367 100644 (file)
@@ -484,6 +484,8 @@ IrcUserItem::IrcUserItem(IrcUser *ircUser, AbstractTreeItem *parent)
   
   connect(ircUser, SIGNAL(nickSet(QString)),
          this, SLOT(setNick(QString)));
+  connect(ircUser, SIGNAL(awaySet(bool)),
+          this, SLOT(setAway(bool)));
 }
 
 QString IrcUserItem::nickName() const {
@@ -567,6 +569,11 @@ void IrcUserItem::setNick(QString newNick) {
   emit dataChanged(0);
 }
 
+void IrcUserItem::setAway(bool away) {
+  Q_UNUSED(away);
+  emit dataChanged(0);
+}
+
 /*****************************************
  * NetworkModel
  *****************************************/
index 9cfc7b7..6ac06f8 100644 (file)
@@ -182,9 +182,10 @@ public:
   virtual quint64 id() const;
   virtual QVariant data(int column, int role) const;
   virtual QString toolTip(int column) const;
-                                  
+
 private slots:
   void setNick(QString newNick);
+  void setAway(bool);
 
 private:
   QPointer<IrcUser> _ircUser;
index 3b58903..335bd3a 100644 (file)
@@ -463,7 +463,9 @@ void IrcServerHandler::handle314(const QString &prefix, const QList<QByteArray>
 /*  RPL_ENDOFWHO: "<name> :End of WHO list" */
 void IrcServerHandler::handle315(const QString &prefix, const QList<QByteArray> &params) {
   Q_UNUSED(prefix)
-  emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
+  // FIXME temporarily made silent
+  Q_UNUSED(params)
+  // emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
 }
 
 /*  RPL_WHOISIDLE - "<nick> <integer> :seconds idle" 
@@ -538,7 +540,8 @@ void IrcServerHandler::handle352(const QString &prefix, const QList<QByteArray>
     ircuser->setRealName(serverDecode(params.last()).section(" ", 1));
   }
 
-  emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
+  // FIXME temporarily made silent
+  //emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
 }
 
 /* RPL_NAMREPLY */
index 651a1be..e56bb93 100644 (file)
@@ -46,7 +46,13 @@ NetworkConnection::NetworkConnection(Network *network, CoreSession *session) : Q
     _autoReconnectCount(0)
 {
   _autoReconnectTimer.setSingleShot(true);
+
+  // TODO make configurable
+  _whoTimer.setInterval(60 * 1000);
+  _whoTimer.setSingleShot(false);
+
   connect(&_autoReconnectTimer, SIGNAL(timeout()), this, SLOT(doAutoReconnect()));
+  connect(&_whoTimer, SIGNAL(timeout()), this, SLOT(sendWho()));
 
   connect(network, SIGNAL(currentServerSet(const QString &)), this, SLOT(networkInitialized(const QString &)));
   connect(network, SIGNAL(useAutoReconnectSet(bool)), this, SLOT(autoReconnectSettingsChanged()));
@@ -204,7 +210,8 @@ void NetworkConnection::networkInitialized(const QString &currentServer) {
   setConnectionState(Network::Initialized);
   network()->setConnected(true);
   emit connected(networkId());
-
+  sendWho();
+  _whoTimer.start();
 }
 
 void NetworkConnection::sendPerform() {
@@ -294,6 +301,7 @@ void NetworkConnection::socketStateChanged(QAbstractSocket::SocketState socketSt
 }
 
 void NetworkConnection::socketDisconnected() {
+  _whoTimer.stop();
   network()->setConnected(false);
   emit disconnected(networkId());
   if(_autoReconnectCount == 0) emit quitRequested(networkId());
@@ -338,6 +346,12 @@ void NetworkConnection::putCmd(const QString &cmd, const QVariantList &params, c
   putRawLine(msg);
 }
 
+void NetworkConnection::sendWho() {
+  foreach(QString chan, network()->channels()) {
+    putRawLine("WHO " + serverEncode(chan));
+  }
+}
+
 void NetworkConnection::addChannelKey(const QString &channel, const QString &key) {
   if(key.isEmpty()) removeChannelKey(channel);
   else _channelKeys[channel] = key;
index f9db515..57fd9d2 100644 (file)
@@ -95,6 +95,7 @@ private slots:
   void sendPerform();
   void autoReconnectSettingsChanged();
   void doAutoReconnect();
+  void sendWho();
   void nickChanged(const QString &newNick, const QString &oldNick); // this signal is inteded to rename query buffers in the storage backend
 
 signals:
@@ -129,6 +130,7 @@ private:
 
   Network *_network;
   CoreSession *_coreSession;
+  BufferInfo _statusBufferInfo;
 
   IrcServerHandler *_ircServerHandler;
   UserInputHandler *_userInputHandler;
@@ -138,6 +140,8 @@ private:
   QTimer _autoReconnectTimer;
   int _autoReconnectCount;
 
+  QTimer _whoTimer;
+
   class ParseError : public Exception {
   public:
     ParseError(QString cmd, QString prefix, QStringList params);