added ircserverhandler for whois, who and whowas
authorAlexander von Renteln <phon@quassel-irc.org>
Thu, 31 Jan 2008 15:58:07 +0000 (15:58 +0000)
committerAlexander von Renteln <phon@quassel-irc.org>
Thu, 31 Jan 2008 15:58:07 +0000 (15:58 +0000)
added away and awaymessage to ircuser
added away and awaymessage to user tooltip

src/client/networkmodel.cpp
src/common/ircuser.cpp
src/common/ircuser.h
src/core/ircserverhandler.cpp
src/core/ircserverhandler.h

index ba9d0c8..1cde086 100644 (file)
@@ -472,7 +472,14 @@ QVariant IrcUserItem::data(int column, int role) const {
 
 QString IrcUserItem::toolTip(int column) const {
   Q_UNUSED(column);
 
 QString IrcUserItem::toolTip(int column) const {
   Q_UNUSED(column);
-  return "<p><b>" + nickName() + "</b><br />" + _ircUser->hostmask() + "</p>";
+  QString toolTip = "<b>" + nickName() + "</b><br />" + _ircUser->hostmask();
+  if(_ircUser->isAway()) {
+    toolTip += "<br /> away";
+    if(!_ircUser->awayMessage().isEmpty()) { 
+      toolTip += " (" + _ircUser->awayMessage() + ")"; 
+    }
+  }
+  return "<p>" + toolTip + "</p>";
 }
 
 void IrcUserItem::setNick(QString newNick) {
 }
 
 void IrcUserItem::setNick(QString newNick) {
index 5f05f0f..f7fc9b0 100644 (file)
@@ -39,6 +39,7 @@ IrcUser::IrcUser(const QString &hostmask, Network *network)
     _codecForDecoding(0)
 {
   updateObjectName();
     _codecForDecoding(0)
 {
   updateObjectName();
+  _away = false;
 }
 
 IrcUser::~IrcUser() {
 }
 
 IrcUser::~IrcUser() {
@@ -61,10 +62,22 @@ QString IrcUser::nick() const {
   return _nick;
 }
 
   return _nick;
 }
 
+QString IrcUser::realName() const {
+  return _realName;
+}
+
 QString IrcUser::hostmask() const {
   return QString("%1!%2@%3").arg(nick()).arg(user()).arg(host());
 }
 
 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::userModes() const {
   return _userModes;
 }
 QString IrcUser::userModes() const {
   return _userModes;
 }
@@ -128,6 +141,28 @@ void IrcUser::setUser(const QString &user) {
   }
 }
 
   }
 }
 
+void IrcUser::setRealName(const QString &realName) {
+  if (!realName.isEmpty() && _realName != realName) {
+    _realName = realName;
+    emit realNameSet(realName);
+  }
+}
+
+void IrcUser::setAway(const bool &away) {
+  if(away != _away) {
+    _away = away;
+    emit awaySet(away);
+  }
+}
+
+void IrcUser::setAwayMessage(const QString &awayMessage) {
+  if(!awayMessage.isEmpty() && _awayMessage != awayMessage) {
+    _awayMessage = awayMessage;
+    emit awayMessageSet(awayMessage);
+  }
+}
+
+
 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 45be422..768de50 100644 (file)
@@ -38,6 +38,9 @@ class IrcUser : public SyncableObject {
   Q_PROPERTY(QString user READ user WRITE setUser STORED false)
   Q_PROPERTY(QString host READ host WRITE setHost STORED false)
   Q_PROPERTY(QString nick READ nick WRITE setNick STORED false)
   Q_PROPERTY(QString user READ user WRITE setUser STORED false)
   Q_PROPERTY(QString host READ host WRITE setHost STORED false)
   Q_PROPERTY(QString nick READ nick WRITE setNick STORED false)
+  Q_PROPERTY(QString realName READ realName WRITE setRealName STORED false)
+  Q_PROPERTY(bool away READ isAway WRITE setAway STORED false)
+  Q_PROPERTY(QString awayMessage READ awayMessage WRITE setAwayMessage 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)
@@ -49,7 +52,10 @@ public:
   QString user() const;
   QString host() const;
   QString nick() const;
   QString user() const;
   QString host() const;
   QString nick() const;
+  QString realName() const; 
   QString hostmask() const;
   QString hostmask() const;
+  bool isAway() const;
+  QString awayMessage() const;
   Network *network() const;
 
   QString userModes() const;
   Network *network() const;
 
   QString userModes() const;
@@ -71,6 +77,9 @@ public slots:
   void setUser(const QString &user);
   void setHost(const QString &host);
   void setNick(const QString &nick);
   void setUser(const QString &user);
   void setHost(const QString &host);
   void setNick(const QString &nick);
+  void setRealName(const QString &realName);
+  void setAway(const bool &away);
+  void setAwayMessage(const QString &awayMessage);
   void updateHostmask(const QString &mask);
 
   void setUserModes(const QString &modes);
   void updateHostmask(const QString &mask);
 
   void setUserModes(const QString &modes);
@@ -90,6 +99,9 @@ signals:
   void userSet(QString user);
   void hostSet(QString host);
   void nickSet(QString newnick);
   void userSet(QString user);
   void hostSet(QString host);
   void nickSet(QString newnick);
+  void realNameSet(QString realName);
+  void awaySet(bool away);
+  void awayMessageSet(QString awayMessage);
   void hostmaskUpdated(QString mask);
 
   void userModesSet(QString modes);
   void hostmaskUpdated(QString mask);
 
   void userModesSet(QString modes);
@@ -123,6 +135,9 @@ private:
   QString _nick;
   QString _user;
   QString _host;
   QString _nick;
   QString _user;
   QString _host;
+  QString _realName;
+  QString _awayMessage;
+  bool _away;
 
   // QSet<QString> _channels;
   QSet<IrcChannel *> _channels;
 
   // QSet<QString> _channels;
   QSet<IrcChannel *> _channels;
index 2f9c013..0841c7a 100644 (file)
@@ -388,6 +388,72 @@ void IrcServerHandler::handle005(QString prefix, QList<QByteArray> params) {
 }
 
 
 }
 
 
+/* 
+WHOIS-Message: 
+   Replies 311 - 313, 317 - 319 are all replies generated in response to a WHOIS message.
+  and 301 (RPL_AWAY)
+              "<nick> :<away message>"
+WHO-Message:
+   Replies 352 and 315 paired are used to answer a WHO message.
+
+WHOWAS-Message:
+   Replies 314 and 369 are responses to a WHOWAS message.
+*/
+
+
+/*   RPL_AWAY - "<nick> :<away message>" */
+void IrcServerHandler::handle301(QString prefix, QList<QByteArray> params) {
+  IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
+  ircuser->setAwayMessage(serverDecode(params.last()));
+  ircuser->setAway(true);
+  emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+}
+
+/*  RPL_WHOISUSER - "<nick> <user> <host> * :<real name>" */
+void IrcServerHandler::handle311(QString prefix, QList<QByteArray> params) {
+  IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
+  ircuser->setUser(serverDecode(params[1]));
+  ircuser->setHost(serverDecode(params[2]));
+  ircuser->setRealName(serverDecode(params.last()));
+  emit displayMsg(Message::Server, "", tr("[Whois] %1 %2 %3 (%4)")
+      .arg(ircuser->nick(), ircuser->user(), ircuser->host(), ircuser->realName()));
+}
+/*  RPL_WHOISSERVER -  "<nick> <server> :<server info>" */
+void IrcServerHandler::handle312(QString prefix, QList<QByteArray> params) {
+  emit displayMsg(Message::Server, "", tr("[Whois/Whowas] %1").arg(serverDecode(params).join(" ")));
+}
+
+/*  RPL_WHOISOPERATOR - "<nick> :is an IRC operator" */
+void IrcServerHandler::handle313(QString prefix, QList<QByteArray> params) {
+  emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+}
+
+/*  RPL_WHOWASUSER - "<nick> <user> <host> * :<real name>" */
+void IrcServerHandler::handle314(QString prefix, QList<QByteArray> params) {
+  emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
+}
+
+/*  RPL_ENDOFWHO: "<name> :End of WHO list" */
+void IrcServerHandler::handle315(QString prefix, QList<QByteArray> params) {
+  emit displayMsg(Message::Server, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
+}
+
+/*  RPL_WHOISIDLE - "<nick> <integer> :seconds idle" */
+void IrcServerHandler::handle317(QString prefix, QList<QByteArray> params) {
+  emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+}
+
+/*  RPL_ENDOFWHOIS - "<nick> :End of WHOIS list" */
+void IrcServerHandler::handle318(QString prefix, QList<QByteArray> params) {
+  emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+}
+
+/*  RPL_WHOISCHANNELS - "<nick> :*( ( "@" / "+" ) <channel> " " )" */
+void IrcServerHandler::handle319(QString prefix, QList<QByteArray> params) {
+  emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+}
+
 /* RPL_NOTOPIC */
 void IrcServerHandler::handle331(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix);
 /* RPL_NOTOPIC */
 void IrcServerHandler::handle331(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix);
@@ -413,6 +479,25 @@ void IrcServerHandler::handle333(QString prefix, QList<QByteArray> params) {
       .arg(bufferDecode(channel, params[1]), QDateTime::fromTime_t(bufferDecode(channel, params[2]).toUInt()).toString()));
 }
 
       .arg(bufferDecode(channel, params[1]), QDateTime::fromTime_t(bufferDecode(channel, params[2]).toUInt()).toString()));
 }
 
