local E, L, V, P, G, _ = unpack(ElvUI); --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB, Localize Underscore local CH = E:GetModule('Chat') local LSM = LibStub("LibSharedMedia-3.0") local chatFilters = {}; local specialChatIcons = { ["Kil'jaeden"] = { ["Elvz"] = "|TInterface\\AddOns\\ElvUI\\media\\textures\\ElvUI_Chat_Logo:13:22|t" }, ["Illidan"] = { ["Affinichi"] = "|TInterface\\AddOns\\ElvUI\\media\\textures\\Bathrobe_Chat_Logo.blp:15:15|t", ["Uplift"] = "|TInterface\\AddOns\\ElvUI\\media\\textures\\Bathrobe_Chat_Logo.blp:15:15|t", ["Affinitii"] = "|TInterface\\AddOns\\ElvUI\\media\\textures\\Bathrobe_Chat_Logo.blp:15:15|t", ["Affinity"] = "|TInterface\\AddOns\\ElvUI\\media\\textures\\Bathrobe_Chat_Logo.blp:15:15|t", --Darth's toon ["Darthpred"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", --Repooc's Toon ["Repooc"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t" }, ["Свежеватель Душ"] = { --Darth's toons ["Дартпредатор"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Алея"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Ваззули"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Сиаранна"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Джатон"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Фикстер"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Киландра"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Нарджо"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Верзук"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", --["Большойгном"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Крениг"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t" }, ["Вечная Песня"] = { --Darth's toons ["Киландра"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Равенор"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Налкас"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Ваззули"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", --Darth's friends --["Леани"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t" }, ["Korialstrasz"] = { ["Sifupooc"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Repooc"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Cursewordz"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t" }, ["Andorhal"] = { ["Dapooc"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Rovert"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t", ["Sliceoflife"] = "|TInterface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Chat_Logo:13:22|t" }, } function CH:ChatEdit_AddHistory(editBox, line) if line:find("/rl") then return; end if ( strlen(line) > 0 ) then for i, text in pairs(ElvCharacterDB.ChatEditHistory) do if text == line then return end end table.insert(ElvCharacterDB.ChatEditHistory, #ElvCharacterDB.ChatEditHistory + 1, line) if #ElvCharacterDB.ChatEditHistory > E.db.chat.editboxhistory then for i=1,(#ElvCharacterDB.ChatEditHistory - E.db.chat.editboxhistory) do table.remove(ElvCharacterDB.ChatEditHistory, 1) end end end end --Replacement of chat tab position and size function function CH:PositionChat(override) if not self.db.lockPositions or ((InCombatLockdown() and not override and self.initialMove) or (IsMouseButtonDown("LeftButton") and not override)) then return end if not RightChatPanel or not LeftChatPanel then return; end RightChatPanel:Size(E.db.chat.panelWidth, E.db.chat.panelHeight) LeftChatPanel:Size(E.db.chat.panelWidth, E.db.chat.panelHeight) if E.private.chat.enable ~= true then return end local chat, chatbg, tab, id, point, button, isDocked, chatFound for _, frameName in pairs(CHAT_FRAMES) do chat = _G[frameName] id = chat:GetID() point = GetChatWindowSavedPosition(id) if point == "BOTTOMRIGHT" and chat:IsShown() then chatFound = true break end end if chatFound then self.RightChatWindowID = id else self.RightChatWindowID = nil end CreatedFrames = id for i=1, CreatedFrames do local BASE_OFFSET = 60 if E.PixelMode then BASE_OFFSET = BASE_OFFSET - 3 end chat = _G[format("ChatFrame%d", i)] chatbg = format("ChatFrame%dBackground", i) button = _G[format("ButtonCF%d", i)] id = chat:GetID() tab = _G[format("ChatFrame%sTab", i)] point = GetChatWindowSavedPosition(id) isDocked = chat.isDocked if id > NUM_CHAT_WINDOWS then if point == nil then point = select(1, chat:GetPoint()) end if select(2, tab:GetPoint()):GetName() ~= bg then isDocked = true else isDocked = false end end if point == "BOTTOMRIGHT" and chat:IsShown() and not (id > NUM_CHAT_WINDOWS) and id == self.RightChatWindowID then chat:ClearAllPoints() if E.db.datatexts.rightChatPanel then chat:Point("BOTTOMRIGHT", RightChatDataPanel, "TOPRIGHT", 10, 3) -- <<< Changed else BASE_OFFSET = BASE_OFFSET - 24 chat:Point("BOTTOMLEFT", RightChatDataPanel, "TOPLEFT", 4, 3) end if id ~= 2 then chat:SetSize(E.db.chat.panelWidth - 10, (E.db.chat.panelHeight - (E.PixelMode and 31 or 27))) -- <<< Changed else chat:Size(E.db.chat.panelWidth - 10, (E.db.chat.panelHeight - (E.PixelMode and 31 or 27)) - CombatLogQuickButtonFrame_Custom:GetHeight()) end FCF_SavePositionAndDimensions(chat) tab:SetParent(RightChatPanel) chat:SetParent(RightChatPanel) if chat:IsMovable() then chat:SetUserPlaced(true) end if E.db.chat.panelBackdrop == 'HIDEBOTH' or E.db.chat.panelBackdrop == 'LEFT' then CH:SetupChatTabs(tab, true) else CH:SetupChatTabs(tab, false) end elseif not isDocked and chat:IsShown() then tab:SetParent(UIParent) chat:SetParent(UIParent) CH:SetupChatTabs(tab, true) else if id ~= 2 and not (id > NUM_CHAT_WINDOWS) then chat:ClearAllPoints() if E.db.datatexts.leftChatPanel then chat:Point("BOTTOMLEFT", LeftChatToggleButton, "TOPLEFT", 5, 3) else BASE_OFFSET = BASE_OFFSET - 24 chat:Point("BOTTOMLEFT", LeftChatToggleButton, "TOPLEFT", 5, 3) end chat:Size(E.db.chat.panelWidth - 6, (E.db.chat.panelHeight - (E.PixelMode and 31 or 27))) -- <<< Changed FCF_SavePositionAndDimensions(chat) end chat:SetParent(LeftChatPanel) if i > 2 then tab:SetParent(GeneralDockManagerScrollFrameChild) else tab:SetParent(GeneralDockManager) end if chat:IsMovable() then chat:SetUserPlaced(true) end if E.db.chat.panelBackdrop == 'HIDEBOTH' or E.db.chat.panelBackdrop == 'RIGHT' then CH:SetupChatTabs(tab, true) else CH:SetupChatTabs(tab, false) end end end self.initialMove = true; end function CH:ChatFrame_MessageEventHandler(event, ...) if ( strsub(event, 1, 8) == "CHAT_MSG" ) then local arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14 = ...; local type = strsub(event, 10); local info = ChatTypeInfo[type]; local filter = false; if ( chatFilters[event] ) then local newarg1, newarg2, newarg3, newarg4, newarg5, newarg6, newarg7, newarg8, newarg9, newarg10, newarg11, newarg12, newarg13, newarg14; for _, filterFunc in next, chatFilters[event] do filter, newarg1, newarg2, newarg3, newarg4, newarg5, newarg6, newarg7, newarg8, newarg9, newarg10, newarg11, newarg12, newarg13, newarg14 = filterFunc(self, event, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); if ( filter ) then return true; elseif ( newarg1 ) then arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14 = newarg1, newarg2, newarg3, newarg4, newarg5, newarg6, newarg7, newarg8, newarg9, newarg10, newarg11, newarg12, newarg13, newarg14; end end end local coloredName = GetColoredName(event, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); local channelLength = strlen(arg4); local infoType = type; if ( (strsub(type, 1, 7) == "CHANNEL") and (type ~= "CHANNEL_LIST") and ((arg1 ~= "INVITE") or (type ~= "CHANNEL_NOTICE_USER")) ) then if ( arg1 == "WRONG_PASSWORD" ) then local staticPopup = _G[StaticPopup_Visible("CHAT_CHANNEL_PASSWORD") or ""]; if ( staticPopup and strupper(staticPopup.data) == strupper(arg9) ) then -- Don't display invalid password messages if we're going to prompt for a password (bug 102312) return; end end local found = 0; for index, value in pairs(self.channelList) do if ( channelLength > strlen(value) ) then -- arg9 is the channel name without the number in front... if ( ((arg7 > 0) and (self.zoneChannelList[index] == arg7)) or (strupper(value) == strupper(arg9)) ) then found = 1; infoType = "CHANNEL"..arg8; info = ChatTypeInfo[infoType]; if ( (type == "CHANNEL_NOTICE") and (arg1 == "YOU_LEFT") ) then self.channelList[index] = nil; self.zoneChannelList[index] = nil; end break; end end end if ( (found == 0) or not info ) then return true; end end local chatGroup = Chat_GetChatCategory(type); local chatTarget; if ( chatGroup == "CHANNEL" or chatGroup == "BN_CONVERSATION" ) then chatTarget = tostring(arg8); elseif ( chatGroup == "WHISPER" or chatGroup == "BN_WHISPER" ) then if(not(strsub(arg2, 1, 2) == "|K")) then chatTarget = strupper(arg2); else chatTarget = arg2; end end if ( FCFManager_ShouldSuppressMessage(self, chatGroup, chatTarget) ) then return true; end if ( chatGroup == "WHISPER" or chatGroup == "BN_WHISPER" ) then if ( self.privateMessageList and not self.privateMessageList[strlower(arg2)] ) then return true; elseif ( self.excludePrivateMessageList and self.excludePrivateMessageList[strlower(arg2)] and ( (chatGroup == "WHISPER" and GetCVar("whisperMode") ~= "popout_and_inline") or (chatGroup == "BN_WHISPER" and GetCVar("bnWhisperMode") ~= "popout_and_inline") ) ) then return true; end elseif ( chatGroup == "BN_CONVERSATION" ) then if ( self.bnConversationList and not self.bnConversationList[arg8] ) then return true; elseif ( self.excludeBNConversationList and self.excludeBNConversationList[arg8] and GetCVar("conversationMode") ~= "popout_and_inline") then return true; end end if (self.privateMessageList) then -- Dedicated BN whisper windows need online/offline messages for only that player if ( (chatGroup == "BN_INLINE_TOAST_ALERT" or chatGroup == "BN_WHISPER_PLAYER_OFFLINE") and not self.privateMessageList[strlower(arg2)] ) then return true; end -- HACK to put certain system messages into dedicated whisper windows if ( chatGroup == "SYSTEM") then local matchFound = false; local message = strlower(arg1); for playerName, _ in pairs(self.privateMessageList) do local playerNotFoundMsg = strlower(format(ERR_CHAT_PLAYER_NOT_FOUND_S, playerName)); local charOnlineMsg = strlower(format(ERR_FRIEND_ONLINE_SS, playerName, playerName)); local charOfflineMsg = strlower(format(ERR_FRIEND_OFFLINE_S, playerName)); if ( message == playerNotFoundMsg or message == charOnlineMsg or message == charOfflineMsg) then matchFound = true; break; end end if (not matchFound) then return true; end end end if ( type == "SYSTEM" or type == "SKILL" or type == "LOOT" or type == "CURRENCY" or type == "MONEY" or type == "OPENING" or type == "TRADESKILLS" or type == "PET_INFO" or type == "TARGETICONS" or type == "BN_WHISPER_PLAYER_OFFLINE") then self:AddMessage(arg1, info.r, info.g, info.b, info.id); elseif ( strsub(type,1,7) == "COMBAT_" ) then self:AddMessage(arg1, info.r, info.g, info.b, info.id); elseif ( strsub(type,1,6) == "SPELL_" ) then self:AddMessage(arg1, info.r, info.g, info.b, info.id); elseif ( strsub(type,1,10) == "BG_SYSTEM_" ) then self:AddMessage(arg1, info.r, info.g, info.b, info.id); elseif ( strsub(type,1,11) == "ACHIEVEMENT" ) then self:AddMessage(format(arg1, "|Hplayer:"..arg2.."|h".."["..coloredName.."]".."|h"), info.r, info.g, info.b, info.id); elseif ( strsub(type,1,18) == "GUILD_ACHIEVEMENT" ) then self:AddMessage(format(arg1, "|Hplayer:"..arg2.."|h".."["..coloredName.."]".."|h"), info.r, info.g, info.b, info.id); elseif ( type == "IGNORED" ) then self:AddMessage(format(CHAT_IGNORED, arg2), info.r, info.g, info.b, info.id); elseif ( type == "FILTERED" ) then self:AddMessage(format(CHAT_FILTERED, arg2), info.r, info.g, info.b, info.id); elseif ( type == "RESTRICTED" ) then self:AddMessage(CHAT_RESTRICTED, info.r, info.g, info.b, info.id); elseif ( type == "CHANNEL_LIST") then if(channelLength > 0) then self:AddMessage(format(_G["CHAT_"..type.."_GET"]..arg1, tonumber(arg8), arg4), info.r, info.g, info.b, info.id); else self:AddMessage(arg1, info.r, info.g, info.b, info.id); end elseif (type == "CHANNEL_NOTICE_USER") then local globalstring = _G["CHAT_"..arg1.."_NOTICE_BN"]; if ( not globalstring ) then globalstring = _G["CHAT_"..arg1.."_NOTICE"]; end if(strlen(arg5) > 0) then -- TWO users in this notice (E.G. x kicked y) self:AddMessage(format(globalstring, arg8, arg4, arg2, arg5), info.r, info.g, info.b, info.id); elseif ( arg1 == "INVITE" ) then self:AddMessage(format(globalstring, arg4, arg2), info.r, info.g, info.b, info.id); else self:AddMessage(format(globalstring, arg8, arg4, arg2), info.r, info.g, info.b, info.id); end elseif (type == "CHANNEL_NOTICE") then local globalstring = _G["CHAT_"..arg1.."_NOTICE_BN"]; if ( not globalstring ) then globalstring = _G["CHAT_"..arg1.."_NOTICE"]; end if ( arg10 > 0 ) then arg4 = arg4.." "..arg10; end local accessID = ChatHistory_GetAccessID(Chat_GetChatCategory(type), arg8); local typeID = ChatHistory_GetAccessID(infoType, arg8, arg12); self:AddMessage(format(globalstring, arg8, arg4), info.r, info.g, info.b, info.id, false, accessID, typeID); elseif ( type == "BN_CONVERSATION_NOTICE" ) then local channelLink = format(CHAT_BN_CONVERSATION_GET_LINK, arg8, MAX_WOW_CHAT_CHANNELS + arg8); local playerLink = format("|HBNplayer:%s:%s:%s:%s:%s|h[%s]|h", arg2, arg13, arg11, Chat_GetChatCategory(type), arg8, arg2); local message = format(_G["CHAT_CONVERSATION_"..arg1.."_NOTICE"], channelLink, playerLink) local accessID = ChatHistory_GetAccessID(Chat_GetChatCategory(type), arg8); local typeID = ChatHistory_GetAccessID(infoType, arg8, arg12); self:AddMessage(message, info.r, info.g, info.b, info.id, false, accessID, typeID); elseif ( type == "BN_CONVERSATION_LIST" ) then local channelLink = format(CHAT_BN_CONVERSATION_GET_LINK, arg8, MAX_WOW_CHAT_CHANNELS + arg8); local message = format(CHAT_BN_CONVERSATION_LIST, channelLink, arg1); self:AddMessage(message, info.r, info.g, info.b, info.id, false, accessID, typeID); elseif ( type == "BN_INLINE_TOAST_ALERT" ) then if ( arg1 == "FRIEND_OFFLINE" and not BNet_ShouldProcessOfflineEvents() ) then return true; end local globalstring = _G["BN_INLINE_TOAST_"..arg1]; local message; if ( arg1 == "FRIEND_REQUEST" ) then message = globalstring; elseif ( arg1 == "FRIEND_PENDING" ) then message = format(BN_INLINE_TOAST_FRIEND_PENDING, BNGetNumFriendInvites()); elseif ( arg1 == "FRIEND_REMOVED" or arg1 == "BATTLETAG_FRIEND_REMOVED" ) then message = format(globalstring, arg2); elseif ( arg1 == "FRIEND_ONLINE" or arg1 == "FRIEND_OFFLINE") then local hasFocus, toonName, client, realmName, realmID, faction, race, class, guild, zoneName, level, gameText = BNGetToonInfo(arg13); if (toonName and toonName ~= "" and client and client ~= "") then local toonNameText = BNet_GetClientEmbeddedTexture(client, 14)..toonName; local playerLink = format("|HBNplayer:%s:%s:%s:%s:%s|h[%s] (%s)|h", arg2, arg13, arg11, Chat_GetChatCategory(type), 0, arg2, toonNameText); message = format(globalstring, playerLink); else local playerLink = format("|HBNplayer:%s:%s:%s:%s:%s|h[%s]|h", arg2, arg13, arg11, Chat_GetChatCategory(type), 0, arg2); message = format(globalstring, playerLink); end else local playerLink = format("|HBNplayer:%s:%s:%s:%s:%s|h[%s]|h", arg2, arg13, arg11, Chat_GetChatCategory(type), 0, arg2); message = format(globalstring, playerLink); end self:AddMessage(message, info.r, info.g, info.b, info.id); elseif ( type == "BN_INLINE_TOAST_BROADCAST" ) then if ( arg1 ~= "" ) then arg1 = RemoveExtraSpaces(arg1); local playerLink = format("|HBNplayer:%s:%s:%s:%s:%s|h[%s]|h", arg2, arg13, arg11, Chat_GetChatCategory(type), 0, arg2); self:AddMessage(format(BN_INLINE_TOAST_BROADCAST, playerLink, arg1), info.r, info.g, info.b, info.id); end elseif ( type == "BN_INLINE_TOAST_BROADCAST_INFORM" ) then if ( arg1 ~= "" ) then arg1 = RemoveExtraSpaces(arg1); self:AddMessage(BN_INLINE_TOAST_BROADCAST_INFORM, info.r, info.g, info.b, info.id); end elseif ( type == "BN_INLINE_TOAST_CONVERSATION" ) then self:AddMessage(format(BN_INLINE_TOAST_CONVERSATION, arg1), info.r, info.g, info.b, info.id); else local body; local _, fontHeight = FCF_GetChatWindowInfo(self:GetID()); if ( fontHeight == 0 ) then --fontHeight will be 0 if it's still at the default (14) fontHeight = 14; end -- Add AFK/DND flags local pflag; if(strlen(arg6) > 0) then if ( arg6 == "GM" ) then --If it was a whisper, dispatch it to the GMChat addon. if ( type == "WHISPER" ) then return; end --Add Blizzard Icon, this was sent by a GM pflag = "|TInterface\\ChatFrame\\UI-ChatIcon-Blizz:12:20:0:0:32:16:4:28:0:16|t "; elseif ( arg6 == "DEV" ) then --Add Blizzard Icon, this was sent by a Dev pflag = "|TInterface\\ChatFrame\\UI-ChatIcon-Blizz:12:20:0:0:32:16:4:28:0:16|t "; else pflag = _G["CHAT_FLAG_"..arg6]; end else if specialChatIcons[E.myrealm] then for character, texture in pairs(specialChatIcons[E.myrealm]) do if arg2 == character then pflag = texture end end for realm, _ in pairs(specialChatIcons) do if realm ~= E.myrealm then for character, texture in pairs(specialChatIcons[realm]) do if arg2 == character.."%-"..realm then pflag = texture end end end end else for realm, _ in pairs(specialChatIcons) do for character, texture in pairs(specialChatIcons[realm]) do if arg2 == character.."%-"..realm then pflag = texture end end end end if not pflag then pflag = ""; end end if ( type == "WHISPER_INFORM" and GMChatFrame_IsGM and GMChatFrame_IsGM(arg2) ) then return; end local showLink = 1; if ( strsub(type, 1, 7) == "MONSTER" or strsub(type, 1, 9) == "RAID_BOSS") then showLink = nil; else arg1 = gsub(arg1, "%%", "%%%%"); end -- Search for icon links and replace them with texture links. for tag in string.gmatch(arg1, "%b{}") do local term = strlower(string.gsub(tag, "[{}]", "")); if ( ICON_TAG_LIST[term] and ICON_LIST[ICON_TAG_LIST[term]] ) then arg1 = string.gsub(arg1, tag, ICON_LIST[ICON_TAG_LIST[term]] .. "0|t"); elseif ( GROUP_TAG_LIST[term] ) then local groupIndex = GROUP_TAG_LIST[term]; local groupList = "["; for i=1, GetNumGroupMembers() do local name, rank, subgroup, level, class, classFileName = GetRaidRosterInfo(i); if ( name and subgroup == groupIndex ) then local classColorTable = RAID_CLASS_COLORS[classFileName]; if ( classColorTable ) then name = string.format("\124cff%.2x%.2x%.2x%s\124r", classColorTable.r*255, classColorTable.g*255, classColorTable.b*255, name); end groupList = groupList..(groupList == "[" and "" or PLAYER_LIST_DELIMITER)..name; end end groupList = groupList.."]"; arg1 = string.gsub(arg1, tag, groupList); end end --Remove groups of many spaces arg1 = RemoveExtraSpaces(arg1); local playerLink; if ( type ~= "BN_WHISPER" and type ~= "BN_WHISPER_INFORM" and type ~= "BN_CONVERSATION" ) then playerLink = "|Hplayer:"..arg2..":"..arg11..":"..chatGroup..(chatTarget and ":"..chatTarget or "").."|h"; else playerLink = "|HBNplayer:"..arg2..":"..arg13..":"..arg11..":"..chatGroup..(chatTarget and ":"..chatTarget or "").."|h"; end local message = arg1; if ( arg14 ) then --isMobile message = ChatFrame_GetMobileEmbeddedTexture(info.r, info.g, info.b)..message; end if ( (strlen(arg3) > 0) and (arg3 ~= self.defaultLanguage) ) then local languageHeader = "["..arg3.."] "; if ( showLink and (strlen(arg2) > 0) ) then body = format(_G["CHAT_"..type.."_GET"]..languageHeader..message, pflag..playerLink.."["..coloredName.."]".."|h"); else body = format(_G["CHAT_"..type.."_GET"]..languageHeader..message, pflag..arg2); end else if ( not showLink or strlen(arg2) == 0 ) then if ( type == "TEXT_EMOTE" ) then body = message; else body = format(_G["CHAT_"..type.."_GET"]..message, pflag..arg2, arg2); end else if ( type == "EMOTE" ) then body = format(_G["CHAT_"..type.."_GET"]..message, pflag..playerLink..coloredName.."|h"); elseif ( type == "TEXT_EMOTE") then body = string.gsub(message, arg2, pflag..playerLink..coloredName.."|h", 1); else body = format(_G["CHAT_"..type.."_GET"]..message, pflag..playerLink.."["..coloredName.."]".."|h"); end end end -- Add Channel arg4 = gsub(arg4, "%s%-%s.*", ""); if( chatGroup == "BN_CONVERSATION" ) then body = format(CHAT_BN_CONVERSATION_GET_LINK, arg8, MAX_WOW_CHAT_CHANNELS + arg8)..body; elseif(channelLength > 0) then body = "|Hchannel:channel:"..arg8.."|h["..arg4.."]|h "..body; end --Add Timestamps if ( CH.db.timeStampFormat and CH.db.timeStampFormat ~= 'NONE' ) then local timeStamp = BetterDate(CH.db.timeStampFormat, CH.timeOverride or time()); timeStamp = timeStamp:gsub(' ', '') timeStamp = timeStamp:gsub('AM', ' AM') timeStamp = timeStamp:gsub('PM', ' PM') body = '|cffB3B3B3['..timeStamp..'] |r'..body end local accessID = ChatHistory_GetAccessID(chatGroup, chatTarget); local typeID = ChatHistory_GetAccessID(infoType, chatTarget, arg12 == "" and arg13 or arg12); body = body:gsub("|Hchannel:(.-)|h%[(.-)%]|h", CH.ShortChannel) body = body:gsub('CHANNEL:', '') body = body:gsub("^(.-|h) "..L['whispers'], "%1") body = body:gsub("^(.-|h) "..L['says'], "%1") body = body:gsub("^(.-|h) "..L['yells'], "%1") body = body:gsub("<"..AFK..">", "[|cffFF0000"..L['AFK'].."|r] ") body = body:gsub("<"..DND..">", "[|cffE7E716"..L['DND'].."|r] ") body = body:gsub("%[BN_CONVERSATION:", '%['..L["BN:"]) body = body:gsub("^%["..RAID_WARNING.."%]", '['..L['RW']..']') self:AddMessage(body, info.r, info.g, info.b, info.id, false, accessID, typeID); CH.timeOverride = nil; end if ( type == "WHISPER" or type == "BN_WHISPER" ) then --BN_WHISPER FIXME ChatEdit_SetLastTellTarget(arg2, type); if ( self.tellTimer and (GetTime() > self.tellTimer) ) then PlaySound("TellMessage"); end self.tellTimer = GetTime() + CHAT_TELL_ALERT_TIME; --FCF_FlashTab(self); end if ( not self:IsShown() ) then if ( (self == DEFAULT_CHAT_FRAME and info.flashTabOnGeneral) or (self ~= DEFAULT_CHAT_FRAME and info.flashTab) ) then if ( not CHAT_OPTIONS.HIDE_FRAME_ALERTS or type == "WHISPER" or type == "BN_WHISPER" ) then --BN_WHISPER FIXME if (not (type == "BN_CONVERSATION" and BNIsSelf(arg13))) then if (not FCFManager_ShouldSuppressMessageFlash(self, chatGroup, chatTarget) ) then FCF_StartAlertFlash(self); end end end end end return true; end end function CH:ChatFrame_AddMessageEventFilter (event, filter) assert(event and filter); if ( chatFilters[event] ) then -- Only allow a filter to be added once for index, filterFunc in next, chatFilters[event] do if ( filterFunc == filter ) then return; end end else chatFilters[event] = {}; end tinsert(chatFilters[event], filter); end function CH:ChatFrame_RemoveMessageEventFilter (event, filter) assert(event and filter); if ( chatFilters[event] ) then for index, filterFunc in next, chatFilters[event] do if ( filterFunc == filter ) then tremove(chatFilters[event], index); end end if ( #chatFilters[event] == 0 ) then chatFilters[event] = nil; end end end