Adds api_client support for GET /licenses/{key}/schedule with If-None-Match
and target-payload parsing (version/type/daily/weekly + legacy blocks), an
atomic on-disk schedule cache, a pure schedule engine (half-open blocks,
midnight self-wrap for daily, Sunday->Monday spillover for weekly, invalid
blocks skipped with a warning), and a background ScheduleManager that loads
the cache offline and pulls on boot and every 5 minutes. Adds engine/cache
tests against the shared docs/fixtures, including 304, corrupt cache, and
offline cases.
38 lines
1.1 KiB
C++
38 lines
1.1 KiB
C++
#pragma once
|
|
|
|
#include <ctime>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace radiantwave::timezone {
|
|
|
|
struct TimeZoneInfo {
|
|
std::string display_name;
|
|
std::string iana_code;
|
|
};
|
|
|
|
struct CountryTimeZones {
|
|
std::string country_name;
|
|
std::vector<TimeZoneInfo> zones;
|
|
};
|
|
|
|
// Returns standard Linux / IANA timezones grouped by country
|
|
const std::vector<CountryTimeZones>& getStandardTimeZones();
|
|
|
|
// Converts a UTC timestamp to the user's configured IANA timezone
|
|
std::string formatUtcToTimezone(time_t utc_time, const std::string& iana_code, const std::string& format = "%Y-%m-%d %H:%M:%S %Z");
|
|
|
|
// Wall-clock minutes since midnight (0-1439) right now in `iana_code`. Used by
|
|
// the schedule to pick the active listening block. Falls back to UTC when the
|
|
// timezone is empty.
|
|
int currentLocalMinutes(const std::string& iana_code);
|
|
|
|
// Weekday right now in `iana_code`, 0=Monday .. 6=Sunday. Falls back to UTC when
|
|
// the timezone is empty.
|
|
int currentLocalWeekday(const std::string& iana_code);
|
|
|
|
// Gets current UTC timestamp as ISO string
|
|
std::string getUtcTimestampIso();
|
|
|
|
} // namespace radiantwave::timezone
|