diff options
-rw-r--r-- | src/server/game/Chat/Chat.cpp | 33 | ||||
-rw-r--r-- | src/server/game/Chat/Chat.h | 5 | ||||
-rw-r--r-- | src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Chat/ChatCommands/ChatCommandTags.h | 4 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 4 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_guild.cpp | 22 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_misc.cpp | 69 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_tele.cpp | 42 |
9 files changed, 73 insertions, 130 deletions
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 6d59c3d5efd..84c92140969 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -906,21 +906,6 @@ uint32 ChatHandler::extractSpellIdFromLink(char* text) return 0; } -GameTele const* ChatHandler::extractGameTeleFromLink(char* text) -{ - // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r - char* cId = extractKeyFromLink(text, "Htele"); - if (!cId) - return nullptr; - - // id case (explicit or from shift link) - if (cId[0] >= '0' && cId[0] <= '9') - if (uint32 id = atoi(cId)) - return sObjectMgr->GetGameTele(id); - - return sObjectMgr->GetGameTele(cId); -} - enum GuidLinkType { GUID_LINK_PLAYER = 0, // must be first for selection in not link case @@ -1048,24 +1033,6 @@ bool ChatHandler::extractPlayerTarget(char* args, Player** player, ObjectGuid* p return true; } -void ChatHandler::extractOptFirstArg(char* args, char** arg1, char** arg2) -{ - char* p1 = strtok(args, " "); - char* p2 = strtok(nullptr, " "); - - if (!p2) - { - p2 = p1; - p1 = nullptr; - } - - if (arg1) - *arg1 = p1; - - if (arg2) - *arg2 = p2; -} - char* ChatHandler::extractQuotedArg(char* args) { if (!args || !*args) diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 898a73816fa..e91b1e74841 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -113,14 +113,9 @@ class TC_GAME_API ChatHandler char* extractKeyFromLink(char* text, char const* linkType, char** something1 = nullptr); char* extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1 = nullptr); - - // if args have single value then it return in arg2 and arg1 == nullptr - void extractOptFirstArg(char* args, char** arg1, char** arg2); char* extractQuotedArg(char* args); - uint32 extractSpellIdFromLink(char* text); ObjectGuid::LowType extractLowGuidFromLink(char* text, HighGuid& guidHigh); - GameTele const* extractGameTeleFromLink(char* text); bool GetPlayerGroupAndGUIDByName(char const* cname, Player*& player, Group*& group, ObjectGuid& guid, bool offline = false); std::string extractPlayerNameFromLink(char* text); // select by arg (name/link) or in-game selection online/offline player or self if a creature is selected diff --git a/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp b/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp index ed2848a43f6..97286ffd515 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp +++ b/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp @@ -35,8 +35,9 @@ Optional<std::string_view> Trinity::Impl::ChatCommands::ArgInfo<AchievementEntry Variant<Hyperlink<achievement>, uint32> val; Optional<std::string_view> next = SingleConsumer<decltype(val)>::TryConsumeTo(val, args); if (next) - data = val.visit(AchievementVisitor()); - return next; + if ((data = val.visit(AchievementVisitor()))) + return next; + return std::nullopt; } struct GameTeleVisitor @@ -50,8 +51,9 @@ Optional<std::string_view> Trinity::Impl::ChatCommands::ArgInfo<GameTele const*> Variant<Hyperlink<tele>, std::string> val; Optional<std::string_view> next = SingleConsumer<decltype(val)>::TryConsumeTo(val, args); if (next) - data = val.visit(GameTeleVisitor()); - return next; + if ((data = val.visit(GameTeleVisitor()))) + return next; + return std::nullopt; } struct ItemTemplateVisitor @@ -65,8 +67,9 @@ Optional<std::string_view> Trinity::Impl::ChatCommands::ArgInfo<ItemTemplate con Variant<Hyperlink<item>, uint32> val; Optional<std::string_view> next = SingleConsumer<decltype(val)>::TryConsumeTo(val, args); if (next) - data = val.visit(ItemTemplateVisitor()); - return next; + if ((data = val.visit(ItemTemplateVisitor()))) + return next; + return std::nullopt; } struct SpellInfoVisitor @@ -88,6 +91,7 @@ Optional<std::string_view> Trinity::Impl::ChatCommands::ArgInfo<SpellInfo const* Variant<Hyperlink<enchant>, Hyperlink<glyph>, Hyperlink<spell>, Hyperlink<talent>, Hyperlink<trade>, uint32> val; Optional<std::string_view> next = SingleConsumer<decltype(val)>::TryConsumeTo(val, args); if (next) - data = val.visit(SpellInfoVisitor()); - return next; + if ((data = val.visit(SpellInfoVisitor()))) + return next; + return std::nullopt; } diff --git a/src/server/game/Chat/ChatCommands/ChatCommandTags.h b/src/server/game/Chat/ChatCommands/ChatCommandTags.h index 5e6bd112652..50a0d82edf9 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandTags.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandTags.h @@ -93,6 +93,8 @@ namespace Trinity::ChatCommands { using value_type = std::string_view; + using std::string_view::operator=; + Optional<std::string_view> TryConsume(std::string_view args) { std::string_view::operator=(args); @@ -104,6 +106,8 @@ namespace Trinity::ChatCommands { using value_type = std::wstring; + using std::wstring::operator=; + Optional<std::string_view> TryConsume(std::string_view args) { if (Utf8toWStr(args, *this)) diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 69199912a3c..3b93c021878 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -583,7 +583,7 @@ void Guild::Member::SetOfficerNote(std::string const& officerNote) CharacterDatabase.Execute(stmt); } -void Guild::Member::ChangeRank(CharacterDatabaseTransaction& trans, uint8 newRank) +void Guild::Member::ChangeRank(CharacterDatabaseTransaction trans, uint8 newRank) { m_rankId = newRank; @@ -2370,7 +2370,7 @@ void Guild::DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, b _UpdateAccountsNumber(); } -bool Guild::ChangeMemberRank(CharacterDatabaseTransaction& trans, ObjectGuid guid, uint8 newRank) +bool Guild::ChangeMemberRank(CharacterDatabaseTransaction trans, ObjectGuid guid, uint8 newRank) { if (newRank <= _GetLowestRankId()) // Validate rank (allow only existing ranks) { diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 013dc776961..eb4ba839923 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -317,7 +317,7 @@ class TC_GAME_API Guild uint32 GetZoneId() const { return m_zoneId; } bool IsOnline() const { return (m_flags & GUILDMEMBER_STATUS_ONLINE); } - void ChangeRank(CharacterDatabaseTransaction& trans, uint8 newRank); + void ChangeRank(CharacterDatabaseTransaction trans, uint8 newRank); inline void UpdateLogoutTime(); inline bool IsRank(uint8 rankId) const { return m_rankId == rankId; } @@ -715,7 +715,7 @@ class TC_GAME_API Guild // Adds member to guild. If rankId == GUILD_RANK_NONE, lowest rank is assigned. bool AddMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, uint8 rankId = GUILD_RANK_NONE); void DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, bool isDisbanding = false, bool isKicked = false, bool canDeleteGuild = false); - bool ChangeMemberRank(CharacterDatabaseTransaction& trans, ObjectGuid guid, uint8 newRank); + bool ChangeMemberRank(CharacterDatabaseTransaction trans, ObjectGuid guid, uint8 newRank); // Bank void SwapItems(Player* player, uint8 tabId, uint8 slotId, uint8 destTabId, uint8 destSlotId, uint32 splitedAmount); diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp index 55049d3b11f..9cc03aa5e2a 100644 --- a/src/server/scripts/Commands/cs_guild.cpp +++ b/src/server/scripts/Commands/cs_guild.cpp @@ -33,6 +33,7 @@ EndScriptData */ #include "Player.h" #include "RBAC.h" +using namespace Trinity::ChatCommands; class guild_commandscript : public CommandScript { public: @@ -189,21 +190,14 @@ public: return true; } - static bool HandleGuildRankCommand(ChatHandler* handler, char const* args) + static bool HandleGuildRankCommand(ChatHandler* handler, Optional<PlayerIdentifier> player, uint8 rank) { - char* nameStr; - char* rankStr; - handler->extractOptFirstArg((char*)args, &nameStr, &rankStr); - if (!rankStr) + if (!player) + player = PlayerIdentifier::FromTargetOrSelf(handler); + if (!player) return false; - Player* target; - ObjectGuid targetGuid; - std::string target_name; - if (!handler->extractPlayerTarget(nameStr, &target, &targetGuid, &target_name)) - return false; - - ObjectGuid::LowType guildId = target ? target->GetGuildId() : sCharacterCache->GetCharacterGuildIdByGuid(targetGuid); + ObjectGuid::LowType guildId = player->IsConnected() ? player->GetConnectedPlayer()->GetGuildId() : sCharacterCache->GetCharacterGuildIdByGuid(*player); if (!guildId) return false; @@ -211,9 +205,7 @@ public: if (!targetGuild) return false; - uint8 newRank = uint8(atoi(rankStr)); - CharacterDatabaseTransaction trans(nullptr); - return targetGuild->ChangeMemberRank(trans, targetGuid, newRank); + return targetGuild->ChangeMemberRank(nullptr, *player, rank); } static bool HandleGuildRenameCommand(ChatHandler* handler, char const* _args) diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index bc877af3697..3fbda540a10 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1843,63 +1843,51 @@ public: } // mute player for the specified duration - static bool HandleMuteCommand(ChatHandler* handler, char const* args) + static bool HandleMuteCommand(ChatHandler* handler, Optional<PlayerIdentifier> player, uint32 muteTime, Tail muteReason) { - char* nameStr; - char* delayStr; - handler->extractOptFirstArg((char*)args, &nameStr, &delayStr); - if (!delayStr) - return false; - - char const* muteReason = strtok(nullptr, "\r"); - std::string muteReasonStr = handler->GetTrinityString(LANG_NO_REASON); - if (muteReason != nullptr) - muteReasonStr = muteReason; + std::string muteReasonStr{ muteReason }; + if (muteReason.empty()) + muteReasonStr = handler->GetTrinityString(LANG_NO_REASON); - Player* target; - ObjectGuid targetGuid; - std::string targetName; - if (!handler->extractPlayerTarget(nameStr, &target, &targetGuid, &targetName)) + if (!player) + player = PlayerIdentifier::FromTarget(handler); + if (!player) + { + handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); return false; + } - uint32 accountId = target ? target->GetSession()->GetAccountId() : sCharacterCache->GetCharacterAccountIdByGuid(targetGuid); + Player* target = player->GetConnectedPlayer(); + uint32 accountId = target ? target->GetSession()->GetAccountId() : sCharacterCache->GetCharacterAccountIdByGuid(*player); // find only player from same account if any if (!target) if (WorldSession* session = sWorld->FindSession(accountId)) target = session->GetPlayer(); - uint32 notSpeakTime = uint32(atoi(delayStr)); - // must have strong lesser security level - if (handler->HasLowerSecurity (target, targetGuid, true)) + if (handler->HasLowerSecurity(target, player->GetGUID(), true)) return false; LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME); std::string muteBy = ""; - if (handler->GetSession()) - muteBy = handler->GetSession()->GetPlayerName(); + if (Player* gmPlayer = handler->GetPlayer()) + muteBy = gmPlayer->GetName(); else muteBy = handler->GetTrinityString(LANG_CONSOLE); if (target) { // Target is online, mute will be in effect right away. - int64 muteTime = GameTime::GetGameTime() + notSpeakTime * MINUTE; - target->GetSession()->m_muteTime = muteTime; - stmt->setInt64(0, muteTime); - std::string nameLink = handler->playerLink(targetName); - - if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD)) - sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy.c_str(), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); - - ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str()); + int64 mutedUntil = GameTime::GetGameTime() + static_cast<int64>(muteTime) * MINUTE; + target->GetSession()->m_muteTime = mutedUntil; + stmt->setInt64(0, mutedUntil); } else { // Target is offline, mute will be in effect starting from the next login. - int32 muteTime = -int32(notSpeakTime * MINUTE); - stmt->setInt64(0, muteTime); + stmt->setInt64(0, -static_cast<int64>(muteTime) * MINUTE); } stmt->setString(1, muteReasonStr); @@ -1908,16 +1896,23 @@ public: LoginDatabase.Execute(stmt); stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT_MUTE); stmt->setUInt32(0, accountId); - stmt->setUInt32(1, notSpeakTime); + stmt->setUInt32(1, muteTime); stmt->setString(2, muteBy); stmt->setString(3, muteReasonStr); LoginDatabase.Execute(stmt); - std::string nameLink = handler->playerLink(targetName); - if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD) && !target) - sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy.c_str(), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); + std::string nameLink = handler->playerLink(player->GetName()); + if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD)) + sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy.c_str(), nameLink.c_str(), muteTime, muteReasonStr.c_str()); + if (target) + { + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, muteTime, muteBy.c_str(), muteReasonStr.c_str()); + handler->PSendSysMessage(LANG_YOU_DISABLE_CHAT, nameLink.c_str(), muteTime, muteReasonStr.c_str()); + } else - handler->PSendSysMessage(target ? LANG_YOU_DISABLE_CHAT : LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); + { + handler->PSendSysMessage(LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), muteTime, muteReasonStr.c_str()); + } return true; } diff --git a/src/server/scripts/Commands/cs_tele.cpp b/src/server/scripts/Commands/cs_tele.cpp index 2800c186f28..cd44b3faba0 100644 --- a/src/server/scripts/Commands/cs_tele.cpp +++ b/src/server/scripts/Commands/cs_tele.cpp @@ -108,28 +108,21 @@ public: } // teleport player to given game_tele.entry - static bool HandleTeleNameCommand(ChatHandler* handler, char const* args) + static bool HandleTeleNameCommand(ChatHandler* handler, Optional<PlayerIdentifier> player, Variant<GameTele const*, ExactSequence<'$','h','o','m','e'>> where) { - char* nameStr; - char* teleStr; - handler->extractOptFirstArg((char*)args, &nameStr, &teleStr); - if (!teleStr) - return false; - - Player* target; - ObjectGuid target_guid; - std::string target_name; - if (!handler->extractPlayerTarget(nameStr, &target, &target_guid, &target_name)) + if (!player) + player = PlayerIdentifier::FromTargetOrSelf(handler); + if (!player) return false; - if (strcmp(teleStr, "$home") == 0) // References target's homebind + if (where.index() == 1) // References target's homebind { - if (target) + if (Player* target = player->GetConnectedPlayer()) target->TeleportTo(target->m_homebindMapId, target->m_homebindX, target->m_homebindY, target->m_homebindZ, target->GetOrientation()); else { CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_HOMEBIND); - stmt->setUInt32(0, target_guid.GetCounter()); + stmt->setUInt32(0, player->GetGUID().GetCounter()); PreparedQueryResult resultDB = CharacterDatabase.Query(stmt); if (resultDB) @@ -139,7 +132,7 @@ public: uint32 zoneId = fieldsDB[1].GetUInt16(); CharacterDatabaseTransaction dummy; - Player::SavePositionInDB(loc, zoneId, target_guid, dummy); + Player::SavePositionInDB(loc, zoneId, player->GetGUID(), dummy); } } @@ -147,21 +140,14 @@ public: } // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r - GameTele const* tele = handler->extractGameTeleFromLink(teleStr); - if (!tele) - { - handler->SendSysMessage(LANG_COMMAND_TELE_NOTFOUND); - handler->SetSentErrorMessage(true); - return false; - } - - if (target) + GameTele const* tele = where.get<GameTele const*>(); + if (Player* target = player->GetConnectedPlayer()) { // check online security if (handler->HasLowerSecurity(target, ObjectGuid::Empty)) return false; - std::string chrNameLink = handler->playerLink(target_name); + std::string chrNameLink = handler->playerLink(target->GetName()); if (target->IsBeingTeleported() == true) { @@ -185,16 +171,16 @@ public: else { // check offline security - if (handler->HasLowerSecurity(nullptr, target_guid)) + if (handler->HasLowerSecurity(nullptr, player->GetGUID())) return false; - std::string nameLink = handler->playerLink(target_name); + std::string nameLink = handler->playerLink(player->GetName()); handler->PSendSysMessage(LANG_TELEPORTING_TO, nameLink.c_str(), handler->GetTrinityString(LANG_OFFLINE), tele->name.c_str()); CharacterDatabaseTransaction dummy; Player::SavePositionInDB(WorldLocation(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation), - sMapMgr->GetZoneId(PHASEMASK_NORMAL, tele->mapId, tele->position_x, tele->position_y, tele->position_z), target_guid, dummy); + sMapMgr->GetZoneId(PHASEMASK_NORMAL, tele->mapId, tele->position_x, tele->position_y, tele->position_z), player->GetGUID(), dummy); } return true; |