2 * InspIRCd -- Internet Relay Chat Daemon
4 * Copyright (C) 2018-2019 Sadie Powell <sadie@witchery.services>
5 * Copyright (C) 2018 Attila Molnar <attilamolnar@hush.com>
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.
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
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/>.
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.
35 inline std::string FormatTime(time_t secs, long millisecs = 0)
37 std::string timestr = InspIRCd::TimeString(secs, "%Y-%m-%dT%H:%M:%S.Z", true);
38 timestr.insert(20, InspIRCd::Format("%03ld", millisecs));
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.
49 class IRCv3::ServerTime::Manager : public DataProvider
52 ClientProtocol::MessageTagProvider* tagprov;
56 * @param mod Module that owns the Manager.
59 : DataProvider(mod, "servertimeapi")
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.
67 void Set(ClientProtocol::Message& msg, time_t t)
69 Set(msg, FormatTime(t));
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.
77 void Set(ClientProtocol::Message& msg, const std::string& timestr)
79 msg.AddTag("time", tagprov, timestr);
83 /** Server time API. Use this to access the Manager.
85 class IRCv3::ServerTime::API : public dynamic_reference_nocheck<Manager>
89 : dynamic_reference_nocheck<Manager>(mod, "servertimeapi")