From: Alexander von Renteln Date: Thu, 31 Jan 2008 15:58:07 +0000 (+0000) Subject: added ircserverhandler for whois, who and whowas X-Git-Tag: 0.2.0-alpha1~162 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=99a590ef8b00aadfb3d6f77bc84df015158fc70b added ircserverhandler for whois, who and whowas added away and awaymessage to ircuser added away and awaymessage to user tooltip --- diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index ba9d0c82..1cde086b 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -472,7 +472,14 @@ QVariant IrcUserItem::data(int column, int role) const { QString IrcUserItem::toolTip(int column) const { Q_UNUSED(column); - return "

" + nickName() + "
" + _ircUser->hostmask() + "

"; + QString toolTip = "" + nickName() + "
" + _ircUser->hostmask(); + if(_ircUser->isAway()) { + toolTip += "
away"; + if(!_ircUser->awayMessage().isEmpty()) { + toolTip += " (" + _ircUser->awayMessage() + ")"; + } + } + return "

" + toolTip + "

"; } void IrcUserItem::setNick(QString newNick) { diff --git a/src/common/ircuser.cpp b/src/common/ircuser.cpp index 5f05f0f4..f7fc9b0d 100644 --- a/src/common/ircuser.cpp +++ b/src/common/ircuser.cpp @@ -39,6 +39,7 @@ IrcUser::IrcUser(const QString &hostmask, Network *network) _codecForDecoding(0) { updateObjectName(); + _away = false; } IrcUser::~IrcUser() { @@ -61,10 +62,22 @@ 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::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; diff --git a/src/common/ircuser.h b/src/common/ircuser.h index 45be4220..768de508 100644 --- a/src/common/ircuser.h +++ b/src/common/ircuser.h @@ -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 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) @@ -49,7 +52,10 @@ public: QString user() const; QString host() const; QString nick() const; + QString realName() const; QString hostmask() const; + bool isAway() const; + QString awayMessage() 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 setRealName(const QString &realName); + void setAway(const bool &away); + void setAwayMessage(const QString &awayMessage); 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 realNameSet(QString realName); + void awaySet(bool away); + void awayMessageSet(QString awayMessage); void hostmaskUpdated(QString mask); void userModesSet(QString modes); @@ -123,6 +135,9 @@ private: QString _nick; QString _user; QString _host; + QString _realName; + QString _awayMessage; + bool _away; // QSet _channels; QSet _channels; diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 2f9c013d..0841c7a2 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -388,6 +388,72 @@ void IrcServerHandler::handle005(QString prefix, QList params) { } +/* +WHOIS-Message: + Replies 311 - 313, 317 - 319 are all replies generated in response to a WHOIS message. + and 301 (RPL_AWAY) + " :" +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 - " :" */ +void IrcServerHandler::handle301(QString prefix, QList 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 - " * :" */ +void IrcServerHandler::handle311(QString prefix, QList 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 - " :" */ +void IrcServerHandler::handle312(QString prefix, QList params) { + emit displayMsg(Message::Server, "", tr("[Whois/Whowas] %1").arg(serverDecode(params).join(" "))); +} + +/* RPL_WHOISOPERATOR - " :is an IRC operator" */ +void IrcServerHandler::handle313(QString prefix, QList params) { + emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" "))); +} + +/* RPL_WHOWASUSER - " * :" */ +void IrcServerHandler::handle314(QString prefix, QList params) { + emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" "))); +} + +/* RPL_ENDOFWHO: " :End of WHO list" */ +void IrcServerHandler::handle315(QString prefix, QList params) { + emit displayMsg(Message::Server, "", tr("[Who] %1").arg(serverDecode(params).join(" "))); +} + +/* RPL_WHOISIDLE - " :seconds idle" */ +void IrcServerHandler::handle317(QString prefix, QList params) { + emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" "))); +} + +/* RPL_ENDOFWHOIS - " :End of WHOIS list" */ +void IrcServerHandler::handle318(QString prefix, QList params) { + emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" "))); +} + +/* RPL_WHOISCHANNELS - " :*( ( "@" / "+" ) " " )" */ +void IrcServerHandler::handle319(QString prefix, QList params) { + emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" "))); +} + /* RPL_NOTOPIC */ void IrcServerHandler::handle331(QString prefix, QList params) { Q_UNUSED(prefix); @@ -413,6 +479,25 @@ void IrcServerHandler::handle333(QString prefix, QList params) { .arg(bufferDecode(channel, params[1]), QDateTime::fromTime_t(bufferDecode(channel, params[2]).toUInt()).toString())); } +/* RPL_WHOREPLY: " + ( "H" / "G" > ["*"] [ ( "@" / "+" ) ] : " */ +void IrcServerHandler::handle352(QString prefix, QList 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 params) { Q_UNUSED(prefix) @@ -435,6 +520,11 @@ void IrcServerHandler::handle353(QString prefix, QList params) { } } +/* RPL_ENDOFWHOWAS - " :End of WHOWAS" */ +void IrcServerHandler::handle369(QString prefix, QList params) { + emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" "))); +} + /* ERR_ERRONEUSNICKNAME */ void IrcServerHandler::handle432(QString prefix, QList params) { Q_UNUSED(prefix); diff --git a/src/core/ircserverhandler.h b/src/core/ircserverhandler.h index c8894de3..372cb58c 100644 --- a/src/core/ircserverhandler.h +++ b/src/core/ircserverhandler.h @@ -54,10 +54,21 @@ public slots: void handle001(QString, QList); // RPL_WELCOME void handle005(QString, QList); // RPL_ISUPPORT + void handle301(QString, QList); // RPL_AWAY + void handle311(QString, QList); // RPL_WHOISUSER + void handle312(QString, QList); // RPL_WHOISSERVER + void handle313(QString, QList); // RPL_WHOISOPERATOR + void handle314(QString, QList); // RPL_WHOWASUSER + void handle315(QString, QList); // RPL_ENDOFWHO + void handle317(QString, QList); // RPL_WHOISIDLE + void handle318(QString, QList); // RPL_ENDOFWHOIS + void handle319(QString, QList); // RPL_WHOISCHANNELS void handle331(QString, QList); // RPL_NOTOPIC void handle332(QString, QList); // RPL_TOPIC void handle333(QString, QList); // Topic set by... + void handle352(QString, QList); // RPL_WHOREPLY void handle353(QString, QList); // RPL_NAMREPLY + void handle369(QString, QList); // RPL_ENDOFWHOWAS void handle432(QString, QList); // ERR_ERRONEUSNICKNAME void handle433(QString, QList); // ERR_NICKNAMEINUSE