feat(net): implement remaining failure cases in GruntLogin::LogonResult

This commit is contained in:
fallenoak 2025-09-30 22:51:21 -05:00
parent ecc43fe40b
commit 8b4cc6121a
No known key found for this signature in database
GPG Key ID: 7628F8E61AEA070D
3 changed files with 81 additions and 65 deletions

View File

@ -314,7 +314,7 @@ int32_t Grunt::ClientLink::CmdAuthLogonProof(CDataStore& msg) {
if (verifyResult != SRP6_OK) { if (verifyResult != SRP6_OK) {
this->SetState(STATE_CONNECTED); this->SetState(STATE_CONNECTED);
this->m_clientResponse->LogonResult(Grunt::GRUNT_RESULT_11, nullptr, 0, 0x0); this->m_clientResponse->LogonResult(Result::GRUNT_RESULT_11, nullptr, 0, 0x0);
return 2; return 2;
} }
@ -328,7 +328,7 @@ int32_t Grunt::ClientLink::CmdAuthLogonProof(CDataStore& msg) {
this->SetState(STATE_AUTHENTICATED); this->SetState(STATE_AUTHENTICATED);
this->m_clientResponse->LogonResult(Grunt::GRUNT_RESULT_0, this->m_srpClient.sessionKey, 40, logonFlags); this->m_clientResponse->LogonResult(Result::SUCCESS, this->m_srpClient.sessionKey, 40, logonFlags);
return 2; return 2;
} }
@ -412,7 +412,7 @@ int32_t Grunt::ClientLink::CmdAuthReconnectProof(CDataStore& msg) {
this->SetState(STATE_AUTHENTICATED); this->SetState(STATE_AUTHENTICATED);
this->m_clientResponse->ReconnectResult(Grunt::GRUNT_RESULT_0, this->m_reconnectSessionKey, 40, reconnectFlags); this->m_clientResponse->ReconnectResult(Result::SUCCESS, this->m_reconnectSessionKey, 40, reconnectFlags);
return 2; return 2;
} }

View File

