--------------------------
--Create Functions Section
--------------------------
local function rgbPercToHex(r, g, b) --converts decimal rgb to a hexcode
r = r <= 1 and r >= 0 and r or 0
g = g <= 1 and g >= 0 and g or 0
b = b <= 1 and b >= 0 and b or 0
return string.format('|cff%02x%02x%02x', r*255, g*255, b*255)
end
local DefaultSetItemRef = SetItemRef --this lets us alt click invite and click on url links, it also probably causes taint
function SetItemRef(link, ...)
local type, value = link:match('(%a+):(.+)')
if IsAltKeyDown() and type == 'player' then
InviteUnit(value:match('([^:]+)'))
elseif (type == 'url') then
local eb = LAST_ACTIVE_CHAT_EDIT_BOX or ChatFrame1EditBox
if not eb then return end
eb:Show()
eb:SetText(value)
eb:SetFocus()
eb:HighlightText()
else
return DefaultSetItemRef(link, ...)
end
end
local function createPlayerLinks(event, chatType, ...) --this creates the clickable hyperlink found for the names of players in chat
local senderLinkDisplay = GetColoredName(event, ...) --blizzard function
local _, sender, _, _, _, _, _, channelNumber, _, _, chatLineID, _ = ...
local playerLink = GetPlayerLink(sender, senderLinkDisplay, chatLineID, Chat_GetChatCategory(chatType), tostring(channelNumber) or nil) --blizzard function, have to pass the channel number as a string, some events won't have a channel number (says, whispers, yells etc) so blizzard code doesn't need this argument and accepts nil, too
return playerLink
end
local function hexColorNames(chatMessage, modChatColor) --this will churn through a message and find names that match players and color it by their class color
local test = chatMessage:gsub('[^a-zA-Z%s]', '')
local words = {strsplit(' ', test)}
for i = 1, #words do
--since we technically just changed our sentence or word to ff000000wordr or ff000000this is my sentencer,
--we need to truncate the last word's trailing r and first word's hexcode
if i == 1 then
words[i] = strsub(words[i], 8) --cut off the opening timestamp color hexcode
if i == #words then
words[i] = words[i]:sub(1, -1) --a one word message with a player name was said, now cut off the closing r, too
end
elseif i == #words then
words[i] = words[i]:sub(1, -1) --cut off the closing r
end
local w = words[i]
if (w and not (w == 'player' or w == 'target') and UnitName(w) and UnitIsPlayer(w)) then
local _, class = UnitClass(w)
local colors = RAID_CLASS_COLORS[class]
if (colors) then --color the words that match player names with class colors, return back to the channel color for the next word(s)
chatMessage = gsub(chatMessage, w, rgbPercToHex(colors.r, colors.g, colors.b)..w..modChatColor)
end
end
end
return chatMessage
end
local function handleJoinLeaveChannel(...)
local _, playerName, _, _, _, _, _, _, channelName = ...
local _, class = UnitClass(playerName)
local colors = RAID_CLASS_COLORS[class]
local playerClassColorHex = rgbPercToHex(colors.r, colors.g, colors.b)..playerName
return playerClassColorHex, channelName
end
local function getNameColors(name)
if strfind(name, '-') then
name = strsub(name, 1, strfind(name, '-') - 1)
end
local _, class = UnitClass(name)
colors = RAID_CLASS_COLORS[class]
return colors, name
end
local function colorAndFormatChatString(text, modChatColor)
text = text:gsub('([wWhH][wWtT][wWtT][%.pP]%S+[^%p%s])', '|cffffffff|Hurl:%1|h[%1]|h|r') --find any URLs and make them white hyperlinks
text = modChatColor..text --color our message so it matches whatever channel we're in
text = text:gsub('|h|r', '|h|r'..modChatColor) --this is a shitty hack so if someone puts a hyperlink in chat, the text afterwards will go back to the default chat color
text = hexColorNames(text, modChatColor) --color any player names in chat by their class color
return text
end
-----------------------------------------------------
--Create Frames, Event Handler, and Filters Section--
-----------------------------------------------------
local channelColorHolderTable = {} --this is used to hold the color of custom chat channels, this is important when you leave the channel
--ToDo: make a for k,v in pairs(table) do /n AddMessageFilter and RegisterEvent to save lines of code
ChatFrame_AddMessageEventFilter('CHAT_MSG_CHANNEL', function() return true end)
ChatFrame_AddMessageEventFilter('CHAT_MSG_CHANNEL_JOIN', function() return true end)
ChatFrame_AddMessageEventFilter('CHAT_MSG_CHANNEL_LEAVE', function() return true end)
ChatFrame_AddMessageEventFilter('CHAT_MSG_CHANNEL_LIST', function() return true end)
ChatFrame_AddMessageEventFilter('CHAT_MSG_CHANNEL_NOTICE', function() return true end)
ChatFrame_AddMessageEventFilter('CHAT_MSG_CHANNEL_NOTICE_USER', function() return true end)
ChatFrame_AddMessageEventFilter('CHAT_MSG_AFK', function() return true end)
ChatFrame_AddMessageEventFilter('CHAT_MSG_DND', function() return true end)
--ChatFrame_AddMessageEventFilter('CHAT_MSG_BN_WHISPER', function() return true end)
--ChatFrame_AddMessageEventFilter('CHAT_MSG_BN_WHISPER_INFORM', function() return true end)
--ChatFrame_AddMessageEventFilter('CHAT_MSG_BN_WHISPER_PLAYER_OFFLINE', function() return true end)
--ChatFrame_AddMessageEventFilter('CHAT_MSG_EMOTE', function() return true end)
--ChatFrame_AddMessageEventFilter('CHAT_MSG_IGNORED', function() return true end)
--ChatFrame_AddMessageEventFilter('CHAT_MSG_SAY', function() return true end)
--ChatFrame_AddMessageEventFilter('CHAT_MSG_TEXT_EMOTE', function() return true end)
--ChatFrame_AddMessageEventFilter('CHAT_MSG_WHISPER', function() return true end)
--ChatFrame_AddMessageEventFilter('CHAT_MSG_WHISPER_INFORM', function() return true end)
--ChatFrame_AddMessageEventFilter('CHAT_MSG_YELL', function() return true end)
local f = CreateFrame('frame')
f:RegisterEvent('CHAT_MSG_CHANNEL')
f:RegisterEvent('CHAT_MSG_CHANNEL_JOIN')
f:RegisterEvent('CHAT_MSG_CHANNEL_LEAVE')
f:RegisterEvent('CHAT_MSG_CHANNEL_LIST')
f:RegisterEvent('CHAT_MSG_CHANNEL_NOTICE')
f:RegisterEvent('CHAT_MSG_CHANNEL_NOTICE_USER')
f:RegisterEvent('CHAT_MSG_AFK')
f:RegisterEvent('CHAT_MSG_DND')
--f:RegisterEvent('CHAT_MSG_BN_WHISPER')
--f:RegisterEvent('CHAT_MSG_BN_WHISPER_INFORM')
--f:RegisterEvent('CHAT_MSG_BN_WHISPER_PLAYER_OFFLINE')
--f:RegisterEvent('CHAT_MSG_EMOTE')
--f:RegisterEvent('CHAT_MSG_IGNORED')
--f:RegisterEvent('CHAT_MSG_SAY')
--f:RegisterEvent('CHAT_MSG_TEXT_EMOTE')
--f:RegisterEvent(' ')
--f:RegisterEvent('CHAT_MSG_WHISPER_INFORM')
--f:RegisterEvent('CHAT_MSG_YELL')
f:SetScript('OnEvent', function(self, event, ...) --this is the main handler that creates timeStamp, gets the chat color and passes it along as a hexcode
local message, player, _, fullChannelName, truncatedPlayer, _, _, channelNumber, channelName, _, _, playerGUID = ...
local chatType = strsub(event, 10) --chop off first 'CHAT_MSG_' to get the event
local chatColor = {}
if strsub(event, 10, 16) == 'CHANNEL' then --this will color chats by their proper color since they're user editable
chatColor = channelColorHolderTable[channelNumber]
else
chatColor = ChatTypeInfo[chatType]
end
local timeStamp --this will be used to make our own time stamp for each line
timeStamp = BetterDate(CHAT_TIMESTAMP_FORMAT, time())
timeStamp = rgbPercToHex(0.5, 0.5, 0.5)..'['..timeStamp..']|r' --this colors the brackets and text grey and adds them around the text
timeStamp = gsub(timeStamp, ' ', '') --this removes the random space that gets added between the end of the time string and the ]
local modChatColor = rgbPercToHex(chatColor.r, chatColor.g, chatColor.b)
if self[event] then --handle our event
self[event](self, event, chatType, modChatColor, timeStamp, ...)
end
end)
local g = CreateFrame('frame')
g:RegisterEvent('UPDATE_CHAT_COLOR')
--this will find any channels that are associated with numbers, that is custom channels
--it does this by first removing the 'CHANNEL' before the number, and converting the string to a number
--since there are many strings that don't get converted, we find only the ones that are numbers by our if check
--we then make a table entry for the color rgb so when a player leaves that channel, and no color is associated anymore,
--the leaving text still matches the color they left
g:SetScript('OnEvent', function(self, event, ...)
local channelNumber, r, g, b = ...
channelNumber = channelNumber:gsub('CHANNEL', '')
channelNumber = tonumber(channelNumber)
if channelNumber then
channelColorHolderTable[channelNumber] = {}
channelColorHolderTable[channelNumber].r, channelColorHolderTable[channelNumber].g, channelColorHolderTable[channelNumber].b = r, g, b
end
end)
----------------------------------------------
--Modified GlobalStrings.lua strings Section--
----------------------------------------------
CHAT_ANNOUNCEMENTS_OFF_NOTICE = '%s disabled channel announcements in %s.|r' --playerName..modChatColor, channelName
CHAT_ANNOUNCEMENTS_ON_NOTICE = '%s enabled channel announcements in %s.|r' --playerName..modChatColor, channelName
CHAT_CHANNEL_OWNER_NOTICE = '%s is the owner of %s.|r' --playerName..modChatColor, channelName
CHAT_MODERATION_OFF_NOTICE = '%s disabled channel moderation in %s.|r' --playerName..modChatColor, channelName
CHAT_MODERATION_ON_NOTICE = '%s enabled channel moderation in %s.|r' --playerName..modChatColor, channelName
CHAT_VOICE_OFF_NOTICE = '%s disabled channel voice in %s.|r' --playerName..modChatColor, channelName
CHAT_VOICE_ON_NOTICE = '%s enabled channel voice in %s.|r' --playerName..modChatColor, channelName
CHAT_SET_MODERATOR_NOTICE = '%s received moderator privileges in %s.|r' --playerName..modChatColor, channelName
CHAT_UNSET_MODERATOR_NOTICE = '%s lost moderator privileges in %s.|r' --playerName..modChatColor, channelName
CHAT_SET_SPEAK_NOTICE = '%s received voice chat privileges in %s.|r' --playerName..modChatColor, channelName
CHAT_UNSET_SPEAK_NOTICE = '%s lost voice chat privileges in %s.|r' --playerName..modChatColor, channelName
CHAT_SET_VOICE_NOTICE = '%s received chat privileges in %s.|r' --playerName..modChatColor, channelName
CHAT_UNSET_VOICE_NOTICE = '%s lost chat privileges in %s.|r' --playerName..modChatColor, channelName
CHAT_PASSWORD_CHANGED_NOTICE = '%s changed the password of %s.|r' --playerName..modChatColor, channelName
CHAT_PLAYER_ALREADY_MEMBER_NOTICE = '%s is already a member of %s.|r' --playerName..modChatColor, channelName
CHAT_OWNER_CHANGED_NOTICE = '%s is now the owner of %s.|r' --playerName..modChatColor, channelName
CHAT_INVITE_NOTICE = '%s%s invited you to join %s.|r' --playerName..modchatColor, channelName
CHAT_BANNED_NOTICE = '%sYou are banned from %s.|r' --modChatColor, channelName
CHAT_INVALID_NAME_NOTICE = '%sThe channel you tried to join, %s, does not exist.|r' --modChatColor, channelName
CHAT_INVITE_WRONG_FACTION_NOTICE = '%sThat player cannot join %s because they are the wrong faction.|r' --modChatColor, channelName
CHAT_MUTED_NOTICE = '%sYou do not have permission to speak in %s.|r' --modChatColor, channelName
CHAT_NOT_ALLOWED_IN_CHANNEL_NOTICE = '%sYou attempted an action that is not allowed in %s.|r' --modChatColor, channelName
CHAT_NOT_IN_AREA_NOTICE = '%sYou are not in the correct area for %s.|r' --modChatColor, channelName
CHAT_NOT_MEMBER_NOTICE = '%sYou are not a member of %s.|r' --modChatColor, channelName
CHAT_NOT_MODERATED_NOTICE = '%s%s is not moderated.|r' --modChatColor, channelName
CHAT_NOT_MODERATOR_NOTICE = '%sYou are not a moderator of %s.|r' --modChatColor, channelName
CHAT_NOT_OWNER_NOTICE = '%sYou are not the owner of %s.|r' --modChatColor, channelName
CHAT_YOU_JOINED_NOTICE = '%sYou joined %s.|r' --modChatColor, channelName
CHAT_PLAYER_BANNED_NOTICE = '%s banned %s from %s.|r' --playerName..modChatColor, actionTarget, channelName
CHAT_PLAYER_KICKED_NOTICE = '%s kicked %s from %s.|r' --playerName..modChatColor, actionTarget, channelName
CHAT_PLAYER_UNBANNED_NOTICE = '%s unbanned %s from %s.|r' --playerName..modChatColor, actionTarget, channelName
CHAT_PLAYER_INVITED_NOTICE = 'You invited %s to join %s.|r' --actionTarget, channelName
CHAT_PLAYER_INVITE_BANNED_NOTICE = 'You cannot invite %s to %s because they are banned.|r' --actionTarget, channelName
CHAT_PLAYER_NOT_BANNED_NOTICE = '%s is not banned from %s.|r' --actionTarget..modChatColor, channelName
CHAT_PLAYER_NOT_FOUND_NOTICE = '%s is not in %s.|r' --actionTarget..modChatColor, channelName
--------------------------------------
--Chat Channel Modifications Section--
--------------------------------------
local noticeUserStrings = {
['ANNOUNCEMENTS_OFF'] = true,
['ANNOUNCEMENTS_ON'] = true,
['CHANNEL_OWNER'] = true,
['MODERATION_OFF'] = true,
['MODERATION_ON'] = true,
['VOICE_OFF'] = true,
['VOICE_ON'] = true,
['SET_MODERATOR'] = true,
['UNSET_MODERATOR'] = true,
['SET_SPEAK'] = true,
['UNSET_SPEAK'] = true,
['SET_VOICE'] = true,
['UNSET_VOICE'] = true,
['PASSWORD_CHANGED'] = true,
['PLAYER_ALREADY_MEMBER'] = true,
['OWNER_CHANGED'] = true,
['INVITE_NOTICE'] = true
}
local channelNoticeStrings = {
['BANNED'] = true,
['INVALID_NAME'] = true,
['INVITE_WRONG_FACTION']= true,
['MUTED'] = true,
['NOT_ALLOWED_IN_CHANNEL'] = true,
['NOT_IN_AREA'] = true,
['NOT_MEMBER'] = true,
['NOT_MODERATED'] = true,
['NOT_MODERATOR'] = true,
['NOT_OWNER'] = true,
['YOU_JOINED'] = true
}
local targetActionNoticeStrings = {
['PLAYER_BANNED'] = true,
['PLAYER_KICKED'] = true,
['PLAYER_UNBANNED'] = true
}
local yourInviteNoticeStrings = {
['PLAYER_INVITED'] = true,
['PLAYER_INVITE_BANNED']= true
}
local targetErrorNoticeStrings = {
['PLAYER_NOT_BANNED'] = true,
['PLAYER_NOT_FOUND'] = true
}
function f:CHAT_MSG_CHANNEL(event, chatType, modChatColor, timeStamp, ...) --anytime a message is added by you or another player
local chatMessage, sender, senderLanguage, fullChannelName, arg5, senderFlags, arg7, channelNumber, arg9, arg10, chatLineID, senderGUID = ...
channelNumber = modChatColor..channelNumber..'.|r' --properly color and skin the channel number to appear as '#.'
chatMessage = colorAndFormatChatString(chatMessage, modChatColor) --handle url hyperlinking, channel coloring, and coloring names that may appear in chat
if senderGUID then --hack for local defense 'x zone is under attack' messages trying to make player links when no one was making the phrase
local playerLink = createPlayerLinks(event, chatType, ...) --generate our hyperlinks for players in chat
chatMessage = timeStamp.. ' '..channelNumber..' '..playerLink..modChatColor..': |r'..chatMessage --put it all together
else
chatMessage = timeStamp..' '..channelNumber..modChatColor..': |r'..chatMessage --put it all together
end
ChatFrame1:AddMessage(chatMessage)
end
function f:CHAT_MSG_CHANNEL_NOTICE(event, chatType, modChatColor, timeStamp, ...) --fires when you change channels
local notice, _, _, _, _, _, _, _, channelName = ...
if notice then
local _, class = UnitClass('player')
local colors = RAID_CLASS_COLORS[class]
local You = rgbPercToHex(colors.r, colors.g, colors.b)..'You' --color the word 'You' by your class color
if notice == 'YOU_CHANGED' then
ChatFrame1:AddMessage(timeStamp..' '..You..modChatColor..' joined '..channelName..'.|r')
elseif (notice == 'YOU_LEFT' or notice == 'SUSPENDED') then
ChatFrame1:AddMessage(timeStamp..' '..You..modChatColor..' left '..channelName..'.|r')
elseif notice == 'THROTTLED' then
ChatFrame1:AddMessage(timeStamp..' '..You..modChatColor..' were throttled in '..channelName..'.|r')
end
end
end
function f:CHAT_MSG_CHANNEL_JOIN(event, chatType, modChatColor, timeStamp, ...) --fires when another player joins a channel you're in
local playerClassColorHex, channelName = handleJoinLeaveChannel(...) --returns a colorized player name and the colored channel name
ChatFrame1:AddMessage(timestamp..' '..playerName..modChatColor..' + '..channelName..'.|r')
end
function f:CHAT_MSG_CHANNEL_LEAVE(event, chatType, modChatColor, timeStamp, ...) --fires when another player leaves a channel you're in
local playerClassColorHex, channelName = handleJoinLeaveChannel(...) --returns a colorized player name and the colored channel name
ChatFrame1:AddMessage(timestamp..' '..playerName..modChatColor..' - '..channelName..'.|r')
end
function f:CHAT_MSG_CHANNEL_LIST(event, chatType, modChatColor, timeStamp, ...) --fires when you type /script ListChannels()
local arg1 = ... --arg1 is the string of channels
ChatFrame1:AddMessage(timeStamp..' '..'|cffc0c0c0'..arg1..'|r') --cffc0c0c0 is the hexcode for a grey text
end
function f:CHAT_MSG_CHANNEL_NOTICE_USER(event, chatType, modChatColor, timeStamp, ...) --fires after a LOT of different chat events related to channel management
local notice, playerName, _, _, actionTarget, _, _, _, channelName = ...
local colors, targetColors --call these up top so they're accessible to the if statements below
if playerName then
colors, playerName = getNameColors(playerName)
playerName = rgbPercToHex(colors. r, colors.g, colors.b)..playerName
end
if actionTarget then
targetColors = getNameColors(actionTarget)
actionTarget = rgbPercToHex(targetColors.r, targetColors.g, targetColors.b)..actionTarget
end
--the idea of this is to run through various hash tables and handle these strings accordingly. this has more pipeline stalls than I'd like,
--but it's better than a much longer if elseif chain for each individual case. the final lines have a catch in case I missed a notice and someone finds it other than me
if noticeUserStrings[notice] then
colors = getNameColors('player')
local you = rgbPercToHex(colors.r, colors.g, colors.b)..'you'
_G['CHAT_'..notice..'_NOTICE'] = _G['CHAT_'..notice..'_NOTICE']:gsub('you', you..modChatColor) --replace 'you' with a class colored 'you'
ChatFrame1:AddMessage(string.format(timeStamp..' '.._G['CHAT_'..notice..'_NOTICE'], playerName..modChatColor, channelName))
elseif channelNoticeStrings[notice] then
colors = getNameColors('player')
local You = rgbPercToHex(colors.r, colors.g, colors.b)..'You'
local you = rgbPercToHex(colors.r, colors.g, colors.b)..'you'
_G['CHAT_'..notice..'_NOTICE'] = _G['CHAT_'..notice..'_NOTICE']:gsub('You', You..modChatColor) --replace 'You' with a class colored 'You'
_G['CHAT_'..notice..'_NOTICE'] = _G['CHAT_'..notice..'_NOTICE']:gsub('you', you..modChatColor) --replace 'you' with a class colored 'you'
ChatFrame1:AddMessage(string.format(timeStamp..' '.._G['CHAT_'..notice..'_NOTICE'], modChatColor, channelName))
elseif targetActionNoticeStrings[notice] then
ChatFrame1:AddMessage(string.format(timeStamp..' '.._G['CHAT_'..notice..'_NOTICE'], playerName..modChatColor, actionTarget, channelName))
elseif yourInviteNoticeStrings[notice] then
colors = getNameColors('player')
local You = rgbPercToHex(colors.r, colors.g, colors.b)..'You'
_G['CHAT_'..notice..'NOTICE'] = _G['CHAT_'..notice..'_NOTICE']:gsub('You', You..modChatColor) --replace 'You' with a class colored 'You'
ChatFrame1:AddMessage(string.format(timeStamp..' '.._G['CHAT_'..notice..'_NOTICE'], actionTarget, channelName))
elseif targetActionNoticeStrings[notice] then
ChatFrame1:AddMessage(string.format(timeStamp..' '.._G['CHAT_'..notice..'_NOTICE'], actionTarget..modChatColor, channelName))
else
print('tell terenna that the '..notice..' is not properly handled.')
end
end
------------------------------------------------
--Say, Yell, and Whisper Modifications Section--
------------------------------------------------
--[[
removing the brackets around this would allow you to once again see the player you whispered's afk message. we filtered it out above.
function f:CHAT_MSG_AFK(event, chatType, modChatColor, timeStamp, ...)
local afkMessage, fullNameAndRealm, _, _, nameNoRealm = ...
local playerLink = createPlayerLinks(event, chatType, ...) --generate our hyperlinks for players in chat
afkMessage = colorAndFormatChatString(afkMessage, modChatColor)
afkMessage = timeStamp.. ' '..playerLink..modChatColor..' is away: |r'..afkMessage --put it all together
ChatFrame1:AddMessage(afkMessage)
end
]]--
--[[
removing the brackets around this would allow you to once again see the player you whispered's dnd message. we filtered it out above.
function f:CHAT_MSG_DND(event, chatType, modChatColor, timeStamp, ...)
local dndMessage, fullNameAndRealm, _, _, nameNoRealm = ...
local playerLink = createPlayerLinks(event, chatType, ...) --generate our hyperlinks for players in chat
dndMessage = colorAndFormatChatString(dndMessage, modChatColor)
dndMessage = timeStamp.. ' '..playerLink..modChatColor..' does not wished to be disturbed: |r'..dndMessage --put it all together
ChatFrame1:AddMessage(dndMessage)
end
]]--
--[[
CHAT_MSG_ACHIEVEMENT
CHAT_MSG_ADDON
CHAT_MSG_BG_SYSTEM_ALLIANCE
CHAT_MSG_BG_SYSTEM_HORDE
CHAT_MSG_BG_SYSTEM_NEUTRAL
CHAT_MSG_BN_INLINE_TOAST_ALERT
CHAT_MSG_BN_INLINE_TOAST_BROADCAST
CHAT_MSG_BN_INLINE_TOAST_BROADCAST_INFORM
CHAT_MSG_BN_INLINE_TOAST_CONVERSATION
CHAT_MSG_BN_WHISPER
CHAT_MSG_BN_WHISPER_INFORM
CHAT_MSG_BN_WHISPER_PLAYER_OFFLINE
CHAT_MSG_COMBAT_FACTION_CHANGE
CHAT_MSG_COMBAT_HONOR_GAIN
CHAT_MSG_COMBAT_MISC_INFO
CHAT_MSG_COMBAT_XP_GAIN
CHAT_MSG_COMMUNITIES_CHANNEL
CHAT_MSG_CURRENCY
CHAT_MSG_EMOTE
CHAT_MSG_FILTERED
CHAT_MSG_GUILD
CHAT_MSG_GUILD_ACHIEVEMENT
CHAT_MSG_GUILD_ITEM_LOOTED
CHAT_MSG_IGNORED
CHAT_MSG_INSTANCE_CHAT
CHAT_MSG_INSTANCE_CHAT_LEADER
CHAT_MSG_LOOT
CHAT_MSG_MONEY
CHAT_MSG_MONSTER_EMOTE
CHAT_MSG_MONSTER_PARTY
CHAT_MSG_MONSTER_SAY
CHAT_MSG_MONSTER_WHISPER
CHAT_MSG_MONSTER_YELL
CHAT_MSG_OFFICER
CHAT_MSG_OPENING
CHAT_MSG_PARTY
CHAT_MSG_PARTY_LEADER
CHAT_MSG_PET_BATTLE_COMBAT_LOG
CHAT_MSG_PET_BATTLE_INFO
CHAT_MSG_PET_INFO
CHAT_MSG_RAID
CHAT_MSG_RAID_BOSS_EMOTE
CHAT_MSG_RAID_BOSS_WHISPER
CHAT_MSG_RAID_LEADER
CHAT_MSG_RAID_WARNING
CHAT_MSG_RESTRICTED
CHAT_MSG_SAY
CHAT_MSG_SKILL
CHAT_MSG_SYSTEM
CHAT_MSG_TARGETICONS
CHAT_MSG_TEXT_EMOTE
CHAT_MSG_TRADESKILLS
CHAT_MSG_WHISPER
CHAT_MSG_WHISPER_INFORM
CHAT_MSG_YELL
CHAT_SERVER_DISCONNECTED
CHAT_SERVER_RECONNECTED
CLUB_MESSAGE_ADDED
]]--