32#include <boost/algorithm/string/replace.hpp>
61 if (!target_session && !target_account)
85 else if (target_account)
103 std::string msg{ str };
106 if (escapeCharacters && msg.find(
'|') != std::string::npos)
109 std::ostringstream stream;
110 for (
size_t i = 0; i < tokens.size() - 1; ++i)
111 stream << tokens[i] <<
"||";
112 stream << tokens[tokens.size() - 1];
131 sWorld->SendGlobalMessage(&data);
141 sWorld->SendGlobalGMMessage(&data);
170 if ((text[0] !=
'!') && (text[0] !=
'.'))
174 if (text.length() < 2)
178 if (text[1] == text[0])
189 std::string
const& senderName , std::string
const& receiverName ,
190 uint32 achievementId ,
bool gmMessage , std::string
const& channelName )
192 size_t receiverGUIDPos = 0;
194 data <<
uint8(chatType);
195 data <<
int32(language);
196 data <<
uint64(senderGUID);
208 data <<
uint32(senderName.length() + 1);
210 receiverGUIDPos = data.
wpos();
211 data <<
uint64(receiverGUID);
212 if (receiverGUID && !receiverGUID.
IsPlayer() && !receiverGUID.
IsPet())
214 data <<
uint32(receiverName.length() + 1);
215 data << receiverName;
219 data <<
uint32(senderName.length() + 1);
221 receiverGUIDPos = data.
wpos();
222 data <<
uint64(receiverGUID);
227 receiverGUIDPos = data.
wpos();
228 data <<
uint64(receiverGUID);
229 if (receiverGUID && !receiverGUID.
IsPlayer())
231 data <<
uint32(receiverName.length() + 1);
232 data << receiverName;
237 receiverGUIDPos = data.
wpos();
238 data <<
uint64(receiverGUID);
243 data <<
uint32(senderName.length() + 1);
249 ASSERT(channelName.length() > 0);
253 receiverGUIDPos = data.
wpos();
254 data <<
uint64(receiverGUID);
258 data <<
uint32(message.length() + 1);
260 data <<
uint8(chatTag);
263 data <<
uint32(achievementId);
265 return receiverGUIDPos;
272 std::string senderName =
"";
274 bool gmMessage =
false;
276 std::string receiverName =
"";
279 senderGUID = sender->
GetGUID();
283 chatTag = playerSender->GetChatTag();
290 receiverGUID = receiver->
GetGUID();
294 return BuildChatPacket(data, chatType, language, senderGUID, receiverGUID, message, chatTag, senderName, receiverName, achievementId, gmMessage, channelName);
366 while (*text ==
' '||*text ==
'\t'||*text ==
'\b')
374 return strtok(text,
" ");
380 char* check = strtok(text,
"|");
384 char* cLinkType = strtok(
nullptr,
":");
388 if (strcmp(cLinkType, linkType) != 0)
390 strtok(
nullptr,
" ");
395 char* cKeys = strtok(
nullptr,
"|");
396 char* cKeysTail = strtok(
nullptr,
"");
398 char* cKey = strtok(cKeys,
":|");
400 *something1 = strtok(
nullptr,
":|");
402 strtok(cKeysTail,
"]");
403 strtok(
nullptr,
" ");
414 while (*text ==
' '||*text ==
'\t'||*text ==
'\b')
422 return strtok(text,
" ");
434 char* check = strtok(text,
"|");
438 tail = strtok(
nullptr,
"");
443 char* cLinkType = strtok(tail,
":");
447 for (
int i = 0; linkTypes[i]; ++i)
449 if (strcmp(cLinkType, linkTypes[i]) == 0)
451 char* cKeys = strtok(
nullptr,
"|");
452 char* cKeysTail = strtok(
nullptr,
"");
454 char* cKey = strtok(cKeys,
":|");
456 *something1 = strtok(
nullptr,
":|");
458 strtok(cKeysTail,
"]");
459 strtok(
nullptr,
" ");
466 strtok(
nullptr,
" ");
489 if (bounds.first != bounds.second)
490 return bounds.first->second;
501 for (
auto it = bounds.first; it != bounds.second; ++it)
503 creature = it->second;
504 if (it->second->IsAlive())
541 std::string name = idS;
546 return player->GetGUID().GetCounter();
577 std::string name = name_str;
607 *player_guid = pl ? pl->
GetGUID() : guid;
610 *player_name = pl || guid ? name :
"";
615 static char dummy[1] =
"";
627 *player_name = pl ? pl->
GetName() :
"";
631 if ((!player || !*player) && (!player_guid || !*player_guid) && (!player_name || player_name->empty()))
647 return strtok(args+1,
"\"");
666 if (*(args + 1) ==
'"')
674 return strtok(args + 1,
"\"");
704 return sObjectMgr->GetTrinityStringForDBCLocale(entry);
718 if (str[0] ==
'.' || str[0] ==
'!')
740 std::string name = cname;
759 if (!guid || !offline)
769 if (!guid || !offline)
779 return sWorld->GetDefaultDbcLocale();
789 if (str.length() < 17)
793 char opcode = str[12];
807 std::string_view cmd = str.substr(17);
839 char ack[18] =
"TrinityCore\ta";
840 memcpy(ack+13,
echo, 4);
849 char ok[18] =
"TrinityCore\to";
850 memcpy(ok+13,
echo, 4);
858 char fail[18] =
"TrinityCore\tf";
859 memcpy(fail + 13,
echo, 4);
871 std::string msg =
"TrinityCore\tm";
873 std::string body(str);
874 if (escapeCharacters)
875 boost::replace_all(body,
"|",
"||");
877 for (lastpos = 0, pos = body.find(
'\n', lastpos); pos != std::string::npos; lastpos = pos + 1, pos = body.find(
'\n', lastpos))
879 std::string line(msg);
880 line.append(body, lastpos, pos - lastpos);
883 msg.append(body, lastpos, pos - lastpos);
static char const *const guidKeys[]
#define STRING_VIEW_FMT_ARG(str)
@ LANG_YOURS_SECURITY_IS_LOW
bool normalizePlayerName(std::string &name)
@ CHAT_MSG_MONSTER_WHISPER
@ CHAT_MSG_RAID_BOSS_WHISPER
@ CHAT_MSG_WHISPER_FOREIGN
@ CHAT_MSG_GUILD_ACHIEVEMENT
@ CHAT_MSG_BG_SYSTEM_ALLIANCE
@ CHAT_MSG_RAID_BOSS_EMOTE
@ CHAT_MSG_BG_SYSTEM_HORDE
@ CHAT_MSG_BG_SYSTEM_NEUTRAL
bool StringStartsWith(std::string_view haystack, std::string_view needle)
static uint32 GetSecurity(uint32 accountId, int32 realmId)
void Send(std::string const &msg)
void SendSysMessage(std::string_view, bool escapeCharacters) override
bool ParseCommands(std::string_view str) override
char * extractKeyFromLink(char *text, char const *linkType, char **something1=nullptr)
Player * getSelectedPlayerOrSelf()
bool GetPlayerGroupAndGUIDByName(char const *cname, Player *&player, Group *&group, ObjectGuid &guid, bool offline=false)
virtual bool HasPermission(uint32 permission) const
std::string playerLink(std::string const &name) const
char * extractQuotedArg(char *args)
void SendGlobalGMSysMessage(const char *str)
Player * getSelectedPlayer()
WorldSession * GetSession()
void SendGlobalSysMessage(const char *str)
bool HasSentErrorMessage() const
virtual LocaleConstant GetSessionDbcLocale() const
virtual std::string GetNameLink() const
Creature * GetCreatureFromPlayerMapByDbGuid(ObjectGuid::LowType lowguid)
virtual int GetSessionDbLocaleIndex() const
void PSendSysMessage(const char *fmt, Args &&... args)
bool HasLowerSecurity(Player *target, ObjectGuid guid, bool strong=false)
Creature * getSelectedCreature()
GameObject * GetObjectFromPlayerMapByDbGuid(ObjectGuid::LowType lowguid)
void SetSentErrorMessage(bool val)
Player * GetPlayer() const
WorldObject * getSelectedObject()
virtual bool ParseCommands(std::string_view text)
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
virtual bool needReportToTarget(Player *chr) const
bool extractPlayerTarget(char *args, Player **player, ObjectGuid *player_guid=nullptr, std::string *player_name=nullptr)
std::string extractPlayerNameFromLink(char *text)
bool _ParseCommands(std::string_view text)
GameObject * GetNearbyGameObject()
ObjectGuid::LowType extractLowGuidFromLink(char *text, HighGuid &guidHigh)
bool HasLowerSecurityAccount(WorldSession *target, uint32 account, bool strong=false)
static size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
virtual char const * GetTrinityString(uint32 entry) const
int GetSessionDbLocaleIndex() const override
LocaleConstant GetSessionDbcLocale() const override
void SendSysMessage(std::string_view, bool escapeCharacters) override
bool ParseCommands(std::string_view str) override
char const * GetTrinityString(uint32 entry) const override
bool needReportToTarget(Player *chr) const override
std::string GetNameLink() const override
GameObjectBySpawnIdContainer & GetGameObjectBySpawnIdStore()
CreatureBySpawnIdContainer & GetCreatureBySpawnIdStore()
LowType GetCounter() const
static ObjectGuid const Empty
static ObjectGuid GetGUID(Object const *o)
static Player * ToPlayer(Object *o)
WorldSession * GetSession() const
bool IsVisibleGloballyFor(Player const *player) const
Unit * GetSelectedUnit() const
ObjectGuid GetTarget() const
std::string const & GetName() const
virtual std::string const & GetNameForLocaleIdx(LocaleConstant) const
void Initialize(uint16 opcode, size_t newres=200)
Player session in the World.
char const * GetTrinityString(uint32 entry) const
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
AccountTypes GetSecurity() const
LocaleConstant GetSessionDbLocaleIndex() const
LocaleConstant GetSessionDbcLocale() const
Player * GetPlayer() const
bool HasPermission(uint32 permissionId)
@ CONFIG_GM_LOWER_SECURITY
TC_GAME_API Player * FindPlayerByName(std::string_view name)
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
TC_GAME_API Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const &)
TC_GAME_API bool TryExecuteCommand(ChatHandler &handler, std::string_view cmd)
static constexpr char COMMAND_DELIMITER
TC_COMMON_API std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
@ RBAC_PERM_COMMANDS_NOTIFY_COMMAND_NOT_FOUND_ERROR
@ RBAC_PERM_CAN_IGNORE_LOWER_SECURITY_CHECK
@ RBAC_PERM_COMMAND_GM_CHAT
static void VisitGridObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)