diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/AccountMgr.h | 1 | ||||
-rw-r--r-- | src/game/Chat.cpp | 835 | ||||
-rw-r--r-- | src/game/Chat.h | 72 | ||||
-rw-r--r-- | src/game/Language.h | 91 | ||||
-rw-r--r-- | src/game/Level0.cpp | 54 | ||||
-rw-r--r-- | src/game/Level1.cpp | 60 | ||||
-rw-r--r-- | src/game/Level2.cpp | 153 | ||||
-rw-r--r-- | src/game/Level3.cpp | 1435 | ||||
-rw-r--r-- | src/game/ObjectMgr.h | 1 | ||||
-rw-r--r-- | src/game/PlayerDump.cpp | 131 | ||||
-rw-r--r-- | src/game/PlayerDump.h | 15 | ||||
-rw-r--r-- | src/game/SharedDefines.h | 16 | ||||
-rw-r--r-- | src/game/World.cpp | 98 | ||||
-rw-r--r-- | src/game/World.h | 58 | ||||
-rw-r--r-- | src/game/WorldSession.cpp | 2 | ||||
-rw-r--r-- | src/game/WorldSession.h | 6 | ||||
-rw-r--r-- | src/shared/Common.h | 3 | ||||
-rw-r--r-- | src/trinitycore/CliRunnable.cpp | 1177 | ||||
-rw-r--r-- | src/trinitycore/RASocket.cpp | 31 | ||||
-rw-r--r-- | src/trinitycore/RASocket.h | 2 |
20 files changed, 2128 insertions, 2113 deletions
diff --git a/src/game/AccountMgr.h b/src/game/AccountMgr.h index 3d86bd78672..0c1703ee2d9 100644 --- a/src/game/AccountMgr.h +++ b/src/game/AccountMgr.h @@ -50,7 +50,6 @@ class AccountMgr bool CheckPassword(uint32 accid, std::string passwd); uint32 GetId(std::string username); - uint32 GetIdByGUID(const uint64 &guid) const; uint32 GetSecurity(uint32 acc_id); bool GetName(uint32 acc_id, std::string &name); diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 795471da336..67c79642631 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -38,454 +38,506 @@ bool ChatHandler::load_command_table = true; ChatCommand * ChatHandler::getCommandTable() { + static ChatCommand accountSetCommandTable[] = + { + { "addon", SEC_ADMINISTRATOR, true, &ChatHandler::HandleAccountSetAddonCommand, "", NULL }, + { "gmlevel", SEC_CONSOLE, true, &ChatHandler::HandleAccountSetGmLevelCommand, "", NULL }, + { "password", SEC_CONSOLE, true, &ChatHandler::HandleAccountSetPasswordCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + + static ChatCommand accountCommandTable[] = + { + { "create", SEC_CONSOLE, true, &ChatHandler::HandleAccountCreateCommand, "", NULL }, + { "delete", SEC_CONSOLE, true, &ChatHandler::HandleAccountDeleteCommand, "", NULL }, + { "onlinelist", SEC_CONSOLE, true, &ChatHandler::HandleAccountOnlineListCommand, "", NULL }, + { "set", SEC_ADMINISTRATOR, true, NULL, "", accountSetCommandTable }, + { "", SEC_PLAYER, false, &ChatHandler::HandleAccountCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + + static ChatCommand serverSetCommandTable[] = + { + { "loglevel", SEC_CONSOLE, true, &ChatHandler::HandleServerSetLogLevelCommand, "", NULL }, + { "motd", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerSetMotdCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + static ChatCommand serverCommandTable[] = { - { "idlerestart", SEC_ADMINISTRATOR, &ChatHandler::HandleIdleRestartCommand, "", NULL }, - { "idleshutdown", SEC_ADMINISTRATOR, &ChatHandler::HandleIdleShutDownCommand, "", NULL }, - { "info", SEC_PLAYER, &ChatHandler::HandleInfoCommand, "", NULL }, - { "restart", SEC_ADMINISTRATOR, &ChatHandler::HandleRestartCommand, "", NULL }, - { "shutdown", SEC_ADMINISTRATOR, &ChatHandler::HandleShutDownCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "corpses", SEC_GAMEMASTER, true, &ChatHandler::HandleServerCorpsesCommand, "", NULL }, + { "exit", SEC_CONSOLE, true, &ChatHandler::HandleServerExitCommand, "", NULL }, + { "idlerestart", SEC_ADMINISTRATOR, true, &ChatHandler::HandleIdleRestartCommand, "", NULL }, + { "idleshutdown", SEC_ADMINISTRATOR, true, &ChatHandler::HandleIdleShutDownCommand, "", NULL }, + { "info", SEC_PLAYER, true, &ChatHandler::HandleInfoCommand, "", NULL }, + { "motd", SEC_PLAYER, true, &ChatHandler::HandleServerMotdCommand, "", NULL }, + { "restart", SEC_ADMINISTRATOR, true, &ChatHandler::HandleRestartCommand, "", NULL }, + { "shutdown", SEC_ADMINISTRATOR, true, &ChatHandler::HandleShutDownCommand, "", NULL }, + { "set", SEC_ADMINISTRATOR, true, NULL, "", serverSetCommandTable }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand modifyCommandTable[] = { - { "hp", SEC_MODERATOR, &ChatHandler::HandleModifyHPCommand, "", NULL }, - { "mana", SEC_MODERATOR, &ChatHandler::HandleModifyManaCommand, "", NULL }, - { "rage", SEC_MODERATOR, &ChatHandler::HandleModifyRageCommand, "", NULL }, - { "energy", SEC_MODERATOR, &ChatHandler::HandleModifyEnergyCommand, "", NULL }, - { "money", SEC_MODERATOR, &ChatHandler::HandleModifyMoneyCommand, "", NULL }, - { "speed", SEC_MODERATOR, &ChatHandler::HandleModifySpeedCommand, "", NULL }, - { "swim", SEC_MODERATOR, &ChatHandler::HandleModifySwimCommand, "", NULL }, - { "scale", SEC_MODERATOR, &ChatHandler::HandleModifyScaleCommand, "", NULL }, - { "bit", SEC_MODERATOR, &ChatHandler::HandleModifyBitCommand, "", NULL }, - { "bwalk", SEC_MODERATOR, &ChatHandler::HandleModifyBWalkCommand, "", NULL }, - { "fly", SEC_MODERATOR, &ChatHandler::HandleModifyFlyCommand, "", NULL }, - { "aspeed", SEC_MODERATOR, &ChatHandler::HandleModifyASpeedCommand, "", NULL }, - { "faction", SEC_MODERATOR, &ChatHandler::HandleModifyFactionCommand, "", NULL }, - { "spell", SEC_MODERATOR, &ChatHandler::HandleModifySpellCommand, "", NULL }, - { "tp", SEC_MODERATOR, &ChatHandler::HandleModifyTalentCommand, "", NULL }, - { "titles", SEC_MODERATOR, &ChatHandler::HandleModifyKnownTitlesCommand, "", NULL }, - { "mount", SEC_MODERATOR, &ChatHandler::HandleModifyMountCommand, "", NULL }, - { "honor", SEC_MODERATOR, &ChatHandler::HandleModifyHonorCommand, "", NULL }, - { "rep", SEC_MODERATOR, &ChatHandler::HandleModifyRepCommand, "", NULL }, - { "arena", SEC_MODERATOR, &ChatHandler::HandleModifyArenaCommand, "", NULL }, - { "drunk", SEC_MODERATOR, &ChatHandler::HandleDrunkCommand, "", NULL }, - { "standstate", SEC_GAMEMASTER, &ChatHandler::HandleStandStateCommand, "", NULL }, - { "morph", SEC_GAMEMASTER, &ChatHandler::HandleMorphCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "hp", SEC_MODERATOR, false, &ChatHandler::HandleModifyHPCommand, "", NULL }, + { "mana", SEC_MODERATOR, false, &ChatHandler::HandleModifyManaCommand, "", NULL }, + { "rage", SEC_MODERATOR, false, &ChatHandler::HandleModifyRageCommand, "", NULL }, + { "energy", SEC_MODERATOR, false, &ChatHandler::HandleModifyEnergyCommand, "", NULL }, + { "money", SEC_MODERATOR, false, &ChatHandler::HandleModifyMoneyCommand, "", NULL }, + { "speed", SEC_MODERATOR, false, &ChatHandler::HandleModifySpeedCommand, "", NULL }, + { "swim", SEC_MODERATOR, false, &ChatHandler::HandleModifySwimCommand, "", NULL }, + { "scale", SEC_MODERATOR, false, &ChatHandler::HandleModifyScaleCommand, "", NULL }, + { "bit", SEC_MODERATOR, false, &ChatHandler::HandleModifyBitCommand, "", NULL }, + { "bwalk", SEC_MODERATOR, false, &ChatHandler::HandleModifyBWalkCommand, "", NULL }, + { "fly", SEC_MODERATOR, false, &ChatHandler::HandleModifyFlyCommand, "", NULL }, + { "aspeed", SEC_MODERATOR, false, &ChatHandler::HandleModifyASpeedCommand, "", NULL }, + { "faction", SEC_MODERATOR, false, &ChatHandler::HandleModifyFactionCommand, "", NULL }, + { "spell", SEC_MODERATOR, false, &ChatHandler::HandleModifySpellCommand, "", NULL }, + { "tp", SEC_MODERATOR, false, &ChatHandler::HandleModifyTalentCommand, "", NULL }, + { "titles", SEC_MODERATOR, false, &ChatHandler::HandleModifyKnownTitlesCommand, "", NULL }, + { "mount", SEC_MODERATOR, false, &ChatHandler::HandleModifyMountCommand, "", NULL }, + { "honor", SEC_MODERATOR, false, &ChatHandler::HandleModifyHonorCommand, "", NULL }, + { "rep", SEC_MODERATOR, false, &ChatHandler::HandleModifyRepCommand, "", NULL }, + { "arena", SEC_MODERATOR, false, &ChatHandler::HandleModifyArenaCommand, "", NULL }, + { "drunk", SEC_MODERATOR, false, &ChatHandler::HandleDrunkCommand, "", NULL }, + { "standstate", SEC_GAMEMASTER, false, &ChatHandler::HandleStandStateCommand, "", NULL }, + { "morph", SEC_GAMEMASTER, false, &ChatHandler::HandleMorphCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand wpCommandTable[] = { - { "show", SEC_GAMEMASTER, &ChatHandler::HandleWpShowCommand, "", NULL }, - { "add", SEC_GAMEMASTER, &ChatHandler::HandleWpAddCommand, "", NULL }, - { "modify", SEC_GAMEMASTER, &ChatHandler::HandleWpModifyCommand, "", NULL }, - { "export", SEC_ADMINISTRATOR, &ChatHandler::HandleWpExportCommand, "", NULL }, - { "import", SEC_ADMINISTRATOR, &ChatHandler::HandleWpImportCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "show", SEC_GAMEMASTER, false, &ChatHandler::HandleWpShowCommand, "", NULL }, + { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleWpAddCommand, "", NULL }, + { "modify", SEC_GAMEMASTER, false, &ChatHandler::HandleWpModifyCommand, "", NULL }, + { "export", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWpExportCommand, "", NULL }, + { "import", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWpImportCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; + static ChatCommand banCommandTable[] = + { + { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanAccountCommand, "", NULL }, + { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanCharacterCommand, "", NULL }, + { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanIPCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + + static ChatCommand baninfoCommandTable[] = + { + { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoAccountCommand, "", NULL }, + { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoCharacterCommand, "", NULL }, + { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoIPCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + + static ChatCommand banlistCommandTable[] = + { + { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListAccountCommand, "", NULL }, + { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListCharacterCommand, "", NULL }, + { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListIPCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + + static ChatCommand unbanCommandTable[] = + { + { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanAccountCommand, "", NULL }, + { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanCharacterCommand, "", NULL }, + { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanIPCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } + }; + static ChatCommand debugCommandTable[] = { - { "inarc", SEC_ADMINISTRATOR, &ChatHandler::HandleDebugInArcCommand, "", NULL }, - { "spellfail", SEC_ADMINISTRATOR, &ChatHandler::HandleDebugSpellFailCommand, "", NULL }, - { "setpoi", SEC_ADMINISTRATOR, &ChatHandler::HandleSetPoiCommand, "", NULL }, - { "qpartymsg", SEC_ADMINISTRATOR, &ChatHandler::HandleSendQuestPartyMsgCommand, "", NULL }, - { "qinvalidmsg", SEC_ADMINISTRATOR, &ChatHandler::HandleSendQuestInvalidMsgCommand, "", NULL }, - { "equiperr", SEC_ADMINISTRATOR, &ChatHandler::HandleEquipErrorCommand, "", NULL }, - { "sellerr", SEC_ADMINISTRATOR, &ChatHandler::HandleSellErrorCommand, "", NULL }, - { "buyerr", SEC_ADMINISTRATOR, &ChatHandler::HandleBuyErrorCommand, "", NULL }, - { "sendopcode", SEC_ADMINISTRATOR, &ChatHandler::HandleSendOpcodeCommand, "", NULL }, - { "uws", SEC_ADMINISTRATOR, &ChatHandler::HandleUpdateWorldStateCommand, "", NULL }, - { "ps", SEC_ADMINISTRATOR, &ChatHandler::HandlePlaySound2Command, "", NULL }, - { "scn", SEC_ADMINISTRATOR, &ChatHandler::HandleSendChannelNotifyCommand, "", NULL }, - { "scm", SEC_ADMINISTRATOR, &ChatHandler::HandleSendChatMsgCommand, "", NULL }, - { "getitemstate", SEC_ADMINISTRATOR, &ChatHandler::HandleGetItemState, "", NULL }, - { "playsound", SEC_MODERATOR, &ChatHandler::HandlePlaySoundCommand, "", NULL }, - { "update", SEC_ADMINISTRATOR, &ChatHandler::HandleUpdate, "", NULL }, - { "setvalue", SEC_ADMINISTRATOR, &ChatHandler::HandleSetValue, "", NULL }, - { "getvalue", SEC_ADMINISTRATOR, &ChatHandler::HandleGetValue, "", NULL }, - { "Mod32Value", SEC_ADMINISTRATOR, &ChatHandler::HandleMod32Value, "", NULL }, - { "anim", SEC_GAMEMASTER, &ChatHandler::HandleAnimCommand, "", NULL }, - { "lootrecipient", SEC_GAMEMASTER, &ChatHandler::HandleGetLootRecipient, "", NULL }, - { "arena", SEC_ADMINISTRATOR, &ChatHandler::HandleDebugArenaCommand, "", NULL }, - { "threatlist", SEC_ADMINISTRATOR, &ChatHandler::HandleDebugThreatList, "", NULL }, - { "hostilrefs", SEC_ADMINISTRATOR, &ChatHandler::HandleDebugHostilRefList, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "inarc", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugInArcCommand, "", NULL }, + { "spellfail", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSpellFailCommand, "", NULL }, + { "setpoi", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSetPoiCommand, "", NULL }, + { "qpartymsg", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendQuestPartyMsgCommand, "", NULL }, + { "qinvalidmsg", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendQuestInvalidMsgCommand, "", NULL }, + { "equiperr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleEquipErrorCommand, "", NULL }, + { "sellerr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSellErrorCommand, "", NULL }, + { "buyerr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleBuyErrorCommand, "", NULL }, + { "sendopcode", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendOpcodeCommand, "", NULL }, + { "uws", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUpdateWorldStateCommand, "", NULL }, + { "ps", SEC_ADMINISTRATOR, false, &ChatHandler::HandlePlaySound2Command, "", NULL }, + { "scn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendChannelNotifyCommand, "", NULL }, + { "scm", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendChatMsgCommand, "", NULL }, + { "getitemstate", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGetItemState, "", NULL }, + { "playsound", SEC_MODERATOR, false, &ChatHandler::HandlePlaySoundCommand, "", NULL }, + { "update", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUpdate, "", NULL }, + { "setvalue", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSetValue, "", NULL }, + { "getvalue", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGetValue, "", NULL }, + { "Mod32Value", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMod32Value, "", NULL }, + { "anim", SEC_GAMEMASTER, false, &ChatHandler::HandleAnimCommand, "", NULL }, + { "lootrecipient", SEC_GAMEMASTER, false, &ChatHandler::HandleGetLootRecipient, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand eventCommandTable[] = { - { "activelist", SEC_GAMEMASTER, &ChatHandler::HandleEventActiveListCommand, "", NULL }, - { "start", SEC_GAMEMASTER, &ChatHandler::HandleEventStartCommand, "", NULL }, - { "stop", SEC_GAMEMASTER, &ChatHandler::HandleEventStopCommand, "", NULL }, - { "", SEC_GAMEMASTER, &ChatHandler::HandleEventInfoCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "activelist", SEC_GAMEMASTER, true, &ChatHandler::HandleEventActiveListCommand, "", NULL }, + { "start", SEC_GAMEMASTER, true, &ChatHandler::HandleEventStartCommand, "", NULL }, + { "stop", SEC_GAMEMASTER, true, &ChatHandler::HandleEventStopCommand, "", NULL }, + { "", SEC_GAMEMASTER, true, &ChatHandler::HandleEventInfoCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand learnCommandTable[] = { - { "all", SEC_ADMINISTRATOR, &ChatHandler::HandleLearnAllCommand, "", NULL }, - { "all_gm", SEC_GAMEMASTER, &ChatHandler::HandleLearnAllGMCommand, "", NULL }, - { "all_crafts", SEC_GAMEMASTER, &ChatHandler::HandleLearnAllCraftsCommand, "", NULL }, - { "all_default", SEC_MODERATOR, &ChatHandler::HandleLearnAllDefaultCommand, "", NULL }, - { "all_lang", SEC_MODERATOR, &ChatHandler::HandleLearnAllLangCommand, "", NULL }, - { "all_myclass", SEC_ADMINISTRATOR, &ChatHandler::HandleLearnAllMyClassCommand, "", NULL }, - { "all_myspells", SEC_ADMINISTRATOR, &ChatHandler::HandleLearnAllMySpellsCommand, "", NULL }, - { "all_mytalents", SEC_ADMINISTRATOR, &ChatHandler::HandleLearnAllMyTalentsCommand, "", NULL }, - { "all_recipes", SEC_GAMEMASTER, &ChatHandler::HandleLearnAllRecipesCommand, "", NULL }, - { "", SEC_ADMINISTRATOR, &ChatHandler::HandleLearnCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "all", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllCommand, "", NULL }, + { "all_gm", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllGMCommand, "", NULL }, + { "all_crafts", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllCraftsCommand, "", NULL }, + { "all_default", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllDefaultCommand, "", NULL }, + { "all_lang", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllLangCommand, "", NULL }, + { "all_myclass", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyClassCommand, "", NULL }, + { "all_myspells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMySpellsCommand, "", NULL }, + { "all_mytalents", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyTalentsCommand, "", NULL }, + { "all_recipes", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllRecipesCommand, "", NULL }, + { "", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand reloadCommandTable[] = { - { "all", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllCommand, "", NULL }, - { "all_loot", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllLootCommand, "", NULL }, - { "all_npc", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllNpcCommand, "", NULL }, - { "all_quest", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllQuestCommand, "", NULL }, - { "all_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllScriptsCommand, "", NULL }, - { "all_spell", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllSpellCommand, "", NULL }, - { "all_item", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllItemCommand, "", NULL }, - { "all_locales", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllLocalesCommand, "", NULL }, - - { "config", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadConfigCommand, "", NULL }, - - { "areatrigger_tavern", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAreaTriggerTavernCommand, "", NULL }, - { "areatrigger_teleport", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAreaTriggerTeleportCommand, "", NULL }, - { "areatrigger_involvedrelation",SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestAreaTriggersCommand, "", NULL }, - { "event_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadEventScriptsCommand, "", NULL }, - { "command", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCommandCommand, "", NULL }, - { "creature_involvedrelation", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCreatureQuestInvRelationsCommand,"",NULL }, - { "creature_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesCreatureCommand, "", NULL }, - { "creature_questrelation", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCreatureQuestRelationsCommand, "", NULL }, - { "disenchant_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesDisenchantCommand, "", NULL }, - { "fishing_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesFishingCommand, "", NULL }, - { "game_graveyard_zone", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGameGraveyardZoneCommand, "", NULL }, - { "game_tele", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGameTeleCommand, "", NULL }, - { "gameobject_involvedrelation", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGOQuestInvRelationsCommand, "", NULL }, - { "gameobject_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesGameobjectCommand, "", NULL }, - { "gameobject_questrelation", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGOQuestRelationsCommand, "", NULL }, - { "gameobject_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGameObjectScriptsCommand, "", NULL }, - { "item_enchantment_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL }, - { "item_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL }, - { "trinity_string", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadTrinityStringCommand, "", NULL }, - { "npc_gossip", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadNpcGossipCommand, "", NULL }, - { "npc_trainer", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadNpcTrainerCommand, "", NULL }, - { "npc_vendor", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadNpcVendorCommand, "", NULL }, - { "page_text", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadPageTextsCommand, "", NULL }, - { "pickpocketing_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesPickpocketingCommand,"",NULL}, - { "prospecting_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesProspectingCommand,"", NULL }, - { "quest_mail_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesQuestMailCommand, "", NULL }, - { "quest_end_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestEndScriptsCommand, "", NULL }, - { "quest_start_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestStartScriptsCommand, "", NULL }, - { "quest_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestTemplateCommand, "", NULL }, - { "reference_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesReferenceCommand, "", NULL }, - { "reserved_name", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadReservedNameCommand, "", NULL }, - { "skill_discovery_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSkillDiscoveryTemplateCommand, "", NULL }, - { "skill_extra_item_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSkillExtraItemTemplateCommand, "", NULL }, - { "skill_fishing_base_level", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSkillFishingBaseLevelCommand, "", NULL }, - { "skinning_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesSkinningCommand, "", NULL }, - { "spell_affect", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellAffectCommand, "", NULL }, - { "spell_chain", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellChainCommand, "", NULL }, - { "spell_elixir", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellElixirCommand, "", NULL }, - { "spell_learn_spell", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellLearnSpellCommand, "", NULL }, - { "spell_pet_auras", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellPetAurasCommand, "", NULL }, - { "spell_proc_event", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellProcEventCommand, "", NULL }, - { "spell_script_target", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellScriptTargetCommand, "", NULL }, - { "spell_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellScriptsCommand, "", NULL }, - { "spell_target_position", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellTargetPositionCommand, "", NULL }, - { "spell_threats", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellThreatsCommand, "", NULL }, - { "spell_disabled", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellDisabledCommand, "", NULL }, - { "locales_creature", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesCreatureCommand, "", NULL }, - { "locales_gameobject", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesGameobjectCommand, "", NULL }, - { "locales_item", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesItemCommand, "", NULL }, - { "locales_npc_text", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesNpcTextCommand, "", NULL }, - { "locales_page_text", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL }, - { "locales_quest", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL }, - { "", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "all", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllCommand, "", NULL }, + {"all_loot", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLootCommand, "", NULL }, + { "all_npc", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllNpcCommand, "", NULL }, + { "all_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllQuestCommand, "", NULL }, + { "all_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllScriptsCommand, "", NULL }, + { "all_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllSpellCommand, "", NULL }, + { "all_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllItemCommand, "", NULL }, + { "all_locales", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLocalesCommand, "", NULL }, + + { "config", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadConfigCommand, "", NULL }, + + { "areatrigger_tavern", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTavernCommand, "", NULL }, + { "areatrigger_teleport", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTeleportCommand, "", NULL }, + { "areatrigger_involvedrelation",SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestAreaTriggersCommand, "", NULL }, + { "event_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadEventScriptsCommand, "", NULL }, + { "command", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommandCommand, "", NULL }, + { "creature_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestInvRelationsCommand,"",NULL }, + { "creature_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesCreatureCommand, "", NULL }, + { "creature_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestRelationsCommand, "", NULL }, + { "disenchant_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesDisenchantCommand, "", NULL }, + { "fishing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesFishingCommand, "", NULL }, + { "game_graveyard_zone", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameGraveyardZoneCommand, "", NULL }, + { "game_tele", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameTeleCommand, "", NULL }, + { "gameobject_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestInvRelationsCommand, "", NULL }, + { "gameobject_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesGameobjectCommand, "", NULL }, + { "gameobject_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestRelationsCommand, "", NULL }, + { "gameobject_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameObjectScriptsCommand, "", NULL }, + { "item_enchantment_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL }, + { "item_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL }, + { "trinity_string", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadTrinityStringCommand, "", NULL }, + { "npc_gossip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcGossipCommand, "", NULL }, + { "npc_trainer", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcTrainerCommand, "", NULL }, + { "npc_vendor", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcVendorCommand, "", NULL }, + { "page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadPageTextsCommand, "", NULL }, + { "pickpocketing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesPickpocketingCommand,"",NULL}, + { "prospecting_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesProspectingCommand,"", NULL }, + { "quest_mail_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesQuestMailCommand, "", NULL }, + { "quest_end_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestEndScriptsCommand, "", NULL }, + { "quest_start_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestStartScriptsCommand, "", NULL }, + { "quest_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestTemplateCommand, "", NULL }, + { "reference_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesReferenceCommand, "", NULL }, + { "reserved_name", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadReservedNameCommand, "", NULL }, + { "skill_discovery_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillDiscoveryTemplateCommand, "", NULL }, + { "skill_extra_item_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillExtraItemTemplateCommand, "", NULL }, + { "skill_fishing_base_level", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillFishingBaseLevelCommand, "", NULL }, + { "skinning_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesSkinningCommand, "", NULL }, + { "spell_affect", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellAffectCommand, "", NULL }, + { "spell_chain", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellChainCommand, "", NULL }, + { "spell_elixir", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellElixirCommand, "", NULL }, + { "spell_learn_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellLearnSpellCommand, "", NULL }, + { "spell_pet_auras", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellPetAurasCommand, "", NULL }, + { "spell_proc_event", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellProcEventCommand, "", NULL }, + { "spell_script_target", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptTargetCommand, "", NULL }, + { "spell_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptsCommand, "", NULL }, + { "spell_target_position", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellTargetPositionCommand, "", NULL }, + { "spell_threats", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellThreatsCommand, "", NULL }, + { "locales_creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesCreatureCommand, "", NULL }, + { "locales_gameobject", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesGameobjectCommand, "", NULL }, + { "locales_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesItemCommand, "", NULL }, + { "locales_npc_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesNpcTextCommand, "", NULL }, + { "locales_page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL }, + { "locales_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL }, + + { "", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand honorCommandTable[] = { - { "add", SEC_GAMEMASTER, &ChatHandler::HandleAddHonorCommand, "", NULL }, - { "addkill", SEC_GAMEMASTER, &ChatHandler::HandleHonorAddKillCommand, "", NULL }, - { "update", SEC_GAMEMASTER, &ChatHandler::HandleUpdateHonorFieldsCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleAddHonorCommand, "", NULL }, + { "addkill", SEC_GAMEMASTER, false, &ChatHandler::HandleHonorAddKillCommand, "", NULL }, + { "update", SEC_GAMEMASTER, false, &ChatHandler::HandleUpdateHonorFieldsCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand guildCommandTable[] = { - { "create", SEC_GAMEMASTER, &ChatHandler::HandleGuildCreateCommand, "", NULL }, - { "delete", SEC_GAMEMASTER, &ChatHandler::HandleGuildDeleteCommand, "", NULL }, - { "invite", SEC_GAMEMASTER, &ChatHandler::HandleGuildInviteCommand, "", NULL }, - { "uninvite", SEC_GAMEMASTER, &ChatHandler::HandleGuildUninviteCommand, "", NULL }, - { "rank", SEC_GAMEMASTER, &ChatHandler::HandleGuildRankCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "create", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildCreateCommand, "", NULL }, + { "delete", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildDeleteCommand, "", NULL }, + { "invite", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildInviteCommand, "", NULL }, + { "uninvite", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildUninviteCommand, "", NULL }, + { "rank", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildRankCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand groupCommandTable[] = { - { "leader", SEC_ADMINISTRATOR, &ChatHandler::HandleGroupLeaderCommand, "", NULL }, - { "disband", SEC_ADMINISTRATOR, &ChatHandler::HandleGroupDisbandCommand, "", NULL }, - { "remove", SEC_ADMINISTRATOR, &ChatHandler::HandleGroupRemoveCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "leader", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGroupLeaderCommand, "", NULL }, + { "disband", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGroupDisbandCommand, "", NULL }, + { "remove", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGroupRemoveCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand lookupPlayerCommandTable[] = { - { "ip", SEC_GAMEMASTER, &ChatHandler::HandleLookupPlayerIpCommand, "", NULL }, - { "account", SEC_GAMEMASTER, &ChatHandler::HandleLookupPlayerAccountCommand, "", NULL }, - { "email", SEC_GAMEMASTER, &ChatHandler::HandleLookupPlayerEmailCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "ip", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerIpCommand, "", NULL }, + { "account", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerAccountCommand, "", NULL }, + { "email", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerEmailCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand lookupCommandTable[] = { - { "area", SEC_MODERATOR, &ChatHandler::HandleLookupAreaCommand, "", NULL }, - { "creature", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupCreatureCommand, "", NULL }, - { "event", SEC_GAMEMASTER, &ChatHandler::HandleLookupEventCommand, "", NULL }, - { "faction", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupFactionCommand, "", NULL }, - { "item", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupItemCommand, "", NULL }, - { "itemset", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupItemSetCommand, "", NULL }, - { "object", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupObjectCommand, "", NULL }, - { "quest", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupQuestCommand, "", NULL }, - { "player", SEC_GAMEMASTER, NULL, "", lookupPlayerCommandTable }, - { "skill", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupSkillCommand, "", NULL }, - { "spell", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupSpellCommand, "", NULL }, - { "tele", SEC_MODERATOR, &ChatHandler::HandleLookupTeleCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "area", SEC_MODERATOR, true, &ChatHandler::HandleLookupAreaCommand, "", NULL }, + { "creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupCreatureCommand, "", NULL }, + { "event", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupEventCommand, "", NULL }, + { "faction", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupFactionCommand, "", NULL }, + { "item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupItemCommand, "", NULL }, + { "itemset", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupItemSetCommand, "", NULL }, + { "object", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupObjectCommand, "", NULL }, + { "quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupQuestCommand, "", NULL }, + { "player", SEC_GAMEMASTER, true, NULL, "", lookupPlayerCommandTable }, + { "skill", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupSkillCommand, "", NULL }, + { "spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupSpellCommand, "", NULL }, + { "tele", SEC_MODERATOR, true, &ChatHandler::HandleLookupTeleCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand resetCommandTable[] = { - { "honor", SEC_ADMINISTRATOR, &ChatHandler::HandleResetHonorCommand, "", NULL }, - { "level", SEC_ADMINISTRATOR, &ChatHandler::HandleResetLevelCommand, "", NULL }, - { "spells", SEC_ADMINISTRATOR, &ChatHandler::HandleResetSpellsCommand, "", NULL }, - { "stats", SEC_ADMINISTRATOR, &ChatHandler::HandleResetStatsCommand, "", NULL }, - { "talents", SEC_ADMINISTRATOR, &ChatHandler::HandleResetTalentsCommand, "", NULL }, - { "all", SEC_ADMINISTRATOR, &ChatHandler::HandleResetAllCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "honor", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetHonorCommand, "", NULL }, + { "level", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetLevelCommand, "", NULL }, + { "spells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetSpellsCommand, "", NULL }, + { "stats", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetStatsCommand, "", NULL }, + { "talents", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetTalentsCommand, "", NULL }, + { "all", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetAllCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand castCommandTable[] = { - { "back", SEC_ADMINISTRATOR, &ChatHandler::HandleCastBackCommand, "", NULL }, - { "dist", SEC_ADMINISTRATOR, &ChatHandler::HandleCastDistCommand, "", NULL }, - { "self", SEC_ADMINISTRATOR, &ChatHandler::HandleCastSelfCommand, "", NULL }, - { "target", SEC_ADMINISTRATOR, &ChatHandler::HandleCastTargetCommand, "", NULL }, - { "", SEC_ADMINISTRATOR, &ChatHandler::HandleCastCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "back", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastBackCommand, "", NULL }, + { "dist", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastDistCommand, "", NULL }, + { "self", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastSelfCommand, "", NULL }, + { "target", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastTargetCommand, "", NULL }, + { "", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand pdumpCommandTable[] = { - { "load", SEC_ADMINISTRATOR, &ChatHandler::HandleLoadPDumpCommand, "", NULL }, - { "write", SEC_ADMINISTRATOR, &ChatHandler::HandleWritePDumpCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "load", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLoadPDumpCommand, "", NULL }, + { "write", SEC_ADMINISTRATOR, true, &ChatHandler::HandleWritePDumpCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand listCommandTable[] = { - { "creature", SEC_ADMINISTRATOR, &ChatHandler::HandleListCreatureCommand, "", NULL }, - { "item", SEC_ADMINISTRATOR, &ChatHandler::HandleListItemCommand, "", NULL }, - { "object", SEC_ADMINISTRATOR, &ChatHandler::HandleListObjectCommand, "", NULL }, - { "auras", SEC_ADMINISTRATOR, &ChatHandler::HandleListAurasCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListCreatureCommand, "", NULL }, + { "item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListItemCommand, "", NULL }, + { "object", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListObjectCommand, "", NULL }, + { "auras", SEC_ADMINISTRATOR, false, &ChatHandler::HandleListAurasCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand teleCommandTable[] = { - { "add", SEC_ADMINISTRATOR, &ChatHandler::HandleAddTeleCommand, "", NULL }, - { "del", SEC_ADMINISTRATOR, &ChatHandler::HandleDelTeleCommand, "", NULL }, - { "name", SEC_MODERATOR, &ChatHandler::HandleNameTeleCommand, "", NULL }, - { "group", SEC_MODERATOR, &ChatHandler::HandleGroupTeleCommand, "", NULL }, - { "", SEC_MODERATOR, &ChatHandler::HandleTeleCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "add", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddTeleCommand, "", NULL }, + { "del", SEC_ADMINISTRATOR, true, &ChatHandler::HandleDelTeleCommand, "", NULL }, + { "name", SEC_MODERATOR, true, &ChatHandler::HandleNameTeleCommand, "", NULL }, + { "group", SEC_MODERATOR, false, &ChatHandler::HandleGroupTeleCommand, "", NULL }, + { "", SEC_MODERATOR, false, &ChatHandler::HandleTeleCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand npcCommandTable[] = { - { "say", SEC_MODERATOR, &ChatHandler::HandleSayCommand, "", NULL }, - { "whisper", SEC_MODERATOR, &ChatHandler::HandleNpcWhisperCommand, "", NULL }, - { "yell", SEC_MODERATOR, &ChatHandler::HandleYellCommand, "", NULL }, - { "textemote", SEC_MODERATOR, &ChatHandler::HandleTextEmoteCommand, "", NULL }, - { "add", SEC_GAMEMASTER, &ChatHandler::HandleAddSpwCommand, "", NULL }, - { "delete", SEC_GAMEMASTER, &ChatHandler::HandleDelCreatureCommand, "", NULL }, - { "spawndist", SEC_GAMEMASTER, &ChatHandler::HandleSpawnDistCommand, "", NULL }, - { "spawntime", SEC_GAMEMASTER, &ChatHandler::HandleSpawnTimeCommand, "", NULL }, - { "factionid", SEC_GAMEMASTER, &ChatHandler::HandleFactionIdCommand, "", NULL }, - { "addmove", SEC_GAMEMASTER, &ChatHandler::HandleAddMoveCommand, "", NULL }, - { "setmovetype", SEC_GAMEMASTER, &ChatHandler::HandleSetMoveTypeCommand, "", NULL }, - { "move", SEC_GAMEMASTER, &ChatHandler::HandleMoveCreatureCommand, "", NULL }, - { "changelevel", SEC_GAMEMASTER, &ChatHandler::HandleChangeLevelCommand, "", NULL }, - { "setmodel", SEC_GAMEMASTER, &ChatHandler::HandleSetModelCommand, "", NULL }, - { "additem", SEC_GAMEMASTER, &ChatHandler::HandleAddVendorItemCommand, "", NULL }, - { "delitem", SEC_GAMEMASTER, &ChatHandler::HandleDelVendorItemCommand, "", NULL }, - { "flag", SEC_GAMEMASTER, &ChatHandler::HandleNPCFlagCommand, "", NULL }, - { "changeentry", SEC_ADMINISTRATOR, &ChatHandler::HandleChangeEntryCommand, "", NULL }, - { "info", SEC_ADMINISTRATOR, &ChatHandler::HandleNpcInfoCommand, "", NULL }, - { "playemote", SEC_ADMINISTRATOR, &ChatHandler::HandlePlayEmoteCommand, "", NULL }, + { "say", SEC_MODERATOR, false, &ChatHandler::HandleSayCommand, "", NULL }, + { "whisper", SEC_MODERATOR, false, &ChatHandler::HandleNpcWhisperCommand, "", NULL }, + { "yell", SEC_MODERATOR, false, &ChatHandler::HandleYellCommand, "", NULL }, + { "textemote", SEC_MODERATOR, false, &ChatHandler::HandleTextEmoteCommand, "", NULL }, + { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleAddSpwCommand, "", NULL }, + { "delete", SEC_GAMEMASTER, false, &ChatHandler::HandleDelCreatureCommand, "", NULL }, + { "spawndist", SEC_GAMEMASTER, false, &ChatHandler::HandleSpawnDistCommand, "", NULL }, + { "spawntime", SEC_GAMEMASTER, false, &ChatHandler::HandleSpawnTimeCommand, "", NULL }, + { "factionid", SEC_GAMEMASTER, false, &ChatHandler::HandleFactionIdCommand, "", NULL }, + { "addmove", SEC_GAMEMASTER, false, &ChatHandler::HandleAddMoveCommand, "", NULL }, + { "setmovetype", SEC_GAMEMASTER, false, &ChatHandler::HandleSetMoveTypeCommand, "", NULL }, + { "move", SEC_GAMEMASTER, false, &ChatHandler::HandleMoveCreatureCommand, "", NULL }, + { "changelevel", SEC_GAMEMASTER, false, &ChatHandler::HandleChangeLevelCommand, "", NULL }, + { "setmodel", SEC_GAMEMASTER, false, &ChatHandler::HandleSetModelCommand, "", NULL }, + { "additem", SEC_GAMEMASTER, false, &ChatHandler::HandleAddVendorItemCommand, "", NULL }, + { "delitem", SEC_GAMEMASTER, false, &ChatHandler::HandleDelVendorItemCommand, "", NULL }, + { "flag", SEC_GAMEMASTER, false, &ChatHandler::HandleNPCFlagCommand, "", NULL }, + { "changeentry", SEC_ADMINISTRATOR, false, &ChatHandler::HandleChangeEntryCommand, "", NULL }, + { "info", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcInfoCommand, "", NULL }, + { "playemote", SEC_ADMINISTRATOR, false, &ChatHandler::HandlePlayEmoteCommand, "", NULL }, //{ TODO: fix or remove this commands - { "name", SEC_GAMEMASTER, &ChatHandler::HandleNameCommand, "", NULL }, - { "subname", SEC_GAMEMASTER, &ChatHandler::HandleSubNameCommand, "", NULL }, - { "addweapon", SEC_ADMINISTRATOR, &ChatHandler::HandleAddWeaponCommand, "", NULL }, + { "name", SEC_GAMEMASTER, false, &ChatHandler::HandleNameCommand, "", NULL }, + { "subname", SEC_GAMEMASTER, false, &ChatHandler::HandleSubNameCommand, "", NULL }, + { "addweapon", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddWeaponCommand, "", NULL }, //} - { NULL, 0, NULL, "", NULL } + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand goCommandTable[] = { - { "grid", SEC_MODERATOR, &ChatHandler::HandleGoGridCommand, "", NULL }, - { "creature", SEC_GAMEMASTER, &ChatHandler::HandleGoCreatureCommand, "", NULL }, - { "object", SEC_GAMEMASTER, &ChatHandler::HandleGoObjectCommand, "", NULL }, - { "trigger", SEC_GAMEMASTER, &ChatHandler::HandleGoTriggerCommand, "", NULL }, - { "graveyard", SEC_GAMEMASTER, &ChatHandler::HandleGoGraveyardCommand, "", NULL }, - { "zonexy", SEC_MODERATOR, &ChatHandler::HandleGoZoneXYCommand, "", NULL }, - { "xy", SEC_MODERATOR, &ChatHandler::HandleGoXYCommand, "", NULL }, - { "xyz", SEC_MODERATOR, &ChatHandler::HandleGoXYZCommand, "", NULL }, - { "", SEC_MODERATOR, &ChatHandler::HandleGoXYZCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "grid", SEC_MODERATOR, false, &ChatHandler::HandleGoGridCommand, "", NULL }, + { "creature", SEC_GAMEMASTER, false, &ChatHandler::HandleGoCreatureCommand, "", NULL }, + { "object", SEC_GAMEMASTER, false, &ChatHandler::HandleGoObjectCommand, "", NULL }, + { "trigger", SEC_GAMEMASTER, false, &ChatHandler::HandleGoTriggerCommand, "", NULL }, + { "graveyard", SEC_GAMEMASTER, false, &ChatHandler::HandleGoGraveyardCommand, "", NULL }, + { "zonexy", SEC_MODERATOR, false, &ChatHandler::HandleGoZoneXYCommand, "", NULL }, + { "xy", SEC_MODERATOR, false, &ChatHandler::HandleGoXYCommand, "", NULL }, + { "xyz", SEC_MODERATOR, false, &ChatHandler::HandleGoXYZCommand, "", NULL }, + { "", SEC_MODERATOR, false, &ChatHandler::HandleGoXYZCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand gobjectCommandTable[] = { - { "add", SEC_GAMEMASTER, &ChatHandler::HandleGameObjectCommand, "", NULL }, - { "delete", SEC_GAMEMASTER, &ChatHandler::HandleDelObjectCommand, "", NULL }, - { "target", SEC_GAMEMASTER, &ChatHandler::HandleTargetObjectCommand, "", NULL }, - { "turn", SEC_GAMEMASTER, &ChatHandler::HandleTurnObjectCommand, "", NULL }, - { "move", SEC_GAMEMASTER, &ChatHandler::HandleMoveObjectCommand, "", NULL }, - { "near", SEC_ADMINISTRATOR, &ChatHandler::HandleNearObjectCommand, "", NULL }, - { "state", SEC_ADMINISTRATOR, &ChatHandler::HandleObjectStateCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectCommand, "", NULL }, + { "delete", SEC_GAMEMASTER, false, &ChatHandler::HandleDelObjectCommand, "", NULL }, + { "target", SEC_GAMEMASTER, false, &ChatHandler::HandleTargetObjectCommand, "", NULL }, + { "turn", SEC_GAMEMASTER, false, &ChatHandler::HandleTurnObjectCommand, "", NULL }, + { "move", SEC_GAMEMASTER, false, &ChatHandler::HandleMoveObjectCommand, "", NULL }, + { "near", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNearObjectCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand questCommandTable[] = { - { "add", SEC_ADMINISTRATOR, &ChatHandler::HandleAddQuest, "", NULL }, - { "complete", SEC_ADMINISTRATOR, &ChatHandler::HandleCompleteQuest, "", NULL }, - { "remove", SEC_ADMINISTRATOR, &ChatHandler::HandleRemoveQuest, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "add", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddQuest, "", NULL }, + { "complete", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCompleteQuest, "", NULL }, + { "remove", SEC_ADMINISTRATOR, false, &ChatHandler::HandleRemoveQuest, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand gmCommandTable[] = { - { "chat", SEC_MODERATOR, &ChatHandler::HandleGMChatCommand, "", NULL }, - { "list", SEC_PLAYER, &ChatHandler::HandleGMListCommand, "", NULL }, - { "visible", SEC_MODERATOR, &ChatHandler::HandleVisibleCommand, "", NULL }, - { "fly", SEC_ADMINISTRATOR, &ChatHandler::HandleFlyModeCommand, "", NULL }, - { "", SEC_MODERATOR, &ChatHandler::HandleGMmodeCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "chat", SEC_MODERATOR, false, &ChatHandler::HandleGMChatCommand, "", NULL }, + { "ingame", SEC_PLAYER, true, &ChatHandler::HandleGMListIngameCommand, "", NULL }, + { "list", SEC_ADMINISTRATOR, true, &ChatHandler::HandleGMListFullCommand, "", NULL }, + { "visible", SEC_MODERATOR, false, &ChatHandler::HandleVisibleCommand, "", NULL }, + { "fly", SEC_ADMINISTRATOR, false, &ChatHandler::HandleFlyModeCommand, "", NULL }, + { "", SEC_MODERATOR, false, &ChatHandler::HandleGMmodeCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand instanceCommandTable[] = { - { "listbinds", SEC_MODERATOR, &ChatHandler::HandleInstanceListBindsCommand, "", NULL }, - { "unbind", SEC_MODERATOR, &ChatHandler::HandleInstanceUnbindCommand, "", NULL }, - { "stats", SEC_MODERATOR, &ChatHandler::HandleInstanceStatsCommand, "", NULL }, - { "savedata", SEC_MODERATOR, &ChatHandler::HandleInstanceSaveDataCommand, "", NULL }, - { NULL, 0, NULL, "", NULL } + { "listbinds", SEC_MODERATOR, false, &ChatHandler::HandleInstanceListBindsCommand, "", NULL }, + { "unbind", SEC_MODERATOR, false, &ChatHandler::HandleInstanceUnbindCommand, "", NULL }, + { "stats", SEC_MODERATOR, true, &ChatHandler::HandleInstanceStatsCommand, "", NULL }, + { "savedata", SEC_MODERATOR, false, &ChatHandler::HandleInstanceSaveDataCommand, "", NULL }, + { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = { - { "gm", SEC_MODERATOR, NULL, "", gmCommandTable }, - { "npc", SEC_MODERATOR, NULL, "", npcCommandTable }, - { "go", SEC_MODERATOR, NULL, "", goCommandTable }, - { "learn", SEC_MODERATOR, NULL, "", learnCommandTable }, - { "modify", SEC_MODERATOR, NULL, "", modifyCommandTable }, - { "debug", SEC_MODERATOR, NULL, "", debugCommandTable }, - { "tele", SEC_MODERATOR, NULL, "", teleCommandTable }, - { "event", SEC_GAMEMASTER, NULL, "", eventCommandTable }, - { "gobject", SEC_GAMEMASTER, NULL, "", gobjectCommandTable }, - { "honor", SEC_GAMEMASTER, NULL, "", honorCommandTable }, - { "wp", SEC_GAMEMASTER, NULL, "", wpCommandTable }, - { "quest", SEC_ADMINISTRATOR, NULL, "", questCommandTable }, - { "reload", SEC_ADMINISTRATOR, NULL, "", reloadCommandTable }, - { "list", SEC_ADMINISTRATOR, NULL, "", listCommandTable }, - { "lookup", SEC_ADMINISTRATOR, NULL, "", lookupCommandTable }, - { "pdump", SEC_ADMINISTRATOR, NULL, "", pdumpCommandTable }, - { "group", SEC_ADMINISTRATOR, NULL, "", groupCommandTable }, - { "guild", SEC_ADMINISTRATOR, NULL, "", guildCommandTable }, - { "cast", SEC_ADMINISTRATOR, NULL, "", castCommandTable }, - { "reset", SEC_ADMINISTRATOR, NULL, "", resetCommandTable }, - { "instance", SEC_ADMINISTRATOR, NULL, "", instanceCommandTable }, - { "server", SEC_ADMINISTRATOR, NULL, "", serverCommandTable }, - - { "aura", SEC_ADMINISTRATOR, &ChatHandler::HandleAuraCommand, "", NULL }, - { "unaura", SEC_ADMINISTRATOR, &ChatHandler::HandleUnAuraCommand, "", NULL }, - { "acct", SEC_PLAYER, &ChatHandler::HandleAcctCommand, "", NULL }, - { "nameannounce", SEC_MODERATOR, &ChatHandler::HandleNameAnnounceCommand, "", NULL }, - { "announce", SEC_ADMINISTRATOR, &ChatHandler::HandleAnnounceCommand, "", NULL }, - { "notify", SEC_MODERATOR, &ChatHandler::HandleNotifyCommand, "", NULL }, - { "goname", SEC_MODERATOR, &ChatHandler::HandleGonameCommand, "", NULL }, - { "namego", SEC_MODERATOR, &ChatHandler::HandleNamegoCommand, "", NULL }, - { "groupgo", SEC_MODERATOR, &ChatHandler::HandleGroupgoCommand, "", NULL }, - { "commands", SEC_PLAYER, &ChatHandler::HandleCommandsCommand, "", NULL }, - { "demorph", SEC_GAMEMASTER, &ChatHandler::HandleDeMorphCommand, "", NULL }, - { "die", SEC_ADMINISTRATOR, &ChatHandler::HandleDieCommand, "", NULL }, - { "revive", SEC_ADMINISTRATOR, &ChatHandler::HandleReviveCommand, "", NULL }, - { "dismount", SEC_PLAYER, &ChatHandler::HandleDismountCommand, "", NULL }, - { "gps", SEC_MODERATOR, &ChatHandler::HandleGPSCommand, "", NULL }, - { "guid", SEC_GAMEMASTER, &ChatHandler::HandleGUIDCommand, "", NULL }, - { "help", SEC_PLAYER, &ChatHandler::HandleHelpCommand, "", NULL }, - { "itemmove", SEC_GAMEMASTER, &ChatHandler::HandleItemMoveCommand, "", NULL }, - { "cooldown", SEC_ADMINISTRATOR, &ChatHandler::HandleCooldownCommand, "", NULL }, - { "unlearn", SEC_ADMINISTRATOR, &ChatHandler::HandleUnLearnCommand, "", NULL }, - { "distance", SEC_ADMINISTRATOR, &ChatHandler::HandleGetDistanceCommand, "", NULL }, - { "recall", SEC_MODERATOR, &ChatHandler::HandleRecallCommand, "", NULL }, - { "save", SEC_PLAYER, &ChatHandler::HandleSaveCommand, "", NULL }, - { "saveall", SEC_MODERATOR, &ChatHandler::HandleSaveAllCommand, "", NULL }, - { "kick", SEC_GAMEMASTER, &ChatHandler::HandleKickPlayerCommand, "", NULL }, - { "security", SEC_ADMINISTRATOR, &ChatHandler::HandleSecurityCommand, "", NULL }, - { "ban", SEC_ADMINISTRATOR, &ChatHandler::HandleBanCommand, "", NULL }, - { "unban", SEC_ADMINISTRATOR, &ChatHandler::HandleUnBanCommand, "", NULL }, - { "baninfo", SEC_ADMINISTRATOR, &ChatHandler::HandleBanInfoCommand, "", NULL }, - { "banlist", SEC_ADMINISTRATOR, &ChatHandler::HandleBanListCommand, "", NULL }, - { "plimit", SEC_ADMINISTRATOR, &ChatHandler::HandlePLimitCommand, "", NULL }, - { "start", SEC_PLAYER, &ChatHandler::HandleStartCommand, "", NULL }, - { "taxicheat", SEC_MODERATOR, &ChatHandler::HandleTaxiCheatCommand, "", NULL }, - { "allowmove", SEC_ADMINISTRATOR, &ChatHandler::HandleAllowMovementCommand, "", NULL }, - { "linkgrave", SEC_ADMINISTRATOR, &ChatHandler::HandleLinkGraveCommand, "", NULL }, - { "neargrave", SEC_ADMINISTRATOR, &ChatHandler::HandleNearGraveCommand, "", NULL }, - { "transport", SEC_ADMINISTRATOR, &ChatHandler::HandleSpawnTransportCommand, "", NULL }, - { "explorecheat", SEC_ADMINISTRATOR, &ChatHandler::HandleExploreCheatCommand, "", NULL }, - { "hover", SEC_ADMINISTRATOR, &ChatHandler::HandleHoverCommand, "", NULL }, - { "levelup", SEC_ADMINISTRATOR, &ChatHandler::HandleLevelUpCommand, "", NULL }, - { "showarea", SEC_ADMINISTRATOR, &ChatHandler::HandleShowAreaCommand, "", NULL }, - { "hidearea", SEC_ADMINISTRATOR, &ChatHandler::HandleHideAreaCommand, "", NULL }, - { "additem", SEC_ADMINISTRATOR, &ChatHandler::HandleAddItemCommand, "", NULL }, - { "additemset", SEC_ADMINISTRATOR, &ChatHandler::HandleAddItemSetCommand, "", NULL }, - { "bank", SEC_ADMINISTRATOR, &ChatHandler::HandleBankCommand, "", NULL }, - { "wchange", SEC_ADMINISTRATOR, &ChatHandler::HandleChangeWeather, "", NULL }, - { "ticket", SEC_GAMEMASTER, &ChatHandler::HandleTicketCommand, "", NULL }, - { "delticket", SEC_GAMEMASTER, &ChatHandler::HandleDelTicketCommand, "", NULL }, - { "maxskill", SEC_ADMINISTRATOR, &ChatHandler::HandleMaxSkillCommand, "", NULL }, - { "setskill", SEC_ADMINISTRATOR, &ChatHandler::HandleSetSkillCommand, "", NULL }, - { "whispers", SEC_MODERATOR, &ChatHandler::HandleWhispersCommand, "", NULL }, - { "pinfo", SEC_GAMEMASTER, &ChatHandler::HandlePInfoCommand, "", NULL }, - { "password", SEC_PLAYER, &ChatHandler::HandlePasswordCommand, "", NULL }, - { "lockaccount", SEC_PLAYER, &ChatHandler::HandleLockAccountCommand, "", NULL }, - { "respawn", SEC_ADMINISTRATOR, &ChatHandler::HandleRespawnCommand, "", NULL }, - { "sendmail", SEC_MODERATOR, &ChatHandler::HandleSendMailCommand, "", NULL }, - { "rename", SEC_GAMEMASTER, &ChatHandler::HandleRenameCommand, "", NULL }, - { "loadscripts", SEC_ADMINISTRATOR, &ChatHandler::HandleLoadScriptsCommand, "", NULL }, - { "mute", SEC_GAMEMASTER, &ChatHandler::HandleMuteCommand, "", NULL }, - { "unmute", SEC_GAMEMASTER, &ChatHandler::HandleUnmuteCommand, "", NULL }, - { "movegens", SEC_ADMINISTRATOR, &ChatHandler::HandleMovegensCommand, "", NULL }, - { "cometome", SEC_ADMINISTRATOR, &ChatHandler::HandleComeToMeCommand, "", NULL }, - { "damage", SEC_ADMINISTRATOR, &ChatHandler::HandleDamageCommand, "", NULL }, - { "combatstop", SEC_GAMEMASTER, &ChatHandler::HandleCombatStopCommand, "", NULL }, - { "freeze", SEC_ADMINISTRATOR, &ChatHandler::HandleFreezeCommand, "", NULL }, - { "unfreeze", SEC_ADMINISTRATOR, &ChatHandler::HandleUnFreezeCommand, "", NULL }, - { "listfreeze", SEC_ADMINISTRATOR, &ChatHandler::HandleListFreezeCommand, "", NULL }, - { "flusharenapoints", SEC_ADMINISTRATOR, &ChatHandler::HandleFlushArenaPointsCommand, "", NULL }, - - { NULL, 0, NULL, "", NULL } + { "account", SEC_PLAYER, true, NULL, "", accountCommandTable }, + { "gm", SEC_MODERATOR, true, NULL, "", gmCommandTable }, + { "npc", SEC_MODERATOR, false, NULL, "", npcCommandTable }, + { "go", SEC_MODERATOR, false, NULL, "", goCommandTable }, + { "learn", SEC_MODERATOR, false, NULL, "", learnCommandTable }, + { "modify", SEC_MODERATOR, false, NULL, "", modifyCommandTable }, + { "debug", SEC_MODERATOR, false, NULL, "", debugCommandTable }, + { "tele", SEC_MODERATOR, true, NULL, "", teleCommandTable }, + { "event", SEC_GAMEMASTER, false, NULL, "", eventCommandTable }, + { "gobject", SEC_GAMEMASTER, false, NULL, "", gobjectCommandTable }, + { "honor", SEC_GAMEMASTER, false, NULL, "", honorCommandTable }, + { "wp", SEC_GAMEMASTER, false, NULL, "", wpCommandTable }, + { "quest", SEC_ADMINISTRATOR, false, NULL, "", questCommandTable }, + { "reload", SEC_ADMINISTRATOR, true, NULL, "", reloadCommandTable }, + { "list", SEC_ADMINISTRATOR, true, NULL, "", listCommandTable }, + { "lookup", SEC_ADMINISTRATOR, true, NULL, "", lookupCommandTable }, + { "pdump", SEC_ADMINISTRATOR, true, NULL, "", pdumpCommandTable }, + { "guild", SEC_ADMINISTRATOR, true, NULL, "", guildCommandTable }, + { "cast", SEC_ADMINISTRATOR, false, NULL, "", castCommandTable }, + { "reset", SEC_ADMINISTRATOR, false, NULL, "", resetCommandTable }, + { "instance", SEC_ADMINISTRATOR, true, NULL, "", instanceCommandTable }, + { "server", SEC_ADMINISTRATOR, true, NULL, "", serverCommandTable }, + + { "aura", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAuraCommand, "", NULL }, + { "unaura", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnAuraCommand, "", NULL }, + { "announce", SEC_MODERATOR, true, &ChatHandler::HandleAnnounceCommand, "", NULL }, + { "notify", SEC_MODERATOR, true, &ChatHandler::HandleNotifyCommand, "", NULL }, + { "goname", SEC_MODERATOR, false, &ChatHandler::HandleGonameCommand, "", NULL }, + { "namego", SEC_MODERATOR, false, &ChatHandler::HandleNamegoCommand, "", NULL }, + { "groupgo", SEC_MODERATOR, false, &ChatHandler::HandleGroupgoCommand, "", NULL }, + { "commands", SEC_PLAYER, true, &ChatHandler::HandleCommandsCommand, "", NULL }, + { "demorph", SEC_GAMEMASTER, false, &ChatHandler::HandleDeMorphCommand, "", NULL }, + { "die", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDieCommand, "", NULL }, + { "revive", SEC_ADMINISTRATOR, false, &ChatHandler::HandleReviveCommand, "", NULL }, + { "dismount", SEC_PLAYER, false, &ChatHandler::HandleDismountCommand, "", NULL }, + { "gps", SEC_MODERATOR, false, &ChatHandler::HandleGPSCommand, "", NULL }, + { "guid", SEC_GAMEMASTER, false, &ChatHandler::HandleGUIDCommand, "", NULL }, + { "help", SEC_PLAYER, true, &ChatHandler::HandleHelpCommand, "", NULL }, + { "itemmove", SEC_GAMEMASTER, false, &ChatHandler::HandleItemMoveCommand, "", NULL }, + { "cooldown", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCooldownCommand, "", NULL }, + { "unlearn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnLearnCommand, "", NULL }, + { "distance", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGetDistanceCommand, "", NULL }, + { "recall", SEC_MODERATOR, false, &ChatHandler::HandleRecallCommand, "", NULL }, + { "save", SEC_PLAYER, false, &ChatHandler::HandleSaveCommand, "", NULL }, + { "saveall", SEC_MODERATOR, true, &ChatHandler::HandleSaveAllCommand, "", NULL }, + { "kick", SEC_GAMEMASTER, true, &ChatHandler::HandleKickPlayerCommand, "", NULL }, + { "ban", SEC_ADMINISTRATOR, true, NULL, "", banCommandTable }, + { "unban", SEC_ADMINISTRATOR, true, NULL, "", unbanCommandTable }, + { "baninfo", SEC_ADMINISTRATOR, false, NULL, "", baninfoCommandTable }, + { "banlist", SEC_ADMINISTRATOR, true, NULL, "", banlistCommandTable }, + { "plimit", SEC_ADMINISTRATOR, true, &ChatHandler::HandlePLimitCommand, "", NULL }, + { "start", SEC_PLAYER, false, &ChatHandler::HandleStartCommand, "", NULL }, + { "taxicheat", SEC_MODERATOR, false, &ChatHandler::HandleTaxiCheatCommand, "", NULL }, + { "allowmove", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAllowMovementCommand, "", NULL }, + { "linkgrave", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLinkGraveCommand, "", NULL }, + { "neargrave", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNearGraveCommand, "", NULL }, + { "explorecheat", SEC_ADMINISTRATOR, false, &ChatHandler::HandleExploreCheatCommand, "", NULL }, + { "hover", SEC_ADMINISTRATOR, false, &ChatHandler::HandleHoverCommand, "", NULL }, + { "levelup", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLevelUpCommand, "", NULL }, + { "showarea", SEC_ADMINISTRATOR, false, &ChatHandler::HandleShowAreaCommand, "", NULL }, + { "hidearea", SEC_ADMINISTRATOR, false, &ChatHandler::HandleHideAreaCommand, "", NULL }, + { "additem", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddItemCommand, "", NULL }, + { "additemset", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddItemSetCommand, "", NULL }, + { "bank", SEC_ADMINISTRATOR, false, &ChatHandler::HandleBankCommand, "", NULL }, + { "wchange", SEC_ADMINISTRATOR, false, &ChatHandler::HandleChangeWeather, "", NULL }, + { "ticket", SEC_GAMEMASTER, true, &ChatHandler::HandleTicketCommand, "", NULL }, + { "delticket", SEC_GAMEMASTER, true, &ChatHandler::HandleDelTicketCommand, "", NULL }, + { "maxskill", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMaxSkillCommand, "", NULL }, + { "setskill", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSetSkillCommand, "", NULL }, + { "whispers", SEC_MODERATOR, false, &ChatHandler::HandleWhispersCommand, "", NULL }, + { "pinfo", SEC_GAMEMASTER, true, &ChatHandler::HandlePInfoCommand, "", NULL }, + { "password", SEC_PLAYER, false, &ChatHandler::HandlePasswordCommand, "", NULL }, + { "lockaccount", SEC_PLAYER, false, &ChatHandler::HandleLockAccountCommand, "", NULL }, + { "respawn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleRespawnCommand, "", NULL }, + { "sendmail", SEC_MODERATOR, false, &ChatHandler::HandleSendMailCommand, "", NULL }, + { "rename", SEC_GAMEMASTER, true, &ChatHandler::HandleRenameCommand, "", NULL }, + { "loadscripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLoadScriptsCommand, "", NULL }, + { "mute", SEC_GAMEMASTER, true, &ChatHandler::HandleMuteCommand, "", NULL }, + { "unmute", SEC_GAMEMASTER, true, &ChatHandler::HandleUnmuteCommand, "", NULL }, + { "movegens", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMovegensCommand, "", NULL }, + { "cometome", SEC_ADMINISTRATOR, false, &ChatHandler::HandleComeToMeCommand, "", NULL }, + { "damage", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDamageCommand, "", NULL }, + { "combatstop", SEC_GAMEMASTER, false, &ChatHandler::HandleCombatStopCommand, "", NULL }, + { "chardelete", SEC_CONSOLE, true, &ChatHandler::HandleCombatStopCommand, "", NULL }, + { "sendmessage", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendMessageCommand, "", NULL }, + + { NULL, 0, false, NULL, "", NULL } }; if(load_command_table) @@ -529,11 +581,17 @@ ChatCommand * ChatHandler::getCommandTable() return commandTable; } -const char *ChatHandler::GetTrinityString(int32 entry) +const char *ChatHandler::GetTrinityString(int32 entry) const { return m_session->GetTrinityString(entry); } +bool ChatHandler::isAvailable(ChatCommand const& cmd) const +{ + // check security level only for simple command (without child commands) + return m_session->GetSecurity() >= cmd.SecurityLevel; +} + bool ChatHandler::hasStringAbbr(const char* name, const char* part) { // non "" command @@ -578,6 +636,7 @@ void ChatHandler::SendSysMessage(const char *str) void ChatHandler::SendGlobalSysMessage(const char *str) { + // Chat output WorldPacket data; // need copy to prevent corruption by strtok call in LineFromMessage original string @@ -653,8 +712,8 @@ bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, st return true; } - // check security level only for simple command (without child commands) - if(m_session->GetSecurity() < table[i].SecurityLevel) + // must be available and have handler + if(!table[i].Handler || !isAvailable(table[i])) continue; SetSentErrorMessage(false); @@ -663,11 +722,15 @@ bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, st { if(table[i].SecurityLevel > SEC_PLAYER) { - Player* p = m_session->GetPlayer(); - uint64 sel_guid = p->GetSelection(); - sLog.outCommand("Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]", - fullcmd.c_str(),p->GetName(),m_session->GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(), - GetLogNameForGuid(sel_guid),GUID_LOPART(sel_guid)); + // chat case + if(m_session) + { + Player* p = m_session->GetPlayer(); + uint64 sel_guid = p->GetSelection(); + sLog.outCommand("Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]", + fullcmd.c_str(),p->GetName(),m_session->GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(), + GetLogNameForGuid(sel_guid),GUID_LOPART(sel_guid)); + } } } // some commands have custom error messages. Don't send the default one in these cases. @@ -693,18 +756,24 @@ int ChatHandler::ParseCommands(const char* text) //if(m_session->GetSecurity() == 0) // return 0; - if(text[0] != '!' && text[0] != '.') - return 0; + /// chat case (.command or !command format) + if(m_session) + { + if(text[0] != '!' && text[0] != '.') + return 0; + } - // ignore single . and ! in line + /// ignore single . and ! in line if(strlen(text) < 2) return 0; - // ignore messages staring from many dots. + /// ignore messages staring from many dots. if(text[0] == '.' && text[1] == '.' || text[0] == '!' && text[1] == '!') return 0; - ++text; + /// skip first . or ! (in console allowed use command with . and ! and without its) + if(text[0] == '!' || text[0] == '.') + ++text; std::string fullcmd = text; // original `text` can't be used. It content destroyed in command code processing. @@ -719,13 +788,16 @@ bool ChatHandler::ShowHelpForSubCommands(ChatCommand *table, char const* cmd, ch std::string list; for(uint32 i = 0; table[i].Name != NULL; ++i) { - if(m_session->GetSecurity() < table[i].SecurityLevel) + // must be available (ignore handler existence for show command with possibe avalable subcomands + if(!isAvailable(table[i])) continue; if( *subcmd && !hasStringAbbr(table[i].Name, subcmd)) continue; (list += "\n ") += table[i].Name; + if(table[i].ChildCommands) + list += " ..."; } if(list.empty()) @@ -748,7 +820,8 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand *table, const char* cmd) { for(uint32 i = 0; table[i].Name != NULL; ++i) { - if(m_session->GetSecurity() < table[i].SecurityLevel) + // must be available (ignore handler existence for show command with possibe avalable subcomands + if(!isAvailable(table[i])) continue; if( !hasStringAbbr(table[i].Name, cmd) ) @@ -777,7 +850,8 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand *table, const char* cmd) { for(uint32 i = 0; table[i].Name != NULL; ++i) { - if(m_session->GetSecurity() < table[i].SecurityLevel) + // must be available (ignore handler existence for show command with possibe avalable subcomands + if(!isAvailable(table[i])) continue; if(strlen(table[i].Name)) @@ -878,6 +952,9 @@ void ChatHandler::FillMessageData( WorldPacket *data, WorldSession* session, uin Player * ChatHandler::getSelectedPlayer() { + if(!m_session) + return NULL; + uint64 guid = m_session->GetPlayer()->GetSelection(); if (guid == 0) @@ -888,6 +965,9 @@ Player * ChatHandler::getSelectedPlayer() Unit* ChatHandler::getSelectedUnit() { + if(!m_session) + return NULL; + uint64 guid = m_session->GetPlayer()->GetSelection(); if (guid == 0) @@ -898,6 +978,9 @@ Unit* ChatHandler::getSelectedUnit() Creature* ChatHandler::getSelectedCreature() { + if(!m_session) + return NULL; + return ObjectAccessor::GetCreatureOrPet(*m_session->GetPlayer(),m_session->GetPlayer()->GetSelection()); } @@ -1036,6 +1119,9 @@ char const *fmtstring( char const *format, ... ) GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry) { + if(!m_session) + return NULL; + Player* pl = m_session->GetPlayer(); GameObject* obj = ObjectAccessor::GetGameObject(*pl, MAKE_NEW_GUID(lowguid, entry, HIGHGUID_GAMEOBJECT)); @@ -1110,6 +1196,23 @@ GameTele const* ChatHandler::extractGameTeleFromLink(char* text) return objmgr.GetGameTele(cId); } +const char *CliHandler::GetTrinityString(int32 entry) const +{ + return objmgr.GetTrinityStringForDBCLocale(entry); +} + +bool CliHandler::isAvailable(ChatCommand const& cmd) const +{ + // skip non-console commands in console case + return cmd.AllowConsole; +} + +void CliHandler::SendSysMessage(const char *str) +{ + m_print(str); + m_print("\r\n"); +} + bool ChatHandler::GetPlayerGroupAndGUIDByName(const char* cname, Player* &plr, Group* &group, uint64 &guid, bool offline) { plr = NULL; diff --git a/src/game/Chat.h b/src/game/Chat.h index 89a6478a11d..72f0a2ec79e 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -35,6 +35,7 @@ class ChatCommand public: const char * Name; uint32 SecurityLevel; // function pointer required correct align (use uint32) + bool AllowConsole; bool (ChatHandler::*Handler)(const char* args); std::string Help; ChatCommand * ChildCommands; @@ -61,9 +62,9 @@ class ChatHandler static char* LineFromMessage(char*& pos) { char* start = strtok(pos,"\n"); pos = NULL; return start; } - const char *GetTrinityString(int32 entry); + virtual const char *GetTrinityString(int32 entry) const; - void SendSysMessage( const char *str); + virtual void SendSysMessage( const char *str); void SendSysMessage( int32 entry); void PSendSysMessage( const char *format, ...) ATTR_PRINTF(2,3); void PSendSysMessage( int32 entry, ... ); @@ -71,7 +72,12 @@ class ChatHandler int ParseCommands(const char* text); protected: + explicit ChatHandler() : m_session(NULL) {} // for CLI subclass + bool hasStringAbbr(const char* name, const char* part); + + virtual bool isAvailable(ChatCommand const& cmd) const; + void SendGlobalSysMessage(const char *str); bool ExecuteCommandInTable(ChatCommand *table, const char* text, std::string fullcommand); @@ -80,14 +86,22 @@ class ChatHandler ChatCommand* getCommandTable(); + bool HandleAccountCommand(const char* args); + bool HandleAccountCreateCommand(const char* args); + bool HandleAccountDeleteCommand(const char* args); + bool HandleAccountOnlineListCommand(const char* args); + bool HandleAccountSetAddonCommand(const char* args); + bool HandleAccountSetGmLevelCommand(const char* args); + bool HandleAccountSetPasswordCommand(const char* args); + bool HandleHelpCommand(const char* args); bool HandleCommandsCommand(const char* args); - bool HandleAcctCommand(const char* args); bool HandleStartCommand(const char* args); bool HandleInfoCommand(const char* args); bool HandleDismountCommand(const char* args); bool HandleSaveCommand(const char* args); - bool HandleGMListCommand(const char* args); + bool HandleGMListIngameCommand(const char* args); + bool HandleGMListFullCommand(const char* args); bool HandleNamegoCommand(const char* args); bool HandleGonameCommand(const char* args); @@ -208,6 +222,12 @@ class ChatHandler bool HandleInstanceStatsCommand(const char* args); bool HandleInstanceSaveDataCommand(const char * args); + bool HandleServerCorpsesCommand(const char* args); + bool HandleServerExitCommand(const char* args); + bool HandleServerMotdCommand(const char* args); + bool HandleServerSetMotdCommand(const char* args); + bool HandleServerSetLogLevelCommand(const char* args); + bool HandleAddHonorCommand(const char* args); bool HandleHonorAddKillCommand(const char* args); bool HandleUpdateHonorFieldsCommand(const char* args); @@ -257,10 +277,19 @@ class ChatHandler bool HandleUnFreezeCommand(const char *args); bool HandleListFreezeCommand(const char* args); - bool HandleBanCommand(const char* args); - bool HandleUnBanCommand(const char* args); - bool HandleBanInfoCommand(const char* args); - bool HandleBanListCommand(const char* args); + bool HandleCharacterDeleteCommand(const char* args); + bool HandleBanAccountCommand(const char* args); + bool HandleBanCharacterCommand(const char* args); + bool HandleBanIPCommand(const char* args); + bool HandleUnBanAccountCommand(const char* args); + bool HandleUnBanCharacterCommand(const char* args); + bool HandleUnBanIPCommand(const char* args); + bool HandleBanInfoAccountCommand(const char* args); + bool HandleBanInfoCharacterCommand(const char* args); + bool HandleBanInfoIPCommand(const char* args); + bool HandleBanListAccountCommand(const char* args); + bool HandleBanListCharacterCommand(const char* args); + bool HandleBanListIPCommand(const char* args); bool HandleIdleRestartCommand(const char* args); bool HandleIdleShutDownCommand(const char* args); bool HandleShutDownCommand(const char* args); @@ -387,6 +416,7 @@ class ChatHandler bool HandleCastTargetCommand(const char *args); bool HandleComeToMeCommand(const char *args); bool HandleCombatStopCommand(const char *args); + bool HandleSendMessageCommand(const char * args); bool HandleFlushArenaPointsCommand(const char *args); //! Development Commands @@ -415,19 +445,39 @@ class ChatHandler GameObject* GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry); - WorldSession * m_session; - // Utility methods for commands void ShowTicket(uint64 guid, char const* text, char const* time); uint32 GetTicketIDByNum(uint32 num); bool LookupPlayerSearchCommand(QueryResult* result, int32 limit); + bool HandleBanListHelper(QueryResult* result); + bool HandleBanHelper(BanMode mode,char const* args); + bool HandleBanInfoHelper(uint32 accountid, char const* accountname); + bool HandleUnBanHelper(BanMode mode,char const* args); void SetSentErrorMessage(bool val){ sentErrorMessage = val;}; private: + WorldSession * m_session; // != NULL for chat command call and NULL for CLI command + // common global flag static bool load_command_table; bool sentErrorMessage; }; -#endif + +class CliHandler : public ChatHandler +{ + public: + typedef void Print(char const*); + explicit CliHandler(Print* zprint) : m_print(zprint) {} + + // overwrite functions + const char *GetTrinityString(int32 entry) const; + bool isAvailable(ChatCommand const& cmd) const; + void SendSysMessage(const char *str); + + private: + Print* m_print; +}; char const *fmtstring( char const *format, ... ); + +#endif diff --git a/src/game/Language.h b/src/game/Language.h index b759f603ff6..b4b4ae5e12f 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -79,7 +79,10 @@ enum TrinityStrings LANG_NPC_TAINER_HELLO = 51, LANG_COMMAND_INVALID_ITEM_COUNT = 52, LANG_COMMAND_MAIL_ITEMS_LIMIT = 53, - // Room for more level 0 54-99 not used + LANG_NEW_PASSWORDS_NOT_MATCH = 54, + LANG_PASSWORD_TOO_LONG = 55, + LANG_MOTD_CURRENT = 56, + // Room for more level 0 57-99 not used // level 1 chat LANG_GLOBAL_NOTIFY = 100, @@ -163,7 +166,8 @@ enum TrinityStrings LANG_MAIL_SENT = 169, LANG_SOUND_NOT_EXIST = 170, - // Room for more level 1 171-199 not used + LANG_TELEPORTED_TO_BY_CONSOLE = 171, + // Room for more level 1 172-199 not used // level 2 chat LANG_NO_SELECTION = 200, @@ -331,7 +335,8 @@ enum TrinityStrings LANG_UNBAN_UNBANNED = 411, LANG_UNBAN_ERROR = 412, - LANG_BANINFO_NOACCOUNT = 413, + LANG_ACCOUNT_NOT_EXIST = 413, + LANG_BANINFO_NOCHARACTER = 414, LANG_BANINFO_NOIP = 415, LANG_BANINFO_NOACCOUNTBAN = 416, @@ -444,16 +449,16 @@ enum TrinityStrings LANG_ITEMLIST_AUCTION = 510, LANG_WRONG_LINK_TYPE = 511, - LANG_ITEM_LIST = 512, - LANG_QUEST_LIST = 513, - LANG_CREATURE_ENTRY_LIST = 514, - LANG_CREATURE_LIST = 515, - LANG_GO_ENTRY_LIST = 516, - LANG_GO_LIST = 517, - LANG_ITEMSET_LIST = 518, + LANG_ITEM_LIST_CHAT = 512, + LANG_QUEST_LIST_CHAT = 513, + LANG_CREATURE_ENTRY_LIST_CHAT = 514, + LANG_CREATURE_LIST_CHAT = 515, + LANG_GO_ENTRY_LIST_CHAT = 516, + LANG_GO_LIST_CHAT = 517, + LANG_ITEMSET_LIST_CHAT = 518, LANG_TELE_LIST = 519, LANG_SPELL_LIST = 520, - LANG_SKILL_LIST = 521, + LANG_SKILL_LIST_CHAT = 521, LANG_GAMEOBJECT_NOT_EXIST = 522, @@ -526,7 +531,7 @@ enum TrinityStrings LANG_COMMAND_NEAROBJMESSAGE = 581, LANG_COMMAND_RAWPAWNTIMES = 582, - LANG_EVENT_ENTRY_LIST = 583, + LANG_EVENT_ENTRY_LIST_CHAT = 583, LANG_NOEVENTFOUND = 584, LANG_EVENT_NOT_EXIST = 585, LANG_EVENT_INFO = 586, @@ -538,6 +543,14 @@ enum TrinityStrings LANG_MOVEGENS_DISTRACT = 591, LANG_COMMAND_LEARN_ALL_RECIPES = 592, + LANG_BANLIST_ACCOUNTS = 593, + LANG_BANLIST_ACCOUNTS_HEADER = 594, + LANG_BANLIST_IPS = 595, + LANG_BANLIST_IPS_HEADER = 596, + LANG_GMLIST = 597, + LANG_GMLIST_HEADER = 598, + LANG_GMLIST_EMPTY = 599, + // End Level 3 list, continued at 1100 // Battleground LANG_BG_A_WINS = 600, @@ -658,14 +671,52 @@ enum TrinityStrings LANG_ACCOUNT_FOR_PLAYER_NOT_FOUND = 809, // Room for in-game strings 810-999 not used - // FREE IDS 1000-9999 - LANG_COMMAND_FREEZE = 1000, - LANG_COMMAND_FREEZE_ERROR = 1001, - LANG_COMMAND_FREEZE_WRONG = 1002, - LANG_COMMAND_UNFREEZE = 1003, - LANG_COMMAND_NO_FROZEN_PLAYERS = 1004, - LANG_COMMAND_LIST_FREEZE = 1005, - LANG_COMMAND_FROZEN_PLAYERS = 1006, + // Level 4 (CLI only commands) + LANG_COMMAND_EXIT = 1000, + LANG_ACCOUNT_DELETED = 1001, + LANG_ACCOUNT_NOT_DELETED_SQL_ERROR = 1002, + LANG_ACCOUNT_NOT_DELETED = 1003, + LANG_ACCOUNT_CREATED = 1004, + LANG_ACCOUNT_TOO_LONG = 1005, + LANG_ACCOUNT_ALREADY_EXIST = 1006, + LANG_ACCOUNT_NOT_CREATED_SQL_ERROR = 1007, + LANG_ACCOUNT_NOT_CREATED = 1008, + LANG_CHARACTER_DELETED = 1009, + LANG_ACCOUNT_LIST_HEADER = 1010, + LANG_ACCOUNT_LIST_ERROR = 1011, + // Room for more level 4 1012-1099 not used + + // Level 3 (continue) + LANG_MOTD_NEW = 1100, + LANG_ACCOUNT_SETADDON = 1101, + LANG_SENDMESSAGE = 1102, + LANG_EVENT_ENTRY_LIST_CONSOLE = 1103, + LANG_CREATURE_ENTRY_LIST_CONSOLE = 1104, + LANG_ITEM_LIST_CONSOLE = 1105, + LANG_ITEMSET_LIST_CONSOLE = 1106, + LANG_GO_ENTRY_LIST_CONSOLE = 1107, + LANG_QUEST_LIST_CONSOLE = 1108, + LANG_SKILL_LIST_CONSOLE = 1109, + LANG_CREATURE_LIST_CONSOLE = 1110, + LANG_GO_LIST_CONSOLE = 1111, + LANG_FILE_OPEN_FAIL = 1112, + LANG_ACCOUNT_CHARACTER_LIST_FULL = 1113, + LANG_DUMP_BROKEN = 1114, + LANG_INVALID_CHARACTER_NAME = 1115, + LANG_INVALID_CHARACTER_GUID = 1116, + LANG_CHARACTER_GUID_IN_USE = 1117, + LANG_ITEMLIST_GUILD = 1118, + // Room for more level 3 1119-1199 not used + + // Trinity custom patches 5000-9999 + LANG_COMMAND_FREEZE = 5000, + LANG_COMMAND_FREEZE_ERROR = 5001, + LANG_COMMAND_FREEZE_WRONG = 5002, + LANG_COMMAND_UNFREEZE = 5003, + LANG_COMMAND_NO_FROZEN_PLAYERS = 5004, + LANG_COMMAND_LIST_FREEZE = 5005, + LANG_COMMAND_FROZEN_PLAYERS = 5006, + // Room for more Trinity custom patches 5007-9999 // Use for not-in-svn patches 10000-10999 // opvp hp diff --git a/src/game/Level0.cpp b/src/game/Level0.cpp index 3e02d6ca7f4..bea6dd1f91c 100644 --- a/src/game/Level0.cpp +++ b/src/game/Level0.cpp @@ -35,15 +35,17 @@ bool ChatHandler::HandleHelpCommand(const char* args) { - if(!*args) - return false; - - char* cmd = strtok((char*)args, " "); + char* cmd = strtok((char*)args, " "); if(!cmd) - return false; - - if(!ShowHelpForCommand(getCommandTable(), cmd)) - SendSysMessage(LANG_NO_HELP_CMD); + { + ShowHelpForCommand(getCommandTable(), "help"); + ShowHelpForCommand(getCommandTable(), ""); + } + else + { + if(!ShowHelpForCommand(getCommandTable(), cmd)) + SendSysMessage(LANG_NO_HELP_CMD); + } return true; } @@ -54,7 +56,7 @@ bool ChatHandler::HandleCommandsCommand(const char* args) return true; } -bool ChatHandler::HandleAcctCommand(const char* /*args*/) +bool ChatHandler::HandleAccountCommand(const char* /*args*/) { uint32 gmlevel = m_session->GetSecurity(); PSendSysMessage(LANG_ACCOUNT_LEVEL, gmlevel); @@ -141,7 +143,7 @@ bool ChatHandler::HandleSaveCommand(const char* /*args*/) return true; } -bool ChatHandler::HandleGMListCommand(const char* /*args*/) +bool ChatHandler::HandleGMListIngameCommand(const char* /*args*/) { bool first = true; @@ -149,8 +151,9 @@ bool ChatHandler::HandleGMListCommand(const char* /*args*/) HashMapHolder<Player>::MapType::iterator itr = m.begin(); for(; itr != m.end(); ++itr) { - if( itr->second->GetSession()->GetSecurity() && (itr->second->isGameMaster() || sWorld.getConfig(CONFIG_GM_IN_GM_LIST) ) && - itr->second->IsVisibleGloballyFor(m_session->GetPlayer()) ) + if (itr->second->GetSession()->GetSecurity() && + (itr->second->isGameMaster() || sWorld.getConfig(CONFIG_GM_IN_GM_LIST)) && + (!m_session || itr->second->IsVisibleGloballyFor(m_session->GetPlayer())) ) { if(first) { @@ -177,17 +180,24 @@ bool ChatHandler::HandlePasswordCommand(const char* args) char *new_pass = strtok (NULL, " "); char *new_pass_c = strtok (NULL, " "); - if( !old_pass || !new_pass || !new_pass_c ) + if (!old_pass || !new_pass || !new_pass_c) return false; std::string password_old = old_pass; std::string password_new = new_pass; std::string password_new_c = new_pass_c; - if(!accmgr.CheckPassword(m_session->GetAccountId(), password_old) || password_new != password_new_c) + if (password_new != password_new_c) { - SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD); - SetSentErrorMessage(true); + SendSysMessage (LANG_NEW_PASSWORDS_NOT_MATCH); + SetSentErrorMessage (true); + return false; + } + + if (!accmgr.CheckPassword (m_session->GetAccountId(), password_old)) + { + SendSysMessage (LANG_COMMAND_WRONGOLDPASSWORD); + SetSentErrorMessage (true); return false; } @@ -198,6 +208,11 @@ bool ChatHandler::HandlePasswordCommand(const char* args) case AOR_OK: SendSysMessage(LANG_COMMAND_PASSWORD); break; + case AOR_PASS_TOO_LONG: + SendSysMessage(LANG_PASSWORD_TOO_LONG); + SetSentErrorMessage(true); + return false; + case AOR_NAME_NOT_EXIST: // not possible case, don't want get account name for output default: SendSysMessage(LANG_COMMAND_NOTCHANGEPASSWORD); SetSentErrorMessage(true); @@ -233,3 +248,10 @@ bool ChatHandler::HandleLockAccountCommand(const char* args) SendSysMessage(LANG_USE_BOL); return true; } + +/// Display the 'Message of the day' for the realm +bool ChatHandler::HandleServerMotdCommand(const char* /*args*/) +{ + PSendSysMessage(LANG_MOTD_CURRENT, sWorld.GetMotd()); + return true; +} diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index 9d3ddb3aff8..0e8579b5c00 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -1692,62 +1692,65 @@ bool ChatHandler::HandleTeleCommand(const char * args) bool ChatHandler::HandleLookupAreaCommand(const char* args) { - if(!*args) + if (!*args) return false; std::string namepart = args; std::wstring wnamepart; - if(!Utf8toWStr(namepart,wnamepart)) + if (!Utf8toWStr (namepart,wnamepart)) return false; uint32 counter = 0; // Counter for figure out that we found smth. // converting string that we try to find to lower case - wstrToLower( wnamepart ); + wstrToLower (wnamepart); // Search in AreaTable.dbc - for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows(); ++areaflag) + for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows (); ++areaflag) { - AreaTableEntry const *areaEntry = sAreaStore.LookupEntry(areaflag); - if(areaEntry) + AreaTableEntry const *areaEntry = sAreaStore.LookupEntry (areaflag); + if (areaEntry) { - int loc = m_session->GetSessionDbcLocale(); + int loc = m_session ? m_session->GetSessionDbcLocale () : sWorld.GetDefaultDbcLocale(); std::string name = areaEntry->area_name[loc]; - if(name.empty()) + if (name.empty()) continue; - if(!Utf8FitTo(name, wnamepart)) + if (!Utf8FitTo (name, wnamepart)) { loc = 0; for(; loc < MAX_LOCALE; ++loc) { - if(loc==m_session->GetSessionDbcLocale()) + if (m_session && loc==m_session->GetSessionDbcLocale ()) continue; name = areaEntry->area_name[loc]; - if(name.empty()) + if (name.empty ()) continue; - if (Utf8FitTo(name, wnamepart)) + if (Utf8FitTo (name, wnamepart)) break; } } - if(loc < MAX_LOCALE) + if (loc < MAX_LOCALE) { // send area in "id - [name]" format std::ostringstream ss; - ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << " " << localeNames[loc]<< "]|h|r"; + if (m_session) + ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << " " << localeNames[loc]<< "]|h|r"; + else + ss << areaEntry->ID << " - " << name << " " << localeNames[loc]; - SendSysMessage(ss.str().c_str()); + SendSysMessage (ss.str ().c_str()); ++counter; } } } - if (counter == 0) // if counter == 0 then we found nth - SendSysMessage(LANG_COMMAND_NOAREAFOUND); + if (counter == 0) // if counter == 0 then we found nth + SendSysMessage (LANG_COMMAND_NOAREAFOUND); return true; } @@ -1760,6 +1763,7 @@ bool ChatHandler::HandleLookupTeleCommand(const char * args) SetSentErrorMessage(true); return false; } + char const* str = strtok((char*)args, " "); if(!str) return false; @@ -1773,9 +1777,9 @@ bool ChatHandler::HandleLookupTeleCommand(const char * args) // converting string that we try to find to lower case wstrToLower( wnamepart ); - GameTeleMap const & teleMap = objmgr.GetGameTeleMap(); - std::ostringstream reply; + + GameTeleMap const & teleMap = objmgr.GetGameTeleMap(); for(GameTeleMap::const_iterator itr = teleMap.begin(); itr != teleMap.end(); ++itr) { GameTele const* tele = &itr->second; @@ -1783,11 +1787,10 @@ bool ChatHandler::HandleLookupTeleCommand(const char * args) if(tele->wnameLow.find(wnamepart) == std::wstring::npos) continue; - reply << " |cffffffff|Htele:"; - reply << itr->first; - reply << "|h["; - reply << tele->name; - reply << "]|h|r\n"; + if (m_session) + reply << " |cffffffff|Htele:" << itr->first << "|h[" << tele->name << "]|h|r\n"; + else + reply << " " << itr->first << " " << tele->name << "\n"; } if(reply.str().empty()) @@ -2072,8 +2075,13 @@ bool ChatHandler::HandleNameTeleCommand(const char * args) PSendSysMessage(LANG_TELEPORTING_TO, chr->GetName(),"", tele->name.c_str()); - if (m_session->GetPlayer()->IsVisibleGloballyFor(chr)) - ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, m_session->GetPlayer()->GetName()); + if (m_session) + { + if(m_session->GetPlayer()->IsVisibleGloballyFor(chr)) + ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, m_session->GetPlayer()->GetName()); + } + else + ChatHandler(chr).SendSysMessage(LANG_TELEPORTED_TO_BY_CONSOLE); // stop flight if need if(chr->isInFlight()) diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index a449f15dfc3..4164c5cde3c 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -42,6 +42,7 @@ #include <iostream> #include <fstream> #include <map> +#include "GlobalEvents.h" static uint32 ReputationRankStrIndex[MAX_REPUTATION_RANK] = { @@ -99,7 +100,7 @@ bool ChatHandler::HandleMuteCommand(const char* args) security = accmgr.GetSecurity(account_id); } - if(security >= m_session->GetSecurity()) + if(m_session && security >= m_session->GetSecurity()) { SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); SetSentErrorMessage(true); @@ -165,7 +166,7 @@ bool ChatHandler::HandleUnmuteCommand(const char* args) security = accmgr.GetSecurity(account_id); } - if(security >= m_session->GetSecurity()) + if(m_session && security >= m_session->GetSecurity()) { SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); SetSentErrorMessage(true); @@ -555,38 +556,37 @@ bool ChatHandler::HandleGUIDCommand(const char* /*args*/) bool ChatHandler::HandleLookupFactionCommand(const char* args) { - if(!*args) + if (!*args) return false; - Player *target = getSelectedPlayer(); - if (!target) - { - SendSysMessage(LANG_NO_CHAR_SELECTED); - SetSentErrorMessage(true); - return false; - } + // Can be NULL at console call + Player *target = getSelectedPlayer (); std::string namepart = args; std::wstring wnamepart; - if(!Utf8toWStr(namepart,wnamepart)) + if (!Utf8toWStr (namepart,wnamepart)) return false; // converting string that we try to find to lower case - wstrToLower( wnamepart ); + wstrToLower (wnamepart); uint32 counter = 0; // Counter for figure out that we found smth. - for (uint32 id = 0; id < sFactionStore.GetNumRows(); id++) - //for(FactionStateList::const_iterator itr = target->m_factions.begin(); itr != target->m_factions.end(); ++itr) + for (uint32 id = 0; id < sFactionStore.GetNumRows(); ++id) { - FactionEntry const *factionEntry = sFactionStore.LookupEntry(id); - //FactionEntry const *factionEntry = sFactionStore.LookupEntry(itr->second.ID); + FactionEntry const *factionEntry = sFactionStore.LookupEntry (id); if (factionEntry) { - FactionStateList::const_iterator repItr = target->m_factions.find(factionEntry->reputationListID); + FactionState const* repState = NULL; + if(target) + { + FactionStateList::const_iterator repItr = target->m_factions.find (factionEntry->reputationListID); + if(repItr != target->m_factions.end()) + repState = &repItr->second; + } - int loc = m_session->GetSessionDbcLocale(); + int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale(); std::string name = factionEntry->name[loc]; if(name.empty()) continue; @@ -596,7 +596,7 @@ bool ChatHandler::HandleLookupFactionCommand(const char* args) loc = 0; for(; loc < MAX_LOCALE; ++loc) { - if(loc==m_session->GetSessionDbcLocale()) + if(m_session && loc==m_session->GetSessionDbcLocale()) continue; name = factionEntry->name[loc]; @@ -613,26 +613,29 @@ bool ChatHandler::HandleLookupFactionCommand(const char* args) // send faction in "id - [faction] rank reputation [visible] [at war] [own team] [unknown] [invisible] [inactive]" format // or "id - [faction] [no reputation]" format std::ostringstream ss; - ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << " " << localeNames[loc] << "]|h|r"; + if (m_session) + ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << " " << localeNames[loc] << "]|h|r"; + else + ss << id << " - " << name << " " << localeNames[loc]; - if (repItr != target->m_factions.end()) + if (repState) // and then target!=NULL also { ReputationRank rank = target->GetReputationRank(factionEntry); std::string rankName = GetTrinityString(ReputationRankStrIndex[rank]); ss << " " << rankName << "|h|r (" << target->GetReputation(factionEntry) << ")"; - if(repItr->second.Flags & FACTION_FLAG_VISIBLE) + if(repState->Flags & FACTION_FLAG_VISIBLE) ss << GetTrinityString(LANG_FACTION_VISIBLE); - if(repItr->second.Flags & FACTION_FLAG_AT_WAR) + if(repState->Flags & FACTION_FLAG_AT_WAR) ss << GetTrinityString(LANG_FACTION_ATWAR); - if(repItr->second.Flags & FACTION_FLAG_PEACE_FORCED) + if(repState->Flags & FACTION_FLAG_PEACE_FORCED) ss << GetTrinityString(LANG_FACTION_PEACE_FORCED); - if(repItr->second.Flags & FACTION_FLAG_HIDDEN) + if(repState->Flags & FACTION_FLAG_HIDDEN) ss << GetTrinityString(LANG_FACTION_HIDDEN); - if(repItr->second.Flags & FACTION_FLAG_INVISIBLE_FORCED) + if(repState->Flags & FACTION_FLAG_INVISIBLE_FORCED) ss << GetTrinityString(LANG_FACTION_INVISIBLE_FORCED); - if(repItr->second.Flags & FACTION_FLAG_INACTIVE) + if(repState->Flags & FACTION_FLAG_INACTIVE) ss << GetTrinityString(LANG_FACTION_INACTIVE); } else @@ -1702,7 +1705,7 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args) return false; } - if(name==m_session->GetPlayer()->GetName()) + if(m_session && name==m_session->GetPlayer()->GetName()) { SendSysMessage(LANG_COMMAND_KICKSELF); SetSentErrorMessage(true); @@ -1809,7 +1812,8 @@ bool ChatHandler::HandlePInfoCommand(const char* args) Field* fields = result->Fetch(); username = fields[0].GetCppString(); security = fields[1].GetUInt32(); - if(m_session->GetSecurity() >= security) + + if(!m_session || m_session->GetSecurity() >= security) { last_ip = fields[2].GetCppString(); last_login = fields[3].GetCppString(); @@ -1891,6 +1895,13 @@ bool ChatHandler::HandleTicketCommand(const char* args) // ticket<end> if (!px) { + if(!m_session) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + size_t count; QueryResult *result = CharacterDatabase.Query("SELECT COUNT(ticket_id) FROM character_ticket"); if(result) @@ -1901,13 +1912,22 @@ bool ChatHandler::HandleTicketCommand(const char* args) else count = 0; - PSendSysMessage(LANG_COMMAND_TICKETCOUNT, count, m_session->GetPlayer()->isAcceptTickets() ? GetTrinityString(LANG_ON) : GetTrinityString(LANG_OFF)); + bool accept = m_session->GetPlayer()->isAcceptTickets(); + + PSendSysMessage(LANG_COMMAND_TICKETCOUNT, count, accept ? GetTrinityString(LANG_ON) : GetTrinityString(LANG_OFF)); return true; } // ticket on if(strncmp(px,"on",3) == 0) { + if(!m_session) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + m_session->GetPlayer()->SetAcceptTicket(true); SendSysMessage(LANG_COMMAND_TICKETON); return true; @@ -1916,6 +1936,13 @@ bool ChatHandler::HandleTicketCommand(const char* args) // ticket off if(strncmp(px,"off",4) == 0) { + if(!m_session) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + m_session->GetPlayer()->SetAcceptTicket(false); SendSysMessage(LANG_COMMAND_TICKETOFF); return true; @@ -3590,7 +3617,12 @@ bool ChatHandler::HandleLookupEventCommand(const char* args) if (Utf8FitTo(descr, wnamepart)) { char const* active = activeEvents.find(id) != activeEvents.end() ? GetTrinityString(LANG_ACTIVE) : ""; - PSendSysMessage(LANG_EVENT_ENTRY_LIST,id,id,descr.c_str(),active ); + + if(m_session) + PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,id,id,eventData.description.c_str(),active ); + else + PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,id,eventData.description.c_str(),active ); + ++counter; } } @@ -3615,7 +3647,11 @@ bool ChatHandler::HandleEventActiveListCommand(const char* args) uint32 event_id = *itr; GameEventData const& eventData = events[event_id]; - PSendSysMessage(LANG_EVENT_ENTRY_LIST,event_id,event_id,eventData.description.c_str(),active ); + if(m_session) + PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,event_id,event_id,eventData.description.c_str(),active ); + else + PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,event_id,eventData.description.c_str(),active ); + ++counter; } @@ -3848,7 +3884,7 @@ bool ChatHandler::HandleLearnAllRecipesCommand(const char* args) return false; } - if(!*args) + if (!*args) return false; std::wstring wnamepart; @@ -3916,54 +3952,54 @@ bool ChatHandler::HandleLearnAllRecipesCommand(const char* args) bool ChatHandler::HandleLookupPlayerIpCommand(const char* args) { - if(!*args) + if (!*args) return false; - std::string ip = strtok((char*)args, " "); - char* limit_str = strtok(NULL, " "); - int32 limit = limit_str ? atoi(limit_str) : -1; + std::string ip = strtok ((char*)args, " "); + char* limit_str = strtok (NULL, " "); + int32 limit = limit_str ? atoi (limit_str) : -1; - loginDatabase.escape_string(ip); + loginDatabase.escape_string (ip); - QueryResult* result = loginDatabase.PQuery("SELECT id,username FROM account WHERE last_ip = '%s'", ip.c_str()); + QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE last_ip = '%s'", ip.c_str ()); - return LookupPlayerSearchCommand(result,limit); + return LookupPlayerSearchCommand (result,limit); } bool ChatHandler::HandleLookupPlayerAccountCommand(const char* args) { - if(!*args) + if (!*args) return false; - std::string account = strtok((char*)args, " "); - char* limit_str = strtok(NULL, " "); - int32 limit = limit_str ? atoi(limit_str) : -1; + std::string account = strtok ((char*)args, " "); + char* limit_str = strtok (NULL, " "); + int32 limit = limit_str ? atoi (limit_str) : -1; - if(!AccountMgr::normilizeString(account)) + if (!AccountMgr::normilizeString (account)) return false; - loginDatabase.escape_string(account); + loginDatabase.escape_string (account); - QueryResult* result = loginDatabase.PQuery("SELECT id,username FROM account WHERE username = '%s'", account.c_str()); + QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE username = '%s'", account.c_str ()); - return LookupPlayerSearchCommand(result,limit); + return LookupPlayerSearchCommand (result,limit); } bool ChatHandler::HandleLookupPlayerEmailCommand(const char* args) { - if(!*args) + if (!*args) return false; - std::string email = strtok((char*)args, " "); - char* limit_str = strtok(NULL, " "); - int32 limit = limit_str ? atoi(limit_str) : -1; + std::string email = strtok ((char*)args, " "); + char* limit_str = strtok (NULL, " "); + int32 limit = limit_str ? atoi (limit_str) : -1; - loginDatabase.escape_string(email); + loginDatabase.escape_string (email); - QueryResult* result = loginDatabase.PQuery("SELECT id,username FROM account WHERE email = '%s'", email.c_str()); + QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE email = '%s'", email.c_str ()); - return LookupPlayerSearchCommand(result,limit); + return LookupPlayerSearchCommand (result,limit); } bool ChatHandler::LookupPlayerSearchCommand(QueryResult* result, int32 limit) @@ -4009,3 +4045,10 @@ bool ChatHandler::LookupPlayerSearchCommand(QueryResult* result, int32 limit) return true; } + +/// Triggering corpses expire check in world +bool ChatHandler::HandleServerCorpsesCommand(const char* /*args*/) +{ + CorpsesErase(); + return true; +} diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 71ee2fbab62..c2c8645a27d 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -52,6 +52,7 @@ #include "BattleGroundMgr.h" #include "InstanceSaveMgr.h" #include "InstanceData.h" +#include "AccountMgr.h" //reload commands bool ChatHandler::HandleReloadCommand(const char* arg) @@ -681,56 +682,47 @@ bool ChatHandler::HandleLoadScriptsCommand(const char* args) return true; } -bool ChatHandler::HandleSecurityCommand(const char* args) +bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args) { char* arg1 = strtok((char*)args, " "); if( !arg1 ) return false; - char* arg2 = 0; + char* arg2 = strtok(NULL, " "); - std::string targetName; + std::string targetAccountName; uint32 targetAccountId = 0; uint32 targetSecurity = 0; + /// only target player different from self allowed (if targetPlayer!=NULL then not console) Player* targetPlayer = getSelectedPlayer(); - if(targetPlayer) + if(targetPlayer && m_session->GetPlayer()!=targetPlayer) { - targetName = targetPlayer->GetName(); + /// wrong command syntax or unexpected targeting + if(arg2) + return false; + targetAccountId = targetPlayer->GetSession()->GetAccountId(); targetSecurity = targetPlayer->GetSession()->GetSecurity(); - arg2 = arg1; + if(!accmgr.GetName(targetAccountId,targetAccountName)) + { + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,targetAccountName.c_str()); + SetSentErrorMessage(true); + return false; + } } else { - targetName = arg1; - if(!normalizePlayerName(targetName)) + targetAccountName = arg1; + if(!AccountMgr::normilizeString(targetAccountName)) { - SendSysMessage(LANG_PLAYER_NOT_FOUND); + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,targetAccountName.c_str()); SetSentErrorMessage(true); return false; } - targetPlayer = ObjectAccessor::Instance().FindPlayerByName(targetName.c_str()); - if(targetPlayer) - { - targetAccountId = targetPlayer->GetSession()->GetAccountId(); - targetSecurity = targetPlayer->GetSession()->GetSecurity(); - } - else - { - uint64 targetGUID = objmgr.GetPlayerGUIDByName(targetName.c_str()); - if(!targetGUID) - { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); - return false; - } - targetAccountId = objmgr.GetPlayerAccountIdByGUID(targetGUID); - targetSecurity = accmgr.GetSecurity(targetAccountId); - } - - arg2 = strtok(NULL, " "); + targetAccountId = accmgr.GetId(targetAccountName); + targetSecurity = accmgr.GetSecurity(targetAccountId); } int32 gm = (int32)atoi(arg2); @@ -741,8 +733,12 @@ bool ChatHandler::HandleSecurityCommand(const char* args) return false; } - // can set security level only for target with less security and to less security that we have - if(targetSecurity >= m_session->GetSecurity() || uint32(gm) >= m_session->GetSecurity() ) + /// m_session==NULL only for console + uint32 plSecurity = m_session ? m_session->GetSecurity() : 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 + if(targetSecurity >= plSecurity || uint32(gm) >= plSecurity ) { SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); SetSentErrorMessage(true); @@ -751,18 +747,91 @@ bool ChatHandler::HandleSecurityCommand(const char* args) if(targetPlayer) { - if( targetPlayer != m_session->GetPlayer() ) - ChatHandler(targetPlayer).PSendSysMessage(LANG_YOURS_SECURITY_CHANGED,m_session->GetPlayer()->GetName(), gm); - + ChatHandler(targetPlayer).PSendSysMessage(LANG_YOURS_SECURITY_CHANGED,m_session->GetPlayer()->GetName(), gm); targetPlayer->GetSession()->SetSecurity(gm); } - PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetName.c_str(), gm); + PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetAccountName.c_str(), gm); loginDatabase.PExecute("UPDATE account SET gmlevel = '%i' WHERE id = '%u'", gm, targetAccountId); return true; } +/// Set password for account +bool ChatHandler::HandleAccountSetPasswordCommand(const char* args) +{ + if(!*args) + return false; + + ///- Get the command line arguments + char *szAccount = strtok ((char*)args," "); + char *szPassword1 = strtok (NULL," "); + char *szPassword2 = strtok (NULL," "); + + if (!szAccount||!szPassword1 || !szPassword2) + return false; + + std::string account_name = szAccount; + if(!AccountMgr::normilizeString(account_name)) + { + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); + return false; + } + + uint32 targetAccountId = accmgr.GetId(account_name); + if (!targetAccountId) + { + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); + return false; + } + + uint32 targetSecurity = accmgr.GetSecurity(targetAccountId); + + /// m_session==NULL only for console + uint32 plSecurity = m_session ? m_session->GetSecurity() : SEC_CONSOLE; + + /// can set password only for target with less security + /// This is also reject self apply in fact + if (targetSecurity >= plSecurity) + { + SendSysMessage (LANG_YOURS_SECURITY_IS_LOW); + SetSentErrorMessage (true); + return false; + } + + if (strcmp(szPassword1,szPassword2)) + { + SendSysMessage (LANG_NEW_PASSWORDS_NOT_MATCH); + SetSentErrorMessage (true); + return false; + } + + AccountOpResult result = accmgr.ChangePassword(targetAccountId, szPassword1); + + switch(result) + { + case AOR_OK: + SendSysMessage(LANG_COMMAND_PASSWORD); + break; + case AOR_NAME_NOT_EXIST: + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); + return false; + case AOR_PASS_TOO_LONG: + SendSysMessage(LANG_PASSWORD_TOO_LONG); + SetSentErrorMessage(true); + return false; + default: + SendSysMessage(LANG_COMMAND_NOTCHANGEPASSWORD); + SetSentErrorMessage(true); + return false; + } + + return true; +} + bool ChatHandler::HandleAllowMovementCommand(const char* /*args*/) { if(sWorld.getAllowMovement()) @@ -1976,10 +2045,16 @@ bool ChatHandler::HandleListItemCommand(const char* args) char* cId = extractKeyFromLink((char*)args,"Hitem"); if(!cId) return false; - uint32 item_id = atol(cId); - - ItemPrototype const* itemProto = item_id ? itemProto = objmgr.GetItemPrototype(item_id) : NULL; + uint32 item_id = atol(cId); + if(!item_id) + { + PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, item_id); + SetSentErrorMessage(true); + return false; + } + + ItemPrototype const* itemProto = objmgr.GetItemPrototype(item_id); if(!itemProto) { PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, item_id); @@ -2135,14 +2210,53 @@ bool ChatHandler::HandleListItemCommand(const char* args) delete result; } - if(inv_count+mail_count+auc_count == 0) + // guild bank case + uint32 guild_count = 0; + result=CharacterDatabase.PQuery("SELECT COUNT(item_entry) FROM guild_bank_item WHERE item_entry='%u'",item_id); + if(result) + { + guild_count = (*result)[0].GetUInt32(); + delete result; + } + + result=CharacterDatabase.PQuery( + // 0 1 2 + "SELECT gi.item_guid, gi.guildid, guild.name " + "FROM guild_bank_item AS gi, guild WHERE gi.item_entry='%u' AND gi.guildid = guild.guildid LIMIT %u ", + item_id,uint32(count)); + + if(result) + { + do + { + Field *fields = result->Fetch(); + uint32 item_guid = fields[0].GetUInt32(); + uint32 guild_guid = fields[1].GetUInt32(); + std::string guild_name = fields[2].GetCppString(); + + char const* item_pos = "[in guild bank]"; + + PSendSysMessage(LANG_ITEMLIST_GUILD,item_guid,guild_name.c_str(),guild_guid,item_pos); + } while (result->NextRow()); + + int64 res_count = result->GetRowCount(); + + delete result; + + if(count > res_count) + count-=res_count; + else if(count) + count = 0; + } + + if(inv_count+mail_count+auc_count+guild_count == 0) { SendSysMessage(LANG_COMMAND_NOITEMFOUND); SetSentErrorMessage(true); return false; } - PSendSysMessage(LANG_COMMAND_LISTITEMMESSAGE,item_id,inv_count+mail_count+auc_count,inv_count,mail_count,auc_count); + PSendSysMessage(LANG_COMMAND_LISTITEMMESSAGE,item_id,inv_count+mail_count+auc_count+guild_count,inv_count,mail_count,auc_count,guild_count); return true; } @@ -2152,16 +2266,21 @@ bool ChatHandler::HandleListObjectCommand(const char* args) if(!*args) return false; - // number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r + // number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r char* cId = extractKeyFromLink((char*)args,"Hgameobject_entry"); if(!cId) return false; uint32 go_id = atol(cId); + if(!go_id) + { + PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, go_id); + SetSentErrorMessage(true); + return false; + } GameObjectInfo const * gInfo = objmgr.GetGameObjectInfo(go_id); - - if(!go_id || !gInfo) + if(!gInfo) { PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, go_id); SetSentErrorMessage(true); @@ -2174,7 +2293,6 @@ bool ChatHandler::HandleListObjectCommand(const char* args) if(count < 0) return false; - Player* pl = m_session->GetPlayer(); QueryResult *result; uint32 obj_count = 0; @@ -2185,8 +2303,15 @@ bool ChatHandler::HandleListObjectCommand(const char* args) delete result; } - result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE id = '%u' ORDER BY order_ ASC LIMIT %u", - pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(),go_id,uint32(count)); + if(m_session) + { + Player* pl = m_session->GetPlayer(); + result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE id = '%u' ORDER BY order_ ASC LIMIT %u", + pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(),go_id,uint32(count)); + } + else + result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map FROM gameobject WHERE id = '%u' LIMIT %u", + go_id,uint32(count)); if (result) { @@ -2199,7 +2324,10 @@ bool ChatHandler::HandleListObjectCommand(const char* args) float z = fields[3].GetFloat(); int mapid = fields[4].GetUInt16(); - PSendSysMessage(LANG_GO_LIST, guid, guid, gInfo->name, x, y, z, mapid); + if (m_session) + PSendSysMessage(LANG_GO_LIST_CHAT, guid, guid, gInfo->name, x, y, z, mapid); + else + PSendSysMessage(LANG_GO_LIST_CONSOLE, guid, gInfo->name, x, y, z, mapid); } while (result->NextRow()); delete result; @@ -2238,7 +2366,7 @@ bool ChatHandler::HandleNearObjectCommand(const char* args) if(!gInfo) continue; - PSendSysMessage(LANG_GO_LIST, guid, guid, gInfo->name, x, y, z, mapid); + PSendSysMessage(LANG_GO_LIST_CHAT, guid, guid, gInfo->name, x, y, z, mapid); ++count; } while (result->NextRow()); @@ -2293,16 +2421,21 @@ bool ChatHandler::HandleListCreatureCommand(const char* args) if(!*args) return false; - // number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r + // number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r char* cId = extractKeyFromLink((char*)args,"Hcreature_entry"); if(!cId) return false; uint32 cr_id = atol(cId); + if(!cr_id) + { + PSendSysMessage(LANG_COMMAND_INVALIDCREATUREID, cr_id); + SetSentErrorMessage(true); + return false; + } CreatureInfo const* cInfo = objmgr.GetCreatureTemplate(cr_id); - - if(!cr_id || !cInfo) + if(!cInfo) { PSendSysMessage(LANG_COMMAND_INVALIDCREATUREID, cr_id); SetSentErrorMessage(true); @@ -2315,7 +2448,6 @@ bool ChatHandler::HandleListCreatureCommand(const char* args) if(count < 0) return false; - Player* pl = m_session->GetPlayer(); QueryResult *result; uint32 cr_count = 0; @@ -2326,8 +2458,15 @@ bool ChatHandler::HandleListCreatureCommand(const char* args) delete result; } - result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM creature WHERE id = '%u' ORDER BY order_ ASC LIMIT %u", - pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(), cr_id,uint32(count)); + if(m_session) + { + Player* pl = m_session->GetPlayer(); + result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM creature WHERE id = '%u' ORDER BY order_ ASC LIMIT %u", + pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(), cr_id,uint32(count)); + } + else + result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map FROM creature WHERE id = '%u' LIMIT %u", + cr_id,uint32(count)); if (result) { @@ -2340,7 +2479,10 @@ bool ChatHandler::HandleListCreatureCommand(const char* args) float z = fields[3].GetFloat(); int mapid = fields[4].GetUInt16(); - PSendSysMessage(LANG_CREATURE_LIST, guid, guid, cInfo->Name, x, y, z, mapid); + if (m_session) + PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, cInfo->Name, x, y, z, mapid); + else + PSendSysMessage(LANG_CREATURE_LIST_CONSOLE, guid, cInfo->Name, x, y, z, mapid); } while (result->NextRow()); delete result; @@ -2373,7 +2515,7 @@ bool ChatHandler::HandleLookupItemCommand(const char* args) if(!pProto) continue; - int loc_idx = m_session->GetSessionDbLocaleIndex(); + int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex(); if ( loc_idx >= 0 ) { ItemLocale const *il = objmgr.GetItemLocale(pProto->ItemId); @@ -2385,7 +2527,10 @@ bool ChatHandler::HandleLookupItemCommand(const char* args) if (Utf8FitTo(name, wnamepart)) { - PSendSysMessage(LANG_ITEM_LIST, id, id, name.c_str()); + if (m_session) + PSendSysMessage(LANG_ITEM_LIST_CHAT, id, id, name.c_str()); + else + PSendSysMessage(LANG_ITEM_LIST_CONSOLE, id, name.c_str()); ++counter; continue; } @@ -2399,7 +2544,10 @@ bool ChatHandler::HandleLookupItemCommand(const char* args) if (Utf8FitTo(name, wnamepart)) { - PSendSysMessage(LANG_ITEM_LIST, id, id, name.c_str()); + if (m_session) + PSendSysMessage(LANG_ITEM_LIST_CHAT, id, id, name.c_str()); + else + PSendSysMessage(LANG_ITEM_LIST_CONSOLE, id, name.c_str()); ++counter; } } @@ -2432,8 +2580,8 @@ bool ChatHandler::HandleLookupItemSetCommand(const char* args) ItemSetEntry const *set = sItemSetStore.LookupEntry(id); if(set) { - int loc = m_session->GetSessionDbcLocale(); - std::string name = set->name[m_session->GetSessionDbcLocale()]; + int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale(); + std::string name = set->name[loc]; if(name.empty()) continue; @@ -2442,10 +2590,10 @@ bool ChatHandler::HandleLookupItemSetCommand(const char* args) loc = 0; for(; loc < MAX_LOCALE; ++loc) { - if(loc==m_session->GetSessionDbcLocale()) + if(m_session && loc==m_session->GetSessionDbcLocale()) continue; - name = set->name[m_session->GetSessionDbcLocale()]; + name = set->name[loc]; if(name.empty()) continue; @@ -2457,7 +2605,10 @@ bool ChatHandler::HandleLookupItemSetCommand(const char* args) if(loc < MAX_LOCALE) { // send item set in "id - [namedlink locale]" format - PSendSysMessage(LANG_ITEMSET_LIST,id,id,name.c_str(),localeNames[loc]); + if (m_session) + PSendSysMessage(LANG_ITEMSET_LIST_CHAT,id,id,name.c_str(),localeNames[loc]); + else + PSendSysMessage(LANG_ITEMSET_LIST_CONSOLE,id,name.c_str(),localeNames[loc]); ++counter; } } @@ -2469,16 +2620,11 @@ bool ChatHandler::HandleLookupItemSetCommand(const char* args) bool ChatHandler::HandleLookupSkillCommand(const char* args) { - Player* target = getSelectedPlayer(); - if(!target) - { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); + if (!*args) return false; - } - if(!*args) - return false; + // can be NULL in console call + Player* target = getSelectedPlayer(); std::string namepart = args; std::wstring wnamepart; @@ -2497,7 +2643,7 @@ bool ChatHandler::HandleLookupSkillCommand(const char* args) SkillLineEntry const *skillInfo = sSkillLineStore.LookupEntry(id); if(skillInfo) { - int loc = m_session->GetSessionDbcLocale(); + int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale(); std::string name = skillInfo->name[loc]; if(name.empty()) continue; @@ -2507,7 +2653,7 @@ bool ChatHandler::HandleLookupSkillCommand(const char* args) loc = 0; for(; loc < MAX_LOCALE; ++loc) { - if(loc==m_session->GetSessionDbcLocale()) + if(m_session && loc==m_session->GetSessionDbcLocale()) continue; name = skillInfo->name[loc]; @@ -2521,8 +2667,15 @@ bool ChatHandler::HandleLookupSkillCommand(const char* args) if(loc < MAX_LOCALE) { + char const* knownStr = ""; + if(target && target->HasSkill(id)) + knownStr = GetTrinityString(LANG_KNOWN); + // send skill in "id - [namedlink locale]" format - PSendSysMessage(LANG_SKILL_LIST,id,id,name.c_str(),localeNames[loc],(target->HasSkill(id) ? m_session->GetTrinityString(LANG_KNOWN) : "")); + if (m_session) + PSendSysMessage(LANG_SKILL_LIST_CHAT,id,id,name.c_str(),localeNames[loc],knownStr); + else + PSendSysMessage(LANG_SKILL_LIST_CONSOLE,id,name.c_str(),localeNames[loc],knownStr); ++counter; } @@ -2535,16 +2688,11 @@ bool ChatHandler::HandleLookupSkillCommand(const char* args) bool ChatHandler::HandleLookupSpellCommand(const char* args) { - Player* target = getSelectedPlayer(); - if( !target ) - { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); + if (!*args) return false; - } - if(!*args) - return false; + // can be NULL at console call + Player* target = getSelectedPlayer(); std::string namepart = args; std::wstring wnamepart; @@ -2563,7 +2711,7 @@ bool ChatHandler::HandleLookupSpellCommand(const char* args) SpellEntry const *spellInfo = sSpellStore.LookupEntry(id); if(spellInfo) { - int loc = m_session->GetSessionDbcLocale(); + int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale(); std::string name = spellInfo->SpellName[loc]; if(name.empty()) continue; @@ -2573,7 +2721,7 @@ bool ChatHandler::HandleLookupSpellCommand(const char* args) loc = 0; for(; loc < MAX_LOCALE; ++loc) { - if(loc==m_session->GetSessionDbcLocale()) + if(m_session && loc==m_session->GetSessionDbcLocale()) continue; name = spellInfo->SpellName[loc]; @@ -2587,14 +2735,14 @@ bool ChatHandler::HandleLookupSpellCommand(const char* args) if(loc < MAX_LOCALE) { - bool known = target->HasSpell(id); + bool known = target && target->HasSpell(id); bool learn = (spellInfo->Effect[0] == SPELL_EFFECT_LEARN_SPELL); uint32 telentCost = GetTalentSpellCost(id); bool talent = (telentCost > 0); bool passive = IsPassiveSpell(id); - bool active = target->HasAura(id,0) || target->HasAura(id,1) || target->HasAura(id,2); + bool active = target && (target->HasAura(id,0) || target->HasAura(id,1) || target->HasAura(id,2)); // unit32 used to prevent interpreting uint8 as char at output // find rank of learned spell for learning spell, or talent rank @@ -2602,13 +2750,19 @@ bool ChatHandler::HandleLookupSpellCommand(const char* args) // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format std::ostringstream ss; - ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; + if (m_session) + ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; + else + ss << id << " - " << name; // include rank in link name if(rank) ss << GetTrinityString(LANG_SPELL_RANK) << rank; - ss << " " << localeNames[loc] << "]|h|r"; + if (m_session) + ss << " " << localeNames[loc] << "]|h|r"; + else + ss << " " << localeNames[loc]; if(talent) ss << GetTrinityString(LANG_TALENT); @@ -2634,16 +2788,11 @@ bool ChatHandler::HandleLookupSpellCommand(const char* args) bool ChatHandler::HandleLookupQuestCommand(const char* args) { - Player* target = getSelectedPlayer(); - if( !target ) - { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); + if (!*args) return false; - } - if(!*args) - return false; + // can be NULL at console call + Player* target = getSelectedPlayer(); std::string namepart = args; std::wstring wnamepart; @@ -2661,7 +2810,7 @@ bool ChatHandler::HandleLookupQuestCommand(const char* args) { Quest * qinfo = iter->second; - int loc_idx = m_session->GetSessionDbLocaleIndex(); + int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex(); if ( loc_idx >= 0 ) { QuestLocale const *il = objmgr.GetQuestLocale(qinfo->GetQuestId()); @@ -2673,20 +2822,28 @@ bool ChatHandler::HandleLookupQuestCommand(const char* args) if (Utf8FitTo(title, wnamepart)) { - QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId()); - char const* statusStr = ""; - if(status == QUEST_STATUS_COMPLETE) + + if(target) { - if(target->GetQuestRewardStatus(qinfo->GetQuestId())) - statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED); - else - statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE); + QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId()); + + if(status == QUEST_STATUS_COMPLETE) + { + if(target->GetQuestRewardStatus(qinfo->GetQuestId())) + statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED); + else + statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE); + } + else if(status == QUEST_STATUS_INCOMPLETE) + statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE); } - else if(status == QUEST_STATUS_INCOMPLETE) - statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE); + + if (m_session) + PSendSysMessage(LANG_QUEST_LIST_CHAT,qinfo->GetQuestId(),qinfo->GetQuestId(),title.c_str(),statusStr); + else + PSendSysMessage(LANG_QUEST_LIST_CONSOLE,qinfo->GetQuestId(),title.c_str(),statusStr); - PSendSysMessage(LANG_QUEST_LIST,qinfo->GetQuestId(),qinfo->GetQuestId(),title.c_str(),(status == QUEST_STATUS_COMPLETE ? GetTrinityString(LANG_COMPLETE) : (status == QUEST_STATUS_INCOMPLETE ? GetTrinityString(LANG_ACTIVE) : "") )); ++counter; continue; } @@ -2700,20 +2857,28 @@ bool ChatHandler::HandleLookupQuestCommand(const char* args) if (Utf8FitTo(title, wnamepart)) { - QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId()); - char const* statusStr = ""; - if(status == QUEST_STATUS_COMPLETE) + + if(target) { - if(target->GetQuestRewardStatus(qinfo->GetQuestId())) - statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED); - else - statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE); + QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId()); + + if(status == QUEST_STATUS_COMPLETE) + { + if(target->GetQuestRewardStatus(qinfo->GetQuestId())) + statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED); + else + statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE); + } + else if(status == QUEST_STATUS_INCOMPLETE) + statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE); } - else if(status == QUEST_STATUS_INCOMPLETE) - statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE); + + if (m_session) + PSendSysMessage(LANG_QUEST_LIST_CHAT,qinfo->GetQuestId(),qinfo->GetQuestId(),title.c_str(),statusStr); + else + PSendSysMessage(LANG_QUEST_LIST_CONSOLE,qinfo->GetQuestId(),title.c_str(),statusStr); - PSendSysMessage(LANG_QUEST_LIST,qinfo->GetQuestId(),qinfo->GetQuestId(), title.c_str(),(status == QUEST_STATUS_COMPLETE ? GetTrinityString(LANG_COMPLETE) : (status == QUEST_STATUS_INCOMPLETE ? GetTrinityString(LANG_ACTIVE) : "") )); ++counter; } } @@ -2726,39 +2891,43 @@ bool ChatHandler::HandleLookupQuestCommand(const char* args) bool ChatHandler::HandleLookupCreatureCommand(const char* args) { - if(!*args) + if (!*args) return false; std::string namepart = args; std::wstring wnamepart; // converting string that we try to find to lower case - if(!Utf8toWStr(namepart,wnamepart)) + if (!Utf8toWStr (namepart,wnamepart)) return false; - wstrToLower(wnamepart); + wstrToLower (wnamepart); uint32 counter = 0; - for (uint32 id = 0; id< sCreatureStorage.MaxEntry; id++ ) + for (uint32 id = 0; id< sCreatureStorage.MaxEntry; ++id) { - CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(id); + CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo> (id); if(!cInfo) continue; - int loc_idx = m_session->GetSessionDbLocaleIndex(); - if ( loc_idx >= 0 ) + int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex(); + if (loc_idx >= 0) { - CreatureLocale const *cl = objmgr.GetCreatureLocale(id); + CreatureLocale const *cl = objmgr.GetCreatureLocale (id); if (cl) { - if (cl->Name.size() > loc_idx && !cl->Name[loc_idx].empty()) + if (cl->Name.size() > loc_idx && !cl->Name[loc_idx].empty ()) { std::string name = cl->Name[loc_idx]; - if (Utf8FitTo(name, wnamepart)) + if (Utf8FitTo (name, wnamepart)) { - PSendSysMessage(LANG_CREATURE_ENTRY_LIST, id, id, name.c_str()); + if (m_session) + PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CHAT, id, id, name.c_str ()); + else + PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CONSOLE, id, name.c_str ()); + ++counter; continue; } @@ -2767,18 +2936,21 @@ bool ChatHandler::HandleLookupCreatureCommand(const char* args) } std::string name = cInfo->Name; - if(name.empty()) + if (name.empty ()) continue; if (Utf8FitTo(name, wnamepart)) { - PSendSysMessage(LANG_CREATURE_ENTRY_LIST,id,id,name.c_str()); + if (m_session) + PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CHAT, id, id, name.c_str ()); + else + PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CONSOLE, id, name.c_str ()); ++counter; } } if (counter==0) - SendSysMessage(LANG_COMMAND_NOCREATUREFOUND); + SendSysMessage (LANG_COMMAND_NOCREATUREFOUND); return true; } @@ -2805,7 +2977,7 @@ bool ChatHandler::HandleLookupObjectCommand(const char* args) if(!gInfo) continue; - int loc_idx = m_session->GetSessionDbLocaleIndex(); + int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex(); if ( loc_idx >= 0 ) { GameObjectLocale const *gl = objmgr.GetGameObjectLocale(id); @@ -2817,7 +2989,10 @@ bool ChatHandler::HandleLookupObjectCommand(const char* args) if (Utf8FitTo(name, wnamepart)) { - PSendSysMessage(LANG_GO_ENTRY_LIST, id, id, name.c_str()); + if (m_session) + PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, id, id, name.c_str()); + else + PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, id, name.c_str()); ++counter; continue; } @@ -2831,7 +3006,10 @@ bool ChatHandler::HandleLookupObjectCommand(const char* args) if(Utf8FitTo(name, wnamepart)) { - PSendSysMessage(LANG_GO_ENTRY_LIST, id, id, name.c_str()); + if (m_session) + PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, id, id, name.c_str()); + else + PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, id, name.c_str()); ++counter; } } @@ -2856,86 +3034,82 @@ bool ChatHandler::HandleGuildCreateCommand(const char* args) if (!*args) return false; - Guild *guild; - Player * player; - char *lname,*gname; - std::string guildname; - - lname = strtok((char*)args, " "); - gname = strtok(NULL, ""); + char *lname = strtok ((char*)args, " "); + char *gname = strtok (NULL, ""); - if(!lname) + if (!lname) return false; - else if(!gname) + + if (!gname) { - SendSysMessage(LANG_INSERT_GUILD_NAME); - SetSentErrorMessage(true); + SendSysMessage (LANG_INSERT_GUILD_NAME); + SetSentErrorMessage (true); return false; } - guildname = gname; - player = ObjectAccessor::Instance().FindPlayerByName(lname); + std::string guildname = gname; - if(!player) + Player* player = ObjectAccessor::Instance ().FindPlayerByName (lname); + if (!player) { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); + SendSysMessage (LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage (true); return false; } - if(!player->GetGuildId()) + if (player->GetGuildId()) { - guild = new Guild; - if(!guild->create(player->GetGUID(),guildname)) - { - delete guild; - SendSysMessage(LANG_GUILD_NOT_CREATED); - SetSentErrorMessage(true); - return false; - } + SendSysMessage (LANG_PLAYER_IN_GUILD); + return true; + } - objmgr.AddGuild(guild); + Guild *guild = new Guild; + if (!guild->create (player->GetGUID (),guildname)) + { + delete guild; + SendSysMessage (LANG_GUILD_NOT_CREATED); + SetSentErrorMessage (true); + return false; } - else - SendSysMessage(LANG_PLAYER_IN_GUILD); - + + objmgr.AddGuild (guild); return true; } bool ChatHandler::HandleGuildInviteCommand(const char *args) { - if(!*args) + if (!*args) return false; - char* par1 = strtok((char*)args, " "); + char* par1 = strtok ((char*)args, " "); char* par2 = strtok (NULL, ""); if(!par1 || !par2) return false; std::string glName = par2; - Guild* targetGuild = objmgr.GetGuildByName(glName); - if(!targetGuild) + Guild* targetGuild = objmgr.GetGuildByName (glName); + if (!targetGuild) return false; std::string plName = par1; - if(!normalizePlayerName(plName)) + if (!normalizePlayerName (plName)) { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); + SendSysMessage (LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage (true); return false; } uint64 plGuid = 0; - if(Player* targetPlayer = ObjectAccessor::Instance().FindPlayerByName(plName.c_str())) - plGuid = targetPlayer->GetGUID(); + if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ())) + plGuid = targetPlayer->GetGUID (); else - plGuid = objmgr.GetPlayerGUIDByName(plName.c_str()); + plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ()); - if(!plGuid) + if (!plGuid) false; // players's guild membership checked in AddMember before add - if(!targetGuild->AddMember(plGuid,targetGuild->GetLowestRank())) + if (!targetGuild->AddMember (plGuid,targetGuild->GetLowestRank ())) return false; return true; @@ -2943,107 +3117,109 @@ bool ChatHandler::HandleGuildInviteCommand(const char *args) bool ChatHandler::HandleGuildUninviteCommand(const char *args) { - if(!*args) + if (!*args) return false; - char* par1 = strtok((char*)args, " "); + char* par1 = strtok ((char*)args, " "); if(!par1) return false; + std::string plName = par1; - if(!normalizePlayerName(plName)) + if (!normalizePlayerName (plName)) { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); + SendSysMessage (LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage (true); return false; } uint64 plGuid = 0; uint32 glId = 0; - if(Player* targetPlayer = ObjectAccessor::Instance().FindPlayerByName(plName.c_str())) + if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ())) { - plGuid = targetPlayer->GetGUID(); - glId = targetPlayer->GetGuildId(); + plGuid = targetPlayer->GetGUID (); + glId = targetPlayer->GetGuildId (); } else { - plGuid = objmgr.GetPlayerGUIDByName(plName.c_str()); - glId = Player::GetGuildIdFromDB(plGuid); + plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ()); + glId = Player::GetGuildIdFromDB (plGuid); } - if(!plGuid || !glId) + if (!plGuid || !glId) return false; - Guild* targetGuild = objmgr.GetGuildById(glId); - if(!targetGuild) + Guild* targetGuild = objmgr.GetGuildById (glId); + if (!targetGuild) return false; - targetGuild->DelMember(plGuid); + targetGuild->DelMember (plGuid); return true; } bool ChatHandler::HandleGuildRankCommand(const char *args) { - if(!*args) + if (!*args) return false; - char* par1 = strtok((char*)args, " "); - char* par2 = strtok(NULL, " "); - if(!par1 || !par2) + char* par1 = strtok ((char*)args, " "); + char* par2 = strtok (NULL, " "); + if (!par1 || !par2) return false; + std::string plName = par1; - if(!normalizePlayerName(plName)) + if (!normalizePlayerName (plName)) { - SendSysMessage(LANG_PLAYER_NOT_FOUND); - SetSentErrorMessage(true); + SendSysMessage (LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage (true); return false; } uint64 plGuid = 0; uint32 glId = 0; - if(Player* targetPlayer = ObjectAccessor::Instance().FindPlayerByName(plName.c_str())) + if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ())) { - plGuid = targetPlayer->GetGUID(); - glId = targetPlayer->GetGuildId(); + plGuid = targetPlayer->GetGUID (); + glId = targetPlayer->GetGuildId (); } else { - plGuid = objmgr.GetPlayerGUIDByName(plName.c_str()); - glId = Player::GetGuildIdFromDB(plGuid); + plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ()); + glId = Player::GetGuildIdFromDB (plGuid); } - if(!plGuid || !glId) + if (!plGuid || !glId) return false; - Guild* targetGuild = objmgr.GetGuildById(glId); - if(!targetGuild) + Guild* targetGuild = objmgr.GetGuildById (glId); + if (!targetGuild) return false; - uint32 newrank = uint32(atoi(par2)); - if(newrank > targetGuild->GetLowestRank()) + uint32 newrank = uint32 (atoi (par2)); + if (newrank > targetGuild->GetLowestRank ()) return false; - targetGuild->ChangeRank(plGuid,newrank); + targetGuild->ChangeRank (plGuid,newrank); return true; } bool ChatHandler::HandleGuildDeleteCommand(const char* args) { - if(!*args) + if (!*args) return false; - char* par1 = strtok((char*)args, " "); - if(!par1) + char* par1 = strtok ((char*)args, " "); + if (!par1) return false; std::string gld = par1; - Guild* targetGuild = objmgr.GetGuildByName(gld); - if(!targetGuild) + Guild* targetGuild = objmgr.GetGuildByName (gld); + if (!targetGuild) return false; - targetGuild->Disband(); + targetGuild->Disband (); return true; } @@ -3471,11 +3647,6 @@ bool ChatHandler::HandleNearGraveCommand(const char* args) return true; } -bool ChatHandler::HandleSpawnTransportCommand(const char* /*args*/) -{ - return true; -} - //play npc emote bool ChatHandler::HandlePlayEmoteCommand(const char* args) { @@ -4720,238 +4891,470 @@ bool ChatHandler::HandleCompleteQuest(const char* args) return true; } -bool ChatHandler::HandleBanCommand(const char* args) +bool ChatHandler::HandleBanAccountCommand(const char* args) { - if(!args) - return false; + return HandleBanHelper(BAN_ACCOUNT,args); +} - char* type = strtok((char*)args, " "); +bool ChatHandler::HandleBanCharacterCommand(const char* args) +{ + return HandleBanHelper(BAN_CHARACTER,args); +} - if(!type) +bool ChatHandler::HandleBanIPCommand(const char* args) +{ + return HandleBanHelper(BAN_IP,args); +} + +bool ChatHandler::HandleBanHelper(BanMode mode, const char* args) +{ + if(!args) return false; - char* nameOrIP = strtok(NULL, " "); - if(!nameOrIP) + char* cnameOrIP = strtok ((char*)args, " "); + if (!cnameOrIP) return false; - char* duration = strtok(NULL," "); + std::string nameOrIP = cnameOrIP; + + char* duration = strtok (NULL," "); if(!duration || !atoi(duration)) return false; - char* reason = strtok(NULL,""); + char* reason = strtok (NULL,""); if(!reason) return false; - switch(sWorld.BanAccount(type, nameOrIP, duration, reason,m_session->GetPlayerName())) + switch(mode) + { + case BAN_ACCOUNT: + if(!AccountMgr::normilizeString(nameOrIP)) + { + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,nameOrIP.c_str()); + SetSentErrorMessage(true); + return false; + } + break; + case BAN_CHARACTER: + if(!normalizePlayerName(nameOrIP)) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + break; + case BAN_IP: + if(!IsIPAddress(nameOrIP.c_str())) + return false; + break; + } + + switch(sWorld.BanAccount(mode, nameOrIP, duration, reason,m_session ? m_session->GetPlayerName() : "")) { case BAN_SUCCESS: if(atoi(duration)>0) - PSendSysMessage(LANG_BAN_YOUBANNED,nameOrIP,secsToTimeString(TimeStringToSecs(duration),true).c_str(),reason); + PSendSysMessage(LANG_BAN_YOUBANNED,nameOrIP.c_str(),secsToTimeString(TimeStringToSecs(duration),true).c_str(),reason); else - PSendSysMessage(LANG_BAN_YOUPERMBANNED,nameOrIP,reason); + PSendSysMessage(LANG_BAN_YOUPERMBANNED,nameOrIP.c_str(),reason); break; case BAN_SYNTAX_ERROR: return false; case BAN_NOTFOUND: - PSendSysMessage(LANG_BAN_NOTFOUND,type,nameOrIP); - break; + switch(mode) + { + default: + PSendSysMessage(LANG_BAN_NOTFOUND,"account",nameOrIP.c_str()); + break; + case BAN_CHARACTER: + PSendSysMessage(LANG_BAN_NOTFOUND,"character",nameOrIP.c_str()); + break; + case BAN_IP: + PSendSysMessage(LANG_BAN_NOTFOUND,"ip",nameOrIP.c_str()); + break; + + } + SetSentErrorMessage(true); + return false; } return true; } -bool ChatHandler::HandleUnBanCommand(const char* args) +bool ChatHandler::HandleUnBanAccountCommand(const char* args) { - if(!args) - return false; - char* type = strtok((char*)args, " "); - if(!type) - return false; - char* nameOrIP = strtok(NULL, " "); - - if(!nameOrIP) - return false; + return HandleUnBanHelper(BAN_ACCOUNT,args); +} - if(sWorld.RemoveBanAccount(type,nameOrIP)) - PSendSysMessage(LANG_UNBAN_UNBANNED,nameOrIP); - else - PSendSysMessage(LANG_UNBAN_ERROR,nameOrIP); +bool ChatHandler::HandleUnBanCharacterCommand(const char* args) +{ + return HandleUnBanHelper(BAN_CHARACTER,args); +} - return true; +bool ChatHandler::HandleUnBanIPCommand(const char* args) +{ + return HandleUnBanHelper(BAN_IP,args); } -bool ChatHandler::HandleBanInfoCommand(const char* args) +bool ChatHandler::HandleUnBanHelper(BanMode mode, const char* args) { if(!args) return false; - char* cType = strtok((char*)args, " "); - char* cnameOrIP = strtok(NULL, ""); - if(!cType || !cnameOrIP) + char* cnameOrIP = strtok ((char*)args, " "); + if(!cnameOrIP) return false; std::string nameOrIP = cnameOrIP; - std::string type = cType; - if (!IsIPAddress(cnameOrIP) && type=="ip") - return false; - - Field *fields; - if(type != "ip") + switch(mode) { - //look the accountid up - uint32 accountid; - std::string accountname; - if(type == "account") - { - loginDatabase.escape_string(nameOrIP); - QueryResult *result = loginDatabase.PQuery("SELECT id, username FROM account WHERE username = '%s'",nameOrIP.c_str()); - if (!result) + case BAN_ACCOUNT: + if(!AccountMgr::normilizeString(nameOrIP)) { - PSendSysMessage(LANG_BANINFO_NOACCOUNT); - return true; - } - fields = result->Fetch(); - accountid = fields[0].GetUInt32(); - accountname = fields[1].GetCppString(); - delete result; - } - else if(type == "character") - { - if(!normalizePlayerName(nameOrIP)) + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,nameOrIP.c_str()); + SetSentErrorMessage(true); + return false; + } + break; + case BAN_CHARACTER: + if(!normalizePlayerName(nameOrIP)) { SendSysMessage(LANG_PLAYER_NOT_FOUND); SetSentErrorMessage(true); return false; } + break; + case BAN_IP: + if(!IsIPAddress(nameOrIP.c_str())) + return false; + break; + } - accountid = objmgr.GetPlayerAccountIdByPlayerName (nameOrIP); - if (!accountid) - { - PSendSysMessage(LANG_BANINFO_NOCHARACTER); - return true; - } - - if (!accmgr.GetName (accountid,accountname)) - { - PSendSysMessage(LANG_BANINFO_NOCHARACTER); - return true; - } - } - else - return false; + if(sWorld.RemoveBanAccount(mode,nameOrIP)) + PSendSysMessage(LANG_UNBAN_UNBANNED,nameOrIP.c_str()); + else + PSendSysMessage(LANG_UNBAN_ERROR,nameOrIP.c_str()); - QueryResult *result = loginDatabase.PQuery("SELECT FROM_UNIXTIME(bandate), unbandate-bandate, active, unbandate,banreason,bannedby FROM account_banned WHERE id = '%u' ORDER BY bandate ASC",accountid); - if(!result) - { - PSendSysMessage(LANG_BANINFO_NOACCOUNTBAN, accountname.c_str()); - return true; - } + return true; +} - PSendSysMessage(LANG_BANINFO_BANHISTORY,accountname.c_str()); - do - { - fields = result->Fetch(); - - time_t unbandate = time_t(fields[3].GetUInt64()); - bool active = false; - if(fields[2].GetBool() && (fields[1].GetUInt64() == (uint64)0 ||unbandate >= time(NULL)) ) - active = true; - bool permanent = (fields[1].GetUInt64() == (uint64)0); - std::string bantime = permanent?GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[1].GetUInt64(), true); - PSendSysMessage(LANG_BANINFO_HISTORYENTRY, - fields[0].GetString(), bantime.c_str(), active ? GetTrinityString(LANG_BANINFO_YES):GetTrinityString(LANG_BANINFO_NO), fields[4].GetString(), fields[5].GetString()); - }while (result->NextRow()); +bool ChatHandler::HandleBanInfoAccountCommand(const char* args) +{ + if(!args) + return false; - delete result; + char* cname = strtok((char*)args, ""); + if(!cname) + return false; + + std::string account_name = cname; + if(!AccountMgr::normilizeString(account_name)) + { + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); + return false; } - else + + uint32 accountid = accmgr.GetId(account_name); + if(!accountid) { - loginDatabase.escape_string(nameOrIP); - QueryResult *result = loginDatabase.PQuery("SELECT ip, FROM_UNIXTIME(bandate), FROM_UNIXTIME(unbandate), unbandate-UNIX_TIMESTAMP(), banreason,bannedby,unbandate-bandate FROM ip_banned WHERE ip = '%s'",nameOrIP.c_str()); - if(!result) - { - PSendSysMessage(LANG_BANINFO_NOIP); - return true; - } - fields = result->Fetch(); - bool permanent = (fields[6].GetUInt64()==(uint64)0); - PSendSysMessage(LANG_BANINFO_IPENTRY, - fields[0].GetString(), fields[1].GetString(), permanent ? GetTrinityString(LANG_BANINFO_NEVER):fields[2].GetString(), - permanent ? GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[3].GetUInt64(), true).c_str(), fields[4].GetString(), fields[5].GetString()); - delete result; + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + return true; } - return true; + + return HandleBanInfoHelper(accountid,account_name.c_str()); } -bool ChatHandler::HandleBanListCommand(const char* args) +bool ChatHandler::HandleBanInfoCharacterCommand(const char* args) { - loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate"); - if(!*args) + if(!args) return false; - char* cType = strtok((char*)args, " "); - char* cFilter = strtok(NULL, ""); - if(!cType || !cFilter) + + char* cname = strtok ((char*)args, ""); + if(!cname) return false; - std::string Filter = cFilter; - std::string Type = cType; - loginDatabase.escape_string(Filter); - QueryResult* result = NULL; - Field *fields = NULL; - if(Type == "ip") - { - result = loginDatabase.PQuery("SELECT ip FROM ip_banned WHERE ip "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),Filter.c_str()); - if(!result) - { - PSendSysMessage(LANG_BANLIST_NOIP); - return true; - } - PSendSysMessage(LANG_BANLIST_MATCHINGIP); - do - { - fields = result->Fetch(); - PSendSysMessage("%s",fields[0].GetString()); - } while (result->NextRow()); + std::string name = cname; + if(!normalizePlayerName(name)) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } - delete result; + uint32 accountid = objmgr.GetPlayerAccountIdByPlayerName(name); + if(!accountid) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + std::string accountname; + if(!accmgr.GetName(accountid,accountname)) + { + PSendSysMessage(LANG_BANINFO_NOCHARACTER); return true; } - //lookup accountid - if(Type == "account") + + return HandleBanInfoHelper(accountid,accountname.c_str()); +} + +bool ChatHandler::HandleBanInfoHelper(uint32 accountid, char const* accountname) +{ + QueryResult *result = loginDatabase.PQuery("SELECT FROM_UNIXTIME(bandate), unbandate-bandate, active, unbandate,banreason,bannedby FROM account_banned WHERE id = '%u' ORDER BY bandate ASC",accountid); + if(!result) { - result = loginDatabase.PQuery("SELECT id FROM account WHERE username "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),Filter.c_str()); - if (!result) - { - PSendSysMessage(LANG_BANLIST_NOACCOUNT); - return true; - } - //do not delete result + PSendSysMessage(LANG_BANINFO_NOACCOUNTBAN, accountname); + return true; } - else if(Type == "characters") + + PSendSysMessage(LANG_BANINFO_BANHISTORY,accountname); + do { - result = CharacterDatabase.PQuery("SELECT account FROM characters, WHERE name "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),Filter.c_str()); - if (!result) - { - PSendSysMessage(LANG_BANLIST_NOCHARACTER); - return true; - } + Field* fields = result->Fetch(); + + time_t unbandate = time_t(fields[3].GetUInt64()); + bool active = false; + if(fields[2].GetBool() && (fields[1].GetUInt64() == (uint64)0 ||unbandate >= time(NULL)) ) + active = true; + bool permanent = (fields[1].GetUInt64() == (uint64)0); + std::string bantime = permanent?GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[1].GetUInt64(), true); + PSendSysMessage(LANG_BANINFO_HISTORYENTRY, + fields[0].GetString(), bantime.c_str(), active ? GetTrinityString(LANG_BANINFO_YES):GetTrinityString(LANG_BANINFO_NO), fields[4].GetString(), fields[5].GetString()); + }while (result->NextRow()); + + delete result; + return true; +} + +bool ChatHandler::HandleBanInfoIPCommand(const char* args) +{ + if(!args) + return false; + + char* cIP = strtok ((char*)args, ""); + if(!cIP) + return false; + + if (!IsIPAddress(cIP)) + return false; + + std::string IP = cIP; + + loginDatabase.escape_string(IP); + QueryResult *result = loginDatabase.PQuery("SELECT ip, FROM_UNIXTIME(bandate), FROM_UNIXTIME(unbandate), unbandate-UNIX_TIMESTAMP(), banreason,bannedby,unbandate-bandate FROM ip_banned WHERE ip = '%s'",IP.c_str()); + if(!result) + { + PSendSysMessage(LANG_BANINFO_NOIP); + return true; } - else + + Field *fields = result->Fetch(); + bool permanent = !fields[6].GetUInt64(); + PSendSysMessage(LANG_BANINFO_IPENTRY, + fields[0].GetString(), fields[1].GetString(), permanent ? GetTrinityString(LANG_BANINFO_NEVER):fields[2].GetString(), + permanent ? GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[3].GetUInt64(), true).c_str(), fields[4].GetString(), fields[5].GetString()); + delete result; + return true; +} + +bool ChatHandler::HandleBanListCharacterCommand(const char* args) +{ + loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate"); + + char* cFilter = strtok ((char*)args, " "); + if(!cFilter) return false; + std::string filter = cFilter; + loginDatabase.escape_string(filter); + QueryResult* result = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),filter.c_str()); + if (!result) + { + PSendSysMessage(LANG_BANLIST_NOCHARACTER); + return true; + } + + return HandleBanListHelper(result); +} + +bool ChatHandler::HandleBanListAccountCommand(const char* args) +{ + loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate"); + + char* cFilter = strtok((char*)args, " "); + std::string filter = cFilter ? cFilter : ""; + loginDatabase.escape_string(filter); + + QueryResult* result; + + if(filter.empty()) + { + result = loginDatabase.Query("SELECT account.id, username FROM account, account_banned" + " WHERE account.id = account_banned.id AND active = 1 GROUP BY account.id"); + } + else + { + result = loginDatabase.PQuery("SELECT account.id, username FROM account, account_banned" + " WHERE account.id = account_banned.id AND active = 1 AND username "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'")" GROUP BY account.id", + filter.c_str()); + } + + if (!result) + { + PSendSysMessage(LANG_BANLIST_NOACCOUNT); + return true; + } + + return HandleBanListHelper(result); +} + +bool ChatHandler::HandleBanListHelper(QueryResult* result) +{ PSendSysMessage(LANG_BANLIST_MATCHINGACCOUNT); - do + + // Chat short output + if(m_session) { - fields = result->Fetch(); - uint32 accountid = fields[0].GetUInt32(); - QueryResult* banresult = loginDatabase.PQuery("SELECT account.username FROM account,account_banned WHERE account_banned.id='%u' AND account_banned.active = '1' AND account_banned.id=account.id",accountid); - if(banresult) + do + { + Field* fields = result->Fetch(); + uint32 accountid = fields[0].GetUInt32(); + + QueryResult* banresult = loginDatabase.PQuery("SELECT account.username FROM account,account_banned WHERE account_banned.id='%u' AND account_banned.id=account.id",accountid); + if(banresult) + { + Field* fields2 = banresult->Fetch(); + PSendSysMessage("%s",fields2[0].GetString()); + delete banresult; + } + } while (result->NextRow()); + } + // Console wide output + else + { + SendSysMessage(LANG_BANLIST_ACCOUNTS); + SendSysMessage("==============================================================================="); + SendSysMessage(LANG_BANLIST_ACCOUNTS_HEADER); + do + { + SendSysMessage("-------------------------------------------------------------------------------"); + Field *fields = result->Fetch(); + uint32 account_id = fields[0].GetUInt32 (); + + std::string account_name; + + // "account" case, name can be get in same quary + if(result->GetFieldCount() > 1) + account_name = fields[1].GetCppString(); + // "character" case, name need extract from another DB + else + accmgr.GetName (account_id,account_name); + + // No SQL injection. id is uint32. + QueryResult *banInfo = loginDatabase.PQuery("SELECT bandate,unbandate,bannedby,banreason FROM account_banned WHERE id = %u ORDER BY unbandate", account_id); + if (banInfo) + { + Field *fields2 = banInfo->Fetch(); + do + { + time_t t_ban = fields2[0].GetUInt64(); + tm* aTm_ban = localtime(&t_ban); + + if (fields2[0].GetUInt64() == fields2[1].GetUInt64()) + { + PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|", + account_name.c_str(),aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min, + fields2[2].GetString(),fields2[3].GetString()); + } + else + { + time_t t_unban = fields2[1].GetUInt64(); + tm* aTm_unban = localtime(&t_unban); + PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|", + account_name.c_str(),aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min, + aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min, + fields2[2].GetString(),fields2[3].GetString()); + } + }while ( banInfo->NextRow() ); + delete banInfo; + } + }while( result->NextRow() ); + SendSysMessage("==============================================================================="); + } + + delete result; + return true; +} + +bool ChatHandler::HandleBanListIPCommand(const char* args) +{ + loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate"); + + char* cFilter = strtok((char*)args, " "); + std::string filter = cFilter ? cFilter : ""; + loginDatabase.escape_string(filter); + + QueryResult* result; + + if(filter.empty()) + { + result = loginDatabase.Query ("SELECT ip,bandate,unbandate,bannedby,banreason FROM ip_banned" + " WHERE (bandate=unbandate OR unbandate>UNIX_TIMESTAMP())" + " ORDER BY unbandate" ); + } + else + { + result = loginDatabase.PQuery( "SELECT ip,bandate,unbandate,bannedby,banreason FROM ip_banned" + " WHERE (bandate=unbandate OR unbandate>UNIX_TIMESTAMP()) AND ip "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'") + " ORDER BY unbandate",filter.c_str() ); + } + + if(!result) + { + PSendSysMessage(LANG_BANLIST_NOIP); + return true; + } + + PSendSysMessage(LANG_BANLIST_MATCHINGIP); + // Chat short output + if(m_session) + { + do + { + Field* fields = result->Fetch(); + PSendSysMessage("%s",fields[0].GetString()); + }while (result->NextRow()); + } + // Console wide output + else + { + SendSysMessage(LANG_BANLIST_IPS);SendSysMessage("==============================================================================="); + SendSysMessage(LANG_BANLIST_IPS_HEADER); + do { - Field* fields2 = banresult->Fetch(); - PSendSysMessage("%s",fields2[0].GetString()); - delete banresult; - } - } while (result->NextRow()); + SendSysMessage("-------------------------------------------------------------------------------"); + Field *fields = result->Fetch(); + time_t t_ban = fields[1].GetUInt64(); + tm* aTm_ban = localtime(&t_ban); + if ( fields[1].GetUInt64() == fields[2].GetUInt64() ) + { + PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|", + fields[0].GetString(), aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min, + fields[3].GetString(), fields[4].GetString()); + } + else + { + time_t t_unban = fields[2].GetUInt64(); + tm* aTm_unban = localtime(&t_unban); + PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|", + fields[0].GetString(), aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min, + aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min, + fields[3].GetString(), fields[4].GetString()); + } + }while( result->NextRow() ); + SendSysMessage("==============================================================================="); + } delete result; return true; @@ -5012,37 +5415,111 @@ bool ChatHandler::HandleFlyModeCommand(const char* args) bool ChatHandler::HandleLoadPDumpCommand(const char *args) { - if(!args) + if (!args) return false; - char * file = strtok((char*)args, " "); if(!file) return false; - char * acc = strtok(NULL, " "); if(!acc) return false; - if(!file || !acc) + char * file = strtok((char*)args, " "); + if(!file) + return false; + + char * account = strtok(NULL, " "); + if(!account) + return false; + + std::string account_name = account; + if(!AccountMgr::normilizeString(account_name)) + { + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); return false; + } - uint32 account_id = accmgr.GetId(acc); + uint32 account_id = accmgr.GetId(account_name); if(!account_id) { - account_id = atoi(acc); - if(account_id) + account_id = atoi(account); // use original string + if(!account_id) { - std::string acc_name; - if(!accmgr.GetName(account_id,acc_name)) - return false; + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); + return false; } - else + } + + if(!accmgr.GetName(account_id,account_name)) + { + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); + return false; + } + + char* guid_str = NULL; + char* name_str = strtok(NULL, " "); + + std::string name; + if(name_str) + { + name = name_str; + // normalize the name if specified and check if it exists + if(!normalizePlayerName(name)) + { + PSendSysMessage(LANG_INVALID_CHARACTER_NAME); + SetSentErrorMessage(true); + return false; + } + + if(!ObjectMgr::IsValidName(name,true)) + { + PSendSysMessage(LANG_INVALID_CHARACTER_NAME); + SetSentErrorMessage(true); return false; - } - - char * name = strtok(NULL, " "); - char * guid_str = name ? strtok(NULL, " ") : NULL; - - uint32 guid = guid_str ? atoi(guid_str) : 0; - - if(PlayerDumpReader().LoadDump(file, account_id, name ? name : "", guid)) - PSendSysMessage(LANG_COMMAND_IMPORT_SUCCESS); - else - PSendSysMessage(LANG_COMMAND_IMPORT_FAILED); + } + + guid_str = strtok(NULL, " "); + } + + uint32 guid = 0; + + if(guid_str) + { + guid = atoi(guid_str); + if(!guid) + { + PSendSysMessage(LANG_INVALID_CHARACTER_GUID); + SetSentErrorMessage(true); + return false; + } + + if(objmgr.GetPlayerAccountIdByGUID(guid)) + { + PSendSysMessage(LANG_CHARACTER_GUID_IN_USE,guid); + SetSentErrorMessage(true); + return false; + } + } + + switch(PlayerDumpReader().LoadDump(file, account_id, name, guid)) + { + case DUMP_SUCCESS: + PSendSysMessage(LANG_COMMAND_IMPORT_SUCCESS); + break; + case DUMP_FILE_OPEN_ERROR: + PSendSysMessage(LANG_FILE_OPEN_FAIL,file); + SetSentErrorMessage(true); + return false; + case DUMP_FILE_BROKEN: + PSendSysMessage(LANG_DUMP_BROKEN,file); + SetSentErrorMessage(true); + return false; + case DUMP_TOO_MANY_CHARS: + PSendSysMessage(LANG_ACCOUNT_CHARACTER_LIST_FULL,account_name,account_id); + SetSentErrorMessage(true); + return false; + default: + PSendSysMessage(LANG_COMMAND_IMPORT_FAILED); + SetSentErrorMessage(true); + return false; + } return true; } @@ -5086,10 +5563,27 @@ bool ChatHandler::HandleWritePDumpCommand(const char *args) if(!guid) guid = atoi(p2); - if (PlayerDumpWriter().WriteDump(file, guid)) - PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS); - else - PSendSysMessage(LANG_COMMAND_EXPORT_FAILED); + if(!objmgr.GetPlayerAccountIdByGUID(guid)) + { + PSendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + switch(PlayerDumpWriter().WriteDump(file, guid)) + { + case DUMP_SUCCESS: + PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS); + break; + case DUMP_FILE_OPEN_ERROR: + PSendSysMessage(LANG_FILE_OPEN_FAIL,file); + SetSentErrorMessage(true); + return false; + default: + PSendSysMessage(LANG_COMMAND_EXPORT_FAILED); + SetSentErrorMessage(true); + return false; + } return true; } @@ -5573,6 +6067,135 @@ bool ChatHandler::HandleInstanceSaveDataCommand(const char * /*args*/) return true; } +/// Display the list of GMs +bool ChatHandler::HandleGMListFullCommand(const char* /*args*/) +{ + ///- Get the accounts with GM Level >0 + QueryResult *result = loginDatabase.Query( "SELECT username,gmlevel FROM account WHERE gmlevel > 0" ); + if(result) + { + SendSysMessage(LANG_GMLIST); + SendSysMessage("========================"); + SendSysMessage(LANG_GMLIST_HEADER); + SendSysMessage("========================"); + + ///- Circle through them. Display username and GM level + do + { + Field *fields = result->Fetch(); + PSendSysMessage("|%15s|%6s|", fields[0].GetString(),fields[1].GetString()); + } while( result->NextRow() ); + + PSendSysMessage("========================"); + delete result; + } + else + PSendSysMessage(LANG_GMLIST_EMPTY); + return true; +} + +/// Define the 'Message of the day' for the realm +bool ChatHandler::HandleServerSetMotdCommand(const char* args) +{ + sWorld.SetMotd(args); + PSendSysMessage(LANG_MOTD_NEW, args); + return true; +} + +/// Set/Unset the expansion level for an account +bool ChatHandler::HandleAccountSetAddonCommand(const char* args) +{ + ///- Get the command line arguments + char *szAcc = strtok((char*)args," "); + char *szExp = strtok(NULL," "); + + if(!szAcc) + return false; + + std::string account_name; + uint32 account_id; + + if(!szExp) + { + Player* player = getSelectedPlayer(); + if(!player) + return false; + + account_id = player->GetSession()->GetAccountId(); + accmgr.GetName(account_id,account_name); + szExp = szAcc; + } + else + { + ///- Convert Account name to Upper Format + account_name = szAcc; + if(!AccountMgr::normilizeString(account_name)) + { + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); + return false; + } + + account_id = accmgr.GetId(account_name); + if(!account_id) + { + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); + return false; + } + } + + int lev=atoi(szExp); //get int anyway (0 if error) + if(lev < 0) + return false; + + // No SQL injection + loginDatabase.PExecute("UPDATE account SET expansion = '%d' WHERE id = '%u'",lev,account_id); + PSendSysMessage(LANG_ACCOUNT_SETADDON,account_name.c_str(),account_id,lev); + return true; +} + +/// Send a message to a player in game +bool ChatHandler::HandleSendMessageCommand(const char* args) +{ + ///- Get the command line arguments + char* name_str = strtok((char*)args, " "); + char* msg_str = strtok(NULL, ""); + + if(!name_str || !msg_str) + return false; + + std::string name = name_str; + + if(!normalizePlayerName(name)) + return false; + + ///- Find the player and check that he is not logging out. + Player *rPlayer = objmgr.GetPlayer(name.c_str()); + if(!rPlayer) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + if(rPlayer->GetSession()->isLogingOut()) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + ///- Send the message + //Use SendAreaTriggerMessage for fastest delivery. + rPlayer->GetSession()->SendAreaTriggerMessage("%s", msg_str); + rPlayer->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r"); + + //Confirmation message + PSendSysMessage(LANG_SENDMESSAGE,name.c_str(),msg_str); + return true; +} + bool ChatHandler::HandleFreezeCommand(const char *args) { std::string name; diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h index 6567b4716bd..e1bc3dfcfef 100644 --- a/src/game/ObjectMgr.h +++ b/src/game/ObjectMgr.h @@ -680,6 +680,7 @@ class ObjectMgr } const char *GetTrinityString(int32 entry, int locale_idx) const; const char *GetTrinityStringForDBCLocale(int32 entry) const { return GetTrinityString(entry,DBCLocaleIndex); } + int32 GetDBCLocaleIndex() const { return DBCLocaleIndex; } void SetDBCLocaleIndex(uint32 lang) { DBCLocaleIndex = GetIndexForLocale(LocaleConstant(lang)); } void AddCorpseCellData(uint32 mapid, uint32 cellid, uint32 player_guid, uint32 instance); diff --git a/src/game/PlayerDump.cpp b/src/game/PlayerDump.cpp index e6f68122f9b..78f90bc9c9e 100644 --- a/src/game/PlayerDump.cpp +++ b/src/game/PlayerDump.cpp @@ -26,7 +26,7 @@ #include "ObjectMgr.h" // Character Dump tables -#define DUMP_TABLE_COUNT 20 +#define DUMP_TABLE_COUNT 19 struct DumpTable { @@ -258,11 +258,8 @@ void StoreGUID(QueryResult *result,uint32 data,uint32 field, std::set<uint32>& g } // Writing - High-level functions -bool PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type) +void PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type) { - if (!tableFrom || !tableTo) - return false; - GUIDs const* guids = NULL; char const* fieldname = NULL; @@ -280,7 +277,7 @@ bool PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tabl // for guid set stop if set is empty if(guids && guids->empty()) - return true; // nothing to do + return; // nothing to do // setup for guids case start position GUIDs::const_iterator guids_itr; @@ -298,7 +295,7 @@ bool PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tabl QueryResult *result = CharacterDatabase.PQuery("SELECT * FROM %s WHERE %s", tableFrom, wherestr.c_str()); if(!result) - return false; + return; do { @@ -328,8 +325,6 @@ bool PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tabl delete result; } while(guids && guids_itr != guids->end()); // not set case iterate single time, set case iterate for all guids - - return true; } std::string PlayerDumpWriter::GetDump(uint32 guid) @@ -338,28 +333,29 @@ std::string PlayerDumpWriter::GetDump(uint32 guid) for(int i = 0; i < DUMP_TABLE_COUNT; i++) DumpTable(dump, guid, dumpTables[i].name, dumpTables[i].name, dumpTables[i].type); - // TODO: Add instance/group/gifts.. + // TODO: Add instance/group.. // TODO: Add a dump level option to skip some non-important tables return dump; } -bool PlayerDumpWriter::WriteDump(std::string file, uint32 guid) +DumpReturn PlayerDumpWriter::WriteDump(std::string file, uint32 guid) { FILE *fout = fopen(file.c_str(), "w"); - if (!fout) { sLog.outError("Failed to open file!\r\n"); return false; } + if (!fout) + return DUMP_FILE_OPEN_ERROR; std::string dump = GetDump(guid); fprintf(fout,"%s\n",dump.c_str()); fclose(fout); - return true; + return DUMP_SUCCESS; } // Reading - High-level functions -#define ROLLBACK {CharacterDatabase.RollbackTransaction(); fclose(fin); return false;} +#define ROLLBACK(DR) {CharacterDatabase.RollbackTransaction(); fclose(fin); return (DR);} -bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string name, uint32 guid) +DumpReturn PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string name, uint32 guid) { // check character count { @@ -372,13 +368,12 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na delete result; if (charcount >= 10) - { - return false; - } + return DUMP_TOO_MANY_CHARS; } } FILE *fin = fopen(file.c_str(), "r"); - if(!fin) return false; + if(!fin) + return DUMP_FILE_OPEN_ERROR; QueryResult * result = NULL; char newguid[20], chraccount[20], newpetid[20], currpetid[20], lastpetid[20]; @@ -434,8 +429,7 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na if(!fgets(buf, 32000, fin)) { if(feof(fin)) break; - sLog.outError("LoadPlayerDump: File read error!"); - ROLLBACK; + ROLLBACK(DUMP_FILE_BROKEN); } std::string line; line.assign(buf); @@ -449,7 +443,7 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na if(tn.empty()) { sLog.outError("LoadPlayerDump: Can't extract table name from line: '%s'!", line.c_str()); - ROLLBACK; + ROLLBACK(DUMP_FILE_BROKEN); } DumpTableType type; @@ -466,27 +460,37 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na if (i == DUMP_TABLE_COUNT) { sLog.outError("LoadPlayerDump: Unknown table: '%s'!", tn.c_str()); - ROLLBACK; + ROLLBACK(DUMP_FILE_BROKEN); } // change the data to server values switch(type) { case DTT_CHAR_TABLE: - if(!changenth(line, 1, newguid)) ROLLBACK; + if(!changenth(line, 1, newguid)) + ROLLBACK(DUMP_FILE_BROKEN); break; case DTT_CHARACTER: // character t. { - if(!changenth(line, 1, newguid)) ROLLBACK; + if(!changenth(line, 1, newguid)) + ROLLBACK(DUMP_FILE_BROKEN); // guid, data field:guid, items - if(!changenth(line, 2, chraccount)) ROLLBACK; + if(!changenth(line, 2, chraccount)) + ROLLBACK(DUMP_FILE_BROKEN); + std::string vals = getnth(line, 3); - if(!changetoknth(vals, OBJECT_FIELD_GUID+1, newguid)) ROLLBACK; + if(!changetoknth(vals, OBJECT_FIELD_GUID+1, newguid)) + ROLLBACK(DUMP_FILE_BROKEN); + for(uint16 field = PLAYER_FIELD_INV_SLOT_HEAD; field < PLAYER_FARSIGHT; field++) - if(!changetokGuid(vals, field+1, items, objmgr.m_hiItemGuid, true)) ROLLBACK; - if(!changenth(line, 3, vals.c_str())) ROLLBACK; + if(!changetokGuid(vals, field+1, items, objmgr.m_hiItemGuid, true)) + ROLLBACK(DUMP_FILE_BROKEN); + + if(!changenth(line, 3, vals.c_str())) + ROLLBACK(DUMP_FILE_BROKEN); + if (name == "") { // check if the original name already exists @@ -498,38 +502,51 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na { delete result; // rename on login: `at_login` field 30 in raw field list - if(!changenth(line, 30, "1")) ROLLBACK; + if(!changenth(line, 30, "1")) + ROLLBACK(DUMP_FILE_BROKEN); } } - else if(!changenth(line, 4, name.c_str())) ROLLBACK; + else if(!changenth(line, 4, name.c_str())) + ROLLBACK(DUMP_FILE_BROKEN); break; } case DTT_INVENTORY: // character_inventory t. { - if(!changenth(line, 1, newguid)) ROLLBACK; + if(!changenth(line, 1, newguid)) + ROLLBACK(DUMP_FILE_BROKEN); // bag, item - if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid, true)) ROLLBACK; - if(!changeGuid(line, 4, items, objmgr.m_hiItemGuid)) ROLLBACK; + if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid, true)) + ROLLBACK(DUMP_FILE_BROKEN); + if(!changeGuid(line, 4, items, objmgr.m_hiItemGuid)) + ROLLBACK(DUMP_FILE_BROKEN); break; } case DTT_ITEM: // item_instance t. { // item, owner, data field:item, owner guid - if(!changeGuid(line, 1, items, objmgr.m_hiItemGuid)) ROLLBACK; - if(!changenth(line, 2, newguid)) ROLLBACK; + if(!changeGuid(line, 1, items, objmgr.m_hiItemGuid)) + ROLLBACK(DUMP_FILE_BROKEN); + if(!changenth(line, 2, newguid)) + ROLLBACK(DUMP_FILE_BROKEN); + std::string vals = getnth(line,3); - if(!changetokGuid(vals, OBJECT_FIELD_GUID+1, items, objmgr.m_hiItemGuid)) ROLLBACK; - if(!changetoknth(vals, ITEM_FIELD_OWNER+1, newguid)) ROLLBACK; - if(!changenth(line, 3, vals.c_str())) ROLLBACK; + if(!changetokGuid(vals, OBJECT_FIELD_GUID+1, items, objmgr.m_hiItemGuid)) + ROLLBACK(DUMP_FILE_BROKEN); + if(!changetoknth(vals, ITEM_FIELD_OWNER+1, newguid)) + ROLLBACK(DUMP_FILE_BROKEN); + if(!changenth(line, 3, vals.c_str())) + ROLLBACK(DUMP_FILE_BROKEN); break; } case DTT_ITEM_GIFT: // character_gift { // guid,item_guid, - if(!changenth(line, 1, newguid)) ROLLBACK; - if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) ROLLBACK; + if(!changenth(line, 1, newguid)) + ROLLBACK(DUMP_FILE_BROKEN); + if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) + ROLLBACK(DUMP_FILE_BROKEN); break; } case DTT_PET: // character_pet t @@ -551,8 +568,10 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na } // item, entry, owner, ... - if(!changenth(line, 1, newpetid)) ROLLBACK; - if(!changenth(line, 3, newguid)) ROLLBACK; + if(!changenth(line, 1, newpetid)) + ROLLBACK(DUMP_FILE_BROKEN); + if(!changenth(line, 3, newguid)) + ROLLBACK(DUMP_FILE_BROKEN); break; } @@ -562,27 +581,34 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na // lookup currpetid and match to new inserted pet id std::map<uint32, uint32> :: const_iterator petids_iter = petids.find(atoi(currpetid)); - if(petids_iter == petids.end()) ROLLBACK; // couldn't find new inserted id + if(petids_iter == petids.end()) // couldn't find new inserted id + ROLLBACK(DUMP_FILE_BROKEN); snprintf(newpetid, 20, "%d", petids_iter->second); - if(!changenth(line, 1, newpetid)) ROLLBACK; + if(!changenth(line, 1, newpetid)) + ROLLBACK(DUMP_FILE_BROKEN); break; } case DTT_MAIL: // mail { // id,messageType,stationery,sender,receiver - if(!changeGuid(line, 1, mails, objmgr.m_mailid)) ROLLBACK; - if(!changenth(line, 5, newguid)) ROLLBACK; + if(!changeGuid(line, 1, mails, objmgr.m_mailid)) + ROLLBACK(DUMP_FILE_BROKEN); + if(!changenth(line, 5, newguid)) + ROLLBACK(DUMP_FILE_BROKEN); break; } case DTT_MAIL_ITEM: // mail_items { // mail_id,item_guid,item_template,receiver - if(!changeGuid(line, 1, mails, objmgr.m_mailid)) ROLLBACK; - if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) ROLLBACK; - if(!changenth(line, 4, newguid)) ROLLBACK; + if(!changeGuid(line, 1, mails, objmgr.m_mailid)) + ROLLBACK(DUMP_FILE_BROKEN); + if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) + ROLLBACK(DUMP_FILE_BROKEN); + if(!changenth(line, 4, newguid)) + ROLLBACK(DUMP_FILE_BROKEN); break; } default: @@ -590,7 +616,8 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na break; } - if(!CharacterDatabase.Execute(line.c_str())) ROLLBACK; + if(!CharacterDatabase.Execute(line.c_str())) + ROLLBACK(DUMP_FILE_BROKEN); } CharacterDatabase.CommitTransaction(); @@ -603,5 +630,5 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na fclose(fin); - return true; + return DUMP_SUCCESS; } diff --git a/src/game/PlayerDump.h b/src/game/PlayerDump.h index 6f5b6eed1e7..af5462e1fd6 100644 --- a/src/game/PlayerDump.h +++ b/src/game/PlayerDump.h @@ -73,6 +73,15 @@ enum DumpTableType DTT_ITEM_TEXT, // <- item_text // item_text }; +enum DumpReturn +{ + DUMP_SUCCESS, + DUMP_FILE_OPEN_ERROR, + DUMP_TOO_MANY_CHARS, + DUMP_UNEXPECTED_END, + DUMP_FILE_BROKEN, +}; + class PlayerDump { protected: @@ -85,11 +94,11 @@ class PlayerDumpWriter : public PlayerDump PlayerDumpWriter() {} std::string GetDump(uint32 guid); - bool WriteDump(std::string file, uint32 guid); + DumpReturn WriteDump(std::string file, uint32 guid); private: typedef std::set<uint32> GUIDs; - bool DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type); + void DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type); std::string GenerateWhereStr(char const* field, GUIDs const& guids, GUIDs::const_iterator& itr); std::string GenerateWhereStr(char const* field, uint32 guid); @@ -104,7 +113,7 @@ class PlayerDumpReader : public PlayerDump public: PlayerDumpReader() {} - bool LoadDump(std::string file, uint32 account, std::string name, uint32 guid); + DumpReturn LoadDump(std::string file, uint32 account, std::string name, uint32 guid); }; #endif diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index f950a9ceb6c..26cd729f887 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -2167,4 +2167,20 @@ enum ResponseCodes CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 0x59, CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 0x5A, }; + +/// Ban function modes +enum BanMode +{ + BAN_ACCOUNT, + BAN_CHARACTER, + BAN_IP +}; + +/// Ban function return codes +enum BanReturn +{ + BAN_SUCCESS, + BAN_SYNTAX_ERROR, + BAN_NOTFOUND +}; #endif diff --git a/src/game/World.cpp b/src/game/World.cpp index 8bdea8996ec..de89643257f 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -2264,45 +2264,43 @@ bool World::KickPlayer(std::string playerName) } /// Ban an account or ban an IP address, duration will be parsed using TimeStringToSecs if it is positive, otherwise permban -uint8 World::BanAccount(std::string type, std::string nameOrIP, std::string duration, std::string reason, std::string author) +BanReturn World::BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author) { loginDatabase.escape_string(nameOrIP); loginDatabase.escape_string(reason); std::string safe_author=author; loginDatabase.escape_string(safe_author); - if(type != "ip" && !normalizePlayerName(nameOrIP)) - return BAN_NOTFOUND; // Nobody to ban - uint32 duration_secs = TimeStringToSecs(duration); QueryResult *resultAccounts = NULL; //used for kicking ///- Update the database with ban information - - if(type=="ip") - { - //No SQL injection as strings are escaped - resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE last_ip = '%s'",nameOrIP.c_str()); - loginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+%u,'%s','%s')",nameOrIP.c_str(),duration_secs,safe_author.c_str(),reason.c_str()); + switch(mode) + { + case BAN_IP: + //No SQL injection as strings are escaped + resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE last_ip = '%s'",nameOrIP.c_str()); + loginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+%u,'%s','%s')",nameOrIP.c_str(),duration_secs,safe_author.c_str(),reason.c_str()); + break; + case BAN_ACCOUNT: + //No SQL injection as string is escaped + resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",nameOrIP.c_str()); + break; + case BAN_CHARACTER: + //No SQL injection as string is escaped + resultAccounts = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name = '%s'",nameOrIP.c_str()); + break; + default: + return BAN_SYNTAX_ERROR; } - else if(type=="account") - { - //No SQL injection as string is escaped - resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",nameOrIP.c_str()); - } - else if(type=="character") - { - //No SQL injection as string is escaped - resultAccounts = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name = '%s'",nameOrIP.c_str()); - } - else - return BAN_SYNTAX_ERROR; //Syntax problem - - if(!resultAccounts) - if(type=="ip") - return BAN_SUCCESS; // ip correctly banned but nobody affected (yet) - else - return BAN_NOTFOUND; // Nobody to ban + + if(!resultAccounts) + { + if(mode==BAN_IP) + return BAN_SUCCESS; + else + return BAN_NOTFOUND; // Nobody to ban + } ///- Disconnect all affected players (for IP it can be several) do @@ -2310,13 +2308,14 @@ uint8 World::BanAccount(std::string type, std::string nameOrIP, std::string dura Field* fieldsAccount = resultAccounts->Fetch(); uint32 account = fieldsAccount->GetUInt32(); - if(type != "ip") + if(mode!=BAN_IP) + { //No SQL injection as strings are escaped loginDatabase.PExecute("INSERT INTO account_banned VALUES ('%u', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+%u, '%s', '%s', '1')", account,duration_secs,safe_author.c_str(),reason.c_str()); + } - WorldSession* sess = FindSession(account); - if( sess ) + if (WorldSession* sess = FindSession(account)) if(std::string(sess->GetPlayerName()) != author) sess->KickPlayer(); } @@ -2327,9 +2326,9 @@ uint8 World::BanAccount(std::string type, std::string nameOrIP, std::string dura } /// Remove a ban from an account or IP address -bool World::RemoveBanAccount(std::string type, std::string nameOrIP) +bool World::RemoveBanAccount(BanMode mode, std::string nameOrIP) { - if(type == "ip") + if (mode == BAN_IP) { loginDatabase.escape_string(nameOrIP); loginDatabase.PExecute("DELETE FROM ip_banned WHERE ip = '%s'",nameOrIP.c_str()); @@ -2337,20 +2336,11 @@ bool World::RemoveBanAccount(std::string type, std::string nameOrIP) else { uint32 account=0; - if(type == "account") - { - if (!AccountMgr::normilizeString (nameOrIP)) - return false; - + if (mode == BAN_ACCOUNT) account = accmgr.GetId (nameOrIP); - } - else if(type == "character") - { - if(!normalizePlayerName(nameOrIP)) - return false; - + else if (mode == BAN_CHARACTER) account = objmgr.GetPlayerAccountIdByPlayerName (nameOrIP); - } + if(!account) return false; @@ -2503,20 +2493,24 @@ void World::UpdateSessions( time_t diff ) // This handles the issued and queued CLI commands void World::ProcessCliCommands() { - if (cliCmdQueue.empty()) return; + if (cliCmdQueue.empty()) + return; - CliCommandHolder *command; - pPrintf p_zprintf; + CliCommandHolder::Print* zprint; while (!cliCmdQueue.empty()) { sLog.outDebug("CLI command under processing..."); - command = cliCmdQueue.next(); - command->Execute(); - p_zprintf=command->GetOutputMethod(); + CliCommandHolder *command = cliCmdQueue.next(); + + zprint = command->m_print; + + CliHandler(zprint).ParseCommands(command->m_command); + delete command; } + // print the console message here so it looks right - p_zprintf("TC> "); + zprint("TC> "); } void World::InitResultQueue() diff --git a/src/game/World.h b/src/game/World.h index 764c442d5a3..26746fa71de 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -28,6 +28,7 @@ #include "Common.h" #include "Timer.h" #include "Policies/Singleton.h" +#include "SharedDefines.h" #include <map> #include <set> @@ -40,7 +41,6 @@ class Player; class Weather; struct ScriptAction; struct ScriptInfo; -class CliCommandHolder; class SqlResultQueue; class QueryResult; class WorldSocket; @@ -296,14 +296,6 @@ enum RealmZone REALM_ZONE_CN9 = 29 // basic-Latin at create, any at login }; -/// Ban function return codes -enum BanReturn -{ - BAN_SUCCESS, - BAN_SYNTAX_ERROR, - BAN_NOTFOUND -}; - // DB scripting commands #define SCRIPT_COMMAND_TALK 0 // source = unit, target=any, datalong ( 0=say, 1=whisper, 2=yell, 3=emote text) #define SCRIPT_COMMAND_EMOTE 1 // source = unit, datalong = anim_id @@ -321,37 +313,23 @@ enum BanReturn #define SCRIPT_COMMAND_REMOVE_AURA 14 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id #define SCRIPT_COMMAND_CAST_SPELL 15 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id -/// CLI related stuff, define here to prevent cyclic dependancies +/// Storage class for commands issued for delayed execution +struct CliCommandHolder +{ + typedef void Print(const char*); -typedef int(* pPrintf)(const char*,...); -typedef void(* pCliFunc)(char *,pPrintf); + char *m_command; + Print* m_print; -/// Command Template class -struct CliCommand -{ - char const * cmd; - pCliFunc Func; - char const * description; -}; + CliCommandHolder(const char *command, Print* zprint) + : m_print(zprint) + { + size_t len = strlen(command)+1; + m_command = new char[len]; + memcpy(m_command, command, len); + } -/// Storage class for commands issued for delayed execution -class CliCommandHolder -{ - private: - const CliCommand *cmd; - char *args; - pPrintf m_zprintf; - public: - CliCommandHolder(const CliCommand *command, const char *arguments, pPrintf p_zprintf) - : cmd(command), m_zprintf(p_zprintf) - { - size_t len = strlen(arguments)+1; - args = new char[len]; - memcpy(args, arguments, len); - } - ~CliCommandHolder() { delete[] args; } - void Execute() const { cmd->Func(args, m_zprintf); } - pPrintf GetOutputMethod() const {return (m_zprintf);} + ~CliCommandHolder() { delete[] m_command; } }; /// The World @@ -474,8 +452,8 @@ class World void KickAll(); void KickAllLess(AccountTypes sec); void KickAllQueued(); - uint8 BanAccount(std::string type, std::string nameOrIP, std::string duration, std::string reason, std::string author); - bool RemoveBanAccount(std::string type, std::string nameOrIP); + BanReturn BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author); + bool RemoveBanAccount(BanMode mode, std::string nameOrIP); void ScriptsStart(std::map<uint32, std::multimap<uint32, ScriptInfo> > const& scripts, uint32 id, Object* source, Object* target); void ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* source, Object* target); @@ -492,7 +470,7 @@ class World static float GetVisibleObjectGreyDistance() { return m_VisibleObjectGreyDistance; } void ProcessCliCommands(); - void QueueCliCommand(CliCommandHolder* command) { cliCmdQueue.add(command); } + void QueueCliCommand( CliCommandHolder::Print* zprintf, char const* input ) { cliCmdQueue.add(new CliCommandHolder(input, zprintf)); } void UpdateResultQueue(); void InitResultQueue(); diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 9583df10cb1..7d9e2a365ac 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -466,7 +466,7 @@ void WorldSession::SendNotification(int32 string_id,...) } } -const char * WorldSession::GetTrinityString( int32 entry ) +const char * WorldSession::GetTrinityString( int32 entry ) const { return objmgr.GetTrinityString(entry,GetSessionDbLocaleIndex()); } diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index 346184f6a24..fc3866868cd 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -194,9 +194,9 @@ class TRINITY_DLL_SPEC WorldSession time_t m_muteTime; // Locales - LocaleConstant GetSessionDbcLocale() { return m_sessionDbcLocale; } - int GetSessionDbLocaleIndex() { return m_sessionDbLocaleIndex; } - const char *GetTrinityString(int32 entry); + LocaleConstant GetSessionDbcLocale() const { return m_sessionDbcLocale; } + int GetSessionDbLocaleIndex() const { return m_sessionDbLocaleIndex; } + const char *GetTrinityString(int32 entry) const; uint32 GetLatency() const { return m_latency; } void SetLatency(uint32 latency) { m_latency = latency; } diff --git a/src/shared/Common.h b/src/shared/Common.h index 96071437931..34a35800ad2 100644 --- a/src/shared/Common.h +++ b/src/shared/Common.h @@ -169,7 +169,8 @@ enum AccountTypes SEC_PLAYER = 0, SEC_MODERATOR = 1, SEC_GAMEMASTER = 2, - SEC_ADMINISTRATOR = 3 + SEC_ADMINISTRATOR = 3, + SEC_CONSOLE = 4 // must be always last in list, accounts must have less security level always also }; enum LocaleConstant diff --git a/src/trinitycore/CliRunnable.cpp b/src/trinitycore/CliRunnable.cpp index 33544435e3b..9c464fde9ef 100644 --- a/src/trinitycore/CliRunnable.cpp +++ b/src/trinitycore/CliRunnable.cpp @@ -27,7 +27,6 @@ #include "Log.h" #include "World.h" #include "ScriptCalls.h" -#include "GlobalEvents.h" #include "ObjectMgr.h" #include "WorldSession.h" #include "SystemConfig.h" @@ -36,254 +35,109 @@ #include "AccountMgr.h" #include "CliRunnable.h" #include "MapManager.h" -#include "PlayerDump.h" #include "Player.h" +#include "Chat.h" -//CliCommand and CliCommandHolder are defined in World.h to avoid cyclic deps - -//func prototypes must be defined - -void CliHelp(char*,pPrintf); -void CliInfo(char*,pPrintf); -void CliBan(char*,pPrintf); -void CliBanList(char*,pPrintf); -void CliRemoveBan(char*,pPrintf); -void CliSetGM(char*,pPrintf); -void CliListGM(char*,pPrintf); -void CliVersion(char*,pPrintf); -void CliExit(char*,pPrintf); -void CliIdleRestart(char*,pPrintf zprintf); -void CliRestart(char*,pPrintf zprintf); -void CliIdleShutdown(char*,pPrintf zprintf); -void CliShutdown(char*,pPrintf zprintf); -void CliBroadcast(char*,pPrintf); -void CliCreate(char*,pPrintf); -void CliDelete(char*,pPrintf); -void CliCharDelete(char *,pPrintf); -void CliLoadScripts(char*,pPrintf); -void CliKick(char*,pPrintf); -void CliTele(char*,pPrintf); -void CliMotd(char*,pPrintf); -void CliCorpses(char*,pPrintf); -void CliSetLogLevel(char*,pPrintf); -void CliUpTime(char*,pPrintf); -void CliSetAddon(char*,pPrintf); -void CliWritePlayerDump(char*,pPrintf); -void CliLoadPlayerDump(char*,pPrintf); -void CliSave(char*,pPrintf); -void CliSend(char*,pPrintf); -void CliPLimit(char*,pPrintf); -void CliSetPassword(char*,pPrintf); -/// Table of known commands -const CliCommand Commands[]= +void utf8print(const char* str) { - {"help", & CliHelp,"Display this help message"}, - {"broadcast", & CliBroadcast,"Announce in-game message"}, - {"create", & CliCreate,"Create account"}, - {"delete", & CliDelete,"Delete account and characters"}, - {"chardelete", & CliCharDelete,"Delete character"}, - {"info", & CliInfo,"Display Server infomation"}, - {"uptime", & CliUpTime, "Displays the server uptime"}, - {"motd", & CliMotd,"Change or display motd"}, - {"kick", & CliKick,"Kick user"}, - {"ban", & CliBan,"Ban account|ip"}, - {"listbans", & CliBanList,"List bans"}, - {"unban", & CliRemoveBan,"Remove ban from account|ip"}, - {"setgm", & CliSetGM,"Edit user privileges"}, - {"setpass", & CliSetPassword,"Set password for account"}, - {"setaddon", & CliSetAddon,"Set user expansion addon level allowed"}, - {"listgm", & CliListGM,"Display user privileges"}, - {"loadscripts", & CliLoadScripts,"Load script library"}, - {"setloglevel", & CliSetLogLevel,"Set Log Level"}, - {"corpses", & CliCorpses,"Manually call corpses erase global even code"}, - {"version", & CliVersion,"Display server version"}, - {"idlerestart", & CliIdleRestart,"Restart server with some delay when there are no active connections remaining"}, - {"restart", & CliRestart,"Restart server with some delay"}, - {"idleshutdown", & CliIdleShutdown,"Shutdown server with some delay when there are no active connections remaining"}, - {"shutdown", & CliShutdown,"Shutdown server with some delay"}, - {"exit", & CliExit,"Shutdown server NOW"}, - {"writepdump", &CliWritePlayerDump,"Write a player dump to a file"}, - {"loadpdump", &CliLoadPlayerDump,"Load a player dump from a file"}, - {"saveall", &CliSave,"Save all players"}, - {"send", &CliSend,"Send message to a player"}, - {"tele", &CliTele,"Teleport player to location"}, - {"plimit", &CliPLimit,"Show or set player login limitations"} -}; -/// \todo Need some pragma pack? Else explain why in a comment. -#define CliTotalCmds sizeof(Commands)/sizeof(CliCommand) - #if PLATFORM == PLATFORM_WINDOWS -int utf8printf(const char* str,...) -{ - UTF8PRINTF(stdout,str,1); - return 0; -} #define UTF8ZPRINTF utf8printf + wchar_t wtemp_buf[6000]; + size_t wtemp_len = 6000-1; + if(!Utf8toWStr(str,strlen(str),wtemp_buf,wtemp_len)) + return; + + char temp_buf[6000]; + CharToOemBuffW(&wtemp_buf[0],&temp_buf[0],wtemp_len+1); + printf(temp_buf); #else -#define UTF8ZPRINTF printf + printf(str); #endif +} -/// Create a character dump file -void CliWritePlayerDump(char*command,pPrintf zprintf) +/// Delete a user account and all associated characters in this realm +/// \todo This function has to be enhanced to respect the login/realm split (delete char, delete account chars in realm, delete account chars in realm then delete account +bool ChatHandler::HandleAccountDeleteCommand(const char* args) { - char * file = strtok(command, " "); - char * p2 = strtok(NULL, " "); - if(!file || !p2) - { - zprintf("Syntax is: writepdump $filename $playerNameOrGUID\r\n"); - return; - } - - std::string name; - if(!consoleToUtf8(p2,name)) // convert from console encoding to utf8 - return; - - if(!normalizePlayerName(name)) - { - zprintf("Syntax is: writepdump $filename $playerNameOrGUID\r\n"); - return; - } - - uint32 guid = objmgr.GetPlayerGUIDByName(name); - if(!guid) - guid = atoi(p2); - - if(!guid) - { - zprintf("Syntax is: writepdump $filename $playerNameOrGUID\r\n"); - return; - } + if(!*args) + return false; - PlayerDumpWriter().WriteDump(file, guid); -} + ///- Get the account name from the command line + char *account_name_str=strtok ((char*)args," "); + if (!account_name_str) + return false; -/// Load a character from a dump file -void CliLoadPlayerDump(char*command,pPrintf zprintf) -{ - char * file = strtok(command, " "); - char * acc = strtok(NULL, " "); - if (!file ||!acc) + std::string account_name = account_name_str; + if(!AccountMgr::normilizeString(account_name)) { - zprintf("Syntax is: loadpdump $filename $account ($newname) ($newguid)\r\n"); - return; + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); + return false; } - uint32 account_id = accmgr.GetId(acc); + uint32 account_id = accmgr.GetId(account_name); if(!account_id) { - account_id = atoi(acc); - if(account_id) - { - std::string acc_name; - if(!accmgr.GetName(account_id,acc_name)) - { - zprintf("Failed to load the character! Account not exist.\r\n"); - return; - } - } - else - { - zprintf("Failed to load the character! Account not exist.\r\n"); - return; - } + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); + return false; } - char * name_str = strtok(NULL, " "); - char * guid_str = name_str ? strtok(NULL, " ") : NULL; - - uint32 guid = guid_str ? atoi(guid_str) : 0; - - std::string name; - if(name_str) + /// Commands not recommended call from chat, but support anyway + if(m_session) { - if(!consoleToUtf8(name_str,name)) // convert from console encoding to utf8 - return; + uint32 targetSecurity = accmgr.GetSecurity(account_id); - if(!normalizePlayerName(name)) + /// can delete only for account with less security + /// This is also reject self apply in fact + if (targetSecurity >= m_session->GetSecurity()) { - zprintf("Syntax is: loadpdump $filename $account ($newname) ($newguid)\r\n"); - return; + SendSysMessage (LANG_YOURS_SECURITY_IS_LOW); + SetSentErrorMessage (true); + return false; } } - if(PlayerDumpReader().LoadDump(file, account_id, name, guid)) - zprintf("Character loaded successfully!\r\n"); - else - zprintf("Failed to load the character!\r\n"); -} - -/// Reload the scripts and notify the players -void CliLoadScripts(char*command,pPrintf zprintf) -{ - char const *del=strtok(command," "); - if (!del) - del=""; - if(!LoadScriptingModule(del)) // Error report is already done by LoadScriptingModule - return; - - sWorld.SendWorldText(LANG_SCRIPTS_RELOADED); -} - -/// Delete a user account and all associated characters in this realm -/// \todo This function has to be enhanced to respect the login/realm split (delete char, delete account chars in realm, delete account chars in realm then delete account -void CliDelete(char*command,pPrintf zprintf) -{ - ///- Get the account name from the command line - char *account_name_str=strtok(command," "); - if(!account_name_str) - { - // \r\n is used because this function can also be called from RA - zprintf("Syntax is: delete $account\r\n"); - return; - } - - std::string account_name; - if(!consoleToUtf8(account_name_str,account_name)) // convert from console encoding to utf8 - return; - - AccountOpResult result = accmgr.DeleteAccount(accmgr.GetId(account_name)); + AccountOpResult result = accmgr.DeleteAccount(account_id); switch(result) { case AOR_OK: - zprintf("We deleted account: %s\r\n",account_name.c_str()); + PSendSysMessage(LANG_ACCOUNT_DELETED,account_name.c_str()); break; case AOR_NAME_NOT_EXIST: - zprintf("User %s does not exist\r\n",account_name.c_str()); - break; + PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); + SetSentErrorMessage(true); + return false; case AOR_DB_INTERNAL_ERROR: - zprintf("User %s NOT deleted (probably sql file format was updated)\r\n",account_name.c_str()); - break; + PSendSysMessage(LANG_ACCOUNT_NOT_DELETED_SQL_ERROR,account_name.c_str()); + SetSentErrorMessage(true); + return false; default: - zprintf("User %s NOT deleted (unknown error)\r\n",account_name.c_str()); - break; + PSendSysMessage(LANG_ACCOUNT_NOT_DELETED,account_name.c_str()); + SetSentErrorMessage(true); + return false; } + + return true; } -void CliCharDelete(char*command,pPrintf zprintf) +bool ChatHandler::HandleCharacterDeleteCommand(const char* args) { - char *character_name_str = strtok(command," "); + if(!*args) + return false; + char *character_name_str = strtok((char*)args," "); if(!character_name_str) - { - zprintf("Syntax is: chardelete $character_name\r\n"); - return; - } - - std::string character_name; - if(!consoleToUtf8(character_name_str,character_name)) // convert from console encoding to utf8 - return; + return false; + std::string character_name = character_name_str; if(!normalizePlayerName(character_name)) - { - zprintf("Syntax is: chardelete $character_name\r\n"); - return; - } - - Player *player = objmgr.GetPlayer(character_name.c_str()); + return false; uint64 character_guid; uint32 account_id; + Player *player = objmgr.GetPlayer(character_name.c_str()); if(player) { character_guid = player->GetGUID(); @@ -295,185 +149,42 @@ void CliCharDelete(char*command,pPrintf zprintf) character_guid = objmgr.GetPlayerGUIDByName(character_name); if(!character_guid) { - zprintf("Player %s not found!\r\n",character_name.c_str()); - return; + PSendSysMessage(LANG_NO_PLAYER,character_name.c_str()); + SetSentErrorMessage(true); + return false; } account_id = objmgr.GetPlayerAccountIdByGUID(character_guid); } - Player::DeleteFromDB(character_guid, account_id, true); - zprintf("Player %s (Guid: %u AccountId: %u) deleted\r\n",character_name.c_str(),GUID_LOPART(character_guid),account_id); -} - -/// Broadcast a message to the World -void CliBroadcast(char *text,pPrintf zprintf) -{ - std::string textUtf8; - if(!consoleToUtf8(text,textUtf8)) // convert from console encoding to utf8 - return; + std::string account_name; + accmgr.GetName (account_id,account_name); - sWorld.SendWorldText(LANG_SYSTEMMESSAGE,textUtf8.c_str()); - zprintf("Broadcasting to the world: %s\r\n",textUtf8.c_str()); -} - -/// Print the list of commands and associated description -void CliHelp(char*,pPrintf zprintf) -{ - for (unsigned int x=0;x<CliTotalCmds;x++) - zprintf("%-13s - %s.\r\n",Commands[x].cmd ,Commands[x].description); + Player::DeleteFromDB(character_guid, account_id, true); + PSendSysMessage(LANG_CHARACTER_DELETED,character_name.c_str(),GUID_LOPART(character_guid),account_name.c_str(), account_id); + return true; } /// Exit the realm -void CliExit(char*,pPrintf zprintf) +bool ChatHandler::HandleServerExitCommand(const char* args) { - zprintf( "Exiting daemon...\r\n" ); + SendSysMessage(LANG_COMMAND_EXIT); World::m_stopEvent = true; -} - -/// Restart the server (with some delay) as soon as no active connections remain on the server -void CliIdleRestart(char* command,pPrintf zprintf) -{ - char *args = strtok(command," "); - - if(!args) - { - zprintf("Syntax is: idlerestart $seconds|cancel\r\n"); - return; - } - - if(std::string(args)=="cancel") - { - sWorld.ShutdownCancel(); - } - else - { - - uint32 time = atoi(args); - - ///- Prevent interpret wrong arg value as 0 secs shutdown time - if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0) - { - zprintf("Syntax is: idlerestart $seconds|cancel\r\n"); - return; - } - - sWorld.ShutdownServ(time,SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE); - } -} - -/// Restart the server with some delay -void CliRestart(char* command,pPrintf zprintf) -{ - char *args = strtok(command," "); - - if(!args) - { - zprintf("Syntax is: restart $seconds|cancel\r\n"); - return; - } - - if(std::string(args)=="cancel") - { - sWorld.ShutdownCancel(); - } - else - { - int32 time = atoi(args); - - ///- Prevent interpret wrong arg value as 0 secs shutdown time - if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0) - { - zprintf("Syntax is: restart $seconds|cancel\r\n"); - return; - } - - sWorld.ShutdownServ(time,SHUTDOWN_MASK_RESTART); - } -} - -/// Shutdown the server (with some delay) as soon as no active connections remain on the server -void CliIdleShutdown(char* command,pPrintf zprintf) -{ - char *args = strtok(command," "); - - if(!args) - { - zprintf("Syntax is: idleshutdown $seconds|cancel\r\n"); - return; - } - - if(std::string(args)=="cancel") - { - sWorld.ShutdownCancel(); - } - else - { - - uint32 time = atoi(args); - - ///- Prevent interpret wrong arg value as 0 secs shutdown time - if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0) - { - zprintf("Syntax is: idleshutdown $seconds|cancel\r\n"); - return; - } - - sWorld.ShutdownServ(time,SHUTDOWN_MASK_IDLE); - } -} - -/// Shutdown the server with some delay -void CliShutdown(char* command,pPrintf zprintf) -{ - char *args = strtok(command," "); - - if(!args) - { - zprintf("Syntax is: shutdown $seconds|cancel\r\n"); - return; - } - - if(std::string(args)=="cancel") - { - sWorld.ShutdownCancel(); - } - else - { - int32 time = atoi(args); - - ///- Prevent interpret wrong arg value as 0 secs shutdown time - if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0) - { - zprintf("Syntax is: shutdown $seconds|cancel\r\n"); - return; - } - - sWorld.ShutdownServ(time); - } + return true; } /// Display info on users currently in the realm -void CliInfo(char*,pPrintf zprintf) +bool ChatHandler::HandleAccountOnlineListCommand(const char* args) { - uint32 activeClientsNum = sWorld.GetActiveSessionCount(); - uint32 queuedClientsNum = sWorld.GetQueuedSessionCount(); - uint32 maxActiveClientsNum = sWorld.GetMaxActiveSessionCount(); - uint32 maxQueuedClientsNum = sWorld.GetMaxQueuedSessionCount(); - std::string timeStr = secsToTimeString(sWorld.GetUptime(),true); - - zprintf("Online players: %u (max: %u) queued: %u (max: %u) Uptime: %s\r\n",activeClientsNum,maxActiveClientsNum,queuedClientsNum,maxQueuedClientsNum,timeStr.c_str()); - ///- Get the list of accounts ID logged to the realm QueryResult *resultDB = CharacterDatabase.Query("SELECT name,account FROM characters WHERE online > 0"); - if (!resultDB) - return; + return true; ///- Display the list of account/characters online - zprintf("=====================================================================\r\n"); - zprintf("| Account | Character | IP | GM | Exp |\r\n"); - zprintf("=====================================================================\r\n"); + SendSysMessage("====================================================================="); + SendSysMessage(LANG_ACCOUNT_LIST_HEADER); + SendSysMessage("====================================================================="); ///- Circle through accounts do @@ -490,708 +201,77 @@ void CliInfo(char*,pPrintf zprintf) if(resultLogin) { Field *fieldsLogin = resultLogin->Fetch(); - zprintf("|%15s| %20s | %15s |%4d|%5d|\r\n", + PSendSysMessage("|%15s| %20s | %15s |%4d|%5d|", fieldsLogin[0].GetString(),name.c_str(),fieldsLogin[1].GetString(),fieldsLogin[2].GetUInt32(),fieldsLogin[3].GetUInt32()); delete resultLogin; } else - zprintf("|<Error> | %20s |<Error> |<Er>|<Err>|\r\n",name.c_str()); + PSendSysMessage(LANG_ACCOUNT_LIST_ERROR,name.c_str()); }while(resultDB->NextRow()); delete resultDB; - zprintf("=====================================================================\r\n"); -} - -/// Display a list of banned accounts and ip addresses -void CliBanList(char*,pPrintf zprintf) -{ - bool found = false; - ///- Get the list of banned accounts and display them - QueryResult *result = loginDatabase.Query("SELECT id,username FROM account WHERE id IN (SELECT id FROM account_banned WHERE active = 1)"); - if(result) - { - found = true; - - zprintf("Currently Banned Accounts:\r\n"); - zprintf("===============================================================================\r\n"); - zprintf("| Account | BanDate | UnbanDate | Banned By | Ban Reason |\r\n"); - do - { - zprintf("-------------------------------------------------------------------------------\r\n"); - Field *fields = result->Fetch(); - // No SQL injection. id is uint32. - QueryResult *banInfo = loginDatabase.PQuery("SELECT bandate,unbandate,bannedby,banreason FROM account_banned WHERE id = %u AND active = 1 ORDER BY unbandate", fields[0].GetUInt32()); - if (banInfo) - { - Field *fields2 = banInfo->Fetch(); - do - { - time_t t_ban = fields2[0].GetUInt64(); - tm* aTm_ban = localtime(&t_ban); - zprintf("|%-15.15s|", fields[1].GetString()); - zprintf("%02d-%02d-%02d %02d:%02d|", aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min); - if ( fields2[0].GetUInt64() == fields2[1].GetUInt64() ) - zprintf(" permanent |"); - else - { - time_t t_unban = fields2[1].GetUInt64(); - tm* aTm_unban = localtime(&t_unban); - zprintf("%02d-%02d-%02d %02d:%02d|",aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min); - } - zprintf("%-15.15s|%-15.15s|\r\n",fields2[2].GetString(),fields2[3].GetString()); - }while ( banInfo->NextRow() ); - delete banInfo; - } - }while( result->NextRow() ); - zprintf("===============================================================================\r\n"); - delete result; - } - - ///- Get the list of banned IP addresses and display them - result = loginDatabase.Query( "SELECT ip,bandate,unbandate,bannedby,banreason FROM ip_banned WHERE (bandate=unbandate OR unbandate>UNIX_TIMESTAMP()) ORDER BY unbandate" ); - if(result) - { - found = true; - - zprintf("Currently Banned IPs:\r\n"); - zprintf("===============================================================================\r\n"); - zprintf("| IP | BanDate | UnbanDate | Banned By | Ban Reason |\r\n"); - do - { - zprintf("-------------------------------------------------------------------------------\r\n"); - Field *fields = result->Fetch(); - time_t t_ban = fields[1].GetUInt64(); - tm* aTm_ban = localtime(&t_ban); - zprintf("|%-15.15s|", fields[0].GetString()); - zprintf("%02d-%02d-%02d %02d:%02d|", aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min); - if ( fields[1].GetUInt64() == fields[2].GetUInt64() ) - zprintf(" permanent |"); - else - { - time_t t_unban = fields[2].GetUInt64(); - tm* aTm_unban = localtime(&t_unban); - zprintf("%02d-%02d-%02d %02d:%02d|", aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min); - } - zprintf("%-15.15s|%-15.15s|\r\n", fields[3].GetString(), fields[4].GetString()); - }while( result->NextRow() ); - zprintf("===============================================================================\r\n"); - delete result; - } - - if(!found) - zprintf("We do not have banned users\r\n"); -} - -/// Ban an IP address or a user account -void CliBan(char*command,pPrintf zprintf) -{ - ///- Get the command parameter - char* type_str = strtok((char*)command, " "); - char* nameOrIP_str = strtok(NULL, " "); - char* duration_str = strtok(NULL," "); - char* reason_str = strtok(NULL,""); - - if(!type_str||!nameOrIP_str||!duration_str||!reason_str)// ?!? input of single char "0"-"9" wouldn't detect when with: || !atoi(duration) - { - zprintf("Syntax: ban account|ip|character $AccountOrIpOrCharacter $duration[s|m|h|d] $reason \r\n"); - return; - } - - std::string type; - if(!consoleToUtf8(type_str,type)) // convert from console encoding to utf8 - return; - - std::string nameOrIP; - if(!consoleToUtf8(nameOrIP_str,nameOrIP)) // convert from console encoding to utf8 - return; - - std::string duration; - if(!consoleToUtf8(duration_str,duration)) // convert from console encoding to utf8 - return; - - std::string reason; - if(!consoleToUtf8(reason_str,reason)) // convert from console encoding to utf8 - return; - - switch (sWorld.BanAccount(type, nameOrIP, duration, reason, "Set by console.")) - { - case BAN_SUCCESS: - if(atoi(duration_str)>0) - zprintf("%s is banned for %s. Reason: %s.\r\n",nameOrIP.c_str(),secsToTimeString(TimeStringToSecs(duration_str),true,false).c_str(),reason.c_str()); - else - zprintf("%s is banned permanently. Reason: %s.\r\n",nameOrIP.c_str(),reason.c_str()); - break; - case BAN_NOTFOUND: - zprintf("%s %s not found\r\n", type.c_str(), nameOrIP.c_str()); - break; - case BAN_SYNTAX_ERROR: - zprintf("Syntax: ban account|ip|character $AccountOrIpOrCharacter $duration[s|m|h|d] $reason \r\n"); - break; - } -} - -/// Display %TrinIty version -void CliVersion(char*,pPrintf zprintf) -{ - //<--maybe better append to info cmd - zprintf( "%s (world-daemon)\r\n", _FULLVERSION ); -} - -/// Unban an IP adress or a user account -void CliRemoveBan(char *command,pPrintf zprintf) -{ - ///- Get the command parameter - char *type_str = strtok(command," "); - char *nameorip_str = strtok(NULL," "); - if(!nameorip_str||!type_str) - { - zprintf("Syntax is: unban account|ip|character $nameorip\r\n"); - return; - } - - std::string type; - if(!consoleToUtf8(type_str,type)) // convert from console encoding to utf8 - return; - - std::string nameorip; - if(!consoleToUtf8(nameorip_str,nameorip)) // convert from console encoding to utf8 - return; - - if (!sWorld.RemoveBanAccount(type, nameorip)) - zprintf("%s %s not found\r\n", type.c_str(), nameorip.c_str()); - else - zprintf("We removed ban from %s: %s\r\n",type_str,nameorip.c_str()); -} - -/// Display the list of GMs -void CliListGM(char*,pPrintf zprintf) -{ - - ///- Get the accounts with GM Level >0 - Field *fields; - - QueryResult *result = loginDatabase.Query( "SELECT username,gmlevel FROM account WHERE gmlevel > 0" ); - if(result) - { - - zprintf("Current gamemasters:\r\n"); - zprintf("========================\r\n"); - zprintf("| Account | GM |\r\n"); - zprintf("========================\r\n"); - - ///- Circle through them. Display username and GM level - do - { - fields = result->Fetch(); - zprintf("|%15s|", fields[0].GetString()); - zprintf("%6s|\r\n",fields[1].GetString()); - }while( result->NextRow() ); - - zprintf("========================\r\n"); - delete result; - } - else - { - zprintf("No gamemasters\r\n"); - } -} - -/// Set the GM level of an account -void CliSetGM(char *command,pPrintf zprintf) -{ - ///- Get the command line arguments - char *szAcc = strtok(command," "); - char *szLevel = strtok(NULL," "); - - if(!szAcc||!szLevel) //wrong syntax 'setgm' without name - { - zprintf("Syntax is: setgm $account $number (0 - normal, 3 - gamemaster)>\r\n"); - return; - } - - //wow it's ok,let's hope it was integer given - int lev=atoi(szLevel); //get int anyway (0 if error) - - std::string safe_account_name; - if(!consoleToUtf8(szAcc,safe_account_name)) // convert from console encoding to utf8 - return; - - ///- Convert Account name to Upper Format - AccountMgr::normilizeString(safe_account_name); - - ///- Escape the account name to allow quotes in names - loginDatabase.escape_string(safe_account_name); - - ///- Try to find the account, then update the GM level - // No SQL injection (account name is escaped) - QueryResult *result = loginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",safe_account_name.c_str()); - - if (result) - { - Field *fields = result->Fetch(); - uint32 account_id = fields[0].GetUInt32(); - delete result; - - WorldSession* session = sWorld.FindSession(account_id); - if(session) - session->SetSecurity(lev); - - // No SQL injection (account name is escaped) - loginDatabase.PExecute("UPDATE account SET gmlevel = '%d' WHERE username = '%s'",lev,safe_account_name.c_str()); - zprintf("We set %s gmlevel %d\r\n",safe_account_name.c_str(),lev); - } - else - { - zprintf("No account %s found\r\n",safe_account_name.c_str()); - } -} - -/// Set password for account -void CliSetPassword(char *command,pPrintf zprintf) -{ - ///- Get the command line arguments - char *szAcc = strtok(command," "); - char *szPassword1 = strtok(NULL," "); - char *szPassword2 = strtok(NULL," "); - - if(!szAcc||!szPassword1 || !szPassword2) - { - zprintf("Syntax is: setpass $account $password $password\r\n"); - return; - } - - std::string account_name; - if(!consoleToUtf8(szAcc,account_name)) // convert from console encoding to utf8 - return; - - std::string pass1; - if(!consoleToUtf8(szPassword1,pass1)) // convert from console encoding to utf8 - return; - - std::string pass2; - if(!consoleToUtf8(szPassword2,pass2)) // convert from console encoding to utf8 - return; - - uint32 acc_id = accmgr.GetId(szAcc); - if (!acc_id) - { - zprintf("Account '%s' does not exist!\r\n", account_name.c_str()); - return; - } - - if (pass1 != pass2) - { - zprintf("Password does not match the confirm password, password not changed!\r\n"); - return; - } - - AccountOpResult result = accmgr.ChangePassword(acc_id, pass1); - - switch(result) - { - case AOR_OK: - zprintf("The password was changed for account '%s' (ID: %u).\r\n",account_name.c_str(),acc_id); - break; - case AOR_PASS_TOO_LONG: - zprintf("Password can't be longer than 16 characters (client limit), password not changed!\r\n"); - break; - case AOR_NAME_NOT_EXIST: - zprintf("Account '%s' does not exist!\r\n", account_name.c_str()); - break; - case AOR_DB_INTERNAL_ERROR: - zprintf("Password not changed! (probably sql file format was updated)\r\n"); - break; - default: - zprintf("Password not changed! (unknown error\r\n"); - break; - } + SendSysMessage("====================================================================="); + return true; } /// Create an account -void CliCreate(char *command,pPrintf zprintf) +bool ChatHandler::HandleAccountCreateCommand(const char* args) { - //I see no need in this function (why would an admin personally create accounts - //instead of using account registration page or accessing db directly?) - //but still let it be + if(!*args) + return false; ///- %Parse the command line arguments - char *szAcc = strtok(command, " "); + char *szAcc = strtok((char*)args, " "); char *szPassword = strtok(NULL, " "); if(!szAcc || !szPassword) - { - zprintf("Syntax is: create $username $password\r\n"); - return; - } + return false; - std::string account_name; - if(!consoleToUtf8(szAcc,account_name)) // convert from console encoding to utf8 - return; - - std::string password; - if(!consoleToUtf8(szPassword,password)) // convert from console encoding to utf8 - return; + // normilized in accmgr.CreateAccount + std::string account_name = szAcc; + std::string password = szPassword; AccountOpResult result = accmgr.CreateAccount(account_name, password); switch(result) { case AOR_OK: - zprintf("User %s with password %s created successfully\r\n",account_name.c_str(),password.c_str()); + PSendSysMessage(LANG_ACCOUNT_CREATED,account_name.c_str()); break; case AOR_NAME_TOO_LONG: - zprintf("Username %s is too long\r\n", account_name.c_str()); - break; + SendSysMessage(LANG_ACCOUNT_TOO_LONG); + SetSentErrorMessage(true); + return false; case AOR_NAME_ALREDY_EXIST: - zprintf("User %s already exists\r\n",account_name.c_str()); - break; + SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST); + SetSentErrorMessage(true); + return false; case AOR_DB_INTERNAL_ERROR: - zprintf("User %s with password %s NOT created (probably sql file format was updated)\r\n",account_name.c_str(),password.c_str()); - break; + PSendSysMessage(LANG_ACCOUNT_NOT_CREATED_SQL_ERROR,account_name.c_str()); + SetSentErrorMessage(true); + return false; default: - zprintf("User %s with password %s NOT created (unknown error)\r\n",account_name.c_str(),password.c_str()); - break; - } -} - -/// Command parser and dispatcher -void ParseCommand( pPrintf zprintf, char* input) -{ - unsigned int x; - bool bSuccess=false; - if (!input) - return; - - unsigned int l=strlen(input); - char *supposedCommand=NULL,* arguments=(char*)(""); - if(l) - { - ///- Get the command and the arguments - supposedCommand = strtok(input," "); - if (supposedCommand) - { - if (l>strlen(supposedCommand)) - arguments=&input[strlen(supposedCommand)+1]; - - ///- Circle through the command table and, if found, put the command in the queue - for ( x=0;x<CliTotalCmds;x++) - if(!strcmp(Commands[x].cmd,supposedCommand)) - { - sWorld.QueueCliCommand(new CliCommandHolder(&Commands[x], arguments, zprintf)); - bSuccess=true; - break; - } - - ///- Display an error message if the command is unknown - if(x==CliTotalCmds) - zprintf("Unknown command: %s\r\n", input); - } + PSendSysMessage(LANG_ACCOUNT_NOT_CREATED,account_name.c_str()); + SetSentErrorMessage(true); + return false; } - if (!bSuccess) - zprintf("TC>"); -} - -/// Kick a character out of the realm -void CliKick(char*command,pPrintf zprintf) -{ - char *kickName = strtok(command, " "); - - if (!kickName) - { - zprintf("Syntax is: kick $charactername\r\n"); - return; - } - - std::string name; - if(!consoleToUtf8(kickName,name)) // convert from console encoding to utf8 - return; - - if(!normalizePlayerName(name)) - return; - - sWorld.KickPlayer(name); -} - -/// Teleport a character to location -void CliTele(char*command,pPrintf zprintf) -{ - char *charName = strtok(command, " "); - char *locName = strtok(NULL, " "); - - if (!charName || !locName) - { - zprintf("Syntax is: tele $charactername $location\r\n"); - return; - } - - std::string name = charName; - if(!consoleToUtf8(charName,name)) // convert from console encoding to utf8 - return; - - if(!normalizePlayerName(name)) - return; - - std::string location; - if(!consoleToUtf8(locName,location)) // convert from console encoding to utf8 - return; - - WorldDatabase.escape_string(location); - QueryResult *result = WorldDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map FROM game_tele WHERE name = '%s'",location.c_str()); - if (!result) - { - zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_COMMAND_TELE_NOTFOUND),"\r\n"); - return; - } - - Field *fields = result->Fetch(); - float x = fields[0].GetFloat(); - float y = fields[1].GetFloat(); - float z = fields[2].GetFloat(); - float ort = fields[3].GetFloat(); - int mapid = fields[4].GetUInt16(); - delete result; - - if(!MapManager::IsValidMapCoord(mapid,x,y,z,ort)) - { - zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_INVALID_TARGET_COORD),"\r\n",x,y,mapid); - return; - } - - Player *chr = objmgr.GetPlayer(name.c_str()); - if (chr) - { - - if(chr->IsBeingTeleported()==true) - { - zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_IS_TELEPORTED),"\r\n",chr->GetName()); - return; - } - - if(chr->isInFlight()) - { - zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_CHAR_IN_FLIGHT),"\r\n",chr->GetName()); - return; - } - - zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_TELEPORTING_TO),"\r\n",chr->GetName(),"", location.c_str()); - - chr->SaveRecallPosition(); - - chr->TeleportTo(mapid,x,y,z,chr->GetOrientation()); - } - else if (uint64 guid = objmgr.GetPlayerGUIDByName(name.c_str())) - { - zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_TELEPORTING_TO),"\r\n",name.c_str(), objmgr.GetTrinityStringForDBCLocale(LANG_OFFLINE), location.c_str()); - Player::SavePositionInDB(mapid,x,y,z,ort,MapManager::Instance().GetZoneId(mapid,x,y),guid); - } - else - zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_NO_PLAYER),"\r\n",name.c_str()); -} - -/// Display/Define the 'Message of the day' for the realm -void CliMotd(char*command,pPrintf zprintf) -{ - - if (strlen(command) == 0) - { - zprintf("Current Message of the day: \r\n%s\r\n", sWorld.GetMotd()); - return; - } - else - { - std::string commandUtf8; - if(!consoleToUtf8(command,commandUtf8)) // convert from console encoding to utf8 - return; - - sWorld.SetMotd(commandUtf8); - zprintf("Message of the day changed to:\r\n%s\r\n", commandUtf8.c_str()); - } -} - -/// Comment me -/// \todo What is CorpsesErase for? -void CliCorpses(char*,pPrintf) -{ - CorpsesErase(); + + return true; } /// Set the level of logging -void CliSetLogLevel(char*command,pPrintf zprintf) -{ - char *NewLevel = strtok(command, " "); - if (!NewLevel) - { - zprintf("Syntax is: setloglevel $loglevel\r\n"); - return; - } - sLog.SetLogLevel(NewLevel); -} - -/// Display the server uptime -void CliUpTime(char*,pPrintf zprintf) -{ - uint32 uptime = sWorld.GetUptime(); - std::string suptime = secsToTimeString(uptime,true,(uptime > 86400)); - zprintf("Server has been up for: %s\r\n", suptime.c_str()); -} - -/// Set/Unset the TBC flag for an account -void CliSetAddon(char *command,pPrintf zprintf) -{ - ///- Get the command line arguments - char *szAcc = strtok(command," "); - char *szExp = strtok(NULL," "); - - if(!szAcc||!szExp) - { - zprintf("Syntax is: setbc $account $number (0 - normal, 1 - tbc, 2 - wotlk)>\r\n"); - return; - } - - int lev=atoi(szExp); //get int anyway (0 if error) - - if(lev < 0) - { - zprintf("Syntax is: setbc $account $number (0 - normal, 1 - tbc, 2 - wotlk)>\r\n"); - return; - } - - ///- Escape the account name to allow quotes in names - std::string safe_account_name; - if(!consoleToUtf8(szAcc,safe_account_name)) // convert from console encoding to utf8 - return; - - ///- Convert Account name to Upper Format - AccountMgr::normilizeString(safe_account_name); - - ///- Escape the account name to allow quotes in names - loginDatabase.escape_string(safe_account_name); - - // No SQL injection (account name is escaped) - QueryResult *result = loginDatabase.PQuery("SELECT 1 FROM account WHERE username = '%s'",safe_account_name.c_str()); - - if (result) - { - // No SQL injection (account name is escaped) - loginDatabase.PExecute("UPDATE account SET expansion = '%d' WHERE username = '%s'",lev,safe_account_name.c_str()); - zprintf("We set %s to expansion allowed %d\r\n",safe_account_name.c_str(),lev); - - delete result; - } - else - { - zprintf("No account %s found\r\n",safe_account_name.c_str()); - } -} - -/// Save all players -void CliSave(char*,pPrintf zprintf) -{ - ///- Save players - ObjectAccessor::Instance().SaveAllPlayers(); - zprintf( objmgr.GetTrinityStringForDBCLocale(LANG_PLAYERS_SAVED) ); - - ///- Send a message - sWorld.SendWorldText(LANG_PLAYERS_SAVED); -} - -/// Send a message to a player in game -void CliSend(char *playerN,pPrintf zprintf) +bool ChatHandler::HandleServerSetLogLevelCommand(const char *args) { - ///- Get the command line arguments - char* name_str = strtok((char*)playerN, " "); - char* msg_str = strtok(NULL, ""); - - if(!name_str || !msg_str) - { - zprintf("Syntax: send $player $message (Player name is case sensitive)\r\n"); - return; - } - - std::string name; - if(!consoleToUtf8(name_str,name)) // convert from console encoding to utf8 - return; - - std::string msg; - if(!consoleToUtf8(msg_str,msg)) // convert from console encoding to utf8 - return; - - if(!normalizePlayerName(name)) - { - zprintf("Syntax: send $player $message (Player name is case sensitive)\r\n"); - return; - } + if(!*args) + return false; - ///- Find the player and check that he is not logging out. - Player *rPlayer = objmgr.GetPlayer(name.c_str()); - if(!rPlayer) - { - zprintf("Player %s not found!\r\n", name.c_str()); - return; - } - - if (rPlayer->GetSession()->isLogingOut()) - { - zprintf("Cannot send message while player %s is logging out!\r\n",name.c_str()); - return; - } - - ///- Send the message - //Use SendAreaTriggerMessage for fastest delivery. - rPlayer->GetSession()->SendAreaTriggerMessage("%s", msg.c_str()); - rPlayer->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r"); - - //Confirmation message - zprintf("Message '%s' sent to %s\r\n",msg.c_str(), name.c_str()); -} - -void CliPLimit(char *args,pPrintf zprintf) -{ - if(*args) - { - char* param = strtok((char*)args, " "); - if(!param || !*param) - return; - - int l = strlen(param); - - if( strncmp(param,"player",l) == 0 ) - sWorld.SetPlayerLimit(-SEC_PLAYER); - else if(strncmp(param,"moderator",l) == 0 ) - sWorld.SetPlayerLimit(-SEC_MODERATOR); - else if(strncmp(param,"gamemaster",l) == 0 ) - sWorld.SetPlayerLimit(-SEC_GAMEMASTER); - else if(strncmp(param,"administrator",l) == 0 ) - sWorld.SetPlayerLimit(-SEC_ADMINISTRATOR); - else if(strncmp(param,"reset",l) == 0 ) - sWorld.SetPlayerLimit(sConfig.GetIntDefault("PlayerLimit", DEFAULT_PLAYER_LIMIT)); - else - { - int val = atoi(param); - if(val < -SEC_ADMINISTRATOR) val = -SEC_ADMINISTRATOR; - - sWorld.SetPlayerLimit(val); - } - - // kick all low security level players - if(sWorld.GetPlayerAmountLimit() > SEC_PLAYER) - sWorld.KickAllLess(sWorld.GetPlayerSecurityLimit()); - } - - uint32 pLimit = sWorld.GetPlayerAmountLimit(); - AccountTypes allowedAccountType = sWorld.GetPlayerSecurityLimit(); - char const* secName = ""; - switch(allowedAccountType) - { - case SEC_PLAYER: secName = "Player"; break; - case SEC_MODERATOR: secName = "Moderator"; break; - case SEC_GAMEMASTER: secName = "Gamemaster"; break; - case SEC_ADMINISTRATOR: secName = "Administrator"; break; - default: secName = "<unknown>"; break; - } + char *NewLevel = strtok((char*)args, " "); + if (!NewLevel) + return false; - zprintf("Player limits: amount %u, min. security level %s.\r\n",pLimit,secName); + sLog.SetLogLevel(NewLevel); + return true; } /// @} @@ -1221,13 +301,9 @@ void CliRunnable::run() ///- Display the list of available CLI functions then beep sLog.outString(); - /// \todo Shoudn't we use here also the sLog singleton? - CliHelp(NULL,&UTF8ZPRINTF); if(sConfig.GetBoolDefault("BeepAtStart", true)) - { printf("\a"); // \a = Alert - } // print this here the first time // later it will be printed after command queue updates @@ -1244,22 +320,33 @@ void CliRunnable::run() if (World::m_stopEvent) break; #endif - char *command = fgets(commandbuf,sizeof(commandbuf),stdin); - if (command != NULL) + char *command_str = fgets(commandbuf,sizeof(commandbuf),stdin); + if (command_str != NULL) { - for(int x=0;command[x];x++) - if(command[x]=='\r'||command[x]=='\n') + for(int x=0;command_str[x];x++) + if(command_str[x]=='\r'||command_str[x]=='\n') + { + command_str[x]=0; + break; + } + + if(!*command_str) { - command[x]=0; - break; + printf("TC>"); + continue; } - //// \todo Shoudn't we use here also the sLog singleton? - ParseCommand(&UTF8ZPRINTF,command); + + std::string command; + if(!consoleToUtf8(command_str,command)) // convert from console encoding to utf8 + { + printf("TC>"); + continue; + } + + sWorld.QueueCliCommand(&utf8print,command.c_str()); } else if (feof(stdin)) - { World::m_stopEvent = true; - } } ///- End the database thread diff --git a/src/trinitycore/RASocket.cpp b/src/trinitycore/RASocket.cpp index 36d6b497d3f..69295917d7c 100644 --- a/src/trinitycore/RASocket.cpp +++ b/src/trinitycore/RASocket.cpp @@ -44,7 +44,7 @@ unsigned int iUsers=0; ///< Number of activ typedef int(* pPrintf)(const char*,...); -void ParseCommand(pPrintf zprintf, char*command); +void ParseCommand(CliCommandHolder::Print*, char*command); /// RASocket constructor RASocket::RASocket(ISocketHandler &h): TcpSocket(h) @@ -222,7 +222,7 @@ void RASocket::OnRead() if(strlen(buff)) { sLog.outRALog("Got '%s' cmd.\n",buff); - ParseCommand(&RASocket::zprintf , buff); + sWorld.QueueCliCommand(&RASocket::zprint , buff); } else Sendf("TC>"); @@ -234,20 +234,23 @@ void RASocket::OnRead() } /// Output function -int RASocket::zprintf( const char * szText, ... ) +void RASocket::zprint( const char * szText ) { - if( !szText ) return 0; - va_list ap; - va_start(ap, szText); - /// \todo Remove buffer length here. Can be >1024 (e.g. list of users) - char *megabuffer=new char[1024]; - unsigned int sz=vsnprintf(megabuffer,1024,szText,ap); + if( !szText ) + return; + #ifdef RA_CRYPT - Encrypt(megabuffer,sz); - #endif - send(r,megabuffer,sz,0); + char *megabuffer=strdup(szText); + unsigned int sz=strlen(megabuffer); + Encrypt(megabuffer,sz); + send(r,megabuffer,sz,0); delete [] megabuffer; - va_end(ap); - return 0; + + #else + + unsigned int sz=strlen(szText); + send(r,szText,sz,0); + + #endif } diff --git a/src/trinitycore/RASocket.h b/src/trinitycore/RASocket.h index f4b4d96f3f2..dd6ebbc572d 100644 --- a/src/trinitycore/RASocket.h +++ b/src/trinitycore/RASocket.h @@ -61,7 +61,7 @@ class RASocket: public TcpSocket OK, //both login and pass were given, and they are correct and user have enough priv. }stage; - static int zprintf( const char * szText, ... ); + static void zprint( const char * szText ); }; #endif /// @} |