local mod = Chatter:NewModule("Broadcast Filter", "AceEvent-3.0") local L = LibStub("AceLocale-3.0"):GetLocale("Chatter") mod.modName = L["Broadcast Filter"] local ipairs = _G.ipairs local type = _G.type local select = _G.select local strlower = _G.string.lower local strfind = _G.string.find local gmatch = _G.string.gmatch local gsub = _G.string.gsub -- Events the autobroadcast can arrive on. It renders as "[Ascension Autobroadcast]: ..." -- which is a named channel, so CHAT_MSG_CHANNEL is the primary one; SYSTEM and -- RAID_WARNING are belt-and-suspenders for other server broadcast styles. local events = { "CHAT_MSG_CHANNEL", "CHAT_MSG_CHANNEL_NOTICE", "CHAT_MSG_SYSTEM", "CHAT_MSG_RAID_WARNING", } local defaults = { profile = { patterns = "Ascension Autobroadcast", } } -- Lowercased, trimmed, non-empty lines from the user's textbox. local activePatterns = {} local function rebuild() for i = #activePatterns, 1, -1 do activePatterns[i] = nil end for line in gmatch(mod.db.profile.patterns or "", "[^\r\n]+") do line = gsub(gsub(line, "^%s+", ""), "%s+$", "") if line ~= "" then activePatterns[#activePatterns + 1] = strlower(line) end end end -- Returns true to suppress. For a channel message the channel name ("Ascension -- Autobroadcast") is not in the body but in a later arg, so scan the body and -- every string vararg with a case-insensitive plain substring match. mod.filterFunc = function(frame, event, msg, ...) local n = #activePatterns if n == 0 then return false end if msg and msg ~= "" then local m = strlower(msg) for i = 1, n do if strfind(m, activePatterns[i], 1, true) then return true end end end for i = 1, select("#", ...) do local v = select(i, ...) if type(v) == "string" and v ~= "" then v = strlower(v) for j = 1, n do if strfind(v, activePatterns[j], 1, true) then return true end end end end return false end local options = { desc = { order = 1, type = "description", name = L["Hides chat lines from broadcast channels or senders. One entry per line; matching is a case-insensitive substring against the message and its channel/sender."], }, patterns = { order = 2, type = "input", multiline = 8, width = "full", name = L["Hidden broadcasts"], get = function() return mod.db.profile.patterns end, set = function(info, v) mod.db.profile.patterns = v rebuild() end, }, } function mod:OnInitialize() self.db = Chatter.db:RegisterNamespace("BroadcastFilter", defaults) end function mod:OnEnable() rebuild() for _, event in ipairs(events) do ChatFrame_AddMessageEventFilter(event, self.filterFunc) end end function mod:OnDisable() for _, event in ipairs(events) do ChatFrame_RemoveMessageEventFilter(event, self.filterFunc) end end function mod:Info() return L["Suppresses spammy server broadcasts such as the Ascension Autobroadcast Discord nag."] end function mod:GetOptions() return options end