aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2014-08-30 16:36:24 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2014-08-30 16:36:24 +0200
commit56e0459b07a1e09b541dd77ce7d357f0905e302e (patch)
tree8b73dd7a415b93c149c2b74e7a4e1fa694a21d68 /src
parentf89739dab5d8eec4495da9d7c7199fd0cb9cc851 (diff)
parent2086ba46cfaaca9f5690c5f88c5479b986f9876a (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Diffstat (limited to 'src')
-rw-r--r--src/server/game/World/World.cpp8
-rw-r--r--src/server/game/World/World.h4
-rw-r--r--src/server/scripts/Commands/cs_server.cpp183
3 files changed, 63 insertions, 132 deletions
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 6018ff9a607..ab8a1acc5f4 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -2592,7 +2592,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())
@@ -2613,14 +2613,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)
@@ -2635,6 +2635,8 @@ void World::ShutdownMsg(bool show, Player* player)
(m_ShutdownTimer > 12 * HOUR && (m_ShutdownTimer % (12 * HOUR)) == 0)) // > 12 h ; every 12 h
{
std::string str = secsToTimeString(m_ShutdownTimer);
+ if (!reason.empty())
+ str += " - " + reason;
ServerMessageType msgid = (m_ShutdownMask & SHUTDOWN_MASK_RESTART) ? SERVER_MSG_RESTART_TIME : SERVER_MSG_SHUTDOWN_TIME;
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index aac434482c6..6523ade972a 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -656,9 +656,9 @@ class World
/// 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 = NULL);
+ void ShutdownMsg(bool show = false, Player* player = NULL, 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 04cc9ae4ad5..43afea1b381 100644
--- a/src/server/scripts/Commands/cs_server.cpp
+++ b/src/server/scripts/Commands/cs_server.cpp
@@ -30,6 +30,8 @@ EndScriptData */
#include "ScriptMgr.h"
#include "SystemConfig.h"
+#include <regex>
+
class server_commandscript : public CommandScript
{
public:
@@ -201,145 +203,22 @@ public:
static bool HandleServerShutDownCommand(ChatHandler* /*handler*/, char const* args)
{
- if (!*args)
- return false;
-
- char* timeStr = strtok((char*) args, " ");
- char* exitCodeStr = strtok(NULL, "");
-
- int32 time = atoi(timeStr);
-
- // Prevent interpret wrong arg value as 0 secs shutdown time
- if ((time == 0 && (timeStr[0] != '0' || timeStr[1] != '\0')) || time < 0)
- return false;
-
- if (exitCodeStr)
- {
- int32 exitCode = atoi(exitCodeStr);
-
- // Handle atoi() errors
- if (exitCode == 0 && (exitCodeStr[0] != '0' || exitCodeStr[1] != '\0'))
- return false;
-
- // Exit code should be in range of 0-125, 126-255 is used
- // in many shells for their own return codes and code > 255
- // is not supported in many others
- if (exitCode < 0 || exitCode > 125)
- return false;
-
- sWorld->ShutdownServ(time, 0, exitCode);
- }
- else
- sWorld->ShutdownServ(time, 0, SHUTDOWN_EXIT_CODE);
-
- return true;
+ return ShutdownServer(args, 0, SHUTDOWN_EXIT_CODE);
}
static bool HandleServerRestartCommand(ChatHandler* /*handler*/, char const* args)
{
- if (!*args)
- return false;
-
- char* timeStr = strtok((char*) args, " ");
- char* exitCodeStr = strtok(NULL, "");
-
- int32 time = atoi(timeStr);
-
- // Prevent interpret wrong arg value as 0 secs shutdown time
- if ((time == 0 && (timeStr[0] != '0' || timeStr[1] != '\0')) || time < 0)
- return false;
-
- if (exitCodeStr)
- {
- int32 exitCode = atoi(exitCodeStr);
-
- // Handle atoi() errors
- if (exitCode == 0 && (exitCodeStr[0] != '0' || exitCodeStr[1] != '\0'))
- return false;
-
- // Exit code should be in range of 0-125, 126-255 is used
- // in many shells for their own return codes and code > 255
- // is not supported in many others
- if (exitCode < 0 || exitCode > 125)
- return false;
-
- sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART, exitCode);
- }
- else
- sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART, RESTART_EXIT_CODE);
-
- return true;
+ return ShutdownServer(args, SHUTDOWN_MASK_RESTART, RESTART_EXIT_CODE);
}
static bool HandleServerIdleRestartCommand(ChatHandler* /*handler*/, char const* args)
{
- if (!*args)
- return false;
-
- char* timeStr = strtok((char*) args, " ");
- char* exitCodeStr = strtok(NULL, "");
-
- int32 time = atoi(timeStr);
-
- // Prevent interpret wrong arg value as 0 secs shutdown time
- if ((time == 0 && (timeStr[0] != '0' || timeStr[1] != '\0')) || time < 0)
- return false;
-
- if (exitCodeStr)
- {
- int32 exitCode = atoi(exitCodeStr);
-
- // Handle atoi() errors
- if (exitCode == 0 && (exitCodeStr[0] != '0' || exitCodeStr[1] != '\0'))
- return false;
-
- // Exit code should be in range of 0-125, 126-255 is used
- // in many shells for their own return codes and code > 255
- // is not supported in many others
- if (exitCode < 0 || exitCode > 125)
- return false;
-
- sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART | SHUTDOWN_MASK_IDLE, exitCode);
- }
- else
- sWorld->ShutdownServ(time, SHUTDOWN_MASK_RESTART | SHUTDOWN_MASK_IDLE, RESTART_EXIT_CODE);
- return true;
+ return ShutdownServer(args, SHUTDOWN_MASK_RESTART | SHUTDOWN_MASK_IDLE, RESTART_EXIT_CODE);
}
static bool HandleServerIdleShutDownCommand(ChatHandler* /*handler*/, char const* args)
{
- if (!*args)
- return false;
-
- char* timeStr = strtok((char*) args, " ");
- char* exitCodeStr = strtok(NULL, "");
-
- int32 time = atoi(timeStr);
-
- // Prevent interpret wrong arg value as 0 secs shutdown time
- if ((time == 0 && (timeStr[0] != '0' || timeStr[1] != '\0')) || time < 0)
- return false;
-
- if (exitCodeStr)
- {
- int32 exitCode = atoi(exitCodeStr);
-
- // Handle atoi() errors
- if (exitCode == 0 && (exitCodeStr[0] != '0' || exitCodeStr[1] != '\0'))
- return false;
-
- // Exit code should be in range of 0-125, 126-255 is used
- // in many shells for their own return codes and code > 255
- // is not supported in many others
- if (exitCode < 0 || exitCode > 125)
- return false;
-
- sWorld->ShutdownServ(time, SHUTDOWN_MASK_IDLE, exitCode);
- }
- else
- sWorld->ShutdownServ(time, SHUTDOWN_MASK_IDLE, SHUTDOWN_EXIT_CODE);
-
- return true;
+ return ShutdownServer(args, SHUTDOWN_MASK_IDLE, SHUTDOWN_EXIT_CODE);
}
// Exit the realm
@@ -415,6 +294,56 @@ public:
return true;
}
+
+private:
+ static bool ParseExitCode(std::string const& exitCodeStr, int32& exitCode)
+ {
+ exitCode = atoi(exitCodeStr.c_str());
+
+ // Handle atoi() errors
+ if (exitCode == 0 && (exitCodeStr[0] != '0' || exitCodeStr[1] != '\0'))
+ return false;
+
+ // Exit code should be in range of 0-125, 126-255 is used
+ // in many shells for their own return codes and code > 255
+ // is not supported in many others
+ if (exitCode < 0 || exitCode > 125)
+ return false;
+
+ return true;
+ }
+
+ static bool ShutdownServer(char const* args, uint32 shutdownMask, int32 defaultExitCode)
+ {
+ if (!*args)
+ return false;
+
+ // #delay [#exit_code] [reason]
+ std::regex regex("([0-9]+) ([0-9]*) ?(.*)");
+ std::cmatch cm;
+
+ if (!std::regex_match(args, cm, regex))
+ return false;
+
+ std::string delayStr = cm[1];
+ std::string exitCodeStr = cm[2];
+ std::string reason = cm[3];
+
+ int32 delay = atoi(delayStr.c_str());
+
+ // 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.length() > 0)
+ if (!ParseExitCode(exitCodeStr, exitCode))
+ return false;
+
+ sWorld->ShutdownServ(delay, shutdownMask, static_cast<uint8>(exitCode), reason);
+
+ return true;
+ }
};
void AddSC_server_commandscript()