diff options
author | Skjalf <47818697+Nyeriah@users.noreply.github.com> | 2021-11-20 16:47:41 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-20 16:47:41 -0300 |
commit | 3d95308d4067f1b661284f7948819241c311ab49 (patch) | |
tree | 0443efb4481fe2c4fa958fb59fe68c3b33dd4f63 | |
parent | 3b803969930d90e74fa9cd6c8b03faaf6b7a4b85 (diff) |
feat(Scripts/Commands): Implement restart/shutdown reasons (#9242)
-rw-r--r-- | src/server/game/World/IWorld.h | 4 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 11 | ||||
-rw-r--r-- | src/server/game/World/World.h | 4 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_server.cpp | 80 | ||||
-rw-r--r-- | src/test/mocks/WorldMock.h | 4 |
5 files changed, 86 insertions, 17 deletions
diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index 0af9eb0571..5582c43f8a 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -545,9 +545,9 @@ public: virtual void SendServerMessage(ServerMessageType type, const char* text = "", Player* player = nullptr) = 0; virtual bool IsShuttingDown() const = 0; virtual uint32 GetShutDownTimeLeft() const = 0; - virtual void ShutdownServ(uint32 time, uint32 options, uint8 exitcode) = 0; + virtual void ShutdownServ(uint32 time, uint32 options, uint8 exitcode, const std::string& reason = std::string()) = 0; virtual void ShutdownCancel() = 0; - virtual void ShutdownMsg(bool show = false, Player* player = nullptr) = 0; + virtual void ShutdownMsg(bool show = false, Player* player = nullptr, const std::string& reason = std::string()) = 0; virtual void Update(uint32 diff) = 0; virtual void UpdateSessions(uint32 diff) = 0; virtual void setRate(Rates rate, float value) = 0; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 54840072ba..1ff937724d 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2712,7 +2712,7 @@ void World::_UpdateGameTime() } /// Shutdown the server -void World::ShutdownServ(uint32 time, uint32 options, uint8 exitcode) +void World::ShutdownServ(uint32 time, uint32 options, uint8 exitcode, const std::string& reason) { // ignore if server shutdown at next tick if (IsStopped()) @@ -2733,14 +2733,14 @@ void World::ShutdownServ(uint32 time, uint32 options, uint8 exitcode) else { m_ShutdownTimer = time; - ShutdownMsg(true); + ShutdownMsg(true, nullptr, reason); } sScriptMgr->OnShutdownInitiate(ShutdownExitCode(exitcode), ShutdownMask(options)); } /// Display a shutdown message to the user(s) -void World::ShutdownMsg(bool show, Player* player) +void World::ShutdownMsg(bool show, Player* player, const std::string& reason) { // not show messages for idle shutdown mode if (m_ShutdownMask & SHUTDOWN_MASK_IDLE) @@ -2756,6 +2756,11 @@ void World::ShutdownMsg(bool show, Player* player) { std::string str = secsToTimeString(m_ShutdownTimer).append("."); + if (!reason.empty()) + { + str += " - " + reason; + } + ServerMessageType msgid = (m_ShutdownMask & SHUTDOWN_MASK_RESTART) ? SERVER_MSG_RESTART_TIME : SERVER_MSG_SHUTDOWN_TIME; SendServerMessage(msgid, str.c_str(), player); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index ab3b1ff037..b2f2658654 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -265,9 +265,9 @@ public: /// Are we in the middle of a shutdown? bool IsShuttingDown() const { return m_ShutdownTimer > 0; } uint32 GetShutDownTimeLeft() const { return m_ShutdownTimer; } - void ShutdownServ(uint32 time, uint32 options, uint8 exitcode); + void ShutdownServ(uint32 time, uint32 options, uint8 exitcode, const std::string& reason = std::string()); void ShutdownCancel(); - void ShutdownMsg(bool show = false, Player* player = nullptr); + void ShutdownMsg(bool show = false, Player* player = nullptr, const std::string& reason = std::string()); static uint8 GetExitCode() { return m_ExitCode; } static void StopNow(uint8 exitcode) { m_stopEvent = true; m_ExitCode = exitcode; } static bool IsStopped() { return m_stopEvent; } diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index 62a69810ef..ce0b8ab118 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -267,57 +267,121 @@ public: return true; } - static bool HandleServerShutDownCommand(ChatHandler* /*handler*/, int32 time, Optional<int32> exitCode) + static bool HandleServerShutDownCommand(ChatHandler* /*handler*/, int32 time, Optional<int32> exitCode, Tail reason) { + std::wstring wReason = std::wstring(); + std::string strReason = std::string(); + + if (!reason.empty()) + { + if (!Utf8toWStr(reason, wReason)) + { + return false; + } + + if (!WStrToUtf8(wReason, strReason)) + { + return false; + } + } + if (exitCode && *exitCode >= 0 && *exitCode <= 125) { sWorld->ShutdownServ(time, 0, *exitCode); } else { - sWorld->ShutdownServ(time, 0, SHUTDOWN_EXIT_CODE); + sWorld->ShutdownServ(time, 0, SHUTDOWN_EXIT_CODE, strReason); } return true; } - static bool HandleServerRestartCommand(ChatHandler* /*handler*/, int32 time, Optional<int32> exitCode) + static bool HandleServerRestartCommand(ChatHandler* /*handler*/, int32 time, Optional<int32> exitCode, Tail reason) { + std::wstring wReason = std::wstring(); + std::string strReason = std::string(); + + if (!reason.empty()) + { + if (!Utf8toWStr(reason, wReason)) + { + return false; + } + + if (!WStrToUtf8(wReason, strReason)) + { + return false; + } + } + if (exitCode && *exitCode >= 0 && *exitCode <= 125) { sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART, *exitCode); } else { - sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART, RESTART_EXIT_CODE); + sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART, RESTART_EXIT_CODE, strReason); } return true; } - static bool HandleServerIdleRestartCommand(ChatHandler* /*handler*/, int32 time, Optional<int32> exitCode) + static bool HandleServerIdleRestartCommand(ChatHandler* /*handler*/, int32 time, Optional<int32> exitCode, Tail reason) { + std::wstring wReason = std::wstring(); + std::string strReason = std::string(); + + if (!reason.empty()) + { + if (!Utf8toWStr(reason, wReason)) + { + return false; + } + + if (!WStrToUtf8(wReason, strReason)) + { + return false; + } + } + if (exitCode && *exitCode >= 0 && *exitCode <= 125) { sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART | SHUTDOWN_MASK_IDLE, *exitCode); } else { - sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART | SHUTDOWN_MASK_IDLE, RESTART_EXIT_CODE); + sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART | SHUTDOWN_MASK_IDLE, RESTART_EXIT_CODE, strReason); } return true; } - static bool HandleServerIdleShutDownCommand(ChatHandler* /*handler*/, int32 time, Optional<int32> exitCode) + static bool HandleServerIdleShutDownCommand(ChatHandler* /*handler*/, int32 time, Optional<int32> exitCode, Tail reason) { + std::wstring wReason = std::wstring(); + std::string strReason = std::string(); + + if (!reason.empty()) + { + if (!Utf8toWStr(reason, wReason)) + { + return false; + } + + if (!WStrToUtf8(wReason, strReason)) + { + return false; + } + } + if (exitCode && *exitCode >= 0 && *exitCode <= 125) { sWorld->ShutdownServ(time, SHUTDOWN_MASK_IDLE, *exitCode); } else { - sWorld->ShutdownServ(time, SHUTDOWN_MASK_IDLE, SHUTDOWN_EXIT_CODE); + sWorld->ShutdownServ(time, SHUTDOWN_MASK_IDLE, SHUTDOWN_EXIT_CODE, strReason); } return true; diff --git a/src/test/mocks/WorldMock.h b/src/test/mocks/WorldMock.h index ca469c1ca8..14ec735790 100644 --- a/src/test/mocks/WorldMock.h +++ b/src/test/mocks/WorldMock.h @@ -86,9 +86,9 @@ public: MOCK_METHOD(void, SendServerMessage, (ServerMessageType type, const char* text, Player* player)); MOCK_METHOD(bool, IsShuttingDown, (), (const)); MOCK_METHOD(uint32, GetShutDownTimeLeft, (), (const)); - MOCK_METHOD(void, ShutdownServ, (uint32 time, uint32 options, uint8 exitcode), ()); + MOCK_METHOD(void, ShutdownServ, (uint32 time, uint32 options, uint8 exitcode, const std::string& reason), ()); MOCK_METHOD(void, ShutdownCancel, ()); - MOCK_METHOD(void, ShutdownMsg, (bool show, Player* player), ()); + MOCK_METHOD(void, ShutdownMsg, (bool show, Player* player, const std::string& reason), ()); MOCK_METHOD(void, Update, (uint32 diff), ()); MOCK_METHOD(void, UpdateSessions, (uint32 diff), ()); MOCK_METHOD(void, setRate, (Rates rate, float value), ()); |