void Channel::Leave(uint64 p, bool send) { if (!IsOn(p)) { if (send) { WorldPacket data; MakeNotMember(&data); SendToOne(&data, p); } } else { Player *plr = sObjectMgr.GetPlayer(p); if (send) { WorldPacket data; MakeYouLeft(&data); SendToOne(&data, p); if (plr) plr->LeftChannel(this); data.clear(); } bool changeowner = players[p].IsOwner(); players.erase(p); if (m_announce && (!plr || !plr->GetSession()->HasPermissions(PERM_GMT) || !sWorld.getConfig(CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL))) { //WorldPacket data; //MakeLeft(&data, p); //SendToAll(&data); } LeaveNotify(p); if (changeowner) ChangeOwner(); } }
void Channel::Leave(uint64 p, bool send) { if(!IsOn(p)) { if(send) { WorldPacket data; MakeNotOn(&data); SendToOne(&data,p); } } else { if(send) { WorldPacket data; MakeYouLeft(&data); SendToOne(&data,p); Player *plr = objmgr.GetPlayer(p); if(plr) plr->LeftChannel(this); data.clear(); } bool changeowner = players[p].owner; players.erase(p); if(announce) { WorldPacket data; MakeLeft(&data,p); SendToAll(&data); } if(changeowner) { uint64 newowner = players.size() > 0 ? players.begin()->second.player : 0; SetOwner(newowner); } } }
void Channel::KickOrBan(uint64 good, const char *badname, bool ban) { AccountTypes sec = SEC_PLAYER; Player *gplr = sObjectMgr->GetPlayer(good); if (gplr) sec = gplr->GetSession()->GetSecurity(); if (!IsOn(good)) { WorldPacket data; MakeNotMember(&data); SendToOne(&data, good); } else if (!players[good].IsModerator() && sec < SEC_GAMEMASTER) { WorldPacket data; MakeNotModerator(&data); SendToOne(&data, good); } else { Player *bad = sObjectMgr->GetPlayer(badname); if (bad == NULL || !IsOn(bad->GetGUID())) { WorldPacket data; MakePlayerNotFound(&data, badname); SendToOne(&data, good); } else if (sec < SEC_GAMEMASTER && bad->GetGUID() == m_ownerGUID && good != m_ownerGUID) { WorldPacket data; MakeNotOwner(&data); SendToOne(&data, good); } else { bool changeowner = (m_ownerGUID == bad->GetGUID()); WorldPacket data; if (ban && !IsBanned(bad->GetGUID())) { banned.insert(bad->GetGUID()); MakePlayerBanned(&data, bad->GetGUID(), good); UpdateChannelInDB(); } else MakePlayerKicked(&data, bad->GetGUID(), good); SendToAll(&data); players.erase(bad->GetGUID()); bad->LeftChannel(this); if (changeowner && m_ownership && !players.empty()) { uint64 newowner = good; players[newowner].SetModerator(true); SetOwner(newowner); } } } }
void Channel::KickOrBan(uint64 good, const char *badname, bool ban) { AccountTypes sec = SEC_PLAYER; Player* gplr = ObjectAccessor::FindPlayer(good); if (gplr) sec = gplr->GetSession()->GetSecurity(); if (!IsOn(good)) { WorldPacket data; MakeNotMember(&data); SendToOne(&data, good); } else if (!players[good].IsModerator() && !AccountMgr::IsGMAccount(sec)) { WorldPacket data; MakeNotModerator(&data); SendToOne(&data, good); } else { Player* bad = sObjectAccessor->FindPlayerByName(badname); if (bad == NULL || !IsOn(bad->GetGUID())) { WorldPacket data; MakePlayerNotFound(&data, badname); SendToOne(&data, good); } else if (!AccountMgr::IsGMAccount(sec) && bad->GetGUID() == m_ownerGUID && good != m_ownerGUID) { WorldPacket data; MakeNotOwner(&data); SendToOne(&data, good); } else { bool changeowner = (m_ownerGUID == bad->GetGUID()); WorldPacket data; bool notify = !(AccountMgr::IsGMAccount(sec) && sWorld->getBoolConfig(CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL)); if (ban && !IsBanned(bad->GetGUID())) { banned.insert(bad->GetGUID()); UpdateChannelInDB(); if (notify) MakePlayerBanned(&data, bad->GetGUID(), good); } else if (notify) MakePlayerKicked(&data, bad->GetGUID(), good); if (notify) SendToAll(&data); players.erase(bad->GetGUID()); bad->LeftChannel(this); if (changeowner && m_ownership && !players.empty()) { uint64 newowner = good; players[newowner].SetModerator(true); SetOwner(newowner); } } } }
void Channel::KickOrBan(Player* player, const char* targetName, bool ban) { ObjectGuid guid = player->GetObjectGuid(); if (!IsOn(guid)) { WorldPacket data; MakeNotMember(&data); SendToOne(&data, guid); return; } if (!m_players[guid].IsModerator() && player->GetSession()->GetSecurity() < SEC_GAMEMASTER) { WorldPacket data; MakeNotModerator(&data); SendToOne(&data, guid); return; } Player* target = sObjectMgr.GetPlayer(targetName); if (!target) { WorldPacket data; MakePlayerNotFound(&data, targetName); SendToOne(&data, guid); return; } ObjectGuid targetGuid = target->GetObjectGuid(); if (!IsOn(targetGuid)) { WorldPacket data; MakePlayerNotFound(&data, targetName); SendToOne(&data, guid); return; } bool changeowner = m_ownerGuid == targetGuid; if (player->GetSession()->GetSecurity() < SEC_GAMEMASTER && changeowner && guid != m_ownerGuid) { WorldPacket data; MakeNotOwner(&data); SendToOne(&data, guid); return; } // kick or ban player WorldPacket data; if (ban && !IsBanned(targetGuid)) { m_banned.insert(targetGuid); MakePlayerBanned(&data, targetGuid, guid); } else MakePlayerKicked(&data, targetGuid, guid); SendToAll(&data); m_players.erase(targetGuid); target->LeftChannel(this); if (changeowner) { ObjectGuid newowner = !m_players.empty() ? guid : ObjectGuid(); SetOwner(newowner); } }
void Channel::KickOrBan(Player const* player, std::string const& badname, bool ban) { uint64 good = player->GetGUID(); if (!IsOn(good)) { WorldPacket data; MakeNotMember(&data); SendToOne(&data, good); return; } if (!playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { WorldPacket data; MakeNotModerator(&data); SendToOne(&data, good); return; } Player* bad = sObjectAccessor->FindPlayerByName(badname); uint64 victim = bad ? bad->GetGUID() : 0; if (!victim || !IsOn(victim)) { WorldPacket data; MakePlayerNotFound(&data, badname); SendToOne(&data, good); return; } bool changeowner = _ownerGUID == victim; if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && changeowner && good != _ownerGUID) { WorldPacket data; MakeNotOwner(&data); SendToOne(&data, good); return; } if (ban && !IsBanned(victim)) { bannedStore.insert(victim); UpdateChannelInDB(); if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { WorldPacket data; MakePlayerBanned(&data, victim, good); SendToAll(&data); } } else if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { WorldPacket data; MakePlayerKicked(&data, victim, good); SendToAll(&data); } playersStore.erase(victim); bad->LeftChannel(this); if (changeowner && _ownership && !playersStore.empty()) { uint64 newowner = good; playersStore[newowner].SetModerator(true); SetOwner(newowner); } }
void Channel::KickOrBan(uint64 good, const char *badname, bool ban) { AccountTypes sec = SEC_PLAYER; Player *gplr = objmgr.GetPlayer(good); if(gplr) sec = gplr->GetSession()->GetSecurity(); if(!IsOn(good)) { WorldPacket data; MakeNotMember(&data); SendToOne(&data, good); } else if(!players[good].IsModerator() && sec < SEC_GAMEMASTER) { WorldPacket data; MakeNotModerator(&data); SendToOne(&data, good); } else { Player *bad = objmgr.GetPlayer(badname); if(bad == NULL || !IsOn(bad->GetGUID())) { WorldPacket data; MakePlayerNotFound(&data, badname); SendToOne(&data, good); } else if(sec < SEC_GAMEMASTER && bad->GetGUID() == m_ownerGUID && good != m_ownerGUID) { WorldPacket data; MakeNotOwner(&data); SendToOne(&data, good); } else { bool changeowner = (m_ownerGUID == bad->GetGUID()); WorldPacket data; if(ban && !IsBanned(bad->GetGUID())) { banned.insert(bad->GetGUID()); MakePlayerBanned(&data, bad->GetGUID(), good); //save banlist if(m_IsSaved) { std::ostringstream banlist; BannedList::iterator iter; for (iter = banned.begin();iter != banned.end(); ++iter) { banlist << (*iter) << " "; } std::ostringstream ss; ss << "UPDATE channels SET BannedList = '" << banlist.str().c_str() << "' WHERE m_name = '"<<m_name.c_str()<<"' AND m_team = '"<<m_Team<<"'"; if(CharacterDatabase.PExecute( ss.str( ).c_str( ) )) { sLog.outDebug("Channel(%s) BannedList saved", m_name.c_str()); } } } else MakePlayerKicked(&data, bad->GetGUID(), good); SendToAll(&data); players.erase(bad->GetGUID()); bad->LeftChannel(this); if(changeowner) { uint64 newowner = !players.empty() ? good : false; players[newowner].SetModerator(true); SetOwner(newowner); } } } }
void Channel::KickOrBan(Player const* player, std::string const& badname, bool ban) { AccountTypes sec = player->GetSession()->GetSecurity(); uint64 good = player->GetGUID(); if (!IsOn(good)) { WorldPacket data; MakeNotMember(&data); SendToOne(&data, good); return; } if (!playersStore[good].IsModerator() && !AccountMgr::IsGMAccount(sec)) { WorldPacket data; MakeNotModerator(&data); SendToOne(&data, good); return; } Player* bad = sObjectAccessor->FindPlayerByName(badname); uint64 victim = bad ? bad->GetGUID() : 0; if (!victim || !IsOn(victim)) { WorldPacket data; MakePlayerNotFound(&data, badname); SendToOne(&data, good); return; } bool changeowner = _ownerGUID == victim; if (!AccountMgr::IsGMAccount(sec) && changeowner && good != _ownerGUID) { WorldPacket data; MakeNotOwner(&data); SendToOne(&data, good); return; } bool notify = !(AccountMgr::IsGMAccount(sec) && sWorld->getBoolConfig(CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL)); if (ban && !IsBanned(victim)) { bannedStore.insert(victim); UpdateChannelInDB(); if (notify) { WorldPacket data; MakePlayerBanned(&data, victim, good); SendToAll(&data); } } else if (notify) { WorldPacket data; MakePlayerKicked(&data, victim, good); SendToAll(&data); } playersStore.erase(victim); bad->LeftChannel(this); if (changeowner && _ownership && !playersStore.empty()) { uint64 newowner = good; playersStore[newowner].SetModerator(true); SetOwner(newowner); } }
void Channel::Leave(uint64 p, bool send) { std::string worldChatChannelName = sWorld->GetWorldChatChannelName(); uint64 worldChatOwnerGuid = sWorld->GetWorldChatOwnerGuid(); uint64 worldChatIdleGuid = sWorld->GetWorldChatIdleGuid(); if (!IsOn(p)) { if (send) { WorldPacket data; MakeNotMember(&data); SendToOne(&data, p); } } else { Player* player = ObjectAccessor::FindPlayer(p); if (send) { WorldPacket data; MakeYouLeft(&data); SendToOne(&data, p); if (player) player->LeftChannel(this); data.clear(); } bool changeowner = players[p].IsOwner(); players.erase(p); if (m_announce && (!player || !AccountMgr::IsGMAccount(player->GetSession()->GetSecurity()) || !sWorld->getBoolConfig(CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL))) { WorldPacket data; MakeLeft(&data, p); SendToAll(&data); } LeaveNotify(p); if (!IsConstant()) { // Update last_used timestamp in db UpdateChannelUseageInDB(); // If the channel owner left and there are still players inside, pick a new owner if (changeowner && m_ownership && !players.empty()) { if ( m_name != worldChatChannelName ) { uint64 newowner = !players.empty() ? players.begin()->second.player : 0; players[newowner].SetModerator(true); SetOwner(newowner); } else { if ( IsOn(worldChatOwnerGuid) ) { uint64 newowner = worldChatOwnerGuid; players[newowner].SetModerator(true); SetOwner(newowner); } else { uint64 newowner = worldChatIdleGuid; players[newowner].SetModerator(true); SetOwner(newowner); } } } } } }
void Channel::KickOrBan(Player const* player, std::string const& badname, bool ban) { AccountTypes sec = player->GetSession()->GetSecurity(); uint64 good = player->GetGUID(); if (!IsOn(good)) { WorldPacket data; MakeNotMember(&data); SendToOne(&data, good); return; } if (!playersStore[good].IsModerator() && !AccountMgr::IsGMAccount(sec)) { WorldPacket data; MakeNotModerator(&data); SendToOne(&data, good); return; } bool banOffline = false; // pussywizard bool isGoodConstantModerator = _channelRights.moderators.find(player->GetSession()->GetAccountId()) != _channelRights.moderators.end(); uint64 victim = 0; uint32 badAccId = 0; uint32 badSecurity = 0; Player* bad = ObjectAccessor::FindPlayerByName(badname, false); if (bad) { victim = bad->GetGUID(); badAccId = bad->GetSession()->GetAccountId(); badSecurity = bad->GetSession()->GetSecurity(); } bool isOnChannel = victim && IsOn(victim); if (!isOnChannel) { if (ban && (AccountMgr::IsGMAccount(sec) || isGoodConstantModerator)) { if (uint32 lowGuid = sWorld->GetGlobalPlayerGUID(badname)) if (const GlobalPlayerData* gpd = sWorld->GetGlobalPlayerData(lowGuid)) { if (Player::TeamIdForRace(gpd->race) == Player::TeamIdForRace(player->getRace())) { banOffline = true; victim = MAKE_NEW_GUID(lowGuid, 0, HIGHGUID_PLAYER); badAccId = gpd->accountId; } else { ChatHandler(player->GetSession()).PSendSysMessage("Character %s has other faction!", badname.c_str()); return; } } if (!banOffline) { WorldPacket data; MakePlayerNotFound(&data, badname); SendToOne(&data, good); return; } } else { WorldPacket data; MakePlayerNotFound(&data, badname); SendToOne(&data, good); return; } } bool changeowner = _ownerGUID == victim; bool isBadConstantModerator = _channelRights.moderators.find(badAccId) != _channelRights.moderators.end(); if (!AccountMgr::IsGMAccount(sec) && !isGoodConstantModerator) { if (changeowner && good != _ownerGUID) { WorldPacket data; MakeNotOwner(&data); SendToOne(&data, good); return; } if (ban && (_channelRights.flags & CHANNEL_RIGHT_CANT_BAN) || !ban && (_channelRights.flags & CHANNEL_RIGHT_CANT_KICK)) { WorldPacket data; MakeNotModerator(&data); SendToOne(&data, good); return; } if (isBadConstantModerator || AccountMgr::IsGMAccount(badSecurity)) { WorldPacket data; MakeNotModerator(&data); SendToOne(&data, good); return; } } bool notify = !(AccountMgr::IsGMAccount(sec) && sWorld->getBoolConfig(CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL)); if (ban) { if (!IsBanned(victim)) { bannedStore[GUID_LOPART(victim)] = time(NULL) + CHANNEL_BAN_DURATION; AddChannelBanToDB(GUID_LOPART(victim), time(NULL) + CHANNEL_BAN_DURATION); if (notify) { WorldPacket data; MakePlayerBanned(&data, victim, good); SendToAll(&data); } } } else if (notify) { WorldPacket data; MakePlayerKicked(&data, victim, good); SendToAll(&data); } if (isOnChannel) { playersStore.erase(victim); bad->LeftChannel(this); RemoveWatching(bad); LeaveNotify(bad); } if (changeowner && _ownership) { if (good != victim) SetOwner(good); else if (!playersStore.empty()) { uint64 newowner = 0; for (Channel::PlayerContainer::const_iterator itr = playersStore.begin(); itr != playersStore.end(); ++itr) { newowner = itr->second.player; if (!itr->second.plrPtr->GetSession()->GetSecurity()) break; } SetOwner(newowner); } else SetOwner(0); } }
void Channel::KickOrBan(Player const* player, std::string const& badname, bool ban) { ObjectGuid const& good = player->GetGUID(); if (!IsOn(good)) { NotMemberAppend appender; ChannelNameBuilder<NotMemberAppend> builder(this, appender); SendToOne(builder, good); return; } PlayerInfo& info = _playersStore.at(good); if (!info.IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { NotModeratorAppend appender; ChannelNameBuilder<NotModeratorAppend> builder(this, appender); SendToOne(builder, good); return; } Player* bad = ObjectAccessor::FindConnectedPlayerByName(badname); ObjectGuid const& victim = bad ? bad->GetGUID() : ObjectGuid::Empty; if (!victim || !IsOn(victim)) { PlayerNotFoundAppend appender(badname); ChannelNameBuilder<PlayerNotFoundAppend> builder(this, appender); SendToOne(builder, good); return; } bool changeowner = _ownerGuid == victim; if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && changeowner && good != _ownerGuid) { NotOwnerAppend appender; ChannelNameBuilder<NotOwnerAppend> builder(this, appender); SendToOne(builder, good); return; } if (ban && !IsBanned(victim)) { _bannedStore.insert(victim); UpdateChannelInDB(); if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { PlayerBannedAppend appender(good, victim); ChannelNameBuilder<PlayerBannedAppend> builder(this, appender); SendToAll(builder); } } else if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { PlayerKickedAppend appender(good, victim); ChannelNameBuilder<PlayerKickedAppend> builder(this, appender); SendToAll(builder); } _playersStore.erase(victim); bad->LeftChannel(this); if (changeowner && _ownershipEnabled && !_playersStore.empty()) { info.SetModerator(true); SetOwner(good); } }
void Channel::KickOrBan(Player const* player, std::string const& badname, bool ban) { ObjectGuid const& good = player->GetGUID(); if (!IsOn(good)) { WorldPackets::Channel::ChannelNotify notify; MakeNotMember(notify); player->SendDirectMessage(notify.Write()); return; } if (!_playersStore[good].IsModerator() && !player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR)) { WorldPackets::Channel::ChannelNotify notify; MakeNotModerator(notify); player->SendDirectMessage(notify.Write()); return; } Player* bad = ObjectAccessor::FindConnectedPlayerByName(badname); ObjectGuid victim = bad ? bad->GetGUID() : ObjectGuid::Empty; if (!victim || !IsOn(victim)) { WorldPackets::Channel::ChannelNotify notify; MakePlayerNotFound(notify, badname); player->SendDirectMessage(notify.Write()); return; } bool changeowner = _ownerGUID == victim; if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR) && changeowner && good != _ownerGUID) { WorldPackets::Channel::ChannelNotify notify; MakeNotOwner(notify); player->SendDirectMessage(notify.Write()); return; } if (ban && !IsBanned(victim)) { _bannedStore.insert(victim); UpdateChannelInDB(); if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { WorldPackets::Channel::ChannelNotify notify; MakePlayerBanned(notify, victim, good); SendToAll(notify.Write()); } } else if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_SILENTLY_JOIN_CHANNEL)) { WorldPackets::Channel::ChannelNotify notify; MakePlayerKicked(notify, victim, good); SendToAll(notify.Write()); } _playersStore.erase(victim); bad->LeftChannel(this); if (changeowner && _ownership && !_playersStore.empty()) { _playersStore[good].SetModerator(true); SetOwner(good); } }