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 @@
+