+/*  RPL_WHOREPLY: "<channel> <user> <host> <server> <nick> 
+              ( "H" / "G" > ["*"] [ ( "@" / "+" ) ] :<hopcount> <real name>" */
+void IrcServerHandler::handle352(QString prefix, QList<QByteArray> params) {
+  QString channel = serverDecode(params[0]);
+  IrcUser *ircuser = network()->ircUser(serverDecode(params[4]));
+  ircuser->setUser(serverDecode(params[1]));
+  ircuser->setHost(serverDecode(params[2]));
+
+  bool away = serverDecode(params[5]).startsWith("G") ? true : false;
+  ircuser->setAway(away);
+
+  // TODO: !!
+  QString server = serverDecode(params[3]); 
+  int hopCount =  serverDecode(params.last()).section(" ", 0, 0).toInt(); 
+  ircuser->setRealName(serverDecode(params.last()).section(" ", 1));
+
+  emit displayMsg(Message::Server, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
+}
+
 /* RPL_NAMREPLY */
 void IrcServerHandler::handle353(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
 /* RPL_NAMREPLY */
 void IrcServerHandler::handle353(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix)
@@ -435,6 +520,11 @@ void IrcServerHandler::handle353(QString prefix, QList<QByteArray> params) {
   }
 }
 
   }
 }
 
