diff options
Diffstat (limited to 'src/server/game/Handlers/ChannelHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/ChannelHandler.cpp | 292 |
1 files changed, 47 insertions, 245 deletions
diff --git a/src/server/game/Handlers/ChannelHandler.cpp b/src/server/game/Handlers/ChannelHandler.cpp index 245665d8d3b..c5e1c3e7fad 100644 --- a/src/server/game/Handlers/ChannelHandler.cpp +++ b/src/server/game/Handlers/ChannelHandler.cpp @@ -70,270 +70,72 @@ void WorldSession::HandleLeaveChannel(WorldPackets::Channel::LeaveChannel& packe } } -void WorldSession::HandleChannelList(WorldPackets::Channel::ChannelListRequest& packet) +template<void(Channel::*CommandFunction)(Player const*)> +void WorldSession::HandleChannelCommand(WorldPackets::Channel::ChannelPlayerCommand& packet) { TC_LOG_DEBUG("chat.system", "%s %s ChannelName: %s", GetOpcodeNameForLogging(packet.GetOpcode()).c_str(), GetPlayerInfo().c_str(), packet.ChannelName.c_str()); if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) if (Channel* channel = cMgr->GetChannel(packet.ChannelName, GetPlayer())) - channel->List(GetPlayer()); + (channel->*CommandFunction)(GetPlayer()); } -void WorldSession::HandleChannelPassword(WorldPacket& recvPacket) +template<void(Channel::*CommandFunction)(Player const*, std::string const&)> +void WorldSession::HandleChannelPlayerCommand(WorldPackets::Channel::ChannelPlayerCommand& packet) { - uint32 nameLength = recvPacket.ReadBits(8); - uint32 passLength = recvPacket.ReadBits(7); - - std::string channelName = recvPacket.ReadString(nameLength); - std::string password = recvPacket.ReadString(passLength); - - TC_LOG_DEBUG("chat.system", "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()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->Password(GetPlayer(), password); -} - -void WorldSession::HandleChannelSetOwner(WorldPacket& recvPacket) -{ - uint32 channelLength = recvPacket.ReadBits(8); - uint32 nameLength = recvPacket.ReadBits(7); - - std::string targetName = recvPacket.ReadString(nameLength); - std::string channelName = recvPacket.ReadString(channelLength); - - TC_LOG_DEBUG("chat.system", "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()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->SetOwner(GetPlayer(), targetName); -} - -void WorldSession::HandleChannelOwner(WorldPacket& recvPacket) -{ - uint32 length = recvPacket.ReadBits(8); - std::string channelName = recvPacket.ReadString(length); - - TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_OWNER %s Channel: %s", - GetPlayerInfo().c_str(), channelName.c_str()); - - if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->SendWhoOwner(GetPlayer()); -} - -void WorldSession::HandleChannelModerator(WorldPacket& recvPacket) -{ - uint32 channelLength = recvPacket.ReadBits(8); - uint32 nameLength = recvPacket.ReadBits(7); - - std::string targetName = recvPacket.ReadString(nameLength); - std::string channelName = recvPacket.ReadString(channelLength); - - TC_LOG_DEBUG("chat.system", "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()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->SetModerator(GetPlayer(), targetName); -} - -void WorldSession::HandleChannelUnmoderator(WorldPacket& recvPacket) -{ - uint32 nameLength = recvPacket.ReadBits(7); - uint32 channelLength = recvPacket.ReadBits(8); - - std::string channelName = recvPacket.ReadString(channelLength); - std::string targetName = recvPacket.ReadString(nameLength); - - TC_LOG_DEBUG("chat.system", "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()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->UnsetModerator(GetPlayer(), targetName); -} - -void WorldSession::HandleChannelMute(WorldPacket& recvPacket) -{ - uint32 channelLength = recvPacket.ReadBits(8); - uint32 nameLength = recvPacket.ReadBits(7); - - std::string channelName = recvPacket.ReadString(channelLength); - std::string targetName = recvPacket.ReadString(nameLength); - - TC_LOG_DEBUG("chat.system", "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()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->SetMute(GetPlayer(), targetName); -} - -void WorldSession::HandleChannelUnmute(WorldPacket& recvPacket) -{ - uint32 nameLength = recvPacket.ReadBits(8); - uint32 channelLength = recvPacket.ReadBits(7); - - std::string targetName = recvPacket.ReadString(nameLength); - std::string channelName = recvPacket.ReadString(channelLength); - - TC_LOG_DEBUG("chat.system", "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()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->UnsetMute(GetPlayer(), targetName); -} - -void WorldSession::HandleChannelInvite(WorldPacket& recvPacket) -{ - uint32 nameLength = recvPacket.ReadBits(7); - uint32 channelLength = recvPacket.ReadBits(8); - - std::string targetName = recvPacket.ReadString(nameLength); - std::string channelName = recvPacket.ReadString(channelLength); - - TC_LOG_DEBUG("chat.system", "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()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->Invite(GetPlayer(), targetName); -} - -void WorldSession::HandleChannelKick(WorldPacket& recvPacket) -{ - uint32 channelLength = recvPacket.ReadBits(8); - uint32 nameLength = recvPacket.ReadBits(7); - - std::string channelName = recvPacket.ReadString(channelLength); - std::string targetName = recvPacket.ReadString(nameLength); - - TC_LOG_DEBUG("chat.system", "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()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->Kick(GetPlayer(), targetName); -} - -void WorldSession::HandleChannelBan(WorldPacket& recvPacket) -{ - uint32 channelLength, nameLength; - std::string channelName, targetName; - - channelLength = recvPacket.ReadBits(8); - nameLength = recvPacket.ReadBits(7); - - targetName = recvPacket.ReadString(nameLength); - channelName = recvPacket.ReadString(channelLength); - - TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_BAN %s Channel: %s, Target: %s", - GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); - - if (!normalizePlayerName(targetName)) + if (packet.Name.length() >= MAX_CHANNEL_NAME_STR) + { + TC_LOG_DEBUG("chat.system", "%s %s ChannelName: %s, Name: %s, Name too long.", + GetOpcodeNameForLogging(packet.GetOpcode()).c_str(), GetPlayerInfo().c_str(), packet.ChannelName.c_str(), packet.Name.c_str()); return; + } - if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->Ban(GetPlayer(), targetName); -} - -void WorldSession::HandleChannelUnban(WorldPacket& recvPacket) -{ - uint32 channelLength = recvPacket.ReadBits(7); - uint32 nameLength = recvPacket.ReadBits(8); - - std::string targetName = recvPacket.ReadString(nameLength); - std::string channelName = recvPacket.ReadString(channelLength); - - TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_UNBAN %s Channel: %s, Target: %s", - GetPlayerInfo().c_str(), channelName.c_str(), targetName.c_str()); + TC_LOG_DEBUG("chat.system", "%s %s ChannelName: %s, Name: %s", + GetOpcodeNameForLogging(packet.GetOpcode()).c_str(), GetPlayerInfo().c_str(), packet.ChannelName.c_str(), packet.Name.c_str()); - if (!normalizePlayerName(targetName)) + if (!normalizePlayerName(packet.Name)) return; if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->UnBan(GetPlayer(), targetName); -} - -void WorldSession::HandleChannelAnnouncements(WorldPacket& recvPacket) -{ - uint32 length = recvPacket.ReadBits(8); - std::string channelName = recvPacket.ReadString(length); - - TC_LOG_DEBUG("chat.system", "CMSG_CHANNEL_ANNOUNCEMENTS %s Channel: %s", - GetPlayerInfo().c_str(), channelName.c_str()); - - if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->Announce(GetPlayer()); + if (Channel* channel = cMgr->GetChannel(packet.ChannelName, GetPlayer())) + (channel->*CommandFunction)(GetPlayer(), packet.Name); } -void WorldSession::HandleGetChannelMemberCount(WorldPacket &recvPacket) +template<> +void WorldSession::HandleChannelPlayerCommand<&Channel::Password>(WorldPackets::Channel::ChannelPlayerCommand& packet) { - std::string channelName; - recvPacket >> channelName; - - TC_LOG_DEBUG("chat.system", "CMSG_GET_CHANNEL_MEMBER_COUNT %s Channel: %s", - GetPlayerInfo().c_str(), channelName.c_str()); - - if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) + if (packet.Name.length() > MAX_CHANNEL_PASS_STR) { - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - { - TC_LOG_DEBUG("chat.system", "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); - } + TC_LOG_DEBUG("chat.system", "%s %s ChannelName: %s, Password: %s, Password too long.", + GetOpcodeNameForLogging(packet.GetOpcode()).c_str(), GetPlayerInfo().c_str(), packet.ChannelName.c_str(), packet.Name.c_str()); + return; } -} - -void WorldSession::HandleSetChannelWatch(WorldPacket& recvPacket) -{ - std::string channelName; - recvPacket >> channelName; - TC_LOG_DEBUG("chat.system", "CMSG_SET_CHANNEL_WATCH %s Channel: %s", - GetPlayerInfo().c_str(), channelName.c_str()); + TC_LOG_DEBUG("chat.system", "%s %s ChannelName: %s, Password: %s", + GetOpcodeNameForLogging(packet.GetOpcode()).c_str(), GetPlayerInfo().c_str(), packet.ChannelName.c_str(), packet.Name.c_str()); - /* - if (ChannelMgr* cMgr = channelMgr(GetPlayer()->GetTeam())) - if (Channel* channel = cMgr->GetChannel(channelName, GetPlayer())) - channel->JoinNotify(GetPlayer()); - */ -} + if (ChannelMgr* cMgr = ChannelMgr::ForTeam(GetPlayer()->GetTeam())) + if (Channel* channel = cMgr->GetChannel(packet.ChannelName, GetPlayer())) + channel->Password(GetPlayer(), packet.Name); +} + +template void WorldSession::HandleChannelCommand<&Channel::Announce>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::Ban>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelCommand<&Channel::DeclineInvite>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::Invite>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::Kick>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelCommand<&Channel::List>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::SetModerator>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::SetMute>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelCommand<&Channel::SendWhoOwner>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::SetOwner>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::SilenceAll>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::SilenceVoice>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::UnBan>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::UnsetModerator>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::UnsetMute>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::UnsilenceAll>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelPlayerCommand<&Channel::UnsilenceVoice>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelCommand<&Channel::DeVoice>(WorldPackets::Channel::ChannelPlayerCommand&); +template void WorldSession::HandleChannelCommand<&Channel::Voice>(WorldPackets::Channel::ChannelPlayerCommand&); |