/** * Handles the '.character deleted delete' command, which completely deletes all deleted characters which matches the given search string * * @see Player::GetDeletedCharacterGUIDs * @see Player::DeleteFromDB * @see ChatHandler::HandleCharacterDeletedListCommand * @see ChatHandler::HandleCharacterDeletedRestoreCommand * * @param args the search string which either contains a player GUID or a part of the character-name */ bool ChatHandler::HandleCharacterDeletedDeleteCommand(char* args) { // It is required to submit at least one argument if (!*args) return false; DeletedInfoList foundList; if (!GetDeletedCharacterInfoList(foundList, args)) return false; if (foundList.empty()) { SendSysMessage(LANG_CHARACTER_DELETED_LIST_EMPTY); return false; } SendSysMessage(LANG_CHARACTER_DELETED_DELETE); HandleCharacterDeletedListHelper(foundList); // Call the appropriate function to delete them (current account for deleted characters is 0) for(DeletedInfoList::const_iterator itr = foundList.begin(); itr != foundList.end(); ++itr) Player::DeleteFromDB(ObjectGuid(HIGHGUID_PLAYER, itr->lowguid), 0, false, true); return true; }
/** * Handles the '.character deleted delete' command, which completely deletes all deleted characters which matches the given search string * * @see Player::GetDeletedCharacterGUIDs * @see Player::DeleteFromDB * @see HandleCharacterDeletedListCommand * @see HandleCharacterDeletedRestoreCommand * * @param args the search string which either contains a player GUID or a part fo the character-name */ static bool HandleCharacterDeletedDeleteCommand(ChatHandler* handler, char const* args) { // It is required to submit at least one argument if (!*args) return false; DeletedInfoList foundList; if (!GetDeletedCharacterInfoList(foundList, args)) return false; if (foundList.empty()) { handler->SendSysMessage(LANGUAGE_CHARACTER_DELETED_LIST_EMPTY); return false; } handler->SendSysMessage(LANGUAGE_CHARACTER_DELETED_DELETE); HandleCharacterDeletedListHelper(foundList, handler); // Call the appropriate function to delete them (current account for deleted characters is 0) for (DeletedInfoList::const_iterator itr = foundList.begin(); itr != foundList.end(); ++itr) Player::DeleteFromDB(itr->lowGuid, 0, false, true); return true; }
/** * Shows all deleted characters which matches the given search string, expected non empty list * * @see ChatHandler::HandleCharacterDeletedListCommand * @see ChatHandler::HandleCharacterDeletedRestoreCommand * @see ChatHandler::HandleCharacterDeletedDeleteCommand * @see ChatHandler::DeletedInfoList * * @param foundList contains a list with all found deleted characters */ void ChatHandler::HandleCharacterDeletedListHelper(DeletedInfoList const& foundList) { if (!m_session) { SendSysMessage(LANG_CHARACTER_DELETED_LIST_BAR); SendSysMessage(LANG_CHARACTER_DELETED_LIST_HEADER); SendSysMessage(LANG_CHARACTER_DELETED_LIST_BAR); } for (DeletedInfoList::const_iterator itr = foundList.begin(); itr != foundList.end(); ++itr) { std::string dateStr = TimeToTimestampStr(itr->deleteDate); if (!m_session) PSendSysMessage(LANG_CHARACTER_DELETED_LIST_LINE_CONSOLE, itr->lowguid, itr->name.c_str(), itr->accountName.empty() ? "<nonexistent>" : itr->accountName.c_str(), itr->accountId, dateStr.c_str()); else PSendSysMessage(LANG_CHARACTER_DELETED_LIST_LINE_CHAT, itr->lowguid, itr->name.c_str(), itr->accountName.empty() ? "<nonexistent>" : itr->accountName.c_str(), itr->accountId, dateStr.c_str()); } if (!m_session) SendSysMessage(LANG_CHARACTER_DELETED_LIST_BAR); }
/** * Shows all deleted characters which matches the given search string, expected non empty list * * @see HandleCharacterDeletedListCommand * @see HandleCharacterDeletedRestoreCommand * @see HandleCharacterDeletedDeleteCommand * @see DeletedInfoList * * @param foundList contains a list with all found deleted characters */ static void HandleCharacterDeletedListHelper(DeletedInfoList const& foundList, ChatHandler* handler) { if (!handler->GetSession()) { handler->SendSysMessage(LANGUAGE_CHARACTER_DELETED_LIST_BAR); handler->SendSysMessage(LANGUAGE_CHARACTER_DELETED_LIST_HEADER); handler->SendSysMessage(LANGUAGE_CHARACTER_DELETED_LIST_BAR); } for (DeletedInfoList::const_iterator itr = foundList.begin(); itr != foundList.end(); ++itr) { std::string dateStr = TimeToTimestampStr(itr->deleteDate); if (!handler->GetSession()) handler->PSendSysMessage(LANGUAGE_CHARACTER_DELETED_LIST_LINE_CONSOLE, itr->lowGuid, itr->name.c_str(), itr->accountName.empty() ? "<Not existed>" : itr->accountName.c_str(), itr->accountId, dateStr.c_str()); else handler->PSendSysMessage(LANGUAGE_CHARACTER_DELETED_LIST_LINE_CHAT, itr->lowGuid, itr->name.c_str(), itr->accountName.empty() ? "<Not existed>" : itr->accountName.c_str(), itr->accountId, dateStr.c_str()); } if (!handler->GetSession()) handler->SendSysMessage(LANGUAGE_CHARACTER_DELETED_LIST_BAR); }
/** * Handles the '.character deleted restore' command, which restores all deleted characters which matches the given search string * * The command automatically calls '.character deleted list' command with the search string to show all restored characters. * * @see ChatHandler::HandleCharacterDeletedRestoreHelper * @see ChatHandler::HandleCharacterDeletedListCommand * @see ChatHandler::HandleCharacterDeletedDeleteCommand * * @param args the search string which either contains a player GUID or a part of the character-name */ bool ChatHandler::HandleCharacterDeletedRestoreCommand(char* args) { // It is required to submit at least one argument if (!*args) return false; std::string searchString; std::string newCharName; uint32 newAccount = 0; // GCC by some strange reason fail build code without temporary variable std::istringstream params(args); params >> searchString >> newCharName >> newAccount; DeletedInfoList foundList; if (!GetDeletedCharacterInfoList(foundList, searchString)) return false; if (foundList.empty()) { SendSysMessage(LANG_CHARACTER_DELETED_LIST_EMPTY); return false; } SendSysMessage(LANG_CHARACTER_DELETED_RESTORE); HandleCharacterDeletedListHelper(foundList); if (newCharName.empty()) { // Drop nonexistent account cases for (auto& itr : foundList) HandleCharacterDeletedRestoreHelper(itr); } else if (foundList.size() == 1 && normalizePlayerName(newCharName)) { DeletedInfo delInfo = foundList.front(); // update name delInfo.name = newCharName; // if new account provided update deleted info if (newAccount && newAccount != delInfo.accountId) { delInfo.accountId = newAccount; sAccountMgr.GetName(newAccount, delInfo.accountName); } HandleCharacterDeletedRestoreHelper(delInfo); } else SendSysMessage(LANG_CHARACTER_DELETED_ERR_RENAME); return true; }
/** * Handles the '.character deleted list' command, which shows all deleted characters which matches the given search string * * @see ChatHandler::HandleCharacterDeletedListHelper * @see ChatHandler::HandleCharacterDeletedRestoreCommand * @see ChatHandler::HandleCharacterDeletedDeleteCommand * @see ChatHandler::DeletedInfoList * * @param args the search string which either contains a player GUID or a part fo the character-name */ bool ChatHandler::HandleCharacterDeletedListCommand(const char* args) { DeletedInfoList foundList; if (!GetDeletedCharacterInfoList(foundList, args)) return false; // if no characters have been found, output a warning if (foundList.empty()) { SendSysMessage(LANG_CHARACTER_DELETED_LIST_EMPTY); return false; } HandleCharacterDeletedListHelper(foundList); return true; }
/** * Handles the '.character deleted list' command, which shows all deleted characters which matches the given search string * * @see HandleCharacterDeletedListHelper * @see HandleCharacterDeletedRestoreCommand * @see HandleCharacterDeletedDeleteCommand * @see DeletedInfoList * * @param args the search string which either contains a player GUID or a part fo the character-name */ static bool HandleCharacterDeletedListCommand(ChatHandler* handler, char const* args) { DeletedInfoList foundList; if (!GetDeletedCharacterInfoList(foundList, args)) return false; // if no characters have been found, output a warning if (foundList.empty()) { handler->SendSysMessage(LANGUAGE_CHARACTER_DELETED_LIST_EMPTY); return false; } HandleCharacterDeletedListHelper(foundList, handler); return true; }
/** * Collects all GUIDs (and related info) from deleted characters which are still in the database. * * @param foundList a reference to an std::list which will be filled with info data * @param searchString the search string which either contains a player GUID or a part fo the character-name * @return returns false if there was a problem while selecting the characters (e.g. player name not normalizeable) */ bool ChatHandler::GetDeletedCharacterInfoList(DeletedInfoList& foundList, std::string searchString) { PreparedQueryResult result; PreparedStatement* stmt; if (!searchString.empty()) { // search by GUID if (isNumeric(searchString.c_str())) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_DEL_INFO_BY_GUID); stmt->setUInt32(0, uint32(atoi(searchString.c_str()))); result = CharacterDatabase.Query(stmt); } // search by name else { if (!normalizePlayerName(searchString)) return false; stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_DEL_INFO_BY_NAME); stmt->setString(0, searchString); result = CharacterDatabase.Query(stmt); } } else { stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_DEL_INFO); result = CharacterDatabase.Query(stmt); } if (result) { do { Field* fields = result->Fetch(); DeletedInfo info; info.lowguid = fields[0].GetUInt32(); info.name = fields[1].GetString(); info.accountId = fields[2].GetUInt32(); // account name will be empty for not existed account AccountMgr::GetName(info.accountId, info.accountName); info.deleteDate = time_t(fields[3].GetUInt32()); foundList.push_back(info); } while (result->NextRow()); } return true; }
/** * Handles the '.character deleted restore' command, which restores all deleted characters which matches the given search string * * The command automatically calls '.character deleted list' command with the search string to show all restored characters. * * @see HandleCharacterDeletedRestoreHelper * @see HandleCharacterDeletedListCommand * @see HandleCharacterDeletedDeleteCommand * * @param args the search string which either contains a player GUID or a part of the character-name */ static bool HandleCharacterDeletedRestoreCommand(ChatHandler* handler, char const* args) { // It is required to submit at least one argument if (!*args) return false; std::string searchString; std::string newCharName; uint32 newAccount = 0; // GCC by some strange reason fail build code without temporary variable std::istringstream params(args); params >> searchString >> newCharName >> newAccount; DeletedInfoList foundList; if (!GetDeletedCharacterInfoList(foundList, searchString)) return false; if (foundList.empty()) { handler->SendSysMessage(LANGUAGE_CHARACTER_DELETED_LIST_EMPTY); return false; } handler->SendSysMessage(LANGUAGE_CHARACTER_DELETED_RESTORE); HandleCharacterDeletedListHelper(foundList, handler); if (newCharName.empty()) { // Drop not existed account cases for (DeletedInfoList::iterator itr = foundList.begin(); itr != foundList.end(); ++itr) HandleCharacterDeletedRestoreHelper(*itr, handler); } else if (foundList.size() == 1 && normalizePlayerName(newCharName)) { DeletedInfo delInfo = foundList.front(); // update name delInfo.name = newCharName; // if new account provided update deleted info if (newAccount && newAccount != delInfo.accountId) { delInfo.accountId = newAccount; AccountMgr::GetName(newAccount, delInfo.accountName); } HandleCharacterDeletedRestoreHelper(delInfo, handler); } else handler->SendSysMessage(LANGUAGE_CHARACTER_DELETED_ERR_RENAME); return true; }
/** * Collects all GUIDs (and related info) from deleted characters which are still in the database. * * @param foundList a reference to an std::list which will be filled with info data * @param searchString the search string which either contains a player GUID (low part) or a part of the character-name * @return returns false if there was a problem while selecting the characters (e.g. player name not normalizeable) */ bool ChatHandler::GetDeletedCharacterInfoList(DeletedInfoList& foundList, std::string searchString) { QueryResult* resultChar; if (!searchString.empty()) { // search by GUID if (isNumeric(searchString)) resultChar = CharacterDatabase.PQuery("SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = %u", uint32(atoi(searchString.c_str()))); // search by name else { if (!normalizePlayerName(searchString)) return false; resultChar = CharacterDatabase.PQuery("SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name " _LIKE_ " " _CONCAT3_("'%%'", "'%s'", "'%%'"), searchString.c_str()); } } else resultChar = CharacterDatabase.Query("SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL"); if (resultChar) { do { Field* fields = resultChar->Fetch(); DeletedInfo info; info.lowguid = fields[0].GetUInt32(); info.name = fields[1].GetCppString(); info.accountId = fields[2].GetUInt32(); // account name will be empty for nonexistent account sAccountMgr.GetName(info.accountId, info.accountName); info.deleteDate = time_t(fields[3].GetUInt64()); foundList.push_back(info); } while (resultChar->NextRow()); delete resultChar; } return true; }