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 secs UNIX timestamp to format.
31 * @params millisecs Number of milliseconds to format.
32 * @return Time in server-time format, as a string.
34 inline std::string FormatTime(time_t secs, long millisecs = 0)
36 std::string timestr = InspIRCd::TimeString(secs, "%Y-%m-%dT%H:%M:%S.Z", true);
37 timestr.insert(20, InspIRCd::Format("%03ld", millisecs));
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.
48 class IRCv3::ServerTime::Manager : public DataProvider
51 ClientProtocol::MessageTagProvider* tagprov;
55 * @param mod Module that owns the Manager.
58 : DataProvider(mod, "servertimeapi")
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.
66 void Set(ClientProtocol::Message& msg, time_t t)
68 Set(msg, FormatTime(t));
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.
76 void Set(ClientProtocol::Message& msg, const std::string& timestr)
78 msg.AddTag("time", tagprov, timestr);
82 /** Server time API. Use this to access the Manager.
84 class IRCv3::ServerTime::API : public dynamic_reference_nocheck<Manager>
88 : dynamic_reference_nocheck<Manager>(mod, "servertimeapi")