44#include <boost/filesystem/operations.hpp>
45#include <openssl/crypto.h>
46#include <openssl/opensslv.h>
49#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
50#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
60 static std::vector<ChatCommand> serverIdleRestartCommandTable =
66 static std::vector<ChatCommand> serverIdleShutdownCommandTable =
72 static std::vector<ChatCommand> serverRestartCommandTable =
79 static std::vector<ChatCommand> serverShutdownCommandTable =
86 static std::vector<ChatCommand> serverSetCommandTable =
93 static std::vector<ChatCommand> serverCommandTable =
108 static std::vector<ChatCommand> commandTable =
118 sWorld->RemoveOldCorpses();
124 std::string dbPortOutput;
128 dbPort = (*res)[0].GetUInt16();
136 handler->
PSendSysMessage(
"Using SSL version: %s (library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION));
137 handler->
PSendSysMessage(
"Using Boost version: %i.%i.%i", BOOST_VERSION / 100000, BOOST_VERSION / 100 % 1000, BOOST_VERSION % 100);
145 handler->
SendSysMessage(
"Automatic database updates are disabled for all databases!");
148 static char const*
const databaseNames[] =
155 static size_t constexpr databaseCount = std::extent<
decltype(databaseNames)>::value;
157 std::string availableUpdateDatabases;
158 for (
uint32 i = 0; i < databaseCount; ++i)
160 if (!(updateFlags & (1 << i)))
163 availableUpdateDatabases += databaseNames[i];
164 if (i != databaseCount - 1)
165 availableUpdateDatabases +=
", ";
168 handler->
PSendSysMessage(
"Automatic database updates are enabled for the following databases: %s", availableUpdateDatabases.c_str());
180 std::string dataDir =
sWorld->GetDataPath();
181 std::vector<std::string> subDirs;
182 subDirs.emplace_back(
"maps");
183 if (vmapIndoorCheck || vmapLOSCheck || vmapHeightCheck)
185 handler->
PSendSysMessage(
"VMAPs status: Enabled. LineOfSight: %i, getHeight: %i, indoorCheck: %i", vmapLOSCheck, vmapHeightCheck, vmapIndoorCheck);
186 subDirs.emplace_back(
"vmaps");
194 subDirs.emplace_back(
"mmaps");
199 for (std::string
const& subDir : subDirs)
201 boost::filesystem::path mapPath(dataDir);
204 if (!boost::filesystem::exists(mapPath))
206 handler->
PSendSysMessage(
"%s directory doesn't exist!. Using path: %s", subDir.c_str(), mapPath.generic_string().c_str());
210 auto end = boost::filesystem::directory_iterator();
211 std::size_t folderSize = std::accumulate(boost::filesystem::directory_iterator(mapPath), end, std::size_t(0), [](std::size_t val, boost::filesystem::path
const& mapFile)
213 boost::system::error_code ec;
214 if (boost::filesystem::is_regular_file(mapFile, ec))
215 val += boost::filesystem::file_size(mapFile);
219 handler->
PSendSysMessage(
"%s directory located in %s. Total size: " SZFMTD " bytes", subDir.c_str(), mapPath.generic_string().c_str(), folderSize);
223 uint32 availableLocalesMask = (1 << defaultLocale);
228 if (locale == defaultLocale)
231 if (
sWorld->GetAvailableDbcLocale(locale) != defaultLocale)
232 availableLocalesMask |= (1 << locale);
235 std::string availableLocales;
238 if (!(availableLocalesMask & (1 << i)))
243 availableLocales +=
" ";
246 handler->
PSendSysMessage(
"Using %s DBC Locale as default. All available DBC locales: %s",
localeNames[defaultLocale], availableLocales.c_str());
260 uint32 activeClientsNum =
sWorld->GetActiveSessionCount();
261 uint32 queuedClientsNum =
sWorld->GetQueuedSessionCount();
262 uint32 maxActiveClientsNum =
sWorld->GetMaxActiveSessionCount();
263 uint32 maxQueuedClientsNum =
sWorld->GetMaxQueuedSessionCount();
273 if (
sWorld->IsShuttingDown())
282 for (std::string
const& line :
sWorld->GetMotd())
292 char* paramStr = strtok((
char*)args,
" ");
296 int32 limit = strlen(paramStr);
298 if (strncmp(paramStr,
"player", limit) == 0)
300 else if (strncmp(paramStr,
"moderator", limit) == 0)
302 else if (strncmp(paramStr,
"gamemaster", limit) == 0)
304 else if (strncmp(paramStr,
"administrator", limit) == 0)
306 else if (strncmp(paramStr,
"reset", limit) == 0)
308 sWorld->SetPlayerAmountLimit(
sConfigMgr->GetIntDefault(
"PlayerLimit", 100));
309 sWorld->LoadDBAllowedSecurityLevel();
313 int32 value = atoi(paramStr);
321 uint32 playerAmountLimit =
sWorld->GetPlayerAmountLimit();
323 char const* secName =
"";
324 switch (allowedAccountType)
330 secName =
"Moderator";
333 secName =
"Gamemaster";
336 secName =
"Administrator";
339 secName =
"<unknown>";
342 handler->
PSendSysMessage(
"Player limits: amount %u, min. security level %s.", playerAmountLimit, secName);
360 for (SessionMap::value_type
const& session : sessions)
361 if (session.second && myAddr != session.second->GetRemoteAddress())
414 if (strncmp(args,
"on", 3) == 0)
420 else if (strncmp(args,
"off", 4) == 0)
435 if (name.empty() || level < 0 || (type !=
"a" && type !=
"l"))
438 sLog->SetLogLevel(name, level, type ==
"l");
445 exitCode = atoi(exitCodeStr);
448 if (exitCode == 0 && (exitCodeStr[0] !=
'0' || exitCodeStr[1] !=
'\0'))
454 if (exitCode < 0 || exitCode > 125)
465 if (strlen(args) > 255)
470 char* delayStr = strtok((
char*)args,
" ");
476 delay = atoi(delayStr);
478 if ((delay == 0 && (delayStr[0] !=
'0' || delayStr[1] !=
'\0')) || delay < 0)
489 char* exitCodeStr =
nullptr;
491 char reason[256] = { 0 };
493 while (
char* nextToken = strtok(
nullptr,
" "))
496 exitCodeStr = nextToken;
499 strcat(reason, nextToken);
500 if (
char* remainingTokens = strtok(
nullptr,
"\0"))
503 strcat(reason, remainingTokens);
509 int32 exitCode = defaultExitCode;
521 sWorld->ShutdownServ(delay, shutdownMask,
static_cast<uint8>(exitCode), std::string(reason));
char const * localeNames[TOTAL_LOCALES]
std::shared_ptr< ResultSet > QueryResult
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
@ LANG_SHUTDOWN_CANCELLED
Role Based Access Control related classes definition.
WorldUpdateTime sWorldUpdateTime
std::string secsToTimeString(uint64 timeInSecs, TimeFormat timeFormat, bool hoursOnly)
uint32 TimeStringToSecs(std::string const ×tring)
bool isNumeric(wchar_t wchar)
WorldSession * GetSession()
void PSendSysMessage(const char *fmt, Args &&... args)
void SetSentErrorMessage(bool val)
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
uint32 GetLastUpdateTime() const
bool isHeightCalcEnabled() const
bool isLineOfSightCalcEnabled() const
static VMapManager2 * createOrGetVMapManager()
Player session in the World.
std::string const & GetRemoteAddress() const
static void StopNow(uint8 exitcode)
static bool ShutdownServer(ChatHandler *handler, char const *args, uint32 shutdownMask, int32 defaultExitCode)
static bool HandleServerForceShutDownCommand(ChatHandler *handler, char const *args)
static bool HandleServerDebugCommand(ChatHandler *handler, char const *)
static bool HandleServerSetMotdCommand(ChatHandler *handler, char const *args)
static bool HandleServerExitCommand(ChatHandler *handler, char const *)
static bool HandleServerCorpsesCommand(ChatHandler *, char const *)
static bool HandleServerShutDownCommand(ChatHandler *handler, char const *args)
static bool HandleServerForceRestartCommand(ChatHandler *handler, char const *args)
static bool HandleServerPLimitCommand(ChatHandler *handler, char const *args)
static bool HandleServerIdleShutDownCommand(ChatHandler *handler, char const *args)
static bool HandleServerSetLogLevelCommand(ChatHandler *, std::string const &type, std::string const &name, int32 level)
std::vector< ChatCommand > GetCommands() const override
static bool HandleServerMotdCommand(ChatHandler *handler, char const *)
static bool IsOnlyUser(WorldSession *mySession)
static bool HandleServerRestartCommand(ChatHandler *handler, char const *args)
static bool HandleServerIdleRestartCommand(ChatHandler *handler, char const *args)
static bool HandleServerSetClosedCommand(ChatHandler *handler, char const *args)
static bool ParseExitCode(char const *exitCodeStr, int32 &exitCode)
static bool HandleServerInfoCommand(ChatHandler *handler, char const *)
static bool HandleServerShutDownCancelCommand(ChatHandler *handler, char const *)
void AddSC_server_commandscript()
std::unordered_map< uint32, WorldSession * > SessionMap
@ CONFIG_FORCE_SHUTDOWN_THRESHOLD
@ CONFIG_VMAP_INDOOR_CHECK
uint32 GetUptime()
Uptime (in secs)
TC_COMMON_API char const * GetCMakeVersion()
TC_COMMON_API char const * GetHostOSVersion()
TC_COMMON_API char const * GetFullVersion()
TC_DATABASE_API uint32 GetLibraryVersion()
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
@ RBAC_PERM_COMMAND_SERVER_SHUTDOWN_FORCE
@ RBAC_PERM_COMMAND_SERVER_SHUTDOWN
@ RBAC_PERM_COMMAND_SERVER_SET_LOGLEVEL
@ RBAC_PERM_COMMAND_SERVER_RESTART_CANCEL
@ RBAC_PERM_COMMAND_SERVER_SET
@ RBAC_PERM_COMMAND_SERVER_EXIT
@ RBAC_PERM_COMMAND_SERVER_RESTART
@ RBAC_PERM_COMMAND_SERVER_PLIMIT
@ RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN_CANCEL
@ RBAC_PERM_COMMAND_SERVER_SHUTDOWN_CANCEL
@ RBAC_PERM_COMMAND_SERVER_IDLERESTART_CANCEL
@ RBAC_PERM_COMMAND_SERVER
@ RBAC_PERM_COMMAND_SERVER_MOTD
@ RBAC_PERM_COMMAND_SERVER_SET_CLOSED
@ RBAC_PERM_COMMAND_SERVER_SET_MOTD
@ RBAC_PERM_COMMAND_SERVER_INFO
@ RBAC_PERM_COMMAND_SERVER_IDLERESTART
@ RBAC_PERM_COMMAND_SERVER_RESTART_FORCE
@ RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN
@ RBAC_PERM_COMMAND_SERVER_DEBUG
@ RBAC_PERM_COMMAND_SERVER_CORPSES
Battlenet::RealmHandle Id