diff options
Diffstat (limited to 'src/server/scripts/Commands')
-rw-r--r-- | src/server/scripts/Commands/cs_character.cpp | 93 |
1 files changed, 73 insertions, 20 deletions
diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index a604764c667..4a6d872886f 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -48,6 +48,7 @@ public: { static std::vector<ChatCommand> pdumpCommandTable = { + { "copy", rbac::RBAC_PERM_COMMAND_PDUMP_COPY, true, &HandlePDumpCopyCommand, "" }, { "load", rbac::RBAC_PERM_COMMAND_PDUMP_LOAD, true, &HandlePDumpLoadCommand, "" }, { "write", rbac::RBAC_PERM_COMMAND_PDUMP_WRITE, true, &HandlePDumpWriteCommand, "" }, }; @@ -776,39 +777,57 @@ public: return true; } - static bool HandlePDumpLoadCommand(ChatHandler* handler, std::string fileName, AccountIdentifier account, Optional<std::string_view> characterName, Optional<ObjectGuid::LowType> characterGUID) + static bool HandlePDumpCopyCommand(ChatHandler* handler, PlayerIdentifier player, AccountIdentifier account, Optional<std::string_view> characterName, Optional<ObjectGuid::LowType> characterGUID) { std::string name; - if (characterName) + if (!ValidatePDumpTarget(handler, name, characterName, characterGUID)) + return false; + + std::string dump; + switch (PlayerDumpWriter().WriteDumpToString(dump, player.GetGUID().GetCounter())) { - name.assign(*characterName); - // normalize the name if specified and check if it exists - if (!normalizePlayerName(name)) - { - handler->PSendSysMessage(LANG_INVALID_CHARACTER_NAME); + case DUMP_SUCCESS: + break; + case DUMP_CHARACTER_DELETED: + handler->PSendSysMessage(LANG_COMMAND_EXPORT_DELETED_CHAR); handler->SetSentErrorMessage(true); return false; - } - - if (ObjectMgr::CheckPlayerName(name, sWorld->GetDefaultDbcLocale(), true) != CHAR_NAME_SUCCESS) - { - handler->PSendSysMessage(LANG_INVALID_CHARACTER_NAME); + case DUMP_FILE_OPEN_ERROR: // this error code should not happen + default: + handler->PSendSysMessage(LANG_COMMAND_EXPORT_FAILED); handler->SetSentErrorMessage(true); return false; - } } - if (characterGUID) + switch (PlayerDumpReader().LoadDumpFromString(dump, account, name, characterGUID.value_or(0))) { - if (sCharacterCache->GetCharacterCacheByGuid(ObjectGuid::Create<HighGuid::Player>(*characterGUID))) - { - handler->PSendSysMessage(LANG_CHARACTER_GUID_IN_USE, *characterGUID); + case DUMP_SUCCESS: + break; + case DUMP_TOO_MANY_CHARS: + handler->PSendSysMessage(LANG_ACCOUNT_CHARACTER_LIST_FULL, account.GetName().c_str(), account.GetID()); + handler->SetSentErrorMessage(true); + return false; + case DUMP_FILE_OPEN_ERROR: // this error code should not happen + case DUMP_FILE_BROKEN: // this error code should not happen + default: + handler->PSendSysMessage(LANG_COMMAND_IMPORT_FAILED); handler->SetSentErrorMessage(true); return false; - } } - switch (PlayerDumpReader().LoadDump(fileName, account, name, characterGUID.value_or(0))) + // ToDo: use a new trinity_string for this commands + handler->PSendSysMessage(LANG_COMMAND_IMPORT_SUCCESS); + + return true; + } + + static bool HandlePDumpLoadCommand(ChatHandler* handler, std::string fileName, AccountIdentifier account, Optional<std::string_view> characterName, Optional<ObjectGuid::LowType> characterGUID) + { + std::string name; + if (!ValidatePDumpTarget(handler, name, characterName, characterGUID)) + return false; + + switch (PlayerDumpReader().LoadDumpFromFile(fileName, account, name, characterGUID.value_or(0))) { case DUMP_SUCCESS: handler->PSendSysMessage(LANG_COMMAND_IMPORT_SUCCESS); @@ -834,9 +853,43 @@ public: return true; } + static bool ValidatePDumpTarget(ChatHandler* handler, std::string& name, Optional<std::string_view> characterName, Optional<ObjectGuid::LowType> characterGUID) + { + if (characterName) + { + name.assign(*characterName); + // normalize the name if specified and check if it exists + if (!normalizePlayerName(name)) + { + handler->PSendSysMessage(LANG_INVALID_CHARACTER_NAME); + handler->SetSentErrorMessage(true); + return false; + } + + if (ObjectMgr::CheckPlayerName(name, sWorld->GetDefaultDbcLocale(), true) != CHAR_NAME_SUCCESS) + { + handler->PSendSysMessage(LANG_INVALID_CHARACTER_NAME); + handler->SetSentErrorMessage(true); + return false; + } + } + + if (characterGUID) + { + if (sCharacterCache->GetCharacterCacheByGuid(ObjectGuid::Create<HighGuid::Player>(*characterGUID))) + { + handler->PSendSysMessage(LANG_CHARACTER_GUID_IN_USE, *characterGUID); + handler->SetSentErrorMessage(true); + return false; + } + } + + return true; + } + static bool HandlePDumpWriteCommand(ChatHandler* handler, std::string fileName, PlayerIdentifier player) { - switch (PlayerDumpWriter().WriteDump(fileName, player.GetGUID().GetCounter())) + switch (PlayerDumpWriter().WriteDumpToFile(fileName, player.GetGUID().GetCounter())) { case DUMP_SUCCESS: handler->PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS); |