]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_ircv3_servertime.cpp
Sync helpop chmodes s and p with docs
[user/henk/code/inspircd.git] / src / modules / m_ircv3_servertime.cpp
index 1c35c422b041736781f99adb54893978550064a8..0cc29436e8d440041213d263ea24d11c991f4498 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2016 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2018-2019 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2018 Attila Molnar <attilamolnar@hush.com>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
 #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));
                }
        }
 
  public:
+       using ServerProtocol::MessageEventListener::OnBuildMessage;
+
        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
@@ -65,7 +87,7 @@ class ModuleIRCv3ServerTime : public Module
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides the server-time IRCv3 extension", VF_VENDOR);
+               return Version("Provides the IRCv3 server-time client capability.", VF_VENDOR);
        }
 };