More logging adjustments

This commit is contained in:
Akkadius 2019-07-05 04:21:22 -05:00
parent ffd652a643
commit f0937c3963
6 changed files with 74 additions and 106 deletions

View File

@ -747,7 +747,7 @@ RULE_INT(Faction, ThreateninglyFactionMinimum, -750)
RULE_CATEGORY_END() RULE_CATEGORY_END()
RULE_CATEGORY(Logging) RULE_CATEGORY(Logging)
RULE_BOOL(Logging, PrintFileFunctionAndLine, true) // Ex: [World Server] [net.cpp::main:309] Loading variables... RULE_BOOL(Logging, PrintFileFunctionAndLine, false) // Ex: [World Server] [net.cpp::main:309] Loading variables...
RULE_CATEGORY_END() RULE_CATEGORY_END()
#undef RULE_CATEGORY #undef RULE_CATEGORY

View File

@ -47,7 +47,7 @@ bool Client::Process()
EQApplicationPacket *app = connection->PopPacket(); EQApplicationPacket *app = connection->PopPacket();
while (app) { while (app) {
if (server.options.IsTraceOn()) { if (server.options.IsTraceOn()) {
Log(Logs::General, Logs::Login_Server, "Application packet received from client (size %u)", app->Size()); Log(Logs::General, Logs::Netcode, "Application packet received from client (size %u)", app->Size());
} }
if (server.options.IsDumpInPacketsOn()) { if (server.options.IsDumpInPacketsOn()) {
@ -63,19 +63,19 @@ bool Client::Process()
switch (app->GetOpcode()) { switch (app->GetOpcode()) {
case OP_SessionReady: { case OP_SessionReady: {
if (server.options.IsTraceOn()) { if (server.options.IsTraceOn()) {
Log(Logs::General, Logs::Login_Server, "Session ready received from client."); LogLoginserver("Session ready received from client.");
} }
Handle_SessionReady((const char *) app->pBuffer, app->Size()); Handle_SessionReady((const char *) app->pBuffer, app->Size());
break; break;
} }
case OP_Login: { case OP_Login: {
if (app->Size() < 20) { if (app->Size() < 20) {
Log(Logs::General, Logs::Error, "Login received but it is too small, discarding."); Error("Login received but it is too small, discarding.");
break; break;
} }
if (server.options.IsTraceOn()) { if (server.options.IsTraceOn()) {
Log(Logs::General, Logs::Login_Server, "Login received from client."); LogLoginserver("Login received from client.");
} }
Handle_Login((const char *) app->pBuffer, app->Size()); Handle_Login((const char *) app->pBuffer, app->Size());
@ -83,12 +83,12 @@ bool Client::Process()
} }
case OP_ServerListRequest: { case OP_ServerListRequest: {
if (app->Size() < 4) { if (app->Size() < 4) {
Log(Logs::General, Logs::Error, "Server List Request received but it is too small, discarding."); Error("Server List Request received but it is too small, discarding.");
break; break;
} }
if (server.options.IsTraceOn()) { if (server.options.IsTraceOn()) {
Log(Logs::General, Logs::Login_Server, "Server list request received from client."); LogLoginserver("Server list request received from client.");
} }
SendServerListPacket(*(uint32_t *) app->pBuffer); SendServerListPacket(*(uint32_t *) app->pBuffer);
@ -96,7 +96,7 @@ bool Client::Process()
} }
case OP_PlayEverquestRequest: { case OP_PlayEverquestRequest: {
if (app->Size() < sizeof(PlayEverquestRequest_Struct)) { if (app->Size() < sizeof(PlayEverquestRequest_Struct)) {
Log(Logs::General, Logs::Error, "Play received but it is too small, discarding."); Error("Play received but it is too small, discarding.");
break; break;
} }
@ -107,7 +107,7 @@ bool Client::Process()
if (LogSys.log_settings[Logs::Client_Server_Packet_Unhandled].is_category_enabled == 1) { if (LogSys.log_settings[Logs::Client_Server_Packet_Unhandled].is_category_enabled == 1) {
char dump[64]; char dump[64];
app->build_header_dump(dump); app->build_header_dump(dump);
Log(Logs::General, Logs::Error, "Recieved unhandled application packet from the client: %s.", dump); Error("Recieved unhandled application packet from the client: %s.", dump);
} }
} }
} }
@ -128,12 +128,12 @@ bool Client::Process()
void Client::Handle_SessionReady(const char *data, unsigned int size) void Client::Handle_SessionReady(const char *data, unsigned int size)
{ {
if (status != cs_not_sent_session_ready) { if (status != cs_not_sent_session_ready) {
Log(Logs::General, Logs::Error, "Session ready received again after already being received."); Error("Session ready received again after already being received.");
return; return;
} }
if (size < sizeof(unsigned int)) { if (size < sizeof(unsigned int)) {
Log(Logs::General, Logs::Error, "Session ready was too small."); Error("Session ready was too small.");
return; return;
} }
@ -181,27 +181,18 @@ void Client::Handle_SessionReady(const char *data, unsigned int size)
void Client::Handle_Login(const char *data, unsigned int size) void Client::Handle_Login(const char *data, unsigned int size)
{ {
if (status != cs_waiting_for_login) { if (status != cs_waiting_for_login) {
LogF(Logs::General, Logs::Error, "Login received after already having logged in"); Error("Login received after already having logged in");
return; return;
} }
if ((size - 12) % 8 != 0) { if ((size - 12) % 8 != 0) {
LogF( Error("Login received packet of size: {0}, this would cause a block corruption, discarding", size);
Logs::General,
Logs::Error,
"Login received packet of size: {0}, this would cause a block corruption, discarding.",
size
);
return; return;
} }
if (size < sizeof(LoginLoginRequest_Struct)) { if (size < sizeof(LoginLoginRequest_Struct)) {
LogF( Error("Login received packet of size: {0}, this would cause a buffer overflow, discarding", size);
Logs::General,
Logs::Error,
"Login received packet of size: {0}, this would cause a buffer overflow, discarding.",
size
);
return; return;
} }
@ -215,13 +206,13 @@ void Client::Handle_Login(const char *data, unsigned int size)
std::string outbuffer; std::string outbuffer;
outbuffer.resize(size - 12); outbuffer.resize(size - 12);
if (outbuffer.length() == 0) { if (outbuffer.length() == 0) {
LogF(Logs::General, Logs::Debug, "Corrupt buffer sent to server, no length."); Error("Corrupt buffer sent to server, no length.");
return; return;
} }
auto r = eqcrypt_block(data + 10, size - 12, &outbuffer[0], 0); auto r = eqcrypt_block(data + 10, size - 12, &outbuffer[0], 0);
if (r == nullptr) { if (r == nullptr) {
LogF(Logs::General, Logs::Debug, "Failed to decrypt eqcrypt block"); Error("Failed to decrypt eqcrypt block");
return; return;
} }
@ -229,7 +220,7 @@ void Client::Handle_Login(const char *data, unsigned int size)
std::string user(&outbuffer[0]); std::string user(&outbuffer[0]);
if (user.length() >= outbuffer.length()) { if (user.length() >= outbuffer.length()) {
LogF(Logs::General, Logs::Debug,"Corrupt buffer sent to server, preventing buffer overflow."); Error("Corrupt buffer sent to server, preventing buffer overflow.");
return; return;
} }
@ -257,9 +248,7 @@ void Client::Handle_Login(const char *data, unsigned int size)
user = components[1]; user = components[1];
} }
LogF( LogLoginserver(
Logs::General,
Logs::Login_Server,
"Attempting password based login [{0}] login [{1}] user [{2}]", "Attempting password based login [{0}] login [{1}] user [{2}]",
user, user,
db_loginserver, db_loginserver,
@ -271,12 +260,7 @@ void Client::Handle_Login(const char *data, unsigned int size)
if (server.db->GetLoginDataFromAccountInfo(user, db_loginserver, db_account_password_hash, db_account_id)) { if (server.db->GetLoginDataFromAccountInfo(user, db_loginserver, db_account_password_hash, db_account_id)) {
result = VerifyLoginHash(user, db_loginserver, cred, db_account_password_hash); result = VerifyLoginHash(user, db_loginserver, cred, db_account_password_hash);
LogF( LogLoginserverDetail("[VerifyLoginHash] Success [{0}]", (result ? "true" : "false"));
Logs::Detail,
Logs::Login_Server,
"[VerifyLoginHash] Success [{0}]",
(result ? "true" : "false")
);
} }
else { else {
status = cs_creating_account; status = cs_creating_account;
@ -292,7 +276,7 @@ void Client::Handle_Login(const char *data, unsigned int size)
*/ */
if (result) { if (result) {
LogF( LogF(
Logs::Detail, Logs::Login_Server, "login [{0}] user [{2}] Login succeeded", Logs::Detail, Logs::Login_Server, "login [{0}] user [{1}] Login succeeded",
db_loginserver, db_loginserver,
user user
); );
@ -301,7 +285,7 @@ void Client::Handle_Login(const char *data, unsigned int size)
} }
else { else {
LogF( LogF(
Logs::Detail, Logs::Login_Server, "login [{0}] user [{2}] Login failed", Logs::Detail, Logs::Login_Server, "login [{0}] user [{1}] Login failed",
db_loginserver, db_loginserver,
user user
); );
@ -318,20 +302,16 @@ void Client::Handle_Login(const char *data, unsigned int size)
void Client::Handle_Play(const char *data) void Client::Handle_Play(const char *data)
{ {
if (status != cs_logged_in) { if (status != cs_logged_in) {
Log(Logs::General, Logs::Error, "Client sent a play request when they were not logged in, discarding."); Error("Client sent a play request when they were not logged in, discarding.");
return; return;
} }
const PlayEverquestRequest_Struct *play = (const PlayEverquestRequest_Struct *) data; const auto *play = (const PlayEverquestRequest_Struct *) data;
unsigned int server_id_in = (unsigned int) play->ServerNumber; auto server_id_in = (unsigned int) play->ServerNumber;
unsigned int sequence_in = (unsigned int) play->Sequence; auto sequence_in = (unsigned int) play->Sequence;
if (server.options.IsTraceOn()) { if (server.options.IsTraceOn()) {
Log(Logs::General, LogLoginserver("Play received from client, server number {0} sequence {1}", server_id_in, sequence_in);
Logs::Login_Server,
"Play received from client, server number %u sequence %u.",
server_id_in,
sequence_in);
} }
this->play_server_id = (unsigned int) play->ServerNumber; this->play_server_id = (unsigned int) play->ServerNumber;
@ -396,10 +376,10 @@ void Client::AttemptLoginAccountCreation(
{ {
if (loginserver == "eqemu") { if (loginserver == "eqemu") {
LogF(Logs::General, Logs::Login_Server, "Attempting login account creation via '{0}'", loginserver); LogLoginserver("Attempting login account creation via '{0}'", loginserver);
if (!server.options.CanAutoLinkAccounts()) { if (!server.options.CanAutoLinkAccounts()) {
LogF(Logs::General, Logs::Login_Server, "CanAutoLinkAccounts disabled - sending failed login"); LogLoginserver("CanAutoLinkAccounts disabled - sending failed login");
DoFailedLogin(); DoFailedLogin();
return; return;
} }
@ -473,14 +453,16 @@ void Client::DoFailedLogin()
stored_user.clear(); stored_user.clear();
stored_pass.clear(); stored_pass.clear();
EQApplicationPacket outapp(OP_LoginAccepted, sizeof(LoginLoginFailed_Struct)); EQApplicationPacket outapp(OP_LoginAccepted, sizeof(LoginLoginFailed_Struct));
LoginLoginFailed_Struct *llas = (LoginLoginFailed_Struct *) outapp.pBuffer; auto *login_failed = (LoginLoginFailed_Struct *) outapp.pBuffer;
llas->unknown1 = llrs.unknown1;
llas->unknown2 = llrs.unknown2; login_failed->unknown1 = llrs.unknown1;
llas->unknown3 = llrs.unknown3; login_failed->unknown2 = llrs.unknown2;
llas->unknown4 = llrs.unknown4; login_failed->unknown3 = llrs.unknown3;
llas->unknown5 = llrs.unknown5; login_failed->unknown4 = llrs.unknown4;
memcpy(llas->unknown6, FailedLoginResponseData, sizeof(FailedLoginResponseData)); login_failed->unknown5 = llrs.unknown5;
memcpy(login_failed->unknown6, FailedLoginResponseData, sizeof(FailedLoginResponseData));
if (server.options.IsDumpOutPacketsOn()) { if (server.options.IsDumpOutPacketsOn()) {
DumpPacket(&outapp); DumpPacket(&outapp);
@ -519,9 +501,7 @@ bool Client::VerifyLoginHash(
if (hash.length() == 32) { //md5 is insecure if (hash.length() == 32) { //md5 is insecure
for (int i = EncryptionModeMD5; i <= EncryptionModeMD5Triple; ++i) { for (int i = EncryptionModeMD5; i <= EncryptionModeMD5Triple; ++i) {
if (i != mode && eqcrypt_verify_hash(user, cred, hash, i)) { if (i != mode && eqcrypt_verify_hash(user, cred, hash, i)) {
LogF( LogLoginserverDetail(
Logs::Detail,
Logs::Login_Server,
"user [{0}] loginserver [{1}] mode [{2}]", "user [{0}] loginserver [{1}] mode [{2}]",
user, user,
loginserver, loginserver,
@ -535,9 +515,7 @@ bool Client::VerifyLoginHash(
else if (hash.length() == 40) { //sha1 is insecure else if (hash.length() == 40) { //sha1 is insecure
for (int i = EncryptionModeSHA; i <= EncryptionModeSHATriple; ++i) { for (int i = EncryptionModeSHA; i <= EncryptionModeSHATriple; ++i) {
if (i != mode && eqcrypt_verify_hash(user, cred, hash, i)) { if (i != mode && eqcrypt_verify_hash(user, cred, hash, i)) {
LogF( LogLoginserverDetail(
Logs::Detail,
Logs::Login_Server,
"user [{0}] loginserver [{1}] mode [{2}]", "user [{0}] loginserver [{1}] mode [{2}]",
user, user,
loginserver, loginserver,
@ -552,9 +530,7 @@ bool Client::VerifyLoginHash(
else if (hash.length() == 128) { //sha2-512 is insecure else if (hash.length() == 128) { //sha2-512 is insecure
for (int i = EncryptionModeSHA512; i <= EncryptionModeSHA512Triple; ++i) { for (int i = EncryptionModeSHA512; i <= EncryptionModeSHA512Triple; ++i) {
if (i != mode && eqcrypt_verify_hash(user, cred, hash, i)) { if (i != mode && eqcrypt_verify_hash(user, cred, hash, i)) {
LogF( LogLoginserverDetail(
Logs::Detail,
Logs::Login_Server,
"user [{0}] loginserver [{1}] mode [{2}]", "user [{0}] loginserver [{1}] mode [{2}]",
user, user,
loginserver, loginserver,
@ -586,7 +562,7 @@ void Client::DoSuccessfulLogin(const std::string &user, int db_account_id, const
server.client_manager->RemoveExistingClient(db_account_id, db_loginserver); server.client_manager->RemoveExistingClient(db_account_id, db_loginserver);
in_addr in; in_addr in{};
in.s_addr = connection->GetRemoteIP(); in.s_addr = connection->GetRemoteIP();
server.db->UpdateLSAccountData(db_account_id, std::string(inet_ntoa(in))); server.db->UpdateLSAccountData(db_account_id, std::string(inet_ntoa(in)));
@ -596,15 +572,15 @@ void Client::DoSuccessfulLogin(const std::string &user, int db_account_id, const
account_name = user; account_name = user;
loginserver_name = db_loginserver; loginserver_name = db_loginserver;
EQApplicationPacket *outapp = new EQApplicationPacket(OP_LoginAccepted, 10 + 80); auto *outapp = new EQApplicationPacket(OP_LoginAccepted, 10 + 80);
LoginAccepted_Struct *login_accepted = (LoginAccepted_Struct *) outapp->pBuffer; auto *login_accepted = (LoginAccepted_Struct *) outapp->pBuffer;
login_accepted->unknown1 = llrs.unknown1; login_accepted->unknown1 = llrs.unknown1;
login_accepted->unknown2 = llrs.unknown2; login_accepted->unknown2 = llrs.unknown2;
login_accepted->unknown3 = llrs.unknown3; login_accepted->unknown3 = llrs.unknown3;
login_accepted->unknown4 = llrs.unknown4; login_accepted->unknown4 = llrs.unknown4;
login_accepted->unknown5 = llrs.unknown5; login_accepted->unknown5 = llrs.unknown5;
LoginFailedAttempts_Struct *login_failed_attempts = new LoginFailedAttempts_Struct; auto *login_failed_attempts = new LoginFailedAttempts_Struct;
memset(login_failed_attempts, 0, sizeof(LoginFailedAttempts_Struct)); memset(login_failed_attempts, 0, sizeof(LoginFailedAttempts_Struct));
login_failed_attempts->failed_attempts = 0; login_failed_attempts->failed_attempts = 0;
@ -630,7 +606,7 @@ void Client::DoSuccessfulLogin(const std::string &user, int db_account_id, const
char encrypted_buffer[80] = {0}; char encrypted_buffer[80] = {0};
auto rc = eqcrypt_block((const char *) login_failed_attempts, 75, encrypted_buffer, 1); auto rc = eqcrypt_block((const char *) login_failed_attempts, 75, encrypted_buffer, 1);
if (rc == nullptr) { if (rc == nullptr) {
LogF(Logs::General, Logs::Debug, "Failed to encrypt eqcrypt block"); LogLoginserverDetail("Failed to encrypt eqcrypt block");
} }
memcpy(login_accepted->encrypt, encrypted_buffer, 80); memcpy(login_accepted->encrypt, encrypted_buffer, 80);
@ -707,12 +683,12 @@ void Client::LoginOnStatusChange(
) )
{ {
if (to == EQ::Net::StatusConnected) { if (to == EQ::Net::StatusConnected) {
LogF(Logs::Detail, Logs::Login_Server, "EQ::Net::StatusConnected"); LogLoginserverDetail("EQ::Net::StatusConnected");
LoginSendSessionReady(); LoginSendSessionReady();
} }
if (to == EQ::Net::StatusDisconnecting || to == EQ::Net::StatusDisconnected) { if (to == EQ::Net::StatusDisconnecting || to == EQ::Net::StatusDisconnected) {
LogF(Logs::Detail, Logs::Login_Server, "EQ::Net::StatusDisconnecting || EQ::Net::StatusDisconnected"); LogLoginserverDetail("EQ::Net::StatusDisconnecting || EQ::Net::StatusDisconnected");
DoFailedLogin(); DoFailedLogin();
} }
@ -738,7 +714,6 @@ void Client::LoginOnStatusChangeIgnored(
void Client::LoginOnPacketRecv(std::shared_ptr<EQ::Net::DaybreakConnection> conn, const EQ::Net::Packet &p) void Client::LoginOnPacketRecv(std::shared_ptr<EQ::Net::DaybreakConnection> conn, const EQ::Net::Packet &p)
{ {
auto opcode = p.GetUInt16(0); auto opcode = p.GetUInt16(0);
LogF(Logs::Detail, Logs::Login_Server, "[{0}]", opcode);
switch (opcode) { switch (opcode) {
case 0x0017: //OP_ChatMessage case 0x0017: //OP_ChatMessage
LoginSendLogin(); LoginSendLogin();
@ -810,14 +785,12 @@ void Client::LoginProcessLoginResponse(const EQ::Net::Packet &p)
); );
if (response_error > 101) { if (response_error > 101) {
LogF(Logs::Detail, Logs::Login_Server, "response [{0}] failed login", response_error); LogLoginserverDetail("response [{0}] failed login", response_error);
DoFailedLogin(); DoFailedLogin();
login_connection->Close(); login_connection->Close();
} }
else { else {
LogF( LogLoginserverDetail(
Logs::Detail,
Logs::Login_Server,
"response [{0}] login succeeded user [{1}]", "response [{0}] login succeeded user [{1}]",
response_error, response_error,
stored_user stored_user

View File

@ -52,11 +52,12 @@ ClientManager::ClientManager()
titanium_stream->OnNewConnection( titanium_stream->OnNewConnection(
[this](std::shared_ptr<EQ::Net::EQStream> stream) { [this](std::shared_ptr<EQ::Net::EQStream> stream) {
LogF(Logs::General, LogLoginserver(
Logs::Login_Server, "New Titanium client connection from {0}:{1}",
"New Titanium client connection from {0}:{1}", stream->GetRemoteIP(),
stream->GetRemoteIP(), stream->GetRemotePort()
stream->GetRemotePort()); );
stream->SetOpcodeManager(&titanium_ops); stream->SetOpcodeManager(&titanium_ops);
Client *c = new Client(stream, cv_titanium); Client *c = new Client(stream, cv_titanium);
clients.push_back(c); clients.push_back(c);
@ -69,8 +70,11 @@ ClientManager::ClientManager()
sod_stream = new EQ::Net::EQStreamManager(sod_opts); sod_stream = new EQ::Net::EQStreamManager(sod_opts);
sod_ops = new RegularOpcodeManager; sod_ops = new RegularOpcodeManager;
if (!sod_ops->LoadOpcodes(server.config.GetVariableString("SoD", "opcodes", "login_opcodes.conf").c_str())) { if (!sod_ops->LoadOpcodes(server.config.GetVariableString("SoD", "opcodes", "login_opcodes.conf").c_str())) {
Log(Logs::General, Logs::Error, "ClientManager fatal error: couldn't load opcodes for SoD file %s.", Error(
server.config.GetVariableString("SoD", "opcodes", "login_opcodes.conf").c_str()); "ClientManager fatal error: couldn't load opcodes for SoD file {0}",
server.config.GetVariableString("SoD", "opcodes", "login_opcodes.conf").c_str()
);
run_server = false; run_server = false;
} }
@ -150,9 +154,7 @@ void ClientManager::RemoveExistingClient(unsigned int account_id, const std::str
auto iter = clients.begin(); auto iter = clients.begin();
while (iter != clients.end()) { while (iter != clients.end()) {
if ((*iter)->GetAccountID() == account_id && (*iter)->GetLoginServerName().compare(loginserver) == 0) { if ((*iter)->GetAccountID() == account_id && (*iter)->GetLoginServerName().compare(loginserver) == 0) {
Log(Logs::General, LogLoginserver("Client attempting to log in existing client already logged in, removing existing client");
Logs::Login_Server,
"Client attempting to log in and existing client already logged in, removing existing client.");
delete (*iter); delete (*iter);
iter = clients.erase(iter); iter = clients.erase(iter);
} }

View File

@ -104,9 +104,7 @@ bool Database::GetLoginDataFromAccountInfo(
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (results.RowCount() != 1) { if (results.RowCount() != 1) {
LogF( LogLoginserverDetail(
Logs::Detail,
Logs::Login_Server,
"Could not find account for name [{0}] login [{1}]", "Could not find account for name [{0}] login [{1}]",
name, name,
loginserver loginserver
@ -124,15 +122,13 @@ bool Database::GetLoginDataFromAccountInfo(
id = atoi(row[0]); id = atoi(row[0]);
password = row[1]; password = row[1];
LogF( LogLoginserverDetail(
Logs::Detail,
Logs::Login_Server,
"Found account for name [{0}] login [{1}]", "Found account for name [{0}] login [{1}]",
name, name,
loginserver loginserver
); );
return false; return true;
} }
/** /**

View File

@ -265,17 +265,14 @@ void ServerManager::SendUserToWorldRequest(
found = true; found = true;
if (server.options.IsDumpInPacketsOn()) { if (server.options.IsDumpInPacketsOn()) {
LogF(Logs::General, Logs::Login_Server, "{0}", outapp.ToString()); LogLoginserver("{0}", outapp.ToString());
} }
} }
++iter; ++iter;
} }
if (!found && server.options.IsTraceOn()) { if (!found && server.options.IsTraceOn()) {
Log(Logs::General, Error("Client requested a user to world but supplied an invalid id of {0}", server_id);
Logs::Error,
"Client requested a user to world but supplied an invalid id of %u.",
server_id);
} }
} }

View File

@ -108,18 +108,18 @@ void WorldServer::ProcessNewLSInfo(uint16_t opcode, const EQ::Net::Packet &packe
} }
if (packet.Length() < sizeof(ServerNewLSInfo_Struct)) { if (packet.Length() < sizeof(ServerNewLSInfo_Struct)) {
Log(Logs::General, Logs::Error, Error(
"Received application packet from server that had opcode ServerOP_NewLSInfo, " "Received application packet from server that had opcode ServerOP_NewLSInfo, "
"but was too small. Discarded to avoid buffer overrun."); "but was too small. Discarded to avoid buffer overrun"
);
return; return;
} }
ServerNewLSInfo_Struct *info = (ServerNewLSInfo_Struct *) packet.Data(); auto *info = (ServerNewLSInfo_Struct *) packet.Data();
LogF( LogLoginserver(
Logs::General,
Logs::Login_Server,
"Received New Login Server Info \n" "Received New Login Server Info \n"
" - name [{0}]\n" " - name [{0}]\n"
" - shortname [{1}]\n" " - shortname [{1}]\n"