diff options
Diffstat (limited to 'src/game/Level3.cpp')
-rw-r--r-- | src/game/Level3.cpp | 150 |
1 files changed, 57 insertions, 93 deletions
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 624fc1d14ea..540bd0d8586 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -1412,68 +1412,22 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char *args) char* arg1 = strtok((char*)args, " "); char* arg2 = strtok(NULL, " "); char* arg3 = strtok(NULL, " "); + bool isAccountNameGiven = true; - if (getSelectedPlayer() && arg1 && !arg3) + if (arg1 && !arg3) { - targetAccountId = getSelectedPlayer()->GetSession()->GetAccountId(); - accmgr.GetName(targetAccountId, targetAccountName); - Player* targetPlayer = getSelectedPlayer(); - gm = atoi(arg1); - uint32 gmRealmID = arg2 ? atoi(arg2) : realmID; - - // Check for invalid specified GM level. - if (gm < SEC_PLAYER || gm > SEC_ADMINISTRATOR) - { - SendSysMessage(LANG_BAD_VALUE); - SetSentErrorMessage(true); - return false; - } - - // Check if targets GM level and specified GM level is not higher than current gm level - targetSecurity = targetPlayer->GetSession()->GetSecurity(); - if (targetSecurity >= m_session->GetSecurity() || - gm >= m_session->GetSecurity() || - (gmRealmID != realmID && m_session->GetSecurity() < SEC_CONSOLE)) - { - SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); - SetSentErrorMessage(true); - return false; - } - - // Check if provided realmID is not current realmID, or isn't -1 - if (gmRealmID != realmID && gmRealmID != -1) - { - SendSysMessage(LANG_INVALID_REALMID); - SetSentErrorMessage(true); + if (!getSelectedPlayer()) return false; - } + isAccountNameGiven = false; + } - // Decide which string to show - if (m_session->GetPlayer() != targetPlayer) - PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetAccountName.c_str(), gm); - else - PSendSysMessage(LANG_YOURS_SECURITY_CHANGED, m_session->GetPlayer()->GetName(), gm); + // Check for second parameter + if (!isAccountNameGiven && !arg2) + return false; - // If gmRealmID is -1, delete all values for the account id, else, insert values for the specific realmID - if (gmRealmID == -1) - { - loginDatabase.PExecute("DELETE FROM account_access WHERE id = '%u'", targetAccountId); - loginDatabase.PExecute("INSERT INTO account_access VALUES ('%u', '%d', -1)", targetAccountId, gm); - } - else - { - loginDatabase.PExecute("DELETE FROM account_access WHERE id = '%u' AND RealmID = '%d'", targetAccountId, realmID); - loginDatabase.PExecute("INSERT INTO account_access VALUES ('%u','%d','%d')", targetAccountId, gm, realmID); - } - return true; - } - else + // Check for account + if (isAccountNameGiven) { - // Check for second parameter - if (!arg2) - return false; - - // Check for account targetAccountName = arg1; if (!AccountMgr::normalizeString(targetAccountName)) { @@ -1481,53 +1435,63 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char *args) SetSentErrorMessage(true); return false; } + } - // Check for invalid specified GM level. - gm = atoi(arg2); - if (gm < SEC_PLAYER || gm > SEC_ADMINISTRATOR) - { - SendSysMessage(LANG_BAD_VALUE); - SetSentErrorMessage(true); - return false; - } - - uint32 gmRealmID = arg3 ? atoi(arg3) : realmID; - // Check if provided realmID is not current realmID, or isn't -1 - if (gmRealmID != realmID && gmRealmID != -1) - { - SendSysMessage(LANG_INVALID_REALMID); - SetSentErrorMessage(true); - return false; - } + // Check for invalid specified GM level. + gm = (isAccountNameGiven) ? atoi(arg2) : atoi(arg1); + if (gm < SEC_PLAYER) + { + SendSysMessage(LANG_BAD_VALUE); + SetSentErrorMessage(true); + return false; + } - targetAccountId = accmgr.GetId(arg1); - /// m_session==NULL only for console - uint32 plSecurity = m_session ? m_session->GetSecurity() : SEC_CONSOLE; + // m_session == NULL only for console + targetAccountId = (isAccountNameGiven) ? accmgr.GetId(targetAccountName) : getSelectedPlayer()->GetSession()->GetAccountId(); + int32 gmRealmID = (isAccountNameGiven) ? atoi(arg3) : atoi(arg2); + uint32 plSecurity = m_session ? accmgr.GetSecurity(m_session->GetAccountId(), gmRealmID) : SEC_CONSOLE; - /// can set security level only for target with less security and to less security that we have - /// This is also reject self apply in fact - targetSecurity = accmgr.GetSecurity(targetAccountId); - if (targetSecurity >= plSecurity || gm >= plSecurity) + // can set security level only for target with less security and to less security that we have + // This is also reject self apply in fact + targetSecurity = accmgr.GetSecurity(targetAccountId, gmRealmID); + if (targetSecurity >= plSecurity || gm >= plSecurity) + { + SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); + SetSentErrorMessage(true); + return false; + } + + // Check and abort if the target gm has a higher rank on one of the realms and the new realm is -1 + if (gmRealmID == -1) + { + QueryResult *result = loginDatabase.PQuery("SELECT * FROM account_access WHERE id = '%u' AND gmlevel > '%d'", targetAccountId, gm); + if (result) { + delete result; SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); SetSentErrorMessage(true); return false; } + } - PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetAccountName.c_str(), gm); - // If gmRealmID is -1, delete all values for the account id, else, insert values for the specific realmID - if (gmRealmID == -1) - { - loginDatabase.PExecute("DELETE FROM account_access WHERE id = '%u'", targetAccountId); - loginDatabase.PExecute("INSERT INTO account_access VALUES ('%u', '%d', -1)", targetAccountId, gm); - } - else - { - loginDatabase.PExecute("DELETE FROM account_access WHERE id = '%u' AND RealmID = '%d'", targetAccountId, realmID); - loginDatabase.PExecute("INSERT INTO account_access VALUES ('%u','%d','%d')", targetAccountId, gm, realmID); - } - return true; + // Check if provided realmID has a negative value other than -1 + if (gmRealmID < -1) + { + SendSysMessage(LANG_INVALID_REALMID); + SetSentErrorMessage(true); + return false; } + + // If gmRealmID is -1, delete all values for the account id, else, insert values for the specific realmID + if (gmRealmID == -1) + loginDatabase.PExecute("DELETE FROM account_access WHERE id = '%u'", targetAccountId); + else + loginDatabase.PExecute("DELETE FROM account_access WHERE id = '%u' AND (RealmID = '%d' OR RealmID = '-1')", targetAccountId, realmID); + + if (gm != 0) + loginDatabase.PExecute("INSERT INTO account_access VALUES ('%u','%d','%d')", targetAccountId, gm, realmID); + PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetAccountName.c_str(), gm); + return true; } /// Set password for account |