Implement IRCv3 Server-Time
authorJanne Koschinski <janne@kuschku.de>
Tue, 12 Feb 2019 11:00:12 +0000 (12:00 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Thu, 30 May 2019 20:59:25 +0000 (22:59 +0200)
src/common/irccap.h
src/core/coresession.cpp
src/core/coresession.h
src/core/ircparser.cpp

index 29042b1..f378a78 100644 (file)
@@ -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.
index 852c37b..119d73d 100644 (file)
@@ -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,
index d44a9c4..99cd593 100644 (file)
@@ -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)
index 2add78d..d5f5295 100644 (file)
@@ -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<Event*> events;
     EventManager::EventType type = EventManager::Invalid;