1---2name: wow-api-social-chat3description: Complete reference for WoW Retail Chat, Social, Club/Community, Friend List, Voice Chat, BattleNet, Ping, Social Queue, and Addon Messaging APIs. Covers C_ChatInfo, C_Club, C_ClubFinder, C_FriendList, C_BattleNet, C_VoiceChat, C_SocialRestrictions, C_SocialQueue, C_RecentAllies, C_PingManager, C_TTSSettings, ChatFrame functions, chat filters, addon message system, and 12.0.0 instance restrictions (SendAddonMessage blocked, chat messages may be secret). Use when working with chat output, chat channels, communities, friend lists, voice chat, BattleNet friends, addon communication, social features, or ping system.4---5
6# Social & Chat API (Retail — Patch 12.0.0)
7
8Comprehensive reference for chat, social, clubs/communities, friends, voice, BattleNet, and related APIs.
9
10> **Source:** https://warcraft.wiki.gg/wiki/World_of_Warcraft_API
11> **Current as of:** Patch 12.0.0 (Build 65655) — January 28, 2026
12> **Scope:** Retail only.
13
14## CRITICAL: 12.0.0 Instance Restrictions
15
16- **`SendAddonMessage()` is BLOCKED inside instances** (dungeons, raids, BGs, arenas)
17- Chat messages in instances may be **secret values** (KStrings)
18- Addon communication must use alternative patterns outside instances
19- `C_ChatInfo.SendAddonMessage()` and `C_ChatInfo.SendAddonMessageLogged()` throw errors in instances
20
21---
22
23## Scope
24
25- **C_ChatInfo** — Chat system, channels, addon messages
26- **Chat Frame Functions** — SendChatMessage, chat filters, chat bubbles
27- **C_Club** — Communities / clubs system
28- **C_ClubFinder** — Club finder / recruitment
29- **C_FriendList** — Friends list management
30- **C_BattleNet** — BattleNet friends, presence, game accounts
31- **C_VoiceChat** — Voice chat system
32- **C_SocialRestrictions** — Social restriction checks
33- **C_SocialQueue** — Social queue system
34- **C_RecentAllies** — Recent allies tracking
35- **C_PingManager** — In-world ping system
36- **C_TTSSettings** — Text-to-speech settings
37
38---
39
40## C_ChatInfo — Chat System
41
42### Key Functions
43
44| Function | Returns | Description |
45|----------|---------|-------------|
46| `C_ChatInfo.SendAddonMessage(prefix, message, chatType [, target])` | `success` | Send addon message (BLOCKED in instances) |
47| `C_ChatInfo.SendAddonMessageLogged(prefix, message, chatType [, target])` | `success` | Send logged addon message (BLOCKED in instances) |
48| `C_ChatInfo.RegisterAddonMessagePrefix(prefix)` | `success` | Register prefix for CHAT_MSG_ADDON |
49| `C_ChatInfo.IsAddonMessagePrefixRegistered(prefix)` | `isRegistered` | Check if prefix registered |
50| `C_ChatInfo.GetRegisteredAddonMessagePrefixes()` | `prefixes` | All registered prefixes |
51| `C_ChatInfo.GetChannelInfoFromIdentifier(identifier)` | `info` | Channel info by identifier |
52| `C_ChatInfo.GetChannelRuleset(channelIndex)` | `rulesetID` | Channel ruleset |
53| `C_ChatInfo.GetChannelRulesetForChannelID(channelID)` | `rulesetID` | Ruleset by channel ID |
54| `C_ChatInfo.GetChannelShortcut(channelIndex)` | `shortcut` | Channel shortcut |
55| `C_ChatInfo.GetChannelShortcutForChannelID(channelID)` | `shortcut` | Shortcut by channel ID |
56| `C_ChatInfo.GetChatLineSenderGUID(lineID)` | `guid` | GUID of message sender |
57| `C_ChatInfo.GetChatLineSenderName(lineID)` | `name` | Name of message sender |
58| `C_ChatInfo.GetChatLineText(lineID)` | `text` | Message text |
59| `C_ChatInfo.GetChatTypeByID(chatTypeID)` | `chatType` | Chat type string from ID |
60| `C_ChatInfo.GetColorForChatType(chatType)` | `r, g, b` | Default color for chat type |
61| `C_ChatInfo.GetNumActiveChannels()` | `numChannels` | Number of active channels |
62| `C_ChatInfo.GetActiveChannelList()` | `channels` | Active channel list |
63| `C_ChatInfo.IsChannelRegional(chatType)` | `isRegional` | Is channel regional? |
64| `C_ChatInfo.IsChatLineCensored(lineID)` | `isCensored` | Is message censored? |
65| `C_ChatInfo.IsPartyPositionCategory(category)` | `isPartyPosition` | Is party position category? |
66| `C_ChatInfo.IsRegionalServiceAvailable()` | `isAvailable` | Regional service available? |
67| `C_ChatInfo.IsValidChatLine(lineID)` | `isValid` | Is line valid? |
68| `C_ChatInfo.ReplaceIconAndGroupExpressions(message)` | `text` | Expand {rt1}, {skull}, etc. |
69| `C_ChatInfo.ResetDefaultZoneChannels()` | — | Reset zone channels |
70| `C_ChatInfo.SwapChatChannelsByChannelIndex(i1, i2)` | — | Swap channel order |
71
72### Global Chat Functions
73
74| Function | Returns | Description |
75|----------|---------|-------------|
76| `SendChatMessage(msg [, chatType [, languageID [, target]]])` | — | Send chat message |
77| `GetNumDisplayChannels()` | `numChannels` | Number of displayed channels |
78| `GetChannelDisplayInfo(index)` | `name, header, collapsed, channelNumber, count, active, category, voiceEnabled, voiceActive` | Channel display info |
79| `GetChannelName(idOrName)` | `id, name, instanceID, isCommChannel` | Channel name/ID lookup |
80| `JoinChannelByName(name [, password [, frameID]])` | `type, name` | Join a channel |
81| `LeaveChannelByName(name)` | — | Leave a channel |
82| `ListChannelByName(name)` | — | List channel members |
83| `GetChatWindowInfo(frameIndex)` | `name, fontSize, r, g, b, alpha, shown, locked, docked, uninteractable` | Chat window info |
84| `SetChatWindowName(frameIndex, name)` | — | Set chat window name |
85| `LoggingChat(enable)` | — | Toggle chat logging |
86| `LoggingCombat(enable)` | — | Toggle combat logging |
87
88---
89
90## C_Club — Communities / Clubs
91
92### Club Management
93
94| Function | Returns | Description |
95|----------|---------|-------------|
96| `C_Club.GetSubscribedClubs()` | `clubs` | All joined clubs |
97| `C_Club.GetClubInfo(clubId)` | `info` | Club info |
98| `C_Club.GetClubMembers(clubId [, streamId])` | `members` | Club member list |
99| `C_Club.GetMemberInfo(clubId, memberId)` | `info` | Member info |
100| `C_Club.GetClubStreamNotificationSettings(clubId)` | `settings` | Stream notification settings |
101| `C_Club.CreateClub(name, shortName, description, clubType, avatarId)` | — | Create new club |
102| `C_Club.DestroyClub(clubId)` | — | Destroy a club |
103| `C_Club.EditClub(clubId, name, shortName, description, avatarId, bgColorIndex)` | — | Edit club |
104| `C_Club.LeaveClub(clubId)` | — | Leave a club |
105| `C_Club.AcceptInvitation(clubId)` | — | Accept club invitation |
106| `C_Club.DeclineInvitation(clubId)` | — | Decline club invitation |
107| `C_Club.GetInvitationsForSelf()` | `invitations` | Pending invitations |
108| `C_Club.SendInvitation(clubId, memberId)` | — | Invite to club |
109
110### Club Streams (Chat Channels within Clubs)
111
112| Function | Returns | Description |
113|----------|---------|-------------|
114| `C_Club.GetStreams(clubId)` | `streams` | All streams for club |
115| `C_Club.GetStreamInfo(clubId, streamId)` | `info` | Stream info |
116| `C_Club.CreateStream(clubId, name, subject, leadersAndModeratorsOnly)` | — | Create stream |
117| `C_Club.DestroyStream(clubId, streamId)` | — | Remove stream |
118| `C_Club.EditStream(clubId, streamId, name, subject, leadersAndModeratorsOnly)` | — | Edit stream |
119| `C_Club.GetMessagesBefore(clubId, streamId, messageId, count)` | `messages` | Fetch messages before ID |
120| `C_Club.GetMessagesAfter(clubId, streamId, messageId, count)` | `messages` | Fetch messages after ID |
121| `C_Club.GetMessagesInRange(clubId, streamId, oldest, newest)` | `messages` | Messages in range |
122| `C_Club.SendMessage(clubId, streamId, message)` | — | Send message to stream |
123| `C_Club.FocusStream(clubId, streamId)` | — | Focus a stream |
124| `C_Club.UnfocusStream(clubId, streamId)` | — | Unfocus a stream |
125| `C_Club.SetAutoAdvanceStreamViewMarker(clubId, streamId)` | — | Auto-advance view marker |
126
127### Club Types
128
129| Enum | Value | Description |
130|------|-------|-------------|
131| `Enum.ClubType.BattleNet` | 0 | BattleNet community |
132| `Enum.ClubType.Character` | 1 | Character community |
133| `Enum.ClubType.Guild` | 2 | Guild (treated as club) |
134| `Enum.ClubType.Other` | 3 | Other |
135
136---
137
138## C_ClubFinder — Club Finder / Recruitment
139
140| Function | Returns | Description |
141|----------|---------|-------------|
142| `C_ClubFinder.RequestClubsList(type, isLinkedSearch, searchText, specIDs)` | — | Search for clubs |
143| `C_ClubFinder.GetRecruitingClubInfoFromClubID(clubId)` | `recruitInfo` | Recruitment info for club |
144| `C_ClubFinder.GetTotalMatchingCommunityListSize()` | `size` | Total matching communities |
145| `C_ClubFinder.GetTotalMatchingGuildListSize()` | `size` | Total matching guilds |
146| `C_ClubFinder.RequestPostingInformationFromClubId(clubId)` | — | Request posting info |
147| `C_ClubFinder.PostClub(clubId, minIlvl, minLevel, ...)` | — | Post club listing |
148| `C_ClubFinder.RequestApplicantList(type)` | — | Request applicant list |
149| `C_ClubFinder.GetApplicantInfoList()` | `applicants` | Get applicants |
150| `C_ClubFinder.RespondToApplicant(clubFinderGUID, playerGUID, accepted, ...)` | — | Respond to applicant |
151
152---
153
154## C_FriendList — Friends
155
156| Function | Returns | Description |
157|----------|---------|-------------|
158| `C_FriendList.GetNumFriends()` | `numFriends` | Character friends count |
159| `C_FriendList.GetNumOnlineFriends()` | `numOnline` | Online friends count |
160| `C_FriendList.GetFriendInfoByIndex(index)` | `info` | Friend info by index |
161| `C_FriendList.GetFriendInfoByName(name)` | `info` | Friend info by name |
162| `C_FriendList.GetFriendInfoByGUID(guid)` | `info` | Friend info by GUID |
163| `C_FriendList.AddFriend(name [, notes])` | — | Add friend |
164| `C_FriendList.RemoveFriend(name)` | — | Remove friend |
165| `C_FriendList.SetFriendNotes(name, notes)` | — | Set friend notes |
166| `C_FriendList.AddOrRemoveFriend(name, notes)` | — | Toggle friend |
167| `C_FriendList.IsFriend(guid)` | `isFriend` | Is GUID a friend? |
168| `C_FriendList.AddIgnore(name)` | — | Add to ignore list |
169| `C_FriendList.DelIgnore(name)` | — | Remove from ignore list |
170| `C_FriendList.GetNumIgnores()` | `numIgnores` | Ignore list count |
171| `C_FriendList.GetIgnoreName(index)` | `name` | Ignored player name |
172| `C_FriendList.IsIgnored(name)` | `isIgnored` | Is player ignored? |
173| `C_FriendList.IsIgnoredByGUID(guid)` | `isIgnored` | Is GUID ignored? |
174| `C_FriendList.ShowFriends()` | — | Refresh friends list |
175| `C_FriendList.GetSelectedFriend()` | `index` | Selected friend index |
176| `C_FriendList.SetSelectedFriend(index)` | — | Select friend |
177
178---
179
180## C_BattleNet — BattleNet Friends
181
182| Function | Returns | Description |
183|----------|---------|-------------|
184| `C_BattleNet.GetFriendAccountInfo(index)` | `accountInfo` | BNet friend account info |
185| `C_BattleNet.GetFriendGameAccountInfo(index, gameAccountIndex)` | `gameAccountInfo` | Game account info |
186| `C_BattleNet.GetFriendNumGameAccounts(index)` | `numGameAccounts` | Game accounts for friend |
187| `C_BattleNet.GetAccountInfoByID(bnetAccountID)` | `accountInfo` | Account info by ID |
188| `C_BattleNet.GetAccountInfoByGUID(guid)` | `accountInfo` | Account info by GUID |
189| `C_BattleNet.GetGameAccountInfoByID(gameAccountID)` | `gameAccountInfo` | Game account info |
190| `C_BattleNet.GetGameAccountInfoByGUID(guid)` | `gameAccountInfo` | Game account by GUID |
191| `BNGetNumFriends()` | `numFriends, numOnline` | BNet friend count |
192| `BNGetNumFriendInvites()` | `numInvites` | Pending BNet invites |
193| `BNSendWhisper(bnetAccountID, message)` | — | Send BNet whisper |
194| `BNInviteFriend(bnetAccountID)` | — | Invite to group |
195| `BNRequestInviteFriend(presenceID)` | — | Request BNet friend add |
196| `BNRemoveFriend(bnetAccountID)` | — | Remove BNet friend |
197| `BNSetFriendNote(bnetAccountID, note)` | — | Set friend note |
198| `BNSetCustomMessage(message)` | — | Set BNet status message |
199| `BNConnected()` | `isConnected` | Connected to BNet? |
200
201---
202
203## C_VoiceChat — Voice Chat
204
205| Function | Returns | Description |
206|----------|---------|-------------|
207| `C_VoiceChat.GetActiveChannelID()` | `channelID` | Active voice channel |
208| `C_VoiceChat.GetChannel(channelID)` | `channel` | Channel info |
209| `C_VoiceChat.GetChannelForChannelType(channelType)` | `channel` | Channel by type |
210| `C_VoiceChat.GetChannelForCommunityStream(clubId, streamId)` | `channel` | Club voice channel |
211| `C_VoiceChat.GetMasterVolumeScale()` | `scale` | Master volume |
212| `C_VoiceChat.SetMasterVolumeScale(scale)` | — | Set master volume |
213| `C_VoiceChat.GetInputVolume()` | `volume` | Mic volume |
214| `C_VoiceChat.SetInputVolume(volume)` | — | Set mic volume |
215| `C_VoiceChat.GetOutputVolume()` | `volume` | Speaker volume |
216| `C_VoiceChat.SetOutputVolume(volume)` | — | Set speaker volume |
217| `C_VoiceChat.IsMuted()` | `isMuted` | Is muted? |
218| `C_VoiceChat.SetMuted(muted)` | — | Set mute |
219| `C_VoiceChat.IsDeafened()` | `isDeafened` | Is deafened? |
220| `C_VoiceChat.SetDeafened(deafened)` | — | Set deafen |
221| `C_VoiceChat.IsSilenced()` | `isSilenced` | Is silenced (by Blizzard)? |
222| `C_VoiceChat.ActivateChannel(channelID)` | — | Activate voice channel |
223| `C_VoiceChat.DeactivateChannel(channelID)` | — | Deactivate voice channel |
224| `C_VoiceChat.IsLoggedIn()` | `isLoggedIn` | Voice chat logged in? |
225| `C_VoiceChat.Login()` | — | Log in to voice chat |
226| `C_VoiceChat.Logout()` | — | Log out of voice chat |
227| `C_VoiceChat.GetMemberName(memberID, channelID)` | `name` | Voice member name |
228| `C_VoiceChat.GetMemberVolume(memberID, channelID)` | `volume` | Member volume |
229| `C_VoiceChat.SetMemberVolume(memberID, channelID, volume)` | — | Set member volume |
230| `C_VoiceChat.IsMemberMuted(memberID, channelID)` | `isMuted` | Is member muted? |
231| `C_VoiceChat.SetMemberMuted(memberID, channelID, muted)` | — | Mute member |
232
233---
234
235## C_SocialRestrictions
236
237| Function | Returns | Description |
238|----------|---------|-------------|
239| `C_SocialRestrictions.IsChatDisabled()` | `isDisabled` | Is chat restricted? |
240| `C_SocialRestrictions.IsMuted()` | `isMuted` | Is player muted? |
241| `C_SocialRestrictions.IsSilenced()` | `isSilenced` | Is player silenced? |
242| `C_SocialRestrictions.IsSquelched()` | `isSquelched` | Is player squelched? |
243
244---
245
246## C_SocialQueue — Social Queue
247
248| Function | Returns | Description |
249|----------|---------|-------------|
250| `C_SocialQueue.GetAllGroups()` | `groups` | All social queue groups |
251| `C_SocialQueue.GetGroupInfo(guid)` | `info` | Group queue info |
252| `C_SocialQueue.GetGroupMembers(guid)` | `members` | Group member list |
253| `C_SocialQueue.GetGroupQueues(guid)` | `queues` | Group queues |
254
255---
256
257## C_RecentAllies
258
259| Function | Returns | Description |
260|----------|---------|-------------|
261| `C_RecentAllies.GetRecentAllies()` | `allies` | Recent group allies |
262
263---
264
265## C_PingManager — Ping System
266
267| Function | Returns | Description |
268|----------|---------|-------------|
269| `C_PingManager.GetPingTypeFromUIMouseButton(button)` | `pingType` | Ping type from mouse button |
270| `C_PingManager.TogglePingListener(enabled)` | — | Toggle ping listening |
271
272---
273
274## C_TTSSettings — Text-to-Speech
275
276| Function | Returns | Description |
277|----------|---------|-------------|
278| `C_TTSSettings.GetChatTypeEnabled(chatType)` | `enabled` | Is TTS enabled for chat type? |
279| `C_TTSSettings.SetChatTypeEnabled(chatType, enabled)` | — | Toggle TTS for chat type |
280| `C_TTSSettings.GetSetting(setting)` | `value` | Get TTS setting |
281| `C_TTSSettings.SetSetting(setting, value)` | — | Set TTS setting |
282| `C_TTSSettings.GetVoiceOptionID(voiceType)` | `optionID` | Get voice option |
283
284---
285
286## Common Patterns
287
288### Register and Handle Addon Messages
289
290```lua
291local ADDON_PREFIX = "MyAddon"
292C_ChatInfo.RegisterAddonMessagePrefix(ADDON_PREFIX)
293
294local frame = CreateFrame("Frame")
295frame:RegisterEvent("CHAT_MSG_ADDON")
296frame:SetScript("OnEvent", function(self, event, prefix, message, channel, sender)
297 if prefix == ADDON_PREFIX then
298 -- Process addon message
299 print("Got message from", sender, ":", message)
300 end
301end)
302
303-- Send message (FAILS in instances in 12.0.0!)
304local function SendMessage(msg, target)
305 if not IsInInstance() then
306 C_ChatInfo.SendAddonMessage(ADDON_PREFIX, msg, "PARTY")
307 else
308 -- In-instance: cannot send addon messages
309 -- Consider using encounter events or built-in APIs instead
310 end
311end
312```
313
314### Chat Message Filter
315
316```lua
317-- Filter chat messages to modify or suppress them
318ChatFrame_AddMessageEventFilter("CHAT_MSG_SAY", function(self, event, msg, author, ...)
319 if msg:find("badword") then
320 return true -- suppress the message
321 end
322 -- Modify the message
323 local newMsg = msg:gsub("hello", "|cff00ff00hello|r")
324 return false, newMsg, author, ...
325end)
326```
327
328### Enumerate Friends
329
330```lua
331local function GetOnlineFriends()
332 local friends = {}
333 local numFriends = C_FriendList.GetNumFriends()
334 for i = 1, numFriends do
335 local info = C_FriendList.GetFriendInfoByIndex(i)
336 if info and info.connected then
337 table.insert(friends, info)
338 end
339 end
340 -- Also check BNet friends
341 local numBNet, numOnlineBNet = BNGetNumFriends()
342 for i = 1, numBNet do
343 local acctInfo = C_BattleNet.GetFriendAccountInfo(i)
344 if acctInfo and acctInfo.gameAccountInfo and acctInfo.gameAccountInfo.isOnline then
345 table.insert(friends, acctInfo)
346 end
347 end
348 return friends
349end
350```
351
352---
353
354## Key Events
355
356| Event | Payload | Description |
357|-------|---------|-------------|
358| `CHAT_MSG_SAY` | msg, author, language, channelString, target, flags, ... | /say message |
359| `CHAT_MSG_YELL` | msg, author, ... | /yell message |
360| `CHAT_MSG_PARTY` | msg, author, ... | Party message |
361| `CHAT_MSG_PARTY_LEADER` | msg, author, ... | Party leader message |
362| `CHAT_MSG_RAID` | msg, author, ... | Raid message |
363| `CHAT_MSG_RAID_LEADER` | msg, author, ... | Raid leader message |
364| `CHAT_MSG_GUILD` | msg, author, ... | Guild message |
365| `CHAT_MSG_OFFICER` | msg, author, ... | Guild officer message |
366| `CHAT_MSG_WHISPER` | msg, author, ... | Incoming whisper |
367| `CHAT_MSG_WHISPER_INFORM` | msg, target, ... | Outgoing whisper |
368| `CHAT_MSG_BN_WHISPER` | msg, author, ... | BNet whisper received |
369| `CHAT_MSG_BN_WHISPER_INFORM` | msg, target, ... | BNet whisper sent |
370| `CHAT_MSG_CHANNEL` | msg, author, language, channelString, target, flags, zoneChannelID, channelIndex, channelBaseName, ... | Channel message |
371| `CHAT_MSG_ADDON` | prefix, message, channel, sender | Addon message received |
372| `CHAT_MSG_ADDON_LOGGED` | prefix, message, channel, sender | Logged addon message |
373| `CHAT_MSG_SYSTEM` | msg | System message |
374| `CHAT_MSG_EMOTE` | msg, author, ... | Emote message |
375| `CHAT_MSG_TEXT_EMOTE` | msg, author, ... | /emote text |
376| `FRIENDLIST_UPDATE` | — | Friends list changed |
377| `BN_FRIEND_LIST_SIZE_CHANGED` | — | BNet list changed |
378| `BN_FRIEND_INFO_CHANGED` | bnetAccountID | BNet friend updated |
379| `BN_CONNECTED` | — | Connected to BNet |
380| `BN_DISCONNECTED` | — | Disconnected from BNet |
381| `CLUB_ADDED` | clubId | Joined a club |
382| `CLUB_REMOVED` | clubId | Left a club |
383| `CLUB_UPDATED` | clubId | Club info updated |
384| `CLUB_MESSAGE_ADDED` | clubId, streamId, messageId | New club message |
385| `CLUB_MEMBER_ADDED` | clubId, memberId | Member joined club |
386| `CLUB_MEMBER_REMOVED` | clubId, memberId | Member left club |
387| `CLUB_MEMBER_UPDATED` | clubId, memberId | Member info updated |
388| `VOICE_CHAT_CHANNEL_ACTIVATED` | channelID | Voice channel activated |
389| `VOICE_CHAT_CHANNEL_DEACTIVATED` | channelID | Voice channel deactivated |
390| `VOICE_CHAT_CHANNEL_MEMBER_ADDED` | memberID, channelID | Member joined voice |
391| `VOICE_CHAT_CHANNEL_MEMBER_REMOVED` | memberID, channelID | Left voice channel |
392
393---
394
395## Gotchas & Restrictions
396
3971. **SendAddonMessage BLOCKED in instances** — `C_ChatInfo.SendAddonMessage()` and `SendAddonMessageLogged()` throw errors inside dungeons, raids, BGs, and arenas in 12.0.0.
3982. **Chat messages may be secret** — In instances, chat message content from other players may be KStrings / secret values.
3993. **Addon prefix limit** — Maximum 16 characters for addon message prefixes.
4004. **Addon message size limit** — Maximum 255 characters per addon message.
4015. **Chat throttle** — `SendChatMessage()` is throttled. Sending too fast will disconnect you.
4026. **Hardware event required** — Some chat functions require a hardware event (mouse click/key press) to execute.
4037. **BNet friend list** — `BNGetFriendInfo()` is deprecated. Use `C_BattleNet.GetFriendAccountInfo()`.
4048. **Club type Guild** — Guilds are treated as clubs with `Enum.ClubType.Guild`. Use `C_Club` to interact with guild chat streams.
4059. **Voice chat login** — Voice chat requires explicit login. Check `C_VoiceChat.IsLoggedIn()` before operations.
40610. **Chat filters** — `ChatFrame_AddMessageEventFilter` filters operate on ALL instances of the event across all chat frames.