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
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
|