diff options
author | ForesterDev <11771800+ForesterDev@users.noreply.github.com> | 2020-02-23 00:31:37 +0400 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-12-22 01:25:24 +0100 |
commit | 69f768605082222a3ca573c623d3fc019106be3b (patch) | |
tree | 1045f82caa4c7eb3709033e57b250784e6d06956 | |
parent | 1d08423725141de712290b18739dcc9b3ea3a7c6 (diff) |
Core/Server: correct timestamp format for shutdown/restart notification broadcasts (#24181)
* Core/SmartScripts: implement SMART_ACTION_OVERRIDE_LIGHT and SMART_ACTION_OVERRIDE_WEATHER
* Core/Server: correct timestamp format for shutdown/restart notification broadcasts
* remove unexpected changes
* move enum from Common to Util
* Use enum class instead of enum
* Fix width for seconds 0 to 9
(cherry picked from commit 69231581e4f2d78384d3efe6f613be1b78e9d40f)
-rw-r--r-- | src/common/Utilities/Util.cpp | 73 | ||||
-rw-r--r-- | src/common/Utilities/Util.h | 9 | ||||
-rw-r--r-- | src/server/game/Support/SupportMgr.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Warden/Warden.cpp | 2 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 2 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_ban.cpp | 14 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_gobject.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_list.cpp | 2 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_misc.cpp | 6 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_npc.cpp | 4 |
10 files changed, 95 insertions, 27 deletions
diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp index 57281bf4fd9..ceee94a8009 100644 --- a/src/common/Utilities/Util.cpp +++ b/src/common/Utilities/Util.cpp @@ -22,6 +22,7 @@ #include "StringFormat.h" #include <utf8.h> #include <algorithm> +#include <iomanip> #include <sstream> #include <string> #include <cctype> @@ -108,7 +109,7 @@ time_t GetLocalHourTimestamp(time_t time, uint8 hour, bool onlyAfterTime) return hourLocal; } -std::string secsToTimeString(uint64 timeInSecs, bool shortText, bool hoursOnly) +std::string secsToTimeString(uint64 timeInSecs, TimeFormat timeFormat, bool hoursOnly) { uint64 secs = timeInSecs % MINUTE; uint64 minutes = timeInSecs % HOUR / MINUTE; @@ -117,15 +118,75 @@ std::string secsToTimeString(uint64 timeInSecs, bool shortText, bool hoursOnly) std::ostringstream ss; if (days) - ss << days << (shortText ? "d" : " Day(s) "); + { + ss << days; + if (timeFormat == TimeFormat::Numeric) + ss << ":"; + else if (timeFormat == TimeFormat::ShortText) + ss << "d"; + else // if (timeFormat == TimeFormat::FullText) + { + if (days == 1) + ss << " Day "; + else + ss << " Days "; + } + } if (hours || hoursOnly) - ss << hours << (shortText ? "h" : " Hour(s) "); + { + ss << hours; + if (timeFormat == TimeFormat::Numeric) + ss << ":"; + else if (timeFormat == TimeFormat::ShortText) + ss << "h"; + else // if (timeFormat == TimeFormat::FullText) + { + if (hours <= 1) + ss << " Hour "; + else + ss << " Hours "; + } + } if (!hoursOnly) { if (minutes) - ss << minutes << (shortText ? "m" : " Minute(s) "); - if (secs || (!days && !hours && !minutes) ) - ss << secs << (shortText ? "s" : " Second(s)."); + { + ss << minutes; + if (timeFormat == TimeFormat::Numeric) + ss << ":"; + else if (timeFormat == TimeFormat::ShortText) + ss << "m"; + else // if (timeFormat == TimeFormat::FullText) + { + if (minutes == 1) + ss << " Minute "; + else + ss << " Minutes "; + } + } + else + { + if (timeFormat == TimeFormat::Numeric) + ss << "0:"; + } + if (secs || (!days && !hours && !minutes)) + { + ss << std::setw(2) << std::setfill('0') << secs; + if (timeFormat == TimeFormat::ShortText) + ss << "s"; + else if (timeFormat == TimeFormat::FullText) + { + if (secs <= 1) + ss << " Second."; + else + ss << " Seconds."; + } + } + else + { + if (timeFormat == TimeFormat::Numeric) + ss << "00"; + } } return ss.str(); diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h index 879ec4e0f67..5a51c545859 100644 --- a/src/common/Utilities/Util.h +++ b/src/common/Utilities/Util.h @@ -28,6 +28,13 @@ enum LocaleConstant : uint8; +enum class TimeFormat : uint8 +{ + FullText, // 1 Days 2 Hours 3 Minutes 4 Seconds + ShortText, // 1d 2h 3m 4s + Numeric // 1:2:3:4 +}; + class TC_COMMON_API Tokenizer { public: @@ -63,7 +70,7 @@ TC_COMMON_API time_t LocalTimeToUTCTime(time_t time); TC_COMMON_API time_t GetLocalHourTimestamp(time_t time, uint8 hour, bool onlyAfterTime = true); TC_COMMON_API tm TimeBreakdown(time_t t); -TC_COMMON_API std::string secsToTimeString(uint64 timeInSecs, bool shortText = false, bool hoursOnly = false); +TC_COMMON_API std::string secsToTimeString(uint64 timeInSecs, TimeFormat timeFormat = TimeFormat::FullText, bool hoursOnly = false); TC_COMMON_API uint32 TimeStringToSecs(std::string const& timestring); TC_COMMON_API std::string TimeToTimestampStr(time_t t); TC_COMMON_API std::string TimeToHumanReadable(time_t t); diff --git a/src/server/game/Support/SupportMgr.cpp b/src/server/game/Support/SupportMgr.cpp index 1feb4d2aa42..83bcb909cf8 100644 --- a/src/server/game/Support/SupportMgr.cpp +++ b/src/server/game/Support/SupportMgr.cpp @@ -162,7 +162,7 @@ std::string BugTicket::FormatViewMessageString(ChatHandler& handler, bool detail std::stringstream ss; ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayerName().c_str()); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGECREATE, (secsToTimeString(curTime - _createTime, true, false)).c_str()); + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGECREATE, (secsToTimeString(curTime - _createTime, TimeFormat::ShortText)).c_str()); if (!_assignedTo.IsEmpty()) ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, GetAssignedToName().c_str()); @@ -286,7 +286,7 @@ std::string ComplaintTicket::FormatViewMessageString(ChatHandler& handler, bool std::stringstream ss; ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayerName().c_str()); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGECREATE, (secsToTimeString(curTime - _createTime, true, false)).c_str()); + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGECREATE, (secsToTimeString(curTime - _createTime, TimeFormat::ShortText)).c_str()); if (!_assignedTo.IsEmpty()) ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, GetAssignedToName().c_str()); @@ -373,7 +373,7 @@ std::string SuggestionTicket::FormatViewMessageString(ChatHandler& handler, bool std::stringstream ss; ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayerName().c_str()); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGECREATE, (secsToTimeString(curTime - _createTime, true, false)).c_str()); + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGECREATE, (secsToTimeString(curTime - _createTime, TimeFormat::ShortText)).c_str()); if (!_assignedTo.IsEmpty()) ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, GetAssignedToName().c_str()); diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index 1de40a1fd83..e08ee670a8a 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -110,7 +110,7 @@ void Warden::Update() if (_clientResponseTimer > maxClientResponseDelay * IN_MILLISECONDS) { TC_LOG_WARN("warden", "%s (latency: %u, IP: %s) exceeded Warden module response delay for more than %s - disconnecting client", - _session->GetPlayerInfo().c_str(), _session->GetLatency(), _session->GetRemoteAddress().c_str(), secsToTimeString(maxClientResponseDelay, true).c_str()); + _session->GetPlayerInfo().c_str(), _session->GetLatency(), _session->GetRemoteAddress().c_str(), secsToTimeString(maxClientResponseDelay, TimeFormat::ShortText).c_str()); _session->KickPlayer(); } else diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index b59776ed7b8..c67ca9b99bd 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -3219,7 +3219,7 @@ void World::ShutdownMsg(bool show, Player* player, const std::string& reason) (m_ShutdownTimer < 12 * HOUR && (m_ShutdownTimer % HOUR) == 0) || // < 12 h ; every 1 h (m_ShutdownTimer > 12 * HOUR && (m_ShutdownTimer % (12 * HOUR)) == 0)) // > 12 h ; every 12 h { - std::string str = secsToTimeString(m_ShutdownTimer); + std::string str = secsToTimeString(m_ShutdownTimer, TimeFormat::Numeric); if (!reason.empty()) str += " - " + reason; diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index 5a0a6222f0d..48718cf16bc 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -118,9 +118,9 @@ public: if (atoi(durationStr) > 0) { if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) - sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUBANNEDMESSAGE_WORLD, author.c_str(), name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUBANNEDMESSAGE_WORLD, author.c_str(), name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), TimeFormat::ShortText).c_str(), reasonStr); else - handler->PSendSysMessage(LANG_BAN_YOUBANNED, name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + handler->PSendSysMessage(LANG_BAN_YOUBANNED, name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), TimeFormat::ShortText).c_str(), reasonStr); } else { @@ -205,9 +205,9 @@ public: if (atoi(durationStr) > 0) { if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) - sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, author.c_str(), nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, author.c_str(), nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), TimeFormat::ShortText).c_str(), reasonStr); else - handler->PSendSysMessage(LANG_BAN_YOUBANNED, nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + handler->PSendSysMessage(LANG_BAN_YOUBANNED, nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), TimeFormat::ShortText).c_str(), reasonStr); } else { @@ -288,7 +288,7 @@ public: if (fields[2].GetBool() && (fields[1].GetUInt64() == uint64(0) || unbanDate >= GameTime::GetGameTime())) active = true; bool permanent = (fields[1].GetUInt64() == uint64(0)); - std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt64(), true); + std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt64(), TimeFormat::ShortText); handler->PSendSysMessage(LANG_BANINFO_HISTORYENTRY, fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO), fields[4].GetCString(), fields[5].GetCString()); } @@ -344,7 +344,7 @@ public: if (fields[2].GetUInt8() && (!fields[1].GetInt64() || unbanDate >= GameTime::GetGameTime())) active = true; bool permanent = (fields[1].GetInt64() == SI64LIT(0)); - std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetInt64(), true); + std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetInt64(), TimeFormat::ShortText); handler->PSendSysMessage(LANG_BANINFO_HISTORYENTRY, TimeToTimestampStr(fields[0].GetInt64()).c_str(), banTime.c_str(), active ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO), fields[4].GetCString(), fields[5].GetCString()); } @@ -379,7 +379,7 @@ public: bool permanent = !fields[6].GetUInt64(); handler->PSendSysMessage(LANG_BANINFO_IPENTRY, fields[0].GetCString(), fields[1].GetCString(), permanent ? handler->GetTrinityString(LANG_BANINFO_NEVER) : fields[2].GetCString(), - permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[3].GetUInt64(), true).c_str(), fields[4].GetCString(), fields[5].GetCString()); + permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[3].GetUInt64(), TimeFormat::ShortText).c_str(), fields[4].GetCString(), fields[5].GetCString()); return true; diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index 0647eb8e3c9..3bf6b0ba3f2 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -332,8 +332,8 @@ public: if (curRespawnDelay < 0) curRespawnDelay = 0; - std::string curRespawnDelayStr = secsToTimeString(curRespawnDelay, true); - std::string defRespawnDelayStr = secsToTimeString(target->GetRespawnDelay(), true); + std::string curRespawnDelayStr = secsToTimeString(curRespawnDelay, TimeFormat::ShortText); + std::string defRespawnDelayStr = secsToTimeString(target->GetRespawnDelay(), TimeFormat::ShortText); handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str()); } diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index f0856c9a028..96d940a3089 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -732,7 +732,7 @@ public: } uint32 gridY = ri->gridId / MAX_NUMBER_OF_GRIDS; uint32 gridX = ri->gridId % MAX_NUMBER_OF_GRIDS; - std::string respawnTime = ri->respawnTime > GameTime::GetGameTime() ? secsToTimeString(uint64(ri->respawnTime - GameTime::GetGameTime()), true) : stringOverdue; + std::string respawnTime = ri->respawnTime > GameTime::GetGameTime() ? secsToTimeString(uint64(ri->respawnTime - GameTime::GetGameTime()), TimeFormat::ShortText) : stringOverdue; handler->PSendSysMessage(UI64FMTD " | %u | [%02u,%02u] | %s (%u) | %s%s", ri->spawnId, ri->entry, gridX, gridY, GetZoneName(respawnZoneId, locale), respawnZoneId, respawnTime.c_str(), map->IsSpawnGroupActive(data->spawnGroupData->groupId) ? "" : " (inactive)"); } } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index af77c7466d2..7bf851699ca 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1868,11 +1868,11 @@ public: // Output III. LANG_PINFO_BANNED if ban exists and is applied if (banTime >= 0) - handler->PSendSysMessage(LANG_PINFO_BANNED, banType.c_str(), banReason.c_str(), banTime > 0 ? secsToTimeString(banTime - GameTime::GetGameTime(), true).c_str() : handler->GetTrinityString(LANG_PERMANENTLY), bannedBy.c_str()); + handler->PSendSysMessage(LANG_PINFO_BANNED, banType.c_str(), banReason.c_str(), banTime > 0 ? secsToTimeString(banTime - GameTime::GetGameTime(), TimeFormat::ShortText).c_str() : handler->GetTrinityString(LANG_PERMANENTLY), bannedBy.c_str()); // Output IV. LANG_PINFO_MUTED if mute is applied if (muteTime > 0) - handler->PSendSysMessage(LANG_PINFO_MUTED, muteReason.c_str(), secsToTimeString(muteTime - GameTime::GetGameTime(), true).c_str(), muteBy.c_str()); + handler->PSendSysMessage(LANG_PINFO_MUTED, muteReason.c_str(), secsToTimeString(muteTime - GameTime::GetGameTime(), TimeFormat::ShortText).c_str(), muteBy.c_str()); // Output V. LANG_PINFO_ACC_ACCOUNT handler->PSendSysMessage(LANG_PINFO_ACC_ACCOUNT, userName.c_str(), accId, security); @@ -1948,7 +1948,7 @@ public: } // Output XX. LANG_PINFO_CHR_PLAYEDTIME - handler->PSendSysMessage(LANG_PINFO_CHR_PLAYEDTIME, (secsToTimeString(totalPlayerTime, true, true)).c_str()); + handler->PSendSysMessage(LANG_PINFO_CHR_PLAYEDTIME, (secsToTimeString(totalPlayerTime, TimeFormat::ShortText, true)).c_str()); // Mail Data - an own query, because it may or may not be useful. // SQL: "SELECT SUM(CASE WHEN (checked & 1) THEN 1 ELSE 0 END) AS 'readmail', COUNT(*) AS 'totalmail' FROM mail WHERE `receiver` = ?" diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index dd0a1e27960..06c092f9de2 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -659,8 +659,8 @@ public: if (curRespawnDelay < 0) curRespawnDelay = 0; - std::string curRespawnDelayStr = secsToTimeString(uint64(curRespawnDelay), true); - std::string defRespawnDelayStr = secsToTimeString(target->GetRespawnDelay(), true); + std::string curRespawnDelayStr = secsToTimeString(uint64(curRespawnDelay), TimeFormat::ShortText); + std::string defRespawnDelayStr = secsToTimeString(target->GetRespawnDelay(), TimeFormat::ShortText); handler->PSendSysMessage(LANG_NPCINFO_CHAR, target->GetName().c_str(), std::to_string(target->GetSpawnId()).c_str(), target->GetGUID().ToString().c_str(), entry, faction, std::to_string(npcflags).c_str(), displayid, nativeid); if (target->GetCreatureData() && target->GetCreatureData()->spawnGroupData->groupId) |