TrinityCore
Loading...
Searching...
No Matches
cs_server.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/* ScriptData
19Name: server_commandscript
20%Complete: 100
21Comment: All server related commands
22Category: commandscripts
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "Chat.h"
27#include "ChatCommand.h"
28#include "Config.h"
29#include "DatabaseEnv.h"
30#include "DatabaseLoader.h"
31#include "GameTime.h"
32#include "GitRevision.h"
33#include "Language.h"
34#include "Log.h"
35#include "MySQLThreading.h"
36#include "RBAC.h"
37#include "RealmList.h"
38#include "UpdateTime.h"
39#include "Util.h"
40#include "VMapFactory.h"
41#include "VMapManager.h"
42#include "World.h"
43#include "WorldSession.h"
44#include <boost/filesystem/directory.hpp>
45#include <boost/filesystem/operations.hpp>
46#include <openssl/crypto.h>
47#include <openssl/opensslv.h>
48#include <numeric>
49
50#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
51#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
52#endif
53
54using namespace Trinity::ChatCommands;
55
57{
58public:
59 server_commandscript() : CommandScript("server_commandscript") { }
60
61 std::span<ChatCommandBuilder const> GetCommands() const override
62 {
63 static ChatCommandTable serverIdleRestartCommandTable =
64 {
67 };
68
69 static ChatCommandTable serverIdleShutdownCommandTable =
70 {
73 };
74
75 static ChatCommandTable serverRestartCommandTable =
76 {
80 };
81
82 static ChatCommandTable serverShutdownCommandTable =
83 {
87 };
88
89 static ChatCommandTable serverSetCommandTable =
90 {
94 };
95
96 static ChatCommandTable serverCommandTable =
97 {
101 { "idlerestart", rbac::RBAC_PERM_COMMAND_SERVER_IDLERESTART, true, nullptr, "", serverIdleRestartCommandTable },
102 { "idleshutdown", rbac::RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN, true, nullptr, "", serverIdleShutdownCommandTable },
106 { "restart", rbac::RBAC_PERM_COMMAND_SERVER_RESTART, true, nullptr, "", serverRestartCommandTable },
107 { "shutdown", rbac::RBAC_PERM_COMMAND_SERVER_SHUTDOWN, true, nullptr, "", serverShutdownCommandTable },
108 { "set", rbac::RBAC_PERM_COMMAND_SERVER_SET, true, nullptr, "", serverSetCommandTable },
109 };
110
111 static ChatCommandTable commandTable =
112 {
113 { "server", rbac::RBAC_PERM_COMMAND_SERVER, true, nullptr, "", serverCommandTable },
114 };
115 return commandTable;
116 }
117
118 // Triggering corpses expire check in world
119 static bool HandleServerCorpsesCommand(ChatHandler* /*handler*/, char const* /*args*/)
120 {
121 sWorld->RemoveOldCorpses();
122 return true;
123 }
124
125 static bool HandleServerDebugCommand(ChatHandler* handler, char const* /*args*/)
126 {
127 std::string dbPortOutput;
128
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);
131 else
132 dbPortOutput = Trinity::StringFormat("Realm Id: {} not found in `realmlist` table. Please check your setup", sRealmList->GetCurrentRealmId().Realm);
133
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);
137 handler->PSendSysMessage("Using MySQL version: %u", MySQL::GetLibraryVersion());
138 handler->PSendSysMessage("Using CMake version: %s", GitRevision::GetCMakeVersion());
139
140 handler->PSendSysMessage("Compiled on: %s", GitRevision::GetHostOSVersion());
141
142 uint32 updateFlags = sConfigMgr->GetIntDefault("Updates.EnableDatabases", DatabaseLoader::DATABASE_NONE);
143 if (!updateFlags)
144 handler->SendSysMessage("Automatic database updates are disabled for all databases!");
145 else
146 {
147 static char const* const databaseNames[] =
148 {
149 "Auth",
150 "Characters",
151 "World",
152 "Hotfixes"
153 };
154 static size_t constexpr databaseCount = std::extent<decltype(databaseNames)>::value;
155
156 std::string availableUpdateDatabases;
157 for (uint32 i = 0; i < databaseCount; ++i)
158 {
159 if (!(updateFlags & (1 << i)))
160 continue;
161
162 availableUpdateDatabases += databaseNames[i];
163 if (i != databaseCount - 1)
164 availableUpdateDatabases += ", ";
165 }
166
167 handler->PSendSysMessage("Automatic database updates are enabled for the following databases: %s", availableUpdateDatabases.c_str());
168 }
169
170 handler->PSendSysMessage("Worldserver listening connections on port %u", sWorld->getIntConfig(CONFIG_PORT_WORLD));
171 handler->PSendSysMessage("%s", dbPortOutput.c_str());
172
173 bool vmapIndoorCheck = sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK);
176
177 bool mmapEnabled = sWorld->getBoolConfig(CONFIG_ENABLE_MMAPS);
178
179 std::string dataDir = sWorld->GetDataPath();
180 std::vector<std::string> subDirs;
181 subDirs.emplace_back("maps");
182 if (vmapIndoorCheck || vmapLOSCheck || vmapHeightCheck)
183 {
184 handler->PSendSysMessage("VMAPs status: Enabled. LineOfSight: %i, getHeight: %i, indoorCheck: %i", vmapLOSCheck, vmapHeightCheck, vmapIndoorCheck);
185 subDirs.emplace_back("vmaps");
186 }
187 else
188 handler->SendSysMessage("VMAPs status: Disabled");
189
190 if (mmapEnabled)
191 {
192 handler->SendSysMessage("MMAPs status: Enabled");
193 subDirs.emplace_back("mmaps");
194 }
195 else
196 handler->SendSysMessage("MMAPs status: Disabled");
197
198 for (std::string const& subDir : subDirs)
199 {
200 boost::filesystem::path mapPath(dataDir);
201 mapPath /= subDir;
202
203 if (!boost::filesystem::exists(mapPath))
204 {
205 handler->PSendSysMessage("%s directory doesn't exist!. Using path: %s", subDir.c_str(), mapPath.generic_string().c_str());
206 continue;
207 }
208
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)
211 {
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);
215 return val;
216 });
217
218 handler->PSendSysMessage("%s directory located in %s. Total size: " SZFMTD " bytes", subDir.c_str(), mapPath.generic_string().c_str(), folderSize);
219 }
220
221 LocaleConstant defaultLocale = sWorld->GetDefaultDbcLocale();
222 uint32 availableLocalesMask = (1 << defaultLocale);
223
224 for (uint8 i = 0; i < TOTAL_LOCALES; ++i)
225 {
226 LocaleConstant locale = static_cast<LocaleConstant>(i);
227 if (locale == defaultLocale)
228 continue;
229
230 if (sWorld->GetAvailableDbcLocale(locale) != defaultLocale)
231 availableLocalesMask |= (1 << locale);
232 }
233
234 std::string availableLocales;
235 for (uint8 i = 0; i < TOTAL_LOCALES; ++i)
236 {
237 if (!(availableLocalesMask & (1 << i)))
238 continue;
239
240 availableLocales += localeNames[i];
241 if (i != TOTAL_LOCALES - 1)
242 availableLocales += " ";
243 }
244
245 handler->PSendSysMessage("Using %s DBC Locale as default. All available DBC locales: %s", localeNames[defaultLocale], availableLocales.c_str());
246
247 handler->PSendSysMessage("Using World DB: %s", sWorld->GetDBVersion());
248
249 handler->PSendSysMessage("LoginDatabase queue size: %zu", LoginDatabase.QueueSize());
250 handler->PSendSysMessage("CharacterDatabase queue size: %zu", CharacterDatabase.QueueSize());
251 handler->PSendSysMessage("WorldDatabase queue size: %zu", WorldDatabase.QueueSize());
252 return true;
253 }
254
255 static bool HandleServerInfoCommand(ChatHandler* handler, char const* /*args*/)
256 {
257 uint32 playersNum = sWorld->GetPlayerCount();
258 uint32 maxPlayersNum = sWorld->GetMaxPlayerCount();
259 uint32 activeClientsNum = sWorld->GetActiveSessionCount();
260 uint32 queuedClientsNum = sWorld->GetQueuedSessionCount();
261 uint32 maxActiveClientsNum = sWorld->GetMaxActiveSessionCount();
262 uint32 maxQueuedClientsNum = sWorld->GetMaxQueuedSessionCount();
263 std::string uptime = secsToTimeString(GameTime::GetUptime());
265
267 handler->PSendSysMessage(LANG_CONNECTED_PLAYERS, playersNum, maxPlayersNum);
268 handler->PSendSysMessage(LANG_CONNECTED_USERS, activeClientsNum, maxActiveClientsNum, queuedClientsNum, maxQueuedClientsNum);
269 handler->PSendSysMessage(LANG_UPTIME, uptime.c_str());
270 handler->PSendSysMessage(LANG_UPDATE_DIFF, updateTime);
271 // Can't use sWorld->ShutdownMsg here in case of console command
272 if (sWorld->IsShuttingDown())
273 handler->PSendSysMessage(LANG_SHUTDOWN_TIMELEFT, secsToTimeString(sWorld->GetShutDownTimeLeft()).c_str());
274
275 return true;
276 }
277 // Display the 'Message of the day' for the realm
278 static bool HandleServerMotdCommand(ChatHandler* handler, char const* /*args*/)
279 {
280 std::string motd;
281 for (std::string const& line : sWorld->GetMotd())
282 motd += line;
283 handler->PSendSysMessage(LANG_MOTD_CURRENT, motd.c_str());
284 return true;
285 }
286
287 static bool HandleServerPLimitCommand(ChatHandler* handler, char const* args)
288 {
289 if (*args)
290 {
291 char* paramStr = strtok((char*)args, " ");
292 if (!paramStr)
293 return false;
294
295 int32 limit = strlen(paramStr);
296
297 if (strncmp(paramStr, "player", limit) == 0)
298 sWorld->SetPlayerSecurityLimit(SEC_PLAYER);
299 else if (strncmp(paramStr, "moderator", limit) == 0)
300 sWorld->SetPlayerSecurityLimit(SEC_MODERATOR);
301 else if (strncmp(paramStr, "gamemaster", limit) == 0)
302 sWorld->SetPlayerSecurityLimit(SEC_GAMEMASTER);
303 else if (strncmp(paramStr, "administrator", limit) == 0)
304 sWorld->SetPlayerSecurityLimit(SEC_ADMINISTRATOR);
305 else if (strncmp(paramStr, "reset", limit) == 0)
306 {
307 sWorld->SetPlayerAmountLimit(sConfigMgr->GetIntDefault("PlayerLimit", 100));
308 sWorld->LoadDBAllowedSecurityLevel();
309 }
310 else
311 {
312 int32 value = atoi(paramStr);
313 if (value < 0)
314 sWorld->SetPlayerSecurityLimit(AccountTypes(-value));
315 else
316 sWorld->SetPlayerAmountLimit(uint32(value));
317 }
318 }
319
320 uint32 playerAmountLimit = sWorld->GetPlayerAmountLimit();
321 AccountTypes allowedAccountType = sWorld->GetPlayerSecurityLimit();
322 char const* secName = "";
323 switch (allowedAccountType)
324 {
325 case SEC_PLAYER:
326 secName = "Player";
327 break;
328 case SEC_MODERATOR:
329 secName = "Moderator";
330 break;
331 case SEC_GAMEMASTER:
332 secName = "Gamemaster";
333 break;
335 secName = "Administrator";
336 break;
337 default:
338 secName = "<unknown>";
339 break;
340 }
341 handler->PSendSysMessage("Player limits: amount %u, min. security level %s.", playerAmountLimit, secName);
342
343 return true;
344 }
345
346 static bool HandleServerShutDownCancelCommand(ChatHandler* handler, char const* /*args*/)
347 {
348 if (uint32 timer = sWorld->ShutdownCancel())
350
351 return true;
352 }
353
354 static bool IsOnlyUser(WorldSession* mySession)
355 {
356 // check if there is any session connected from a different address
357 std::string myAddr = mySession ? mySession->GetRemoteAddress() : "";
358 SessionMap const& sessions = sWorld->GetAllSessions();
359 for (SessionMap::value_type const& session : sessions)
360 if (session.second && myAddr != session.second->GetRemoteAddress())
361 return false;
362 return true;
363 }
364 static bool HandleServerShutDownCommand(ChatHandler* handler, char const* args)
365 {
366 return ShutdownServer(handler, args, 0, SHUTDOWN_EXIT_CODE);
367 }
368
369 static bool HandleServerRestartCommand(ChatHandler* handler, char const* args)
370 {
372 }
373
374 static bool HandleServerForceShutDownCommand(ChatHandler* handler, char const* args)
375 {
377 }
378
379 static bool HandleServerForceRestartCommand(ChatHandler* handler, char const* args)
380 {
382 }
383
384 static bool HandleServerIdleShutDownCommand(ChatHandler* handler, char const* args)
385 {
387 }
388
389 static bool HandleServerIdleRestartCommand(ChatHandler* handler, char const* args)
390 {
392 }
393
394 // Exit the realm
395 static bool HandleServerExitCommand(ChatHandler* handler, char const* /*args*/)
396 {
399 return true;
400 }
401
402 // Define the 'Message of the day' for the realm
403 static bool HandleServerSetMotdCommand(ChatHandler* handler, char const* args)
404 {
405 sWorld->SetMotd(args);
406 handler->PSendSysMessage(LANG_MOTD_NEW, args);
407 return true;
408 }
409
410 // Set whether we accept new clients
411 static bool HandleServerSetClosedCommand(ChatHandler* handler, char const* args)
412 {
413 if (strncmp(args, "on", 3) == 0)
414 {
416 sWorld->SetClosed(true);
417 return true;
418 }
419 else if (strncmp(args, "off", 4) == 0)
420 {
422 sWorld->SetClosed(false);
423 return true;
424 }
425
427 handler->SetSentErrorMessage(true);
428 return false;
429 }
430
431 // Set the level of logging
432 static bool HandleServerSetLogLevelCommand(ChatHandler* /*handler*/, std::string const& type, std::string const& name, int32 level)
433 {
434 if (name.empty() || level < 0 || (type != "a" && type != "l"))
435 return false;
436
437 sLog->SetLogLevel(name, level, type == "l");
438 return true;
439 }
440
441private:
442 static bool ParseExitCode(char const* exitCodeStr, int32& exitCode)
443 {
444 exitCode = atoi(exitCodeStr);
445
446 // Handle atoi() errors
447 if (exitCode == 0 && (exitCodeStr[0] != '0' || exitCodeStr[1] != '\0'))
448 return false;
449
450 // Exit code should be in range of 0-125, 126-255 is used
451 // in many shells for their own return codes and code > 255
452 // is not supported in many others
453 if (exitCode < 0 || exitCode > 125)
454 return false;
455
456 return true;
457 }
458
459 static bool ShutdownServer(ChatHandler* handler, char const* args, uint32 shutdownMask, int32 defaultExitCode)
460 {
461 if (!*args)
462 return false;
463
464 if (strlen(args) > 255)
465 return false;
466
467 // #delay [#exit_code] [reason]
468 int32 delay = 0;
469 char* delayStr = strtok((char*)args, " ");
470 if (!delayStr)
471 return false;
472
473 if (isNumeric(delayStr))
474 {
475 delay = atoi(delayStr);
476 // Prevent interpret wrong arg value as 0 secs shutdown time
477 if ((delay == 0 && (delayStr[0] != '0' || delayStr[1] != '\0')) || delay < 0)
478 return false;
479 }
480 else
481 {
482 delay = TimeStringToSecs(std::string(delayStr));
483
484 if (delay == 0)
485 return false;
486 }
487
488 char* exitCodeStr = nullptr;
489
490 char reason[256] = { 0 };
491
492 while (char* nextToken = strtok(nullptr, " "))
493 {
494 if (isNumeric(nextToken))
495 exitCodeStr = nextToken;
496 else
497 {
498 strcat(reason, nextToken);
499 if (char* remainingTokens = strtok(nullptr, "\0"))
500 {
501 strcat(reason, " ");
502 strcat(reason, remainingTokens);
503 }
504 break;
505 }
506 }
507
508 int32 exitCode = defaultExitCode;
509 if (exitCodeStr)
510 if (!ParseExitCode(exitCodeStr, exitCode))
511 return false;
512
513 // Override parameter "delay" with the configuration value if there are still players connected and "force" parameter was not specified
514 if (delay < (int32)sWorld->getIntConfig(CONFIG_FORCE_SHUTDOWN_THRESHOLD) && !(shutdownMask & SHUTDOWN_MASK_FORCE) && !IsOnlyUser(handler->GetSession()))
515 {
516 delay = (int32)sWorld->getIntConfig(CONFIG_FORCE_SHUTDOWN_THRESHOLD);
517 handler->PSendSysMessage(LANG_SHUTDOWN_DELAYED, delay);
518 }
519
520 sWorld->ShutdownServ(delay, shutdownMask, static_cast<uint8>(exitCode), std::string(reason));
521
522 return true;
523 }
524};
525
char const * localeNames[TOTAL_LOCALES]
Definition Common.cpp:20
LocaleConstant
Definition Common.h:51
@ TOTAL_LOCALES
Definition Common.h:65
AccountTypes
Definition Common.h:42
@ SEC_PLAYER
Definition Common.h:43
@ SEC_ADMINISTRATOR
Definition Common.h:46
@ SEC_GAMEMASTER
Definition Common.h:45
@ SEC_MODERATOR
Definition Common.h:44
#define sConfigMgr
Definition Config.h:64
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.
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
#define SZFMTD
Definition Define.h:144
@ LANG_MOTD_CURRENT
Definition Language.h:88
@ LANG_UPDATE_DIFF
Definition Language.h:51
@ LANG_SHUTDOWN_DELAYED
Definition Language.h:1252
@ LANG_COMMAND_EXIT
Definition Language.h:837
@ LANG_USE_BOL
Definition Language.h:309
@ LANG_CONNECTED_USERS
Definition Language.h:44
@ LANG_SHUTDOWN_CANCELLED
Definition Language.h:1253
@ LANG_WORLD_CLOSED
Definition Language.h:1184
@ LANG_UPTIME
Definition Language.h:45
@ LANG_MOTD_NEW
Definition Language.h:877
@ LANG_WORLD_OPENED
Definition Language.h:1185
@ LANG_CONNECTED_PLAYERS
Definition Language.h:92
@ LANG_SHUTDOWN_TIMELEFT
Definition Language.h:52
#define sLog
Definition Log.h:156
Role Based Access Control related classes definition.
#define sRealmList
Definition RealmList.h:93
WorldUpdateTime sWorldUpdateTime
std::string secsToTimeString(uint64 timeInSecs, TimeFormat timeFormat, bool hoursOnly)
Definition Util.cpp:116
uint32 TimeStringToSecs(std::string const &timestring)
Definition Util.cpp:222
bool isNumeric(wchar_t wchar)
Definition Util.h:207
WorldSession * GetSession()
Definition Chat.h:42
void SetSentErrorMessage(bool val)
Definition Chat.h:127
void PSendSysMessage(char const *fmt, Args &&... args)
Definition Chat.h:62
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:111
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)
Definition World.h:667
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
Definition cs_server.cpp:61
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()
#define sWorld
Definition World.h:916
std::unordered_map< uint32, WorldSession * > SessionMap
Definition World.h:551
@ CONFIG_FORCE_SHUTDOWN_THRESHOLD
Definition World.h:292
@ CONFIG_PORT_WORLD
Definition World.h:243
@ CONFIG_ENABLE_MMAPS
Definition World.h:168
@ CONFIG_VMAP_INDOOR_CHECK
Definition World.h:146
@ RESTART_EXIT_CODE
Definition World.h:77
@ SHUTDOWN_EXIT_CODE
Definition World.h:75
@ SHUTDOWN_MASK_RESTART
Definition World.h:68
@ SHUTDOWN_MASK_FORCE
Definition World.h:70
@ SHUTDOWN_MASK_IDLE
Definition World.h:69
uint32 GetUptime()
Uptime (in secs)
Definition GameTime.cpp:91
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
Definition ChatCommand.h:49
std::string StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
Default TC string format function.
@ RBAC_PERM_COMMAND_SERVER_SHUTDOWN_FORCE
Definition RBAC.h:710
@ RBAC_PERM_COMMAND_SERVER_SHUTDOWN
Definition RBAC.h:606
@ RBAC_PERM_COMMAND_SERVER_SET_LOGLEVEL
Definition RBAC.h:604
@ RBAC_PERM_COMMAND_SERVER_RESTART_CANCEL
Definition RBAC.h:600
@ RBAC_PERM_COMMAND_SERVER_SET
Definition RBAC.h:601
@ RBAC_PERM_COMMAND_SERVER_EXIT
Definition RBAC.h:592
@ RBAC_PERM_COMMAND_SERVER_RESTART
Definition RBAC.h:599
@ RBAC_PERM_COMMAND_SERVER_PLIMIT
Definition RBAC.h:598
@ RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN_CANCEL
Definition RBAC.h:596
@ RBAC_PERM_COMMAND_SERVER_SHUTDOWN_CANCEL
Definition RBAC.h:607
@ RBAC_PERM_COMMAND_SERVER_IDLERESTART_CANCEL
Definition RBAC.h:594
@ RBAC_PERM_COMMAND_SERVER
Definition RBAC.h:590
@ RBAC_PERM_COMMAND_SERVER_MOTD
Definition RBAC.h:608
@ RBAC_PERM_COMMAND_SERVER_SET_CLOSED
Definition RBAC.h:602
@ RBAC_PERM_COMMAND_SERVER_SET_MOTD
Definition RBAC.h:605
@ RBAC_PERM_COMMAND_SERVER_INFO
Definition RBAC.h:597
@ RBAC_PERM_COMMAND_SERVER_IDLERESTART
Definition RBAC.h:593
@ RBAC_PERM_COMMAND_SERVER_RESTART_FORCE
Definition RBAC.h:711
@ RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN
Definition RBAC.h:595
@ RBAC_PERM_COMMAND_SERVER_DEBUG
Definition RBAC.h:741
@ RBAC_PERM_COMMAND_SERVER_CORPSES
Definition RBAC.h:591