/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * 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 . */ #ifndef _CHANNELAPPENDERS_H #define _CHANNELAPPENDERS_H #include "Channel.h" #include "ChannelPackets.h" #include "CharacterCache.h" #include "GridNotifiers.h" #include "World.h" // initial packet data (notify type and channel name) template class ChannelNameBuilder { public: ChannelNameBuilder(Channel const* source, PacketModifier const& modifier) : _source(source), _modifier(modifier){ } Trinity::PacketSenderOwning* operator()(LocaleConstant locale) const { // LocalizedPacketDo sends client DBC locale, we need to get available to server locale LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale); Trinity::PacketSenderOwning* sender = new Trinity::PacketSenderOwning(); sender->Data.Type = _modifier.NotificationType; sender->Data._Channel = _source->GetName(localeIdx); _modifier.Append(sender->Data); sender->Data.Write(); return sender; } private: Channel const* _source; PacketModifier _modifier; }; struct JoinedAppend { explicit JoinedAppend(ObjectGuid const& guid) : _guid(guid) { } static uint8 const NotificationType = CHAT_JOINED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _guid; } private: ObjectGuid _guid; }; struct LeftAppend { explicit LeftAppend(ObjectGuid const& guid) : _guid(guid) { } static uint8 const NotificationType = CHAT_LEFT_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _guid; } private: ObjectGuid _guid; }; struct YouJoinedAppend { explicit YouJoinedAppend(Channel const* channel) : _channel(channel) { } static uint8 const NotificationType = CHAT_YOU_JOINED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.ChatChannelID = _channel->GetChannelId(); } private: Channel const* _channel; }; struct YouLeftAppend { explicit YouLeftAppend(Channel const* channel) : _channel(channel) { } static uint8 const NotificationType = CHAT_YOU_LEFT_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.ChatChannelID = _channel->GetChannelId(); } private: Channel const* _channel; }; struct WrongPasswordAppend { static uint8 const NotificationType = CHAT_WRONG_PASSWORD_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct NotMemberAppend { static uint8 const NotificationType = CHAT_NOT_MEMBER_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct NotModeratorAppend { static uint8 const NotificationType = CHAT_NOT_MODERATOR_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct PasswordChangedAppend { explicit PasswordChangedAppend(ObjectGuid const& guid) : _guid(guid) { } static uint8 const NotificationType = CHAT_PASSWORD_CHANGED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _guid; } private: ObjectGuid _guid; }; struct OwnerChangedAppend { explicit OwnerChangedAppend(ObjectGuid const& guid) : _guid(guid) { } static uint8 const NotificationType = CHAT_OWNER_CHANGED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _guid; } private: ObjectGuid _guid; }; struct PlayerNotFoundAppend { explicit PlayerNotFoundAppend(std::string const& playerName) : _playerName(playerName) { } static uint8 const NotificationType = CHAT_PLAYER_NOT_FOUND_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.Sender = _playerName; } private: std::string _playerName; }; struct NotOwnerAppend { static uint8 const NotificationType = CHAT_NOT_OWNER_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct ChannelOwnerAppend { explicit ChannelOwnerAppend(Channel const* channel, ObjectGuid const& ownerGuid) : _channel(channel), _ownerGuid(ownerGuid) { if (CharacterCacheEntry const* cInfo = sCharacterCache->GetCharacterCacheByGuid(_ownerGuid)) _ownerName = cInfo->Name; } static uint8 const NotificationType = CHAT_CHANNEL_OWNER_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.Sender = ((_channel->IsConstant() || !_ownerGuid) ? "Nobody" : _ownerName); } private: Channel const* _channel; ObjectGuid _ownerGuid; std::string _ownerName; }; struct ModeChangeAppend { explicit ModeChangeAppend(ObjectGuid const& guid, uint8 oldFlags, uint8 newFlags) : _guid(guid), _oldFlags(oldFlags), _newFlags(newFlags) { } static uint8 const NotificationType = CHAT_MODE_CHANGE_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _guid; data.OldFlags = _oldFlags; data.NewFlags = _newFlags; } private: ObjectGuid _guid; uint8 _oldFlags; uint8 _newFlags; }; struct AnnouncementsOnAppend { explicit AnnouncementsOnAppend(ObjectGuid const& guid) : _guid(guid) { } static uint8 const NotificationType = CHAT_ANNOUNCEMENTS_ON_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _guid; } private: ObjectGuid _guid; }; struct AnnouncementsOffAppend { explicit AnnouncementsOffAppend(ObjectGuid const& guid) : _guid(guid) { } static uint8 const NotificationType = CHAT_ANNOUNCEMENTS_OFF_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _guid; } private: ObjectGuid _guid; }; struct MutedAppend { static uint8 const NotificationType = CHAT_MUTED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct PlayerKickedAppend { explicit PlayerKickedAppend(ObjectGuid const& kicker, ObjectGuid const& kickee) : _kicker(kicker), _kickee(kickee) { } static uint8 const NotificationType = CHAT_PLAYER_KICKED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _kicker; data.TargetGuid = _kickee; } private: ObjectGuid _kicker; ObjectGuid _kickee; }; struct BannedAppend { static uint8 const NotificationType = CHAT_BANNED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct PlayerBannedAppend { explicit PlayerBannedAppend(ObjectGuid const& moderator, ObjectGuid const& banned) : _moderator(moderator), _banned(banned) { } static uint8 const NotificationType = CHAT_PLAYER_BANNED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _moderator; data.TargetGuid = _banned; } private: ObjectGuid _moderator; ObjectGuid _banned; }; struct PlayerUnbannedAppend { explicit PlayerUnbannedAppend(ObjectGuid const& moderator, ObjectGuid const& unbanned) : _moderator(moderator), _unbanned(unbanned) { } static uint8 const NotificationType = CHAT_PLAYER_UNBANNED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _moderator; data.TargetGuid = _unbanned; } private: ObjectGuid _moderator; ObjectGuid _unbanned; }; struct PlayerNotBannedAppend { explicit PlayerNotBannedAppend(std::string const& playerName) : _playerName(playerName) { } static uint8 const NotificationType = CHAT_PLAYER_NOT_BANNED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.Sender = _playerName; } private: std::string _playerName; }; struct PlayerAlreadyMemberAppend { explicit PlayerAlreadyMemberAppend(ObjectGuid const& guid) : _guid(guid) { } static uint8 const NotificationType = CHAT_PLAYER_ALREADY_MEMBER_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _guid; } private: ObjectGuid _guid; }; struct InviteAppend { explicit InviteAppend(ObjectGuid const& guid) : _guid(guid) { } static uint8 const NotificationType = CHAT_INVITE_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _guid; } private: ObjectGuid _guid; }; struct InviteWrongFactionAppend { static uint8 const NotificationType = CHAT_INVITE_WRONG_FACTION_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct WrongFactionAppend { static uint8 const NotificationType = CHAT_WRONG_FACTION_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct InvalidNameAppend { static uint8 const NotificationType = CHAT_INVALID_NAME_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct NotModeratedAppend { static uint8 const NotificationType = CHAT_NOT_MODERATED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct PlayerInvitedAppend { explicit PlayerInvitedAppend(std::string const& playerName) : _playerName(playerName) { } static uint8 const NotificationType = CHAT_PLAYER_INVITED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.Sender = _playerName; } private: std::string _playerName; }; struct PlayerInviteBannedAppend { explicit PlayerInviteBannedAppend(std::string const& playerName) : _playerName(playerName) { } static uint8 const NotificationType = CHAT_PLAYER_INVITE_BANNED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.Sender = _playerName; } private: std::string _playerName; }; struct ThrottledAppend { static uint8 const NotificationType = CHAT_THROTTLED_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct NotInAreaAppend { static uint8 const NotificationType = CHAT_NOT_IN_AREA_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct NotInLFGAppend { static uint8 const NotificationType = CHAT_NOT_IN_LFG_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& /*data*/) const { } }; struct VoiceOnAppend { explicit VoiceOnAppend(ObjectGuid const& guid, bool announce = true) : NotificationType(announce ? CHAT_VOICE_ON_NOTICE : CHAT_VOICE_ON_NO_ANNOUNCE_NOTICE), _guid(guid) { } void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _guid; } uint8 const NotificationType; private: ObjectGuid _guid; }; struct VoiceOffAppend { explicit VoiceOffAppend(ObjectGuid const& guid) : _guid(guid) { } static uint8 const NotificationType = CHAT_VOICE_OFF_NOTICE; void Append(WorldPackets::Channel::ChannelNotify& data) const { data.SenderGuid = _guid; } private: ObjectGuid _guid; }; #endif // _CHANNELAPPENDERS_H