2 * InspIRCd -- Internet Relay Chat Daemon
4 * Copyright (C) 2016 Attila Molnar <attilamolnar@hush.com>
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.
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
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/>.
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.
33 inline std::string FormatTime(time_t t)
35 return InspIRCd::TimeString(t, "%Y-%m-%dT%H:%M:%S.000Z", true);
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.
45 class IRCv3::ServerTime::Manager : public DataProvider
48 ClientProtocol::MessageTagProvider* tagprov;
52 * @param mod Module that owns the Manager.
55 : DataProvider(mod, "servertimeapi")
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.
63 void Set(ClientProtocol::Message& msg, time_t t)
65 Set(msg, FormatTime(t));
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.
73 void Set(ClientProtocol::Message& msg, const std::string& timestr)
75 msg.AddTag("time", tagprov, timestr);
79 /** Server time API. Use this to access the Manager.
81 class IRCv3::ServerTime::API : public dynamic_reference_nocheck<Manager>
85 : dynamic_reference_nocheck<Manager>(mod, "servertimeapi")