]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - include/modules/ircv3_servertime.h
Implement support for millisecond level server-time accuracy.
[user/henk/code/inspircd.git] / include / modules / ircv3_servertime.h
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2016 Attila Molnar <attilamolnar@hush.com>
5  *
6  * This file is part of InspIRCd.  InspIRCd is free software: you can
7  * redistribute it and/or modify it under the terms of the GNU General Public
8  * License as published by the Free Software Foundation, version 2.
9  *
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
13  * details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19
20 #pragma once
21
22 namespace IRCv3
23 {
24         namespace ServerTime
25         {
26                 class Manager;
27                 class API;
28
29                 /** Format a unix timestamp into the format used by server-time.
30                  * @param secs UNIX timestamp to format.
31                  * @params millisecs Number of milliseconds to format.
32                  * @return Time in server-time format, as a string.
33                  */
34                 inline std::string FormatTime(time_t secs, long millisecs = 0)
35                 {
36                         std::string timestr = InspIRCd::TimeString(secs, "%Y-%m-%dT%H:%M:%S.Z", true);
37                         timestr.insert(20, InspIRCd::Format("%03ld", millisecs));
38                         return timestr;
39                 }
40         }
41 }
42
43 /** Implements manipulating the server time on messages.
44  * A timestamp can be attached to outgoing client protocol messages to indicate the time when the message
45  * was generated by us. If a message has server time attached then recipient clients who have negotiated
46  * the appropriate protocol extension will receive it.
47  */
48 class IRCv3::ServerTime::Manager : public DataProvider
49 {
50  protected:
51         ClientProtocol::MessageTagProvider* tagprov;
52
53  public:
54         /** Constructor.
55          * @param mod Module that owns the Manager.
56          */
57         Manager(Module* mod)
58                 : DataProvider(mod, "servertimeapi")
59         {
60         }
61
62         /** Set the server time on a message.
63          * @param msg Message to set the time on. No-op if the message already has server time set.
64          * @param t Unix timestamp to set.
65          */
66         void Set(ClientProtocol::Message& msg, time_t t)
67         {
68                 Set(msg, FormatTime(t));
69         }
70
71         /** Set the server time on a message.
72          * @param msg Message to set the time on. No-op if the message already has server time set.
73          * @param timestr Timestamp to set. Must be in server time format.
74          * The FormatTime() function can be used to convert unix timestamps into the required format.
75          */
76         void Set(ClientProtocol::Message& msg, const std::string& timestr)
77         {
78                 msg.AddTag("time", tagprov, timestr);
79         }
80 };
81
82 /** Server time API. Use this to access the Manager.
83  */
84 class IRCv3::ServerTime::API : public dynamic_reference_nocheck<Manager>
85 {
86  public:
87         API(Module* mod)
88                 : dynamic_reference_nocheck<Manager>(mod, "servertimeapi")
89         {
90         }
91 };