diff options
Diffstat (limited to 'src/server/game/Handlers/ChannelHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/ChannelHandler.cpp | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/src/server/game/Handlers/ChannelHandler.cpp b/src/server/game/Handlers/ChannelHandler.cpp new file mode 100644 index 0000000000..6ac3d3c606 --- /dev/null +++ b/src/server/game/Handlers/ChannelHandler.cpp @@ -0,0 +1,340 @@ +/* + * Copyright (C) + * Copyright (C) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ObjectMgr.h" // for normalizePlayerName +#include "ChannelMgr.h" +#include "Player.h" + +#include <cctype> + +void WorldSession::HandleJoinChannel(WorldPacket& recvPacket) +{ + uint32 channelId; + uint8 unknown1, unknown2; + std::string channelName, password; + + recvPacket >> channelId >> unknown1 >> unknown2 >> channelName >> password; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_JOIN_CHANNEL %s Channel: %u, unk1: %u, unk2: %u, channel: %s, password: %s", + // GetPlayerInfo().c_str(), channelId, unknown1, unknown2, channelName.c_str(), password.c_str()); + + if (channelId) + { + ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(channelId); + if (!channel) + return; + + AreaTableEntry const* zone = GetAreaEntryByAreaID(GetPlayer()->GetZoneId()); + if (!zone || !GetPlayer()->CanJoinConstantChannelInZone(channel, zone)) + return; + } + + if (channelName.empty()) + return; + + if (isdigit(channelName[0])) + return; + + // pussywizard: restrict allowed characters in channel name to avoid |0 and possibly other exploits + //if (!ObjectMgr::IsValidChannelName(channelName)) + if (channelName.find("|") != std::string::npos || channelName.size() >= 100) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + { + if (Channel* channel = cMgr->GetJoinChannel(channelName, channelId)) + channel->JoinChannel(GetPlayer(), password); + } +} + +void WorldSession::HandleLeaveChannel(WorldPacket& recvPacket) +{ + uint32 unk; + std::string channelName; + recvPacket >> unk >> channelName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_LEAVE_CHANNEL %s Channel: %s, unk1: %u", + // GetPlayerInfo().c_str(), channelName.c_str(), unk); + + if (channelName.empty()) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + { + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->LeaveChannel(GetPlayer(), true); + } +} + +void WorldSession::HandleChannelList(WorldPacket& recvPacket) +{ + std::string channelName; + recvPacket >> channelName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "%s %s Channel: %s", + // recvPacket.GetOpcode() == CMSG_CHANNEL_DISPLAY_LIST ? "CMSG_CHANNEL_DISPLAY_LIST" : "CMSG_CHANNEL_LIST", + // GetPlayerInfo().c_str(), channelName.c_str()); + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->List(GetPlayer()); +} + +void WorldSession::HandleChannelPassword(WorldPacket& recvPacket) +{ + std::string channelName, password; + recvPacket >> channelName >> password; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_PASSWORD %s Channel: %s, Password: %s", + // GetPlayerInfo().c_str(), channelName.c_str(), password.c_str()); + + if (password.length() > MAX_CHANNEL_PASS_STR) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->Password(GetPlayer(), password); +} + +void WorldSession::HandleChannelSetOwner(WorldPacket& recvPacket) +{ + std::string channelName, targetName; + recvPacket >> channelName >> targetName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_SET_OWNER %s Channel: %s, Target: %s", + // GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); + + if (!normalizePlayerName(targetName)) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->SetOwner(GetPlayer(), targetName); +} + +void WorldSession::HandleChannelOwner(WorldPacket& recvPacket) +{ + std::string channelName; + recvPacket >> channelName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_OWNER %s Channel: %s", + // GetPlayerInfo().c_str(), channelName.c_str()); + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->SendWhoOwner(GetPlayer()->GetGUID()); +} + +void WorldSession::HandleChannelModerator(WorldPacket& recvPacket) +{ + std::string channelName, targetName; + recvPacket >> channelName >> targetName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_MODERATOR %s Channel: %s, Target: %s", + // GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); + + if (!normalizePlayerName(targetName)) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->SetModerator(GetPlayer(), targetName); +} + +void WorldSession::HandleChannelUnmoderator(WorldPacket& recvPacket) +{ + std::string channelName, targetName; + recvPacket >> channelName >> targetName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_UNMODERATOR %s Channel: %s, Target: %s", + // GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); + + if (!normalizePlayerName(targetName)) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->UnsetModerator(GetPlayer(), targetName); +} + +void WorldSession::HandleChannelMute(WorldPacket& recvPacket) +{ + std::string channelName, targetName; + recvPacket >> channelName >> targetName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_MUTE %s Channel: %s, Target: %s", + // GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); + + if (!normalizePlayerName(targetName)) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->SetMute(GetPlayer(), targetName); +} + +void WorldSession::HandleChannelUnmute(WorldPacket& recvPacket) +{ + std::string channelName, targetName; + recvPacket >> channelName >> targetName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_UNMUTE %s Channel: %s, Target: %s", + // GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); + + if (!normalizePlayerName(targetName)) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->UnsetMute(GetPlayer(), targetName); +} + +void WorldSession::HandleChannelInvite(WorldPacket& recvPacket) +{ + std::string channelName, targetName; + recvPacket >> channelName >> targetName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_INVITE %s Channel: %s, Target: %s", + // GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); + + if (!normalizePlayerName(targetName)) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->Invite(GetPlayer(), targetName); +} + +void WorldSession::HandleChannelKick(WorldPacket& recvPacket) +{ + std::string channelName, targetName; + recvPacket >> channelName >> targetName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_KICK %s Channel: %s, Target: %s", + // GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); + + if (!normalizePlayerName(targetName)) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->Kick(GetPlayer(), targetName); +} + +void WorldSession::HandleChannelBan(WorldPacket& recvPacket) +{ + std::string channelName, targetName; + recvPacket >> channelName >> targetName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_BAN %s Channel: %s, Target: %s", + // GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); + + if (!normalizePlayerName(targetName)) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->Ban(GetPlayer(), targetName); +} + +void WorldSession::HandleChannelUnban(WorldPacket& recvPacket) +{ + std::string channelName, targetName; + recvPacket >> channelName >> targetName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_UNBAN %s Channel: %s, Target: %s", + // GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); + + if (!normalizePlayerName(targetName)) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->UnBan(GetPlayer(), targetName); +} + +void WorldSession::HandleChannelAnnouncements(WorldPacket& recvPacket) +{ + std::string channelName; + recvPacket >> channelName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_CHANNEL_ANNOUNCEMENTS %s Channel: %s", + // GetPlayerInfo().c_str(), channelName.c_str()); + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + channel->Announce(GetPlayer()); +} + +void WorldSession::HandleChannelDisplayListQuery(WorldPacket &recvPacket) +{ + // this should be OK because the 2 function _were_ the same + HandleChannelList(recvPacket); +} + +void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket) +{ + std::string channelName; + recvPacket >> channelName; + + ;//sLog->outDebug(LOG_FILTER_CHATSYS, "CMSG_GET_CHANNEL_MEMBER_COUNT %s Channel: %s", + // GetPlayerInfo().c_str(), channelName.c_str()); + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + { + if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) + { + sLog->outDebug(LOG_FILTER_CHATSYS, "SMSG_CHANNEL_MEMBER_COUNT %s Channel: %s Count: %u", + GetPlayerInfo().c_str(), channelName.c_str(), channel->GetNumPlayers()); + + WorldPacket data(SMSG_CHANNEL_MEMBER_COUNT, channel->GetName().size() + 1 + 4); + data << channel->GetName(); + data << uint8(channel->GetFlags()); + data << uint32(channel->GetNumPlayers()); + SendPacket(&data); + } + } +} + +void WorldSession::HandleSetChannelWatch(WorldPacket &recvPacket) +{ + std::string channelName; + recvPacket >> channelName; + + GetPlayer()->ClearChannelWatch(); + + if (channelName.empty()) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, NULL, false)) + channel->AddWatching(GetPlayer()); +} + +void WorldSession::HandleClearChannelWatch(WorldPacket &recvPacket) +{ + std::string channelName; + recvPacket >> channelName; + + if (channelName.empty()) + return; + + if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetPlayer()->GetTeamId())) + if (Channel* channel = cMgr->GetChannel(channelName, NULL, false)) + channel->RemoveWatching(GetPlayer()); +} |