diff options
author | Vincent-Michael <vincent_michael@gmx.de> | 2016-05-08 00:01:28 +0200 |
---|---|---|
committer | Vincent-Michael <vincent_michael@gmx.de> | 2016-05-08 00:02:15 +0200 |
commit | 0940f3e0776b58bd7abad472347da7d0dea2ac50 (patch) | |
tree | c945bedf161a05c572d5792b11a2316ef8631f98 /src | |
parent | e226c315cfaad865e9d196fba105e2c8d65010e0 (diff) |
Core/Commands: Allowed .server idlerestart / idleshutdown / restart / shutdown to take another parameter structure:
e.g.:
* .server idlerestart 12d3h13m13s
* .server idleshutdown 46m13s
* .server restart 45h56m
* .server shutdown 323m42s
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Commands/cs_server.cpp | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index 0d0264c022e..60f63650e54 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -29,6 +29,7 @@ EndScriptData */ #include "Player.h" #include "ScriptMgr.h" #include "GitRevision.h" +#include <regex> class server_commandscript : public CommandScript { @@ -316,10 +317,46 @@ private: return false; // #delay [#exit_code] [reason] + int32 delay = 0; char* delayStr = strtok((char*)args, " "); - if (!delayStr || !isNumeric(delayStr)) + if (!delayStr) return false; + if (isNumeric(delayStr)) + { + delay = atoi(delayStr); + // Prevent interpret wrong arg value as 0 secs shutdown time + if ((delay == 0 && (delayStr[0] != '0' || delayStr[1] != '\0')) || delay < 0) + return false; + } + else + { + std::string timeStr(args); + static std::regex const regex("[0-9]+[A-Za-z]"); + auto itr = std::sregex_iterator(timeStr.begin(), timeStr.end(), regex); + auto timesEnd = std::sregex_iterator(); + + for (; itr != timesEnd; ++itr) + { + std::string timeString = itr->str(); + + int32 amount = atoi(timeString.c_str()); + if (std::count(timeString.begin(), timeString.end(), 'd') == 1) + delay += amount * DAY; + else if (std::count(timeString.begin(), timeString.end(), 'h') == 1) + delay += amount * HOUR; + else if (std::count(timeString.begin(), timeString.end(), 'm') == 1) + delay += amount * MINUTE; + else if (std::count(timeString.begin(), timeString.end(), 's') == 1) + delay += amount * 1; + else + return false; + } + + if (delay == 0 || delay < 0) + return false; + } + char* exitCodeStr = nullptr; char reason[256] = { 0 }; @@ -340,12 +377,6 @@ private: } } - int32 delay = atoi(delayStr); - - // Prevent interpret wrong arg value as 0 secs shutdown time - if ((delay == 0 && (delayStr[0] != '0' || delayStr[1] != '\0')) || delay < 0) - return false; - int32 exitCode = defaultExitCode; if (exitCodeStr) if (!ParseExitCode(exitCodeStr, exitCode)) |