You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

282 lines
6.8 KiB

local SLE, T, E, L, V, P, G = unpack(select(2, ...))
local C = SLE.Chat
--GLOBALS: UIParent, ChatFrame_AddMessageEventFilter, ChatFrame_RemoveMessageEventFilter
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, ...)
local isSpam = false
for _, line in ipairs(C.spamNextLines) do
if msg:match(line) then
local curTime = GetTime()
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
-- found the meter, now check wheter this line is already in there
local toInsert = true
for a,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 i, 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, text, button, chatframe)
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(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 nil
end
end
if IsAltKeyDown() and linktype == "player" and E.db.sle.chat.invite.altInv then
C_PartyInfo.InviteUnit(id)
return nil
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 nil
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