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