+/*  RPL_ENDOFWHOWAS - "<nick> :End of WHOWAS" */
+void IrcServerHandler::handle369(QString prefix, QList<QByteArray> params) {
+  emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
+}
+
 /* ERR_ERRONEUSNICKNAME */
 void IrcServerHandler::handle432(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix);
 /* ERR_ERRONEUSNICKNAME */
 void IrcServerHandler::handle432(QString prefix, QList<QByteArray> params) {
   Q_UNUSED(prefix);
index c8894de..372cb58 100644 (file)
@@ -54,10 +54,21 @@ public slots:
 
   void handle001(QString, QList<QByteArray>);   // RPL_WELCOME
   void handle005(QString, QList<QByteArray>);   // RPL_ISUPPORT
 
   void handle001(QString, QList<QByteArray>);   // RPL_WELCOME
   void handle005(QString, QList<QByteArray>);   // RPL_ISUPPORT
+  void handle301(QString, QList<QByteArray>);   // RPL_AWAY
+  void handle311(QString, QList<QByteArray>);   // RPL_WHOISUSER
+  void handle312(QString, QList<QByteArray>);   // RPL_WHOISSERVER
+  void handle313(QString, QList<QByteArray>);   // RPL_WHOISOPERATOR
+  void handle314(QString, QList<QByteArray>);   // RPL_WHOWASUSER
+  void handle315(QString, QList<QByteArray>);   // RPL_ENDOFWHO
+  void handle317(QString, QList<QByteArray>);   // RPL_WHOISIDLE
+  void handle318(QString, QList<QByteArray>);   // RPL_ENDOFWHOIS
+  void handle319(QString, QList<QByteArray>);   // RPL_WHOISCHANNELS
   void handle331(QString, QList<QByteArray>);   // RPL_NOTOPIC
   void handle332(QString, QList<QByteArray>);   // RPL_TOPIC
   void handle333(QString, QList<QByteArray>);   // Topic set by...
   void handle331(QString, QList<QByteArray>);   // RPL_NOTOPIC
   void handle332(QString, QList<QByteArray>);   // RPL_TOPIC
   void handle333(QString, QList<QByteArray>);   // Topic set by...
+  void handle352(QString, QList<QByteArray>);   //  RPL_WHOREPLY
   void handle353(QString, QList<QByteArray>);   // RPL_NAMREPLY
   void handle353(QString, QList<QByteArray>);   // RPL_NAMREPLY
+  void handle369(QString, QList<QByteArray>);   // RPL_ENDOFWHOWAS
   void handle432(QString, QList<QByteArray>);   // ERR_ERRONEUSNICKNAME
   void handle433(QString, QList<QByteArray>);   // ERR_NICKNAMEINUSE
 
   void handle432(QString, QList<QByteArray>);   // ERR_ERRONEUSNICKNAME
   void handle433(QString, QList<QByteArray>);   // ERR_NICKNAMEINUSE