local SLE , T , E , L , V , P , G = unpack ( ElvUI_SLE )
local C = SLE.Chat
local format = format
local GetTime = GetTime
local ItemRefTooltip = ItemRefTooltip
local ShowUIPanel = ShowUIPanel
C.Meterspam = false
C.invLinksInit = false
C.ChannelEvents = {
' CHAT_MSG_CHANNEL ' ,
' CHAT_MSG_GUILD ' ,
' CHAT_MSG_OFFICER ' ,
' CHAT_MSG_PARTY ' ,
' CHAT_MSG_PARTY_LEADER ' ,
' CHAT_MSG_INSTANCE_CHAT ' ,
' CHAT_MSG_INSTANCE_CHAT_LEADER ' ,
' CHAT_MSG_RAID ' ,
' CHAT_MSG_RAID_LEADER ' ,
' CHAT_MSG_SAY ' ,
' CHAT_MSG_WHISPER ' ,
' CHAT_MSG_WHISPER_INFORM ' ,
' CHAT_MSG_YELL ' ,
' CHAT_MSG_BN_WHISPER ' ,
' CHAT_MSG_BN_WHISPER_INFORM ' ,
}
C.InvLinkEvents = {
' CHAT_MSG_CHANNEL ' ,
' CHAT_MSG_GUILD ' ,
' CHAT_MSG_OFFICER ' ,
' CHAT_MSG_SAY ' ,
' CHAT_MSG_WHISPER ' ,
' CHAT_MSG_WHISPER_INFORM ' ,
' CHAT_MSG_YELL ' ,
' CHAT_MSG_BN_WHISPER ' ,
' CHAT_MSG_BN_WHISPER_INFORM ' ,
}
C.spamFirstLines = {
' ^Recount - (.*)$ ' , --Recount
' ^Skada: (.*) for (.*):$ ' , -- Skada enUS
' ^Skada: (.*) por (.*):$ ' , -- Skada esES/ptBR
' ^Skada: (.*) fur (.*):$ ' , -- Skada deDE
' ^Skada: (.*) pour (.*):$ ' , -- Skada frFR
' ^Skada: (.*) per (.*):$ ' , -- Skada itIT
' ^(.*) ? Skada ?? (.*):$ ' , -- Skada koKR
' ^Отчёт Skada: (.*), с (.*):$ ' , -- Skada ruRU
' ^Skada??(.*)?(.*):$ ' , -- Skada zhCN
' ^Skada:(.*)??(.*):$ ' , -- Skada zhTW
' ^(.*) Done for (.*)$ ' , -- TinyDPS
' ^Numeration: (.*)$ ' , -- Numeration
' ^Details!:(.*)$ ' -- Details!
}
C.spamNextLines = {
' ^(%d+)%. (.*)$ ' , --Recount, Details! and Skada
' ^(.*) (.*)$ ' , --Additional Skada
' ^Numeration: (.*)$ ' , -- Numeration
' ^[+-]%d+.%d ' , -- Numeration Deathlog Details
' ^(%d+). (.*):(.*)(%d+)(.*)(%d+)%%(.*)%((%d+)%)$ ' , -- TinyDPS
' ^(.+) (%d-%.%d-%w)$ ' , -- Skada 2
' |c%x-|H.-|h(%[.-%])|h|r (%d-%.%d-%w %(%d-%.%d-%%%)) ' , --Skada 3
}
C.Meters = { }
local invKeys = { }
function C : CreateInvKeys ( )
local db = E.db . sle.chat . invite.keys
wipe ( invKeys )
db = gsub ( db , ' ,%s ' , ' , ' ) --remove spaces that follow a comma
for index = 1 , select ( ' # ' , strsplit ( ' , ' , db ) ) do
local key = select ( index , strsplit ( ' , ' , db ) )
if key then
invKeys [ key ] = true
end
end
end
function C : filterLine ( event , source , msg )
for _ , line in ipairs ( C.spamNextLines ) do
if msg : match ( line ) then
local curTime = GetTime ( )
for _ , meter in ipairs ( C.Meters ) do
local elapsed = curTime - meter.time
if meter.src == source and meter.evt == event and elapsed < 1 then
-- found the meter, now check wheter this line is already in there
local toInsert = true
for _ , b in ipairs ( meter.data ) do
if b == msg then
toInsert = false
end
end
if toInsert then tinsert ( meter.data , msg ) end
return true , false , nil
end
end
end
end
for _ , line in ipairs ( C.spamFirstLines ) do
local newID = 0
if msg : match ( line ) then
local curTime = GetTime ( )
if strfind ( msg , ' |cff(.+)|r ' ) then
msg = gsub ( msg , ' |cff%w%w%w%w%w%w ' , ' ' )
msg = gsub ( msg , ' |r ' , ' ' )
end
for id , meter in ipairs ( C.Meters ) do
local elapsed = curTime - meter.time
if meter.src == source and meter.evt == event and elapsed < 1 then
newID = id
return true , true , format ( ' |HSLD:%1$d|h|cFFFFFF00[%2$s]|r|h ' , newID or 0 , msg or ' nil ' )
end
end
local newMeter = { src = source , evt = event , time = curTime , data = { } , title = msg }
tinsert ( C.Meters , newMeter )
for id , meter in ipairs ( C.Meters ) do
if meter.src == source and meter.evt == event and meter.time == curTime then
newID = id
end
end
return true , true , format ( ' |HSLD:%1$d|h|cFFFFFF00[%2$s]|r|h ' , newID or 0 , msg or ' nil ' )
end
end
return false , false , nil
end
function C : ParseChatEvent ( event , msg , sender , ... )
local hide = false
for _ , allevents in ipairs ( C.ChannelEvents ) do
if event == allevents then
local isRecount , isFirstLine , newMessage = C : filterLine ( event , sender , msg )
if isRecount then
if isFirstLine then
msg = newMessage
else
hide = true
end
end
end
end
if not hide then
return false , msg , sender , ...
end
return true
end
function C : ParseChatEventInv ( event , msg , sender , ... )
local hex = E : RGBToHex ( E.db . sle.chat . invite.color . r , E.db . sle.chat . invite.color . g , E.db . sle.chat . invite.color . b )
for _ , allevents in ipairs ( C.InvLinkEvents ) do
if event == allevents then
for key , _ in pairs ( invKeys ) do
if strfind ( msg , key ) then
msg = gsub ( msg , key , format ( ' |Hinvite: ' .. sender .. ' |h ' .. hex .. ' [%s]|r|h ' , key ) )
break
end
end
end
end
return false , msg , sender , ...
end
local function SetItemRef ( link )
local linktype , id = strsplit ( ' : ' , link )
if E.db . sle.chat . dpsSpam then
if linktype == ' SLD ' then
local meterID = tonumber ( id )
-- put stuff in the ItemRefTooltip from FrameXML
ShowUIPanel ( ItemRefTooltip )
if not ItemRefTooltip : IsShown ( ) then
ItemRefTooltip : SetOwner ( _G.UIParent , ' ANCHOR_PRESERVE ' )
end
ItemRefTooltip : ClearLines ( )
ItemRefTooltip : AddLine ( C.Meters [ meterID ] . title )
ItemRefTooltip : AddLine ( format ( L [ " Reported by %s " ] , C.Meters [ meterID ] . src ) )
for _ , message in ipairs ( C.Meters [ meterID ] . data ) do
ItemRefTooltip : AddLine ( message , 1 , 1 , 1 )
end
ItemRefTooltip : Show ( )
return
end
end
if IsAltKeyDown ( ) and linktype == ' player ' and E.db . sle.chat . invite.altInv then
C_PartyInfo.InviteUnit ( id )
return
elseif linktype == ' invite ' then
if strfind ( id , ' |K ' ) then --Bnet whisper
local bnetID = strmatch ( id , ' |K%w(%d+) ' )
FriendsFrame_BattlenetInvite ( nil , bnetID )
else
C_PartyInfo.InviteUnit ( id )
end
return
end
end
function C : SpamFilter ( )
if E.db . sle.chat . dpsSpam then
for _ , event in ipairs ( C.ChannelEvents ) do
ChatFrame_AddMessageEventFilter ( event , self.ParseChatEvent )
end
C.Meterspam = true
else
if C.Meterspam then
for _ , event in ipairs ( C.ChannelEvents ) do
ChatFrame_RemoveMessageEventFilter ( event , self.ParseChatEvent )
end
C.Meterspam = false
end
end
if E.db . sle.chat . invite.invLinks then
for _ , event in ipairs ( C.InvLinkEvents ) do
ChatFrame_AddMessageEventFilter ( event , self.ParseChatEventInv )
end
C.invLinksInit = true
else
if C.invLinksInit then
for _ , event in ipairs ( C.InvLinkEvents ) do
ChatFrame_RemoveMessageEventFilter ( event , self.ParseChatEventInv )
end
C.invLinksInit = false
end
end
end
function C : InitLinks ( )
C : SpamFilter ( )
C : CreateInvKeys ( )
hooksecurefunc ( ' SetItemRef ' , SetItemRef )
-- Borrowed from Deadly Boss Mods
do
local old = ItemRefTooltip.SetHyperlink -- we have to hook this function since the default ChatFrame code assumes that all links except for player and channel links are valid arguments for this function
function ItemRefTooltip : SetHyperlink ( link , ... )
if link : sub ( 0 , 4 ) == ' SLD: ' then return end
if link : sub ( 0 , 6 ) == ' invite ' then return end
return old ( self , link , ... )
end
end
end