summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSkjalf <47818697+Nyeriah@users.noreply.github.com>2021-11-20 16:47:41 -0300
committerGitHub <noreply@github.com>2021-11-20 16:47:41 -0300
commit3d95308d4067f1b661284f7948819241c311ab49 (patch)
tree0443efb4481fe2c4fa958fb59fe68c3b33dd4f63
parent3b803969930d90e74fa9cd6c8b03faaf6b7a4b85 (diff)
feat(Scripts/Commands): Implement restart/shutdown reasons (#9242)
-rw-r--r--src/server/game/World/IWorld.h4
-rw-r--r--src/server/game/World/World.cpp11
-rw-r--r--src/server/game/World/World.h4
-rw-r--r--src/server/scripts/Commands/cs_server.cpp80
-rw-r--r--src/test/mocks/WorldMock.h4
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), ());