From 54f7cc326f9aaf986a2fc1e20c2b03c95e020977 Mon Sep 17 00:00:00 2001 From: Spp Date: Mon, 25 Feb 2013 12:45:10 +0100 Subject: [PATCH] Core/RBAC: Create new permission 'Receive global GM messages/texts' --- sql/updates/auth/2013_02_25_04_auth_misc.sql | 2 +- sql/updates/auth/2013_02_25_05_auth_misc.sql | 18 ++++++++++ src/server/game/Accounts/RBAC.h | 1 + src/server/game/World/World.cpp | 37 ++++++++++++-------- 4 files changed, 42 insertions(+), 16 deletions(-) create mode 100644 sql/updates/auth/2013_02_25_05_auth_misc.sql diff --git a/sql/updates/auth/2013_02_25_04_auth_misc.sql b/sql/updates/auth/2013_02_25_04_auth_misc.sql index accacbb19d..faaee3582e 100644 --- a/sql/updates/auth/2013_02_25_04_auth_misc.sql +++ b/sql/updates/auth/2013_02_25_04_auth_misc.sql @@ -1,7 +1,7 @@ -- Add new permissions DELETE FROM `rbac_permissions` WHERE `id` IN (34, 37); INSERT INTO `rbac_permissions` (`id`, `name`) VALUES -(34, 'Check if shoul appear in list using .gm ingame command'), +(34, 'Check if should appear in list using .gm ingame command'), (37, 'Use staff badge in chat'); -- Add new role diff --git a/sql/updates/auth/2013_02_25_05_auth_misc.sql b/sql/updates/auth/2013_02_25_05_auth_misc.sql new file mode 100644 index 0000000000..e3ee3f0057 --- /dev/null +++ b/sql/updates/auth/2013_02_25_05_auth_misc.sql @@ -0,0 +1,18 @@ +-- Add new permission +DELETE FROM `rbac_permissions` WHERE `id` = 44; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES (44, 'Receive global GM messages/texts'); + +-- Add new role +DELETE FROM `rbac_roles` WHERE `id` = 16; +INSERT INTO `rbac_roles` (`id`, `name`) VALUES (16, 'Receive global GM messages/texts'); + +-- Add the permission to the role +DELETE FROM `rbac_role_permissions` WHERE `roleId` = 16; +INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES (16, 44); + +-- Add it to all GM+ groups +DELETE FROM `rbac_group_roles` WHERE `roleId` = 16; +INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES +(2, 16), +(3, 16), +(4, 16); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 80a493febe..0bc2f65a05 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -66,6 +66,7 @@ enum RBACPermissions RBAC_PERM_COMMANDS_APPEAR_IN_GM_LIST = 34, RBAC_PERM_CHAT_USE_STAFF_BADGE = 37, RBAC_PERM_RESURRECT_WITH_FULL_HPS = 38, + RBAC_PERM_RECEIVE_GLOBAL_GM_TEXTMESSAGE = 44, RBAC_PERM_MAX }; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 32ee21a7ca..955f3b7b99 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2118,18 +2118,21 @@ void World::SendGlobalMessage(WorldPacket* packet, WorldSession* self, uint32 te /// Send a packet to all GMs (except self if mentioned) void World::SendGlobalGMMessage(WorldPacket* packet, WorldSession* self, uint32 team) { - SessionMap::iterator itr; - for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) + for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) { - if (itr->second && - itr->second->GetPlayer() && - itr->second->GetPlayer()->IsInWorld() && - itr->second != self && - !AccountMgr::IsPlayerAccount(itr->second->GetSecurity()) && - (team == 0 || itr->second->GetPlayer()->GetTeam() == team)) - { - itr->second->SendPacket(packet); - } + // check if session and can receive global GM Messages and its not self + WorldSession* session = itr->second; + if (!session || session == self || !session->HasPermission(RBAC_PERM_RECEIVE_GLOBAL_GM_TEXTMESSAGE)) + continue; + + // Player should be in world + Player* player = session->GetPlayer(); + if (!player || !player->IsInWorld()) + continue; + + // Send only to same team, if team is given + if (!team || player->GetTeam() == team) + session->SendPacket(packet); } } @@ -2217,15 +2220,19 @@ void World::SendGMText(int32 string_id, ...) Trinity::WorldWorldTextBuilder wt_builder(string_id, &ap); Trinity::LocalizedPacketListDo wt_do(wt_builder); - for (SessionMap::iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) + for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) { - if (!itr->second || !itr->second->GetPlayer() || !itr->second->GetPlayer()->IsInWorld()) + // Session should have permissions to receive global gm messages + WorldSession* session = itr->second; + if (!session || !session->HasPermission(RBAC_PERM_RECEIVE_GLOBAL_GM_TEXTMESSAGE)) continue; - if (AccountMgr::IsPlayerAccount(itr->second->GetSecurity())) + // Player should be in world + Player* player = session->GetPlayer(); + if (!player || !player->IsInWorld()) continue; - wt_do(itr->second->GetPlayer()); + wt_do(player); } va_end(ap);