summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKitzunu <24550914+Kitzunu@users.noreply.github.com>2024-08-09 01:12:33 +0200
committerGitHub <noreply@github.com>2024-08-08 20:12:33 -0300
commitbb7765d91e8568c479c5cec84948a6015ba29f2e (patch)
tree7bdc517c8425ff1cd350cc742f7c989ed332de95
parentfdd8ff6e04814a1b624cd1ff18093a2c9acaf47c (diff)
refactor(Core/World): Move SendGMText to ChatHandler and allow `fmt` (#19490)
* refactor(Core/World): Move SendGMText to WorldSession and allow `fmt` - Move SendGMText from World to WorldSession - Make SendGMText use fmt - Make SendGMText parse acore_string entries * Update cs_message.cpp * tokenize the string only once * Move to chathandler * Update WorldSession.cpp * make sure we have a session
-rw-r--r--data/sql/updates/pending_db_world/rev_1722121237522834800.sql5
-rw-r--r--src/server/game/Chat/Chat.cpp20
-rw-r--r--src/server/game/Chat/Chat.h22
-rw-r--r--src/server/game/Handlers/TicketHandler.cpp6
-rw-r--r--src/server/game/World/IWorld.h1
-rw-r--r--src/server/game/World/World.cpp26
-rw-r--r--src/server/game/World/World.h1
-rw-r--r--src/server/scripts/Commands/cs_message.cpp6
-rw-r--r--src/test/mocks/WorldMock.h1
9 files changed, 53 insertions, 35 deletions
diff --git a/data/sql/updates/pending_db_world/rev_1722121237522834800.sql b/data/sql/updates/pending_db_world/rev_1722121237522834800.sql
new file mode 100644
index 0000000000..0546127363
--- /dev/null
+++ b/data/sql/updates/pending_db_world/rev_1722121237522834800.sql
@@ -0,0 +1,5 @@
+--
+DELETE FROM `acore_string` WHERE `entry` IN (6613,6615);
+INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, `locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`) VALUES
+(6613, '|cfff00000[GM Announcement]: {}|r', NULL, NULL, '|cfff00000[GM Ankündigung von [{}]]: {}|r', '|cfff00000[管理员公告]: {}|r', NULL, NULL, NULL, NULL),
+(6615, '|cffffff00[|c1f40af20GM Announce by|r |cffff0000{}|cffffff00]:|r {}|r', NULL, NULL, '|cffffff00[|c1f40af20GM Ankündigung von|r |cffff0000{}|cffffff00]:|r {}|r', '|cffffff00[|c1f40af20管理员广播|r |cffff0000{}|cffffff00]:|r {}|r', NULL, NULL, NULL, NULL);
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 764ef3c70c..ec3f5c156d 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -99,6 +99,26 @@ bool ChatHandler::HasLowerSecurityAccount(WorldSession* target, uint32 target_ac
return false;
}
+void ChatHandler::SendGMText(std::string_view str)
+{
+ std::vector<std::string_view> lines = Acore::Tokenize(str, '\n', true);
+ // Session should have permissions to receive global gm messages
+ if (AccountMgr::IsPlayerAccount(m_session->GetSecurity()))
+ return;
+
+ // Player should be in world
+ Player* player = m_session->GetPlayer();
+ if (!player || !player->IsInWorld())
+ return;
+
+ for (std::string_view line : lines)
+ {
+ WorldPacket data;
+ ChatHandler::BuildChatPacket(data, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line);
+ player->SendDirectMessage(&data);
+ }
+}
+
void ChatHandler::SendWorldText(std::string_view str)
{
std::vector<std::string_view> lines = Acore::Tokenize(str, '\n', true);
diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h
index 61dc38cda7..20771bcac0 100644
--- a/src/server/game/Chat/Chat.h
+++ b/src/server/game/Chat/Chat.h
@@ -51,6 +51,28 @@ public:
static char* LineFromMessage(char*& pos) { char* start = strtok(pos, "\n"); pos = nullptr; return start; }
+ void SendGMText(std::string_view str);
+ template<typename... Args>
+ void SendGMText(uint32 strId, Args&&... args)
+ {
+ // WorldText should be sent to all sessions
+ SessionMap::const_iterator itr;
+ for (itr = sWorld->GetAllSessions().begin(); itr != sWorld->GetAllSessions().end(); ++itr)
+ {
+ Player* player = itr->second->GetPlayer();
+ if (player && player->IsInWorld())
+ {
+ m_session = player->GetSession();
+ SendGMText(Acore::StringFormatFmt(GetAcoreString(strId), std::forward<Args>(args)...));
+ }
+ }
+ }
+ template<typename... Args>
+ void SendGMText(char const* fmt, Args&&... args)
+ {
+ SendGMText(Acore::StringFormatFmt(fmt, std::forward<Args>(args)...));
+ }
+
void SendWorldText(std::string_view str);
template<typename... Args>
void SendWorldText(uint32 strId, Args&&... args)
diff --git a/src/server/game/Handlers/TicketHandler.cpp b/src/server/game/Handlers/TicketHandler.cpp
index ff9fe4e3a5..2d56b67570 100644
--- a/src/server/game/Handlers/TicketHandler.cpp
+++ b/src/server/game/Handlers/TicketHandler.cpp
@@ -118,7 +118,7 @@ void WorldSession::HandleGMTicketCreateOpcode(WorldPacket& recvData)
sTicketMgr->AddTicket(ticket);
sTicketMgr->UpdateLastChange();
- sWorld->SendGMText(LANG_COMMAND_TICKETNEW, GetPlayer()->GetName().c_str(), ticket->GetId());
+ ChatHandler(nullptr).SendGMText(LANG_COMMAND_TICKETNEW, GetPlayer()->GetName(), ticket->GetId());
response = GMTICKET_RESPONSE_CREATE_SUCCESS;
}
@@ -145,7 +145,7 @@ void WorldSession::HandleGMTicketUpdateOpcode(WorldPacket& recv_data)
ticket->SetMessage(message);
ticket->SaveToDB(trans);
- sWorld->SendGMText(LANG_COMMAND_TICKETUPDATED, GetPlayer()->GetName().c_str(), ticket->GetId());
+ ChatHandler(nullptr).SendGMText(LANG_COMMAND_TICKETUPDATED, GetPlayer()->GetName(), ticket->GetId());
response = GMTICKET_RESPONSE_UPDATE_SUCCESS;
}
@@ -163,7 +163,7 @@ void WorldSession::HandleGMTicketDeleteOpcode(WorldPacket& /*recv_data*/)
data << uint32(GMTICKET_RESPONSE_TICKET_DELETED);
SendPacket(&data);
- sWorld->SendGMText(LANG_COMMAND_TICKETPLAYERABANDON, GetPlayer()->GetName().c_str(), ticket->GetId());
+ ChatHandler(nullptr).SendGMText(LANG_COMMAND_TICKETPLAYERABANDON, GetPlayer()->GetName(), ticket->GetId());
sTicketMgr->CloseTicket(ticket->GetId(), GetPlayer()->GetGUID());
sTicketMgr->SendTicket(this, nullptr);
diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h
index 1771d7f413..c111972117 100644
--- a/src/server/game/World/IWorld.h
+++ b/src/server/game/World/IWorld.h
@@ -566,7 +566,6 @@ public:
[[nodiscard]] virtual uint16 GetConfigMaxSkillValue() const = 0;
virtual void SetInitialWorldSettings() = 0;
virtual void LoadConfigSettings(bool reload = false) = 0;
- virtual void SendGMText(uint32 string_id, ...) = 0;
virtual void SendGlobalMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0;
virtual void SendGlobalGMMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0;
virtual bool SendZoneMessage(uint32 zone, WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) = 0;
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 1d46005e0b..4f3c88ac37 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -2578,32 +2578,6 @@ namespace Acore
};
} // namespace Acore
-/// Send a System Message to all GMs (except self if mentioned)
-void World::SendGMText(uint32 string_id, ...)
-{
- va_list ap;
- va_start(ap, string_id);
-
- Acore::WorldWorldTextBuilder wt_builder(string_id, &ap);
- Acore::LocalizedPacketListDo<Acore::WorldWorldTextBuilder> wt_do(wt_builder);
- for (SessionMap::iterator itr = _sessions.begin(); itr != _sessions.end(); ++itr)
- {
- // Session should have permissions to receive global gm messages
- WorldSession* session = itr->second;
- if (!session || AccountMgr::IsPlayerAccount(session->GetSecurity()))
- continue;
-
- // Player should be in world
- Player* player = session->GetPlayer();
- if (!player || !player->IsInWorld())
- continue;
-
- wt_do(session->GetPlayer());
- }
-
- va_end(ap);
-}
-
/// Send a packet to all players (or players selected team) in the zone (except self if mentioned)
bool World::SendZoneMessage(uint32 zone, WorldPacket const* packet, WorldSession* self, TeamId teamId)
{
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 9126df816b..daaa53e159 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -238,7 +238,6 @@ public:
void SetInitialWorldSettings() override;
void LoadConfigSettings(bool reload = false) override;
- void SendGMText(uint32 string_id, ...) override;
void SendGlobalMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) override;
void SendGlobalGMMessage(WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) override;
bool SendZoneMessage(uint32 zone, WorldPacket const* packet, WorldSession* self = nullptr, TeamId teamId = TEAM_NEUTRAL) override;
diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp
index f2ef607523..dd42ce23da 100644
--- a/src/server/scripts/Commands/cs_message.cpp
+++ b/src/server/scripts/Commands/cs_message.cpp
@@ -77,7 +77,7 @@ public:
if (WorldSession* session = handler->GetSession())
name = session->GetPlayer()->GetName();
- sWorld->SendGMText(LANG_GM_ANNOUNCE_COLOR, name.c_str(), message.data());
+ handler->SendGMText(LANG_GM_ANNOUNCE_COLOR, name, message.data());
return true;
}
@@ -92,12 +92,12 @@ public:
}
// announce to logged in GMs
- static bool HandleGMAnnounceCommand(ChatHandler* /*handler*/, Tail message)
+ static bool HandleGMAnnounceCommand(ChatHandler* handler, Tail message)
{
if (message.empty())
return false;
- sWorld->SendGMText(LANG_GM_BROADCAST, message.data());
+ handler->SendGMText(LANG_GM_BROADCAST, message.data());
return true;
}
diff --git a/src/test/mocks/WorldMock.h b/src/test/mocks/WorldMock.h
index 5c00ae829c..9a3423e59c 100644
--- a/src/test/mocks/WorldMock.h
+++ b/src/test/mocks/WorldMock.h
@@ -72,7 +72,6 @@ public:
MOCK_METHOD(uint16, GetConfigMaxSkillValue, (), (const));
MOCK_METHOD(void, SetInitialWorldSettings, ());
MOCK_METHOD(void, LoadConfigSettings, (bool reload), ());
- void SendGMText(uint32 string_id, ...) override {}
MOCK_METHOD(void, SendGlobalMessage, (WorldPacket const* packet, WorldSession* self, TeamId teamId), ());
MOCK_METHOD(void, SendGlobalGMMessage, (WorldPacket const* packet, WorldSession* self, TeamId teamId), ());
MOCK_METHOD(bool, SendZoneMessage, (uint32 zone, WorldPacket const* packet, WorldSession* self, TeamId teamId), ());