From: Alexander von Renteln Date: Sun, 3 Feb 2008 04:24:19 +0000 (+0000) Subject: changed the behavior of RPL_AWAY server messages: X-Git-Tag: 0.2.0-alpha1~136 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=7a6e882282779ac24e015c53e3d9fc746c08063d changed the behavior of RPL_AWAY server messages: -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 :-) --- diff --git a/src/common/ircuser.cpp b/src/common/ircuser.cpp index e8ccc370..704934b7 100644 --- a/src/common/ircuser.cpp +++ b/src/common/ircuser.cpp @@ -40,6 +40,7 @@ IrcUser::IrcUser(const QString &hostmask, Network *network) _server(), _idleTime(QDateTime::currentDateTime()), _ircOperator(), + _lastAwayMessage(0), _network(network), _codecForEncoding(0), _codecForDecoding(0) @@ -95,6 +96,10 @@ QString IrcUser::ircOperator() const { return _ircOperator; } +int IrcUser::lastAwayMessage() const { + return _lastAwayMessage; +} + 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; diff --git a/src/common/ircuser.h b/src/common/ircuser.h index 5fd45944..da963231 100644 --- a/src/common/ircuser.h +++ b/src/common/ircuser.h @@ -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(int lastAwayMessage READ lastAwayMessage WRITE setLastAwayMessage STORED false) 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; + int lastAwayMessage() 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 setLastAwayMessage(const int &lastAwayMessage); 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 lastAwayMessageSet(int lastAwayMessage); void hostmaskUpdated(QString mask); void userModesSet(QString modes); @@ -154,6 +158,7 @@ private: QString _server; QDateTime _idleTime; QString _ircOperator; + int _lastAwayMessage; // QSet _channels; QSet _channels; diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 438404c6..cb4c1534 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -35,7 +35,7 @@ IrcServerHandler::IrcServerHandler(NetworkConnection *parent) : BasicHandler(parent), networkConnection(parent) { - _whowas = false; + _whois = false; } IrcServerHandler::~IrcServerHandler() { @@ -405,18 +405,32 @@ WHOWAS-Message: /* RPL_AWAY - " :" */ void IrcServerHandler::handle301(QString prefix, QList 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) { - ircuser->setAwayMessage(serverDecode(params.last())); + ircuser->setAwayMessage(awayMessage); 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 - " * :" */ void IrcServerHandler::handle311(QString prefix, QList params) { Q_UNUSED(prefix) + _whois = true; IrcUser *ircuser = network()->ircUser(serverDecode(params[0])); if(ircuser) { ircuser->setUser(serverDecode(params[1])); @@ -434,10 +448,10 @@ void IrcServerHandler::handle312(QString prefix, QList params) { 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(" "))); + } else { + emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" "))); } } @@ -454,7 +468,6 @@ void IrcServerHandler::handle313(QString prefix, QList params) { /* 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(" "))); } @@ -464,7 +477,9 @@ void IrcServerHandler::handle315(QString prefix, QList params) { emit displayMsg(Message::Server, "", tr("[Who] %1").arg(serverDecode(params).join(" "))); } -/* RPL_WHOISIDLE - " :seconds idle" */ +/* RPL_WHOISIDLE - " :seconds idle" + (real life: " :seconds idle, signon time) */ + //TODO: parse real life message void IrcServerHandler::handle317(QString prefix, QList params) { Q_UNUSED(prefix) IrcUser *ircuser = network()->ircUser(serverDecode(params[0])); @@ -473,15 +488,16 @@ void IrcServerHandler::handle317(QString prefix, QList params) { 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 { - 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 - " :End of WHOIS list" */ void IrcServerHandler::handle318(QString prefix, QList params) { Q_UNUSED(prefix) + _whois = false; emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" "))); } @@ -558,7 +574,6 @@ 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 6149d152..ec9f201a 100644 --- a/src/core/ircserverhandler.h +++ b/src/core/ircserverhandler.h @@ -76,7 +76,7 @@ public slots: private: void tryNextNick(const QString &errnick); - bool _whowas; + bool _whois; NetworkConnection *networkConnection; }; diff --git a/src/core/userinputhandler.cpp b/src/core/userinputhandler.cpp index b4a74aee..232c8cdb 100644 --- a/src/core/userinputhandler.cpp +++ b/src/core/userinputhandler.cpp @@ -104,6 +104,14 @@ void UserInputHandler::handleInvite(QString bufname, QString msg) { 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(" ")); } diff --git a/src/core/userinputhandler.h b/src/core/userinputhandler.h index 1ead7c5c..4070b407 100644 --- a/src/core/userinputhandler.h +++ b/src/core/userinputhandler.h @@ -40,6 +40,7 @@ public slots: 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); diff --git a/version.inc b/version.inc index 665f5718..8c69ffdd 100644 --- a/version.inc +++ b/version.inc @@ -5,7 +5,7 @@ quasselVersion = "0.2.0-pre"; quasselDate = "2008-02-02"; - quasselBuild = 441; + quasselBuild = 444; //! Minimum client build number the core needs clientBuildNeeded = 435;