Quantcast

DPS meter spam filter

Darthpred [03-17-15 - 20:43]
DPS meter spam filter
Filename
ElvUI_SLE/defaults/profile.lua
ElvUI_SLE/locales/russian.lua
ElvUI_SLE/modules/chat.lua
ElvUI_SLE/options/chat_c.lua
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