From e02c22ff165c7b0dbe39343066a4167e94f5618e Mon Sep 17 00:00:00 2001 From: Matt Schatz Date: Sun, 17 Feb 2019 02:10:26 -0700 Subject: Add a function for displaying human-readable durations. Add InspIRCd::DurationString() to take a time_t and return a string with the duration in a human-readable format (ex: 1y20w2d3h5m9s). --- include/inspircd.h | 6 ++++++ src/helperfuncs.cpp | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/include/inspircd.h b/include/inspircd.h index f5c7dbafb..0de64b103 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -516,6 +516,12 @@ class CoreExport InspIRCd */ static bool IsValidDuration(const std::string& str); + /** Return a duration in seconds as a human-readable string. + * @param duration The duration in seconds to convert to a human-readable string. + * @return A string representing the given duration. + */ + static std::string DurationString(time_t duration); + /** Attempt to compare a password to a string from the config file. * This will be passed to handling modules which will compare the data * against possible hashed equivalents in the input string. diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp index 94a5240c9..846feab50 100644 --- a/src/helperfuncs.cpp +++ b/src/helperfuncs.cpp @@ -7,6 +7,7 @@ * Copyright (C) 2008 Thomas Stagner * Copyright (C) 2006-2007 Oliver Lupton * Copyright (C) 2007 Dennis Friis + * Copyright (C) 2003-2019 Anope Team * * This file is part of InspIRCd. InspIRCd is free software: you can * redistribute it and/or modify it under the terms of the GNU General Public @@ -429,6 +430,33 @@ bool InspIRCd::IsValidDuration(const std::string& duration) return true; } +std::string InspIRCd::DurationString(time_t duration) +{ + time_t years = duration / 31536000; + time_t weeks = (duration / 604800) % 52; + time_t days = (duration / 86400) % 7; + time_t hours = (duration / 3600) % 24; + time_t minutes = (duration / 60) % 60; + time_t seconds = duration % 60; + + std::string ret; + + if (years) + ret = ConvToStr(years) + "y"; + if (weeks) + ret += ConvToStr(weeks) + "w"; + if (days) + ret += ConvToStr(days) + "d"; + if (hours) + ret += ConvToStr(hours) + "h"; + if (minutes) + ret += ConvToStr(minutes) + "m"; + if (seconds) + ret += ConvToStr(seconds) + "s"; + + return ret; +} + std::string InspIRCd::Format(va_list& vaList, const char* formatString) { static std::vector formatBuffer(1024); -- cgit v1.2.3