]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_ircv3_servertime.cpp
Fix sending DEL for caps which have not been advertised yet.
[user/henk/code/inspircd.git] / src / modules / m_ircv3_servertime.cpp
index 1c35c422b041736781f99adb54893978550064a8..3e059719d13ac6bac1f03b6cf5968912595fc9fc 100644 (file)
 #include "inspircd.h"
 #include "modules/ircv3.h"
 #include "modules/ircv3_servertime.h"
+#include "modules/server.h"
 
-class ServerTimeTag : public IRCv3::ServerTime::Manager, public IRCv3::CapTag<ServerTimeTag>
+class ServerTimeTag
+       : public IRCv3::ServerTime::Manager
+       , public IRCv3::CapTag<ServerTimeTag>
+       , public ServerProtocol::MessageEventListener
 {
        time_t lasttime;
+       long lasttimens;
        std::string lasttimestring;
 
        void RefreshTimeString()
        {
                const time_t currtime = ServerInstance->Time();
-               if (currtime != lasttime)
+               const long currtimens = ServerInstance->Time_ns();
+               if (currtime != lasttime || currtimens != lasttimens)
                {
                        lasttime = currtime;
-                       // Cache the string so it's not recreated every time a message is sent
-                       lasttimestring = IRCv3::ServerTime::FormatTime(currtime);
+                       lasttimens = currtimens;
+
+                       // Cache the string so it's not recreated every time a message is sent.
+                       lasttimestring = IRCv3::ServerTime::FormatTime(currtime, (currtimens ? currtimens / 1000000 : 0));
                }
        }
 
@@ -41,16 +49,27 @@ class ServerTimeTag : public IRCv3::ServerTime::Manager, public IRCv3::CapTag<Se
        ServerTimeTag(Module* mod)
                : IRCv3::ServerTime::Manager(mod)
                , IRCv3::CapTag<ServerTimeTag>(mod, "server-time", "time")
+               , ServerProtocol::MessageEventListener(mod)
                , lasttime(0)
+               , lasttimens(0)
        {
                tagprov = this;
        }
 
        const std::string* GetValue(const ClientProtocol::Message& msg)
        {
+               // Client protocol.
                RefreshTimeString();
                return &lasttimestring;
        }
+
+       void OnBuildMessage(User* source, const char* command, ClientProtocol::TagMap& tags) CXX11_OVERRIDE
+       {
+               // Server protocol.
+               RefreshTimeString();
+               tags.insert(std::make_pair(tagname, ClientProtocol::MessageTagData(this, lasttimestring)));
+       }
+
 };
 
 class ModuleIRCv3ServerTime : public Module