From 2d19986a8bafafec55b5d3b0474f7d76eb5f33b2 Mon Sep 17 00:00:00 2001 From: Alexander von Renteln Date: Thu, 31 Jan 2008 23:53:24 +0000 Subject: [PATCH] added more user info in the user tool tip --- src/client/networkmodel.cpp | 37 +++++++++++++++++++++++++++------ src/common/ircuser.cpp | 39 ++++++++++++++++++++++++++++++++++- src/common/ircuser.h | 18 +++++++++++++++- src/core/ircserverhandler.cpp | 38 ++++++++++++++++++++++++++++------ src/core/ircserverhandler.h | 1 + src/core/userinputhandler.cpp | 12 ++++------- src/uisupport/nickview.cpp | 18 ++++++++-------- 7 files changed, 132 insertions(+), 31 deletions(-) diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index 7890099b..076e7047 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -479,14 +479,39 @@ QVariant IrcUserItem::data(int column, int role) const { QString IrcUserItem::toolTip(int column) const { Q_UNUSED(column); - QString toolTip = "" + nickName() + "
" + _ircUser->hostmask(); - if(_ircUser->isAway()) { - toolTip += "
away"; - if(!_ircUser->awayMessage().isEmpty()) { - toolTip += " (" + _ircUser->awayMessage() + ")"; + QStringList toolTip(QString("%1").arg(nickName())); + if(_ircUser->isAway()) toolTip[0].append(" is away"); + if(!_ircUser->awayMessage().isEmpty()) toolTip[0].append(QString(" (%1)").arg(_ircUser->awayMessage())); + if(!_ircUser->realName().isEmpty()) toolTip.append(_ircUser->realName()); + if(!_ircUser->ircOperator().isEmpty()) toolTip.append(_ircUser->ircOperator()); + toolTip.append(_ircUser->hostmask()); + + if(_ircUser->idleTime().isValid()) { + QDateTime now = QDateTime::currentDateTime(); + QDateTime idle = _ircUser->idleTime(); + int idleTime = idle.secsTo(now); + + QList< QPair > timeUnit; + timeUnit.append(qMakePair(365*60*60, tr("year"))); + timeUnit.append(qMakePair(24*60*60, tr("day"))); + timeUnit.append(qMakePair(60*60, tr("h"))); + timeUnit.append(qMakePair(60, tr("min"))); + timeUnit.append(qMakePair(1, tr("sec"))); + + QString idleString(' '); + for(int i=0; i < timeUnit.size(); i++) { + int n = idleTime / timeUnit[i].first; + if(n > 0) { + idleString += QString("%1 %2 ").arg(QString::number(n), timeUnit[i].second); + } + idleTime = idleTime % timeUnit[i].first; } + toolTip.append(QString("idling since %1").arg(idleString)); } - return "

" + toolTip + "

"; + + if(!_ircUser->server().isEmpty()) toolTip.append(QString("server: %1").arg(_ircUser->server())); + + return QString("

%1

").arg(toolTip.join("
")); } void IrcUserItem::setNick(QString newNick) { diff --git a/src/common/ircuser.cpp b/src/common/ircuser.cpp index f7fc9b0d..e8ccc370 100644 --- a/src/common/ircuser.cpp +++ b/src/common/ircuser.cpp @@ -34,12 +34,17 @@ IrcUser::IrcUser(const QString &hostmask, Network *network) _nick(nickFromMask(hostmask)), _user(userFromMask(hostmask)), _host(hostFromMask(hostmask)), + _realName(), + _awayMessage(), + _away(false), + _server(), + _idleTime(QDateTime::currentDateTime()), + _ircOperator(), _network(network), _codecForEncoding(0), _codecForDecoding(0) { updateObjectName(); - _away = false; } IrcUser::~IrcUser() { @@ -78,6 +83,18 @@ QString IrcUser::awayMessage() const { return _awayMessage; } +QString IrcUser::server() const { + return _server; +} + +QDateTime IrcUser::idleTime() const { + return _idleTime; +} + +QString IrcUser::ircOperator() const { + return _ircOperator; +} + QString IrcUser::userModes() const { return _userModes; } @@ -162,6 +179,26 @@ void IrcUser::setAwayMessage(const QString &awayMessage) { } } +void IrcUser::setIdleTime(const QDateTime &idleTime) { + if(idleTime.isValid() && _idleTime != idleTime) { + _idleTime = idleTime; + emit idleTimeSet(idleTime); + } +} + +void IrcUser::setServer(const QString &server) { + if(!server.isEmpty() && _server != server) { + _server = server; + emit serverSet(server); + } +} + +void IrcUser::setIrcOperator(const QString &ircOperator) { + if(!ircOperator.isEmpty() && _ircOperator != ircOperator) { + _ircOperator = ircOperator; + emit ircOperatorSet(ircOperator); + } +} void IrcUser::setHost(const QString &host) { if(!host.isEmpty() && _host != host) { diff --git a/src/common/ircuser.h b/src/common/ircuser.h index 768de508..5fd45944 100644 --- a/src/common/ircuser.h +++ b/src/common/ircuser.h @@ -25,6 +25,7 @@ #include #include #include +#include #include "syncableobject.h" @@ -41,6 +42,9 @@ class IrcUser : public SyncableObject { 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(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(QStringList channels READ channels STORED false) // Q_PROPERTY(QStringList usermodes READ usermodes WRITE setUsermodes) @@ -56,6 +60,9 @@ public: QString hostmask() const; bool isAway() const; QString awayMessage() const; + QDateTime idleTime() const; + QString server() const; + QString ircOperator() const; Network *network() const; QString userModes() const; @@ -80,6 +87,9 @@ public slots: void setRealName(const QString &realName); void setAway(const bool &away); void setAwayMessage(const QString &awayMessage); + void setIdleTime(const QDateTime &idleTime); + void setServer(const QString &server); + void setIrcOperator(const QString &ircOperator); void updateHostmask(const QString &mask); void setUserModes(const QString &modes); @@ -102,6 +112,9 @@ signals: void realNameSet(QString realName); void awaySet(bool away); void awayMessageSet(QString awayMessage); + void idleTimeSet(QDateTime idleTime); + void serverSet(QString server); + void ircOperatorSet(QString ircOperator); void hostmaskUpdated(QString mask); void userModesSet(QString modes); @@ -138,7 +151,10 @@ private: QString _realName; QString _awayMessage; bool _away; - + QString _server; + QDateTime _idleTime; + QString _ircOperator; + // QSet _channels; QSet _channels; QString _userModes; diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 0841c7a2..e6e3b324 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -35,6 +35,7 @@ IrcServerHandler::IrcServerHandler(NetworkConnection *parent) : BasicHandler(parent), networkConnection(parent) { + _whowas = false; } IrcServerHandler::~IrcServerHandler() { @@ -398,11 +399,14 @@ WHO-Message: WHOWAS-Message: Replies 314 and 369 are responses to a WHOWAS message. + + ??? BitlBee program, simulating IRC server with one channel, 374-378 */ /* RPL_AWAY - " :" */ void IrcServerHandler::handle301(QString prefix, QList params) { + Q_UNUSED(prefix) IrcUser *ircuser = network()->ircUser(serverDecode(params[0])); ircuser->setAwayMessage(serverDecode(params.last())); ircuser->setAway(true); @@ -411,6 +415,7 @@ void IrcServerHandler::handle301(QString prefix, QList params) { /* RPL_WHOISUSER - " * :" */ void IrcServerHandler::handle311(QString prefix, QList params) { + Q_UNUSED(prefix) IrcUser *ircuser = network()->ircUser(serverDecode(params[0])); ircuser->setUser(serverDecode(params[1])); ircuser->setHost(serverDecode(params[2])); @@ -421,36 +426,57 @@ void IrcServerHandler::handle311(QString prefix, QList params) { /* RPL_WHOISSERVER - " :" */ void IrcServerHandler::handle312(QString prefix, QList params) { - emit displayMsg(Message::Server, "", tr("[Whois/Whowas] %1").arg(serverDecode(params).join(" "))); + Q_UNUSED(prefix) + IrcUser *ircuser = network()->ircUser(serverDecode(params[0])); + ircuser->setServer(serverDecode(params[1])); + if(_whowas) { + emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" "))); + } else { + emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" "))); + } } /* RPL_WHOISOPERATOR - " :is an IRC operator" */ void IrcServerHandler::handle313(QString prefix, QList params) { + Q_UNUSED(prefix) + IrcUser *ircuser = network()->ircUser(serverDecode(params[0])); + ircuser->setIrcOperator(params.last()); emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" "))); } /* RPL_WHOWASUSER - " * :" */ void IrcServerHandler::handle314(QString prefix, QList params) { + Q_UNUSED(prefix) + _whowas = true; emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" "))); } /* RPL_ENDOFWHO: " :End of WHO list" */ void IrcServerHandler::handle315(QString prefix, QList params) { + Q_UNUSED(prefix) 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(" "))); + Q_UNUSED(prefix) + IrcUser *ircuser = network()->ircUser(serverDecode(params[0])); + QDateTime now = QDateTime::currentDateTime(); + 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))); } /* RPL_ENDOFWHOIS - " :End of WHOIS list" */ void IrcServerHandler::handle318(QString prefix, QList params) { + Q_UNUSED(prefix) emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" "))); } /* RPL_WHOISCHANNELS - " :*( ( "@" / "+" ) " " )" */ void IrcServerHandler::handle319(QString prefix, QList params) { + Q_UNUSED(prefix) emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" "))); } @@ -482,6 +508,7 @@ void IrcServerHandler::handle333(QString prefix, QList params) { /* RPL_WHOREPLY: " ( "H" / "G" > ["*"] [ ( "@" / "+" ) ] : " */ void IrcServerHandler::handle352(QString prefix, QList params) { + Q_UNUSED(prefix) QString channel = serverDecode(params[0]); IrcUser *ircuser = network()->ircUser(serverDecode(params[4])); ircuser->setUser(serverDecode(params[1])); @@ -489,10 +516,7 @@ void IrcServerHandler::handle352(QString prefix, QList params) { 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->setServer(serverDecode(params[3])); ircuser->setRealName(serverDecode(params.last()).section(" ", 1)); emit displayMsg(Message::Server, "", tr("[Who] %1").arg(serverDecode(params).join(" "))); @@ -522,6 +546,8 @@ void IrcServerHandler::handle353(QString prefix, QList params) { /* RPL_ENDOFWHOWAS - " :End of WHOWAS" */ void IrcServerHandler::handle369(QString prefix, QList params) { + Q_UNUSED(prefix) + _whowas = false; emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" "))); } diff --git a/src/core/ircserverhandler.h b/src/core/ircserverhandler.h index 372cb58c..6149d152 100644 --- a/src/core/ircserverhandler.h +++ b/src/core/ircserverhandler.h @@ -76,6 +76,7 @@ public slots: private: void tryNextNick(const QString &errnick); + bool _whowas; NetworkConnection *networkConnection; }; diff --git a/src/core/userinputhandler.cpp b/src/core/userinputhandler.cpp index 71735b00..94d81470 100644 --- a/src/core/userinputhandler.cpp +++ b/src/core/userinputhandler.cpp @@ -161,7 +161,6 @@ void UserInputHandler::handleQuote(QString bufname, QString msg) { emit putRawLine(msg); } - void UserInputHandler::handleSay(QString bufname, QString msg) { if(bufname.isEmpty()) return; // server buffer QStringList params; @@ -174,7 +173,6 @@ void UserInputHandler::handleSay(QString bufname, QString msg) { } } - void UserInputHandler::handleTopic(QString bufname, QString msg) { if(bufname.isEmpty()) return; QStringList params; @@ -190,19 +188,17 @@ void UserInputHandler::handleVoice(QString bufname, QString msg) { emit putCmd("MODE", params); } - void UserInputHandler::handleWho(QString bufname, QString msg) { - emit putCmd("WHO", QStringList(msg)); + emit putCmd("WHO", msg.split(' ')); } - void UserInputHandler::handleWhois(QString bufname, QString msg) { - emit putCmd("WHOIS", QStringList(msg)); + qDebug() << "WHOIS" << QStringList(msg); + emit putCmd("WHOIS", msg.split(' ')); } - void UserInputHandler::handleWhowas(QString bufname, QString msg) { - emit putCmd("WHOWAS", QStringList(msg)); + emit putCmd("WHOWAS", msg.split(' ')); } void UserInputHandler::defaultHandler(QString cmd, QString bufname, QString msg) { diff --git a/src/uisupport/nickview.cpp b/src/uisupport/nickview.cpp index 6f1cc9d0..c1f0ab8b 100644 --- a/src/uisupport/nickview.cpp +++ b/src/uisupport/nickview.cpp @@ -105,15 +105,15 @@ void NickView::showContextMenu(const QPoint & pos ) { QAction *result = nickContextMenu.exec(QCursor::pos()); - if(result == whoisAction) { Client::instance()->userInput(bufferInfo, "/WHOIS "+username); } - else if(result == versionAction) { Client::instance()->userInput(bufferInfo, "/CTCP "+username+" VERSION"); } - else if(result == pingAction) { Client::instance()->userInput(bufferInfo, "/CTCP "+username+" PING"); } + if(result == whoisAction) { Client::instance()->userInput(bufferInfo, "/WHOIS " + username + " " + username); } + else if(result == versionAction) { Client::instance()->userInput(bufferInfo, "/CTCP " + username + " VERSION"); } + else if(result == pingAction) { Client::instance()->userInput(bufferInfo, "/CTCP " + username + " PING"); } - else if(result == opAction) { Client::instance()->userInput(bufferInfo, "/OP "+username); } - else if(result == deOpAction) { Client::instance()->userInput(bufferInfo, "/DEOP "+username); } - else if(result == voiceAction) { Client::instance()->userInput(bufferInfo, "/VOICE "+username); } - else if(result == deVoiceAction) { Client::instance()->userInput(bufferInfo, "/DEVOICE "+username); } + else if(result == opAction) { Client::instance()->userInput(bufferInfo, "/OP " + username); } + else if(result == deOpAction) { Client::instance()->userInput(bufferInfo, "/DEOP " + username); } + else if(result == voiceAction) { Client::instance()->userInput(bufferInfo, "/VOICE " + username); } + else if(result == deVoiceAction) { Client::instance()->userInput(bufferInfo, "/DEVOICE " + username); } - else if(result == kickAction) { Client::instance()->userInput(bufferInfo, "/KICK "+username); } - else if(result == kickBanAction) { Client::instance()->userInput(bufferInfo, "/KICKBAN "+username); } + else if(result == kickAction) { Client::instance()->userInput(bufferInfo, "/KICK " + username); } + else if(result == kickBanAction) { Client::instance()->userInput(bufferInfo, "/KICKBAN " + username); } } -- 2.20.1