diff --git a/ElvUI_SLE/defaults/profile.lua b/ElvUI_SLE/defaults/profile.lua
index 9cfafd7..fdbc6c9 100644
--- a/ElvUI_SLE/defaults/profile.lua
+++ b/ElvUI_SLE/defaults/profile.lua
@@ -119,6 +119,7 @@ P['sle'] = {
--Chat
['chat'] = {
['guildmaster'] = false,
+ ['dpsSpam'] = false,
},
--Combat Icon
diff --git a/ElvUI_SLE/locales/russian.lua b/ElvUI_SLE/locales/russian.lua
index fc1ee65..706df20 100644
--- a/ElvUI_SLE/locales/russian.lua
+++ b/ElvUI_SLE/locales/russian.lua
@@ -53,6 +53,11 @@ L["Chat Editbox History"] = "История ввода"
L["The amount of messages to save in the editbox history.\n\n|cffFF0000Note:|r To disable, set to 0."] = "Количество сообщений, введенных вами, которое будет сохранено между сеансами.\n\n|cffFF0000Напоминание:|r Для отключения, установите на 0."
L["Guild Master Icon"] = "Иконка Главы гильдии"
L["Displays an icon near your Guild Master in chat.\n\n|cffFF0000Note:|r Some messages in chat history may disappear on login."] = "Отображает иконку рядом с сообщениями главы вашей гильдии в чате.\n\n|cffFF0000Предупреждение:|r Некоторые сообщения в истории чата в истории чата могут исчезать при входе в игру."
+L["Filter DPS meters' Spam"] = "Фильтровать отчеты о УВС"
+L["Replaces long reports from damage meters with a clickeble hyperlink to reduce chat spam."] = "Заменяет длиные отчеты от аддонов для измерения УВС на гиперссылку, сокращая уровень спама в чате."
+L["Reported by %s"] = "Отчет от %s"
+
+--Raid utility--
L['Raid Utility'] = "Управление рейдом"
--Media--
diff --git a/ElvUI_SLE/modules/chat.lua b/ElvUI_SLE/modules/chat.lua
index 136f5d8..0803a69 100644
--- a/ElvUI_SLE/modules/chat.lua
+++ b/ElvUI_SLE/modules/chat.lua
@@ -34,6 +34,47 @@ local rolePaths = {
local leader = [[|TInterface\GroupFrame\UI-Group-LeaderIcon:12:12|t]]
local specialChatIcons
+--Damage Meter Spam stuff--
+CH.MeterSpam = false
+CH.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",
+}
+CH.spamFirstLines = {
+ "^Recount - (.*)$", --Recount
+ "^Skada: (.*) for (.*):$", -- Skada enUS
+ "^Skada: (.*) por (.*):$", -- Skada esES/ptBR
+ "^Skada: (.*) für (.*):$", -- 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! Report for (.*)$" -- Details!
+}
+CH.spamNextLines = {
+ "^(%d+)\. (.*)$", --Recount, Details! and Skada
+ "^(.*) (.*)$", --Additional Skada
+ "^Numeration: (.*)$", -- Numeration
+ "^[+-]%d+.%d", -- Numeration Deathlog Details
+ "^(%d+). (.*):(.*)(%d+)(.*)(%d+)%%(.*)%((%d+)%)$" -- TinyDPS
+}
+CH.Meters = {}
+
local function Style(self, frame)
CreatedFrames = frame:GetID()
end
@@ -291,6 +332,119 @@ function CH:GMIconUpdate()
end
end
+function CH:filterLine(event, source, msg, ...)
+ local isSpam = false
+ for _, line in ipairs(CH.spamNextLines) do
+ if msg:match(line) then
+ local curTime = GetTime()
+ for id, meter in ipairs(CH.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(CH.spamFirstLines) do
+ local newID = 0
+ if msg:match(line) then
+ local curTime = GetTime();
+ -- check wheter there's already a meter running (don't want duplicates)
+ for id,meter in ipairs(CH.Meters) do
+ local elapsed = curTime - meter.time
+ if meter.src == source and meter.evt == event and elapsed < 1 then
+ newID = id
+ return true, true, string.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, addon = addonName}
+ tinsert(CH.Meters, newMeter)
+
+ for id,meter in ipairs(CH.Meters) do
+ if meter.src == source and meter.evt == event and meter.time == curTime then
+ newID = id
+ end
+ end
+
+ return true, true, string.format("|HSLD:%1$d|h|cFFFFFF00[%2$s]|r|h",newID or 0,msg or "nil")
+ end
+ end
+ return false, false, nil
+end
+
+function CH:ParseChatEvent(event, msg, sender, ...)
+ local hide = false
+ for _,allevents in ipairs(CH.ChannelEvents) do
+ if event == allevents then
+ local isRecount, isFirstLine, newMessage = CH: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 CH:ParseLink(link, text, button, chatframe)
+ if E.db.sle.chat.dpsSpam then
+ local linktype, id = strsplit(":", link)
+ 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(CH.Meters[meterID].title)
+ ItemRefTooltip:AddLine(format(L["Reported by %s"],CH.Meters[meterID].src))
+ for _,message in ipairs(CH.Meters[meterID].data) do
+ ItemRefTooltip:AddLine(message,1,1,1)
+ end
+ ItemRefTooltip:Show()
+ end
+ end
+end
+
+function CH:SpamFilter()
+ if E.db.sle.chat.dpsSpam then
+ for _,event in ipairs(CH.ChannelEvents) do
+ ChatFrame_AddMessageEventFilter(event, self.ParseChatEvent)
+ end
+
+ CH.MeterSpam = true
+ else
+ if CH.MeterSpam then
+ for _,event in ipairs(CH.ChannelEvents) do
+ ChatFrame_RemoveMessageEventFilter(event, self.ParseChatEvent)
+ end
+ CH.MeterSpam = false
+ end
+ end
+end
+
--Previously layout.lua
local LO = E:GetModule('Layout');
local PANEL_HEIGHT = 22;
@@ -380,10 +534,26 @@ hooksecurefunc(LO, "ToggleChatPanels", ChatPanels)
hooksecurefunc(LO, "CreateChatPanels", CreateChatPanels)
hooksecurefunc(CH, "StyleChat", Style)
hooksecurefunc(CH, "Initialize", function(self)
+ if not E.private.chat.enable then return end
if E.db.sle.chat.guildmaster then
self:RegisterEvent('GUILD_ROSTER_UPDATE', Roster)
GMCheck()
end
SLE:GetRegion()
specialChatIcons = SLE.SpecialChatIcons[SLE.region]
+
+ CH:SpamFilter()
+
+ self:SecureHook("SetItemRef","ParseLink")
+
+ -- 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
+ return old(self, link, ...)
+ end
+ end
end)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/chat_c.lua b/ElvUI_SLE/options/chat_c.lua
index 0fdeda1..2509a7f 100644
--- a/ElvUI_SLE/options/chat_c.lua
+++ b/ElvUI_SLE/options/chat_c.lua
@@ -50,6 +50,14 @@ local function configTable()
get = function(info) return E.db.chat.editboxhistory end,
set = function(info, value) E.db.chat.editboxhistory = value; end,
},
+ dpsSpam = {
+ order = 7,
+ type = "toggle",
+ name = L["Filter DPS meters' Spam"],
+ desc = L["Replaces long reports from damage meters with a clickeble hyperlink to reduce chat spam."],
+ get = function(info) return E.db.sle.chat.dpsSpam end,
+ set = function(info, value) E.db.sle.chat.dpsSpam = value; CH:SpamFilter() end,
+ },
},
}
end