aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2017-05-03 13:55:03 +0200
committerShauren <shauren.trinity@gmail.com>2017-05-03 13:55:03 +0200
commit0d556dd4af739130d2217ad66b65787bb310c46b (patch)
treec31c2788868f669656bd27be83f85d238d2b57b3 /src
parentc01d28bc3326cbd649e839cb3ede96eb56d85a7e (diff)
Core/Chat: Fixed addon whispers and channel messages
Closes #19490 Closes #19534
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Chat/Channels/Channel.cpp53
-rw-r--r--src/server/game/Chat/Channels/Channel.h4
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp9
3 files changed, 63 insertions, 3 deletions
diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp
index fd4ca955d27..d587b1fef4e 100644
--- a/src/server/game/Chat/Channels/Channel.cpp
+++ b/src/server/game/Chat/Channels/Channel.cpp
@@ -741,6 +741,48 @@ void Channel::Say(ObjectGuid const& guid, std::string const& what, uint32 lang)
SendToAll(builder, !playerInfo.IsModerator() ? guid : ObjectGuid::Empty);
}
+void Channel::AddonSay(ObjectGuid const& guid, std::string const& prefix, std::string const& what) const
+{
+ if (what.empty())
+ return;
+
+ if (!IsOn(guid))
+ {
+ NotMemberAppend appender;
+ ChannelNameBuilder<NotMemberAppend> builder(this, appender);
+ SendToOne(builder, guid);
+ return;
+ }
+
+ PlayerInfo const& playerInfo = _playersStore.at(guid);
+ if (playerInfo.IsMuted())
+ {
+ MutedAppend appender;
+ ChannelNameBuilder<MutedAppend> builder(this, appender);
+ SendToOne(builder, guid);
+ return;
+ }
+
+ auto builder = [&](LocaleConstant locale)
+ {
+ LocaleConstant localeIdx = sWorld->GetAvailableDbcLocale(locale);
+
+ WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat();
+ if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
+ packet->Initialize(CHAT_MSG_CHANNEL, LANG_ADDON, player, player, what, 0, GetName(localeIdx), DEFAULT_LOCALE, prefix);
+ else
+ {
+ packet->Initialize(CHAT_MSG_CHANNEL, LANG_ADDON, nullptr, nullptr, what, 0, GetName(localeIdx), DEFAULT_LOCALE, prefix);
+ packet->SenderGUID = guid;
+ packet->TargetGUID = guid;
+ }
+
+ return packet;
+ };
+
+ SendToAllWithAddon(builder, prefix, !playerInfo.IsModerator() ? guid : ObjectGuid::Empty);
+}
+
void Channel::Invite(Player const* player, std::string const& newname)
{
ObjectGuid const& guid = player->GetGUID();
@@ -974,3 +1016,14 @@ void Channel::SendToOne(Builder& builder, ObjectGuid const& who) const
if (Player* player = ObjectAccessor::FindConnectedPlayer(who))
localizer(player);
}
+
+template <class Builder>
+void Channel::SendToAllWithAddon(Builder& builder, std::string const& addonPrefix, ObjectGuid const& guid /*= ObjectGuid::Empty*/) const
+{
+ Trinity::LocalizedPacketDo<Builder> localizer(builder);
+
+ for (PlayerContainer::value_type const& i : _playersStore)
+ if (Player* player = ObjectAccessor::FindConnectedPlayer(i.first))
+ if (player->GetSession()->IsAddonRegistered(addonPrefix) && (guid.IsEmpty() || !player->GetSocial()->HasIgnore(guid)))
+ localizer(player);
+}
diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h
index 8fb1b946da2..056cf9a4c3f 100644
--- a/src/server/game/Chat/Channels/Channel.h
+++ b/src/server/game/Chat/Channels/Channel.h
@@ -221,6 +221,7 @@ class TC_GAME_API Channel
void List(Player const* player);
void Announce(Player const* player);
void Say(ObjectGuid const& guid, std::string const& what, uint32 lang) const;
+ void AddonSay(ObjectGuid const& guid, std::string const& prefix, std::string const& what) const;
void DeclineInvite(Player const* player);
void Invite(Player const* player, std::string const& newp);
void JoinNotify(Player const* player);
@@ -238,6 +239,9 @@ class TC_GAME_API Channel
template <class Builder>
void SendToOne(Builder& builder, ObjectGuid const& who) const;
+ template <class Builder>
+ void SendToAllWithAddon(Builder& builder, std::string const& addonPrefix, ObjectGuid const& guid = ObjectGuid::Empty) const;
+
bool IsOn(ObjectGuid const& who) const { return _playersStore.count(who) != 0; }
bool IsBanned(ObjectGuid const& guid) const { return _bannedStore.count(guid) != 0; }
diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
index 40645bc485a..765a071cf29 100644
--- a/src/server/game/Handlers/ChatHandler.cpp
+++ b/src/server/game/Handlers/ChatHandler.cpp
@@ -472,10 +472,13 @@ void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std:
}
case CHAT_MSG_WHISPER:
{
- if (!normalizePlayerName(target))
+ /// @todo implement cross realm whispers (someday)
+ ExtendedPlayerName extName = ExtractExtendedPlayerName(target);
+
+ if (!normalizePlayerName(extName.Name))
break;
- Player* receiver = ObjectAccessor::FindPlayerByName(target);
+ Player* receiver = ObjectAccessor::FindPlayerByName(extName.Name);
if (!receiver)
break;
@@ -510,7 +513,7 @@ void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std:
case CHAT_MSG_CHANNEL:
{
if (Channel* chn = ChannelMgr::GetChannelForPlayerByNamePart(target, sender))
- chn->Say(sender->GetGUID(), text.c_str(), uint32(LANG_ADDON));
+ chn->AddonSay(sender->GetGUID(), prefix, text.c_str());
break;
}
default: