]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - include/modules/ircv3_servertime.h
Add support for the IRCv3 server-time specification.
[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 t Time to format.
31                  * @return Time in server-time format, as a string.
32                  */
33                 inline std::string FormatTime(time_t t)
34                 {
35                         return InspIRCd::TimeString(t, "%Y-%m-%dT%H:%M:%S.000Z", true);
36                 }
37         }
38 }
39
40 /** Implements manipulating the server time on messages.
41  * A timestamp can be attached to outgoing client protocol messages to indicate the time when the message
42  * was generated by us. If a message has server time attached then recipient clients who have negotiated
43  * the appropriate protocol extension will receive it.
44  */
45 class IRCv3::ServerTime::Manager : public DataProvider
46 {
47  protected:
48         ClientProtocol::MessageTagProvider* tagprov;
49
50  public:
51         /** Constructor.
52          * @param mod Module that owns the Manager.
53          */
54         Manager(Module* mod)
55                 : DataProvider(mod, "servertimeapi")
56         {
57         }
58
59         /** Set the server time on a message.
60          * @param msg Message to set the time on. No-op if the message already has server time set.
61          * @param t Unix timestamp to set.
62          */
63         void Set(ClientProtocol::Message& msg, time_t t)
64         {
65                 Set(msg, FormatTime(t));
66         }
67
68         /** Set the server time on a message.
69          * @param msg Message to set the time on. No-op if the message already has server time set.
70          * @param timestr Timestamp to set. Must be in server time format.
71          * The FormatTime() function can be used to convert unix timestamps into the required format.
72          */
73         void Set(ClientProtocol::Message& msg, const std::string& timestr)
74         {
75                 msg.AddTag("time", tagprov, timestr);
76         }
77 };
78
79 /** Server time API. Use this to access the Manager.
80  */
81 class IRCv3::ServerTime::API : public dynamic_reference_nocheck<Manager>
82 {
83  public:
84         API(Module* mod)
85                 : dynamic_reference_nocheck<Manager>(mod, "servertimeapi")
86         {
87         }
88 };