From aa20e33e750f773873f2fd2dbea445d4a5342e63 Mon Sep 17 00:00:00 2001 From: Darthpred Date: Wed, 18 Mar 2015 00:43:43 +0400 Subject: [PATCH] DPS meter spam filter --- ElvUI_SLE/defaults/profile.lua | 1 + ElvUI_SLE/locales/russian.lua | 5 ++ ElvUI_SLE/modules/chat.lua | 170 ++++++++++++++++++++++++++++++++++++++++ ElvUI_SLE/options/chat_c.lua | 8 ++ 4 files changed, 184 insertions(+) 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 -- 1.7.9.5