@ -12,40 +12,41 @@ namespace Grunt {
extern Command<ClientLink> s_clientCommands[]; extern Command<ClientLink> s_clientCommands[];
enum Result { enum Result {
GRUNT_RESULT_0 = 0, SUCCESS = 0,
GRUNT_RESULT_1 = 1, GRUNT_RESULT_1 = 1,
GRUNT_RESULT_2 = 2, GRUNT_RESULT_2 = 2,
GRUNT_RESULT_3 = 3, BANNED = 3,
GRUNT_RESULT_4 = 4, GRUNT_RESULT_4 = 4,
GRUNT_RESULT_5 = 5, GRUNT_RESULT_5 = 5,
GRUNT_RESULT_6 = 6, ALREADYONLINE = 6,
GRUNT_RESULT_7 = 7, NOTIME = 7,
GRUNT_RESULT_8 = 8, DBBUSY = 8,
GRUNT_RESULT_9 = 9, BADVERSION = 9,
GRUNT_RESULT_10 = 10, DOWNLOADFILE = 10,
GRUNT_RESULT_11 = 11, GRUNT_RESULT_11 = 11,
GRUNT_RESULT_12 = 12, SUSPENDED = 12,
GRUNT_RESULT_13 = 13, GRUNT_RESULT_13 = 13,
GRUNT_RESULT_14 = 14, SUCCESS_SURVEY = 14,
GRUNT_RESULT_15 = 15, PARENTALCONTROL = 15,
GRUNT_RESULT_16 = 16, LOCKED_ENFORCED = 16,
GRUNT_RESULT_17 = 17, TRIAL_EXPIRED = 17,
GRUNT_RESULT_18 = 18, ACCOUNT_CONVERTED = 18,
GRUNT_RESULT_19 = 19, GRUNT_RESULT_19 = 19,
GRUNT_RESULT_20 = 20, GRUNT_RESULT_20 = 20,
GRUNT_RESULT_21 = 21, GRUNT_RESULT_21 = 21,
GRUNT_RESULT_22 = 22, CHARGEBACK = 22,
GRUNT_RESULT_23 = 23, IGR_WITHOUT_BNET = 23,
GRUNT_RESULT_24 = 24, GAME_ACCOUNT_LOCKED = 24,
GRUNT_RESULT_25 = 25, UNLOCKABLE_LOCK = 25,
GRUNT_RESULT_26 = 26, GRUNT_RESULT_26 = 26,
GRUNT_RESULT_27 = 27, GRUNT_RESULT_27 = 27,
GRUNT_RESULT_28 = 28, GRUNT_RESULT_28 = 28,
GRUNT_RESULT_29 = 29, GRUNT_RESULT_29 = 29,
GRUNT_RESULT_30 = 30, GRUNT_RESULT_30 = 30,
GRUNT_RESULT_31 = 31, GRUNT_RESULT_31 = 31,
GRUNT_RESULT_32 = 32, CONVERSION_REQUIRED = 32,
GRUNT_RESULT_LAST, GRUNT_RESULT_LAST,
DISCONNECTED = 255
}; };
extern const char* g_LoginResultStringNames[]; extern const char* g_LoginResultStringNames[];

View File

@ -162,7 +162,10 @@ void GruntLogin::Logon(const char* loginServer, const char* loginPortal) {
} }
void GruntLogin::LogonResult(Grunt::Result result, const uint8_t* sessionKey, uint32_t sessionKeyLen, uint16_t flags) { void GruntLogin::LogonResult(Grunt::Result result, const uint8_t* sessionKey, uint32_t sessionKeyLen, uint16_t flags) {
using ::Grunt::Result;
// Reconnect // Reconnect
if (this->IsReconnect()) { if (this->IsReconnect()) {
// TODO // TODO
// this->m_loginResponse->HandleRealmData(1, 0); // this->m_loginResponse->HandleRealmData(1, 0);
@ -172,7 +175,8 @@ void GruntLogin::LogonResult(Grunt::Result result, const uint8_t* sessionKey, ui
} }
// Authentication success // Authentication success
if (result == Grunt::GRUNT_RESULT_0 || result == Grunt::GRUNT_RESULT_14) {
if (result == Result::SUCCESS || result == Result::SUCCESS_SURVEY) {
// TODO // TODO
// this->uint8 = 0; // this->uint8 = 0;
// LOBYTE(this->uint105C) = 0; // LOBYTE(this->uint105C) = 0;
@ -206,12 +210,12 @@ void GruntLogin::LogonResult(Grunt::Result result, const uint8_t* sessionKey, ui
// TODO this->uint8 = 1; // TODO this->uint8 = 1;
switch (result) { switch (result) {
case 3: case Result::BANNED:
this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_BANNED, nullptr, 0x0); this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_BANNED, nullptr, 0x0);
break; break;
case 4: case Result::GRUNT_RESULT_4:
case 5: { case Result::GRUNT_RESULT_5: {
LOGIN_RESULT loginResult = LOGIN_UNKNOWN_ACCOUNT; LOGIN_RESULT loginResult = LOGIN_UNKNOWN_ACCOUNT;
// TODO // TODO
@ -224,58 +228,69 @@ void GruntLogin::LogonResult(Grunt::Result result, const uint8_t* sessionKey, ui
break; break;
} }
case 6: case Result::ALREADYONLINE:
this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_ALREADYONLINE, nullptr, 0x0); this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_ALREADYONLINE, nullptr, 0x0);
break; break;
case 7: case Result::NOTIME:
this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_NOTIME, nullptr, 0x0); this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_NOTIME, nullptr, 0x0);
break; break;
case 8: case Result::DBBUSY:
this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_DBBUSY, nullptr, 0x0); this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_DBBUSY, nullptr, 0x0);
break; break;
case 9: case Result::BADVERSION:
this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_BADVERSION, nullptr, 0x0); this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_BADVERSION, nullptr, 0x0);
break; break;
case 10: case Result::DOWNLOADFILE:
this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_DOWNLOADFILE, LOGIN_OK, nullptr, 0x0); this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_DOWNLOADFILE, LOGIN_OK, nullptr, 0x0);
break; break;
case 12: case Result::SUSPENDED:
this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_SUSPENDED, nullptr, 0x0); this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_SUSPENDED, nullptr, 0x0);
break; break;
case 15: case Result::PARENTALCONTROL:
// TODO this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_PARENTALCONTROL, nullptr, 0x0);
break;
case 16: case Result::LOCKED_ENFORCED:
// TODO this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_LOCKED_ENFORCED, nullptr, 0x0);
break;
case 17: case Result::TRIAL_EXPIRED:
// TODO this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_TRIAL_EXPIRED, nullptr, 0x0);
break;
case 18: case Result::ACCOUNT_CONVERTED:
// TODO this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_ACCOUNT_CONVERTED, nullptr, 0x0);
break;
case 22: case Result::CHARGEBACK:
// TODO this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_CHARGEBACK, nullptr, 0x0);
break;
case 23: case Result::IGR_WITHOUT_BNET:
// TODO this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_IGR_WITHOUT_BNET, nullptr, 0x0);
break;
case 24: case Result::GAME_ACCOUNT_LOCKED:
// TODO this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_GAME_ACCOUNT_LOCKED, nullptr, 0x0);
break;
case 25: case Result::UNLOCKABLE_LOCK:
// TODO this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_UNLOCKABLE_LOCK, nullptr, 0x0);
break;
case 32: case Result::CONVERSION_REQUIRED:
// TODO this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_CONVERSION_REQUIRED, nullptr, 0x0);
break;
// TODO case 255 case Result::DISCONNECTED:
this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_DISCONNECTED, nullptr, 0x0);
break;
default: default:
this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_FAILED, nullptr, 0x0); this->m_loginResponse->UpdateLoginStatus(LOGIN_STATE_FAILED, LOGIN_FAILED, nullptr, 0x0);