From 3d353cea55fdc50f1e1663195db6a3ce641c17ec Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Sun, 31 May 2026 17:01:55 +0200 Subject: [PATCH] feat(modules): add Broadcast Filter to hide Ascension Autobroadcast spam New Chatter module registers a ChatFrame message filter that suppresses chat lines matching a configurable list (default: 'Ascension Autobroadcast'). Matches case-insensitively against the message body and every string arg, so it catches the named-channel autobroadcast where the label is the channel name, not the body. Editable list in the module's options; enabled by default. --- Chatter/Localization/enUS.lua | 6 ++ Chatter/Modules/BroadcastFilter.lua | 109 ++++++++++++++++++++++++++++ Chatter/modules.xml | 1 + 3 files changed, 116 insertions(+) create mode 100644 Chatter/Modules/BroadcastFilter.lua diff --git a/Chatter/Localization/enUS.lua b/Chatter/Localization/enUS.lua index c0ec9fd..572bfe9 100644 --- a/Chatter/Localization/enUS.lua +++ b/Chatter/Localization/enUS.lua @@ -4,6 +4,12 @@ local AceLocale = LibStub:GetLibrary("AceLocale-3.0") local L = AceLocale:NewLocale("Chatter", "enUS", true) if not L then return end +-- ./Modules/BroadcastFilter.lua +L["Broadcast Filter"] = true +L["Hidden broadcasts"] = true +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."] = true +L["Suppresses spammy server broadcasts such as the Ascension Autobroadcast Discord nag."] = true + -- ./Chatter.lua L["Chatter"] = true L["Standalone Config"] = true diff --git a/Chatter/Modules/BroadcastFilter.lua b/Chatter/Modules/BroadcastFilter.lua new file mode 100644 index 0000000..6d9d299 --- /dev/null +++ b/Chatter/Modules/BroadcastFilter.lua @@ -0,0 +1,109 @@ +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 diff --git a/Chatter/modules.xml b/Chatter/modules.xml index a154bd6..1abcf2d 100644 --- a/Chatter/modules.xml +++ b/Chatter/modules.xml @@ -7,6 +7,7 @@