44#include <boost/filesystem/directory.hpp>
45#include <boost/filesystem/operations.hpp>
46#include <openssl/crypto.h>
47#include <openssl/opensslv.h>
50#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
51#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
61 std::span<ChatCommandBuilder const>
GetCommands()
const override
121 sWorld->RemoveOldCorpses();
127 std::string dbPortOutput;
129 if (std::shared_ptr<Realm const> currentRealm =
sRealmList->GetCurrentRealm())
130 dbPortOutput =
Trinity::StringFormat(
"Realmlist (Realm Id: {}) configured in port {}", currentRealm->Id.Realm, currentRealm->Port);
135 handler->
PSendSysMessage(
"Using SSL version: %s (library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION));
136 handler->
PSendSysMessage(
"Using Boost version: %i.%i.%i", BOOST_VERSION / 100000, BOOST_VERSION / 100 % 1000, BOOST_VERSION % 100);
144 handler->
SendSysMessage(
"Automatic database updates are disabled for all databases!");
147 static char const*
const databaseNames[] =
154 static size_t constexpr databaseCount = std::extent<
decltype(databaseNames)>::value;
156 std::string availableUpdateDatabases;
157 for (
uint32 i = 0; i < databaseCount; ++i)
159 if (!(updateFlags & (1 << i)))
162 availableUpdateDatabases += databaseNames[i];
163 if (i != databaseCount - 1)
164 availableUpdateDatabases +=
", ";
167 handler->
PSendSysMessage(
"Automatic database updates are enabled for the following databases: %s", availableUpdateDatabases.c_str());
179 std::string dataDir =
sWorld->GetDataPath();
180 std::vector<std::string> subDirs;
181 subDirs.emplace_back(
"maps");
182 if (vmapIndoorCheck || vmapLOSCheck || vmapHeightCheck)
184 handler->
PSendSysMessage(
"VMAPs status: Enabled. LineOfSight: %i, getHeight: %i, indoorCheck: %i", vmapLOSCheck, vmapHeightCheck, vmapIndoorCheck);
185 subDirs.emplace_back(
"vmaps");
193 subDirs.emplace_back(
"mmaps");
198 for (std::string
const& subDir : subDirs)
200 boost::filesystem::path mapPath(dataDir);
203 if (!boost::filesystem::exists(mapPath))
205 handler->
PSendSysMessage(
"%s directory doesn't exist!. Using path: %s", subDir.c_str(), mapPath.generic_string().c_str());
209 auto end = boost::filesystem::recursive_directory_iterator();
210 std::size_t folderSize = std::accumulate(boost::filesystem::recursive_directory_iterator(mapPath), end, std::size_t(0), [](std::size_t val, boost::filesystem::directory_entry
const& mapFile)
212 boost::system::error_code ec;
213 if (boost::filesystem::is_regular_file(mapFile.path(), ec) && !ec)
214 val += boost::filesystem::file_size(mapFile.path(), ec);
218 handler->
PSendSysMessage(
"%s directory located in %s. Total size: " SZFMTD " bytes", subDir.c_str(), mapPath.generic_string().c_str(), folderSize);
222 uint32 availableLocalesMask = (1 << defaultLocale);
227 if (locale == defaultLocale)
230 if (
sWorld->GetAvailableDbcLocale(locale) != defaultLocale)
231 availableLocalesMask |= (1 << locale);
234 std::string availableLocales;
237 if (!(availableLocalesMask & (1 << i)))
242 availableLocales +=
" ";
245 handler->
PSendSysMessage(
"Using %s DBC Locale as default. All available DBC locales: %s",
localeNames[defaultLocale], availableLocales.c_str());
259 uint32 activeClientsNum =
sWorld->GetActiveSessionCount();
260 uint32 queuedClientsNum =
sWorld->GetQueuedSessionCount();
261 uint32 maxActiveClientsNum =
sWorld->GetMaxActiveSessionCount();
262 uint32 maxQueuedClientsNum =
sWorld->GetMaxQueuedSessionCount();
272 if (
sWorld->IsShuttingDown())
281 for (std::string
const& line :
sWorld->GetMotd())
291 char* paramStr = strtok((
char*)args,
" ");
295 int32 limit = strlen(paramStr);
297 if (strncmp(paramStr,
"player", limit) == 0)
299 else if (strncmp(paramStr,
"moderator", limit) == 0)
301 else if (strncmp(paramStr,
"gamemaster", limit) == 0)
303 else if (strncmp(paramStr,
"administrator", limit) == 0)
305 else if (strncmp(paramStr,
"reset", limit) == 0)
307 sWorld->SetPlayerAmountLimit(
sConfigMgr->GetIntDefault(
"PlayerLimit", 100));
308 sWorld->LoadDBAllowedSecurityLevel();
312 int32 value = atoi(paramStr);
320 uint32 playerAmountLimit =
sWorld->GetPlayerAmountLimit();
322 char const* secName =
"";
323 switch (allowedAccountType)
329 secName =
"Moderator";
332 secName =
"Gamemaster";
335 secName =
"Administrator";
338 secName =
"<unknown>";
341 handler->
PSendSysMessage(
"Player limits: amount %u, min. security level %s.", playerAmountLimit, secName);
359 for (SessionMap::value_type
const& session : sessions)
360 if (session.second && myAddr != session.second->GetRemoteAddress())
413 if (strncmp(args,
"on", 3) == 0)
419 else if (strncmp(args,
"off", 4) == 0)
434 if (name.empty() || level < 0 || (type !=
"a" && type !=
"l"))
437 sLog->SetLogLevel(name, level, type ==
"l");
444 exitCode = atoi(exitCodeStr);
447 if (exitCode == 0 && (exitCodeStr[0] !=
'0' || exitCodeStr[1] !=
'\0'))
453 if (exitCode < 0 || exitCode > 125)
464 if (strlen(args) > 255)
469 char* delayStr = strtok((
char*)args,
" ");
475 delay = atoi(delayStr);
477 if ((delay == 0 && (delayStr[0] !=
'0' || delayStr[1] !=
'\0')) || delay < 0)
488 char* exitCodeStr =
nullptr;
490 char reason[256] = { 0 };
492 while (
char* nextToken = strtok(
nullptr,
" "))
495 exitCodeStr = nextToken;
498 strcat(reason, nextToken);
499 if (
char* remainingTokens = strtok(
nullptr,
"\0"))
502 strcat(reason, remainingTokens);
508 int32 exitCode = defaultExitCode;
520 sWorld->ShutdownServ(delay, shutdownMask,
static_cast<uint8>(exitCode), std::string(reason));
char const * localeNames[TOTAL_LOCALES]
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 SetSentErrorMessage(bool val)
void PSendSysMessage(char const *fmt, Args &&... args)
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
uint32 GetLastUpdateTime() const
static VMapManager * createOrGetVMapManager()
bool isLineOfSightCalcEnabled() const
bool isHeightCalcEnabled() const
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)
std::span< ChatCommandBuilder const > GetCommands() const override
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)
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()
ChatCommandBuilder const [] ChatCommandTable
std::string StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
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