From: Janne Koschinski Date: Tue, 12 Feb 2019 11:00:12 +0000 (+0100) Subject: Implement IRCv3 Server-Time X-Git-Tag: test-travis-01~57 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=e38846f054ad1766f2e91992a57bbaffd33c7c06 Implement IRCv3 Server-Time --- diff --git a/src/common/irccap.h b/src/common/irccap.h index 29042b1d..f378a78e 100644 --- a/src/common/irccap.h +++ b/src/common/irccap.h @@ -100,6 +100,13 @@ namespace IrcCap { */ const QString USERHOST_IN_NAMES = "userhost-in-names"; + /** + * Server time for messages. + * + * https://ircv3.net/specs/extensions/server-time-3.2.html + */ + const QString SERVER_TIME = "server-time"; + /** * Vendor-specific capabilities */ @@ -141,6 +148,7 @@ namespace IrcCap { MULTI_PREFIX, SASL, USERHOST_IN_NAMES, + SERVER_TIME, Vendor::TWITCH_MEMBERSHIP, Vendor::ZNC_SELF_MESSAGE}; // NOTE: If you modify the knownCaps list, update the constants above as needed. diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 852c37b2..119d73d7 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -335,6 +335,7 @@ void CoreSession::recvStatusMsgFromServer(QString msg) void CoreSession::processMessageEvent(MessageEvent* event) { recvMessageFromServer(RawMessage{ + event->timestamp(), event->networkId(), event->msgType(), event->bufferType(), @@ -369,7 +370,8 @@ void CoreSession::processMessages() Q_ASSERT(!createBuffer); bufferInfo = Core::bufferInfo(user(), rawMsg.networkId, BufferInfo::StatusBuffer, ""); } - Message msg(bufferInfo, + Message msg(rawMsg.timestamp, + bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, @@ -400,7 +402,8 @@ void CoreSession::processMessages() } bufferInfoCache[rawMsg.networkId][rawMsg.target] = bufferInfo; } - Message msg(bufferInfo, + Message msg(rawMsg.timestamp, + bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, @@ -423,7 +426,8 @@ void CoreSession::processMessages() // add the StatusBuffer to the Cache in case there are more Messages for the original target bufferInfoCache[rawMsg.networkId][rawMsg.target] = bufferInfo; } - Message msg(bufferInfo, + Message msg(rawMsg.timestamp, + bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, diff --git a/src/core/coresession.h b/src/core/coresession.h index d44a9c49..99cd5932 100644 --- a/src/core/coresession.h +++ b/src/core/coresession.h @@ -306,6 +306,7 @@ struct NetworkInternalMessage struct RawMessage { + QDateTime timestamp; NetworkId networkId; Message::Type type; BufferInfo::Type bufferType; @@ -314,14 +315,16 @@ struct RawMessage QString sender; Message::Flags flags; - RawMessage(NetworkId networkId, + RawMessage(QDateTime timestamp, + NetworkId networkId, Message::Type type, BufferInfo::Type bufferType, QString target, QString text, QString sender, Message::Flags flags) - : networkId(networkId) + : timestamp(std::move(timestamp)) + , networkId(networkId) , type(type) , bufferType(bufferType) , target(std::move(target)) @@ -332,7 +335,8 @@ struct RawMessage RawMessage(NetworkId networkId, const NetworkInternalMessage& msg) - : networkId(networkId) + : timestamp(QDateTime::currentDateTimeUtc()) + , networkId(networkId) , type(msg.type) , bufferType(msg.bufferType) , target(msg.target) diff --git a/src/core/ircparser.cpp b/src/core/ircparser.cpp index 2add78d7..d5f52954 100644 --- a/src/core/ircparser.cpp +++ b/src/core/ircparser.cpp @@ -119,6 +119,17 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent* e) qDebug() << "IRC net" << net->networkId() << "<<" << tags << prefix << cmd << params; } + IrcTagKey serverTimeTag{"", "time", false}; + if (tags.contains(serverTimeTag)) { + QDateTime serverTime = QDateTime::fromString(tags[serverTimeTag], "yyyy-MM-ddThh:mm:ss.zzzZ"); + serverTime.setTimeSpec(Qt::UTC); + if (serverTime.isValid()) { + e->setTimestamp(serverTime); + } else { + qDebug() << "Invalid timestamp from server-time tag:" << tags[serverTimeTag]; + } + } + QList events; EventManager::EventType type = EventManager::Invalid;