aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-09-09 18:33:18 +0200
committerShauren <shauren.trinity@gmail.com>2022-02-05 16:21:54 +0100
commit42be7836dfacd9e8d6b0c2b5d5f230ed6a55f088 (patch)
treecadb901067b72887d9c385814b4e74e7e6a1aa5e
parentfbcd71ecd8a351ce777a7f440d5c553d7a6cff80 (diff)
Chat/Commands: Eradicate ChatHandler::extractOptFirstArg
(cherry picked from commit 4f636b80e4942c4c9c4811496d1c1b77f767378d)
-rw-r--r--src/server/game/Chat/Chat.cpp33
-rw-r--r--src/server/game/Chat/Chat.h5
-rw-r--r--src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp25
-rw-r--r--src/server/game/Chat/ChatCommands/ChatCommandTags.h4
-rw-r--r--src/server/game/Guilds/Guild.cpp4
-rw-r--r--src/server/game/Guilds/Guild.h4
-rw-r--r--src/server/scripts/Commands/cs_guild.cpp22
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp69
-rw-r--r--src/server/scripts/Commands/cs_tele.cpp42
9 files changed, 76 insertions, 132 deletions
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 1601823a568..ec572e72704 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -797,21 +797,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
@@ -941,24 +926,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 3aeb1a6b702..d46b58446c4 100644
--- a/src/server/game/Chat/Chat.h
+++ b/src/server/game/Chat/Chat.h
@@ -104,14 +104,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(const char* 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 e3454bc5240..33db9d4bdf3 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 CurrencyTypesVisitor
@@ -50,8 +51,9 @@ Optional<std::string_view> Trinity::Impl::ChatCommands::ArgInfo<CurrencyTypesEnt
Variant<Hyperlink<currency>, uint32> val;
Optional<std::string_view> next = SingleConsumer<decltype(val)>::TryConsumeTo(val, args);
if (next)
- data = val.visit(CurrencyTypesVisitor());
- return next;
+ if ((data = val.visit(CurrencyTypesVisitor())))
+ return next;
+ return std::nullopt;
}
struct GameTeleVisitor
@@ -65,8 +67,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
@@ -80,8 +83,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
@@ -104,6 +108,7 @@ Optional<std::string_view> Trinity::Impl::ChatCommands::ArgInfo<SpellInfo const*
Variant<Hyperlink<apower>, Hyperlink<conduit>, Hyperlink<enchant>, Hyperlink<mawpower>, Hyperlink<pvptal>, 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 321bdd3219b..6fbfa187f55 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 f4f84381c00..eb7ce272537 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -582,7 +582,7 @@ void Guild::Member::SetOfficerNote(std::string const& officerNote)
CharacterDatabase.Execute(stmt);
}
-void Guild::Member::ChangeRank(CharacterDatabaseTransaction& trans, GuildRankId newRank)
+void Guild::Member::ChangeRank(CharacterDatabaseTransaction trans, GuildRankId newRank)
{
m_rankId = newRank;
@@ -2911,7 +2911,7 @@ void Guild::DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, b
_UpdateAccountsNumber();
}
-bool Guild::ChangeMemberRank(CharacterDatabaseTransaction& trans, ObjectGuid guid, GuildRankId newRank)
+bool Guild::ChangeMemberRank(CharacterDatabaseTransaction trans, ObjectGuid guid, GuildRankId newRank)
{
if (GetRankInfo(newRank)) // Validate rank (allow only existing ranks)
{
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index c9180e7c36d..8167d04b31e 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -351,7 +351,7 @@ class TC_GAME_API Guild
bool IsOnline() const { return (m_flags & GUILDMEMBER_STATUS_ONLINE); }
- void ChangeRank(CharacterDatabaseTransaction& trans, GuildRankId newRank);
+ void ChangeRank(CharacterDatabaseTransaction trans, GuildRankId newRank);
inline void UpdateLogoutTime();
inline bool IsRank(GuildRankId rankId) const { return m_rankId == rankId; }
@@ -820,7 +820,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, Optional<GuildRankId> rankId = {});
void DeleteMember(CharacterDatabaseTransaction& trans, ObjectGuid guid, bool isDisbanding = false, bool isKicked = false, bool canDeleteGuild = false);
- bool ChangeMemberRank(CharacterDatabaseTransaction& trans, ObjectGuid guid, GuildRankId newRank);
+ bool ChangeMemberRank(CharacterDatabaseTransaction trans, ObjectGuid guid, GuildRankId newRank);
bool IsMember(ObjectGuid guid) const;
uint32 GetMembersCount() const { return uint32(m_members.size()); }
diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp
index b34c604b595..d7245f22fb6 100644
--- a/src/server/scripts/Commands/cs_guild.cpp
+++ b/src/server/scripts/Commands/cs_guild.cpp
@@ -35,6 +35,7 @@ EndScriptData */
#include "RBAC.h"
#include <iomanip>
+using namespace Trinity::ChatCommands;
class guild_commandscript : public CommandScript
{
public:
@@ -191,21 +192,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;
@@ -213,9 +207,7 @@ public:
if (!targetGuild)
return false;
- uint8 newRank = uint8(atoi(rankStr));
- CharacterDatabaseTransaction trans(nullptr);
- return targetGuild->ChangeMemberRank(trans, targetGuid, GuildRankId(newRank));
+ return targetGuild->ChangeMemberRank(nullptr, *player, GuildRankId(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 b4e68d5a8c3..97942206edb 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1913,63 +1913,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);
@@ -1978,16 +1966,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 16e08b52ed3..1ea36d72dda 100644
--- a/src/server/scripts/Commands/cs_tele.cpp
+++ b/src/server/scripts/Commands/cs_tele.cpp
@@ -109,28 +109,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_homebind);
else
{
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_HOMEBIND);
- stmt->setUInt64(0, target_guid.GetCounter());
+ stmt->setUInt64(0, player->GetGUID().GetCounter());
PreparedQueryResult resultDB = CharacterDatabase.Query(stmt);
if (resultDB)
@@ -140,7 +133,7 @@ public:
uint32 zoneId = fieldsDB[1].GetUInt16();
CharacterDatabaseTransaction dummy;
- Player::SavePositionInDB(loc, zoneId, target_guid, dummy);
+ Player::SavePositionInDB(loc, zoneId, player->GetGUID(), dummy);
}
}
@@ -148,21 +141,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)
{
@@ -186,16 +172,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(PhasingHandler::GetEmptyPhaseShift(), tele->mapId, tele->position_x, tele->position_y, tele->position_z), target_guid, dummy);
+ sMapMgr->GetZoneId(PhasingHandler::GetEmptyPhaseShift(), tele->mapId, tele->position_x, tele->position_y, tele->position_z), player->GetGUID(), dummy);
}
return true;