-- Change this if your language uses a lot of accented letters SSAccentScore = 0.5 SS = { lastMsg = '' } SSBlocked = { } SSBlockedReason = { } SSLastMessages = { } -- these are always spam, 100% of the time SS.blackList = { "$%d+.+%d+g", -- mwatches $9.99 "%d+g.+$%d+", -- matches 5g $9 "%d+e.?u.?r.+%d+g", -- matches 9eu(r) 5g "%d+g.+%d+e.?u.?r", -- matches 5g 9eu(r) "%d+g.+e.?u.?r%d+", -- matches 5g eur 5 (utf8 scrambled) "\226\130\172%d+.+%d+g", -- matches €9 5g "%d+g.+\226\130\172%d+", -- matches 5g €9 "\194\163%d+.+%d+g", -- matches £9 10g "%d+g.+\194\163%d+", -- matches 10g £9 "s.?k.?y.?p.?e?", -- matches skype under almost all obfuscation's "s.?k.?p.?y.?e?", -- matches skype under almost all obfuscation's "anal", -- anal [gtfo] } -- on english speaking realms, these characters are very very rare -- and are mostly used to try and get around spam blockers SS.obfs = { "å","à","á","ä","â","ã", "è","é","ë","ê", "ì","í","ï","î", "ò","ó","ö","ô","õ", "ù","ú","ü","û", "¥", "{square}","{star}","{triangle}","{circle}","{skull}","{diamond}" } -- guild spamming sucks SS.guildList = { "recruiting", "recruit", "level 25", "L25", "Level25" } -- words that could be bad, but also have a legit usage -- these are given a lower weight SS.greyList = { "dollar", "pounds", "usd", "gbp", "www", "[,.]com", "[,.]corn", "[,.]conn", "[,.]c0m", "[,.]c0rn", "[,.]c0nn", "dotcom","cRT2m","[,.]cqm","vvwwvv", "anytime", "mins", "welcome", "cheap", "buy", "kauf", "delivery", "discount", "rabatt", "peons", "185", "1-85", "525", "1-525", "gold", "%dkgold", "%dgold", "payment", "bucks", "safe", "greatest", "sale", "statchanger", "hack", "20,000", "100,000", "eur", "code", "bonus", "stock", "company", "super", "price", -- people selling arena shit "ranking", "arena", "selling", "best", "get the", "the best", -- mounts, no one has more than 1 or 2 of these so 3+ good bets is a spammer "swift shorestrider", "amani dragonhawk", "savage raptor", "mottled drake", "wooly white rhino", "blazing hippogryph", "big battle bear", "reins of the swift spectral tiger", "vial of the sands", "x-53 touring rocket", -- other bop or achiv selling "boe", "reliable", "company", "sell", "service", "services", "shareing", -- lol they can't spell "sharing", "account", "accounts", "hot", "transfer", } function SS.Check(sender) for _, name in pairs(SSBlocked) do if name == sender then return true end end return false end function SS.SimpleSpam(self, event, msg, ...) if SS.lastMsg == msg then return false end local matchCount = 0 local msgOrig = msg local sender = select(4,...) local line = select(10,...) local reason = false SS.lastMsg = msg msg = strlower(msg) -- no double spam if msg == SSLastMessage then return true end -- blacklist for _, word in ipairs(SS.blackList) do if (string.match(msg, word)) then matchCount = matchCount + 4.0 end end -- greylist for _, word in ipairs(SS.greyList) do if (string.match(msg, word)) then matchCount = matchCount + 1.0 end end -- obfuscated characters for _, word in ipairs(SS.obfs) do if (string.match(msg, word)) then matchCount = matchCount + SSAccentScore end end -- guild spam for _, word in ipairs(SS.guildList) do if (string.match(msg, word)) then matchCount = matchCount + 1.5 end end -- English only please if select(2, string.gsub(msg, "[a-zA-Z0-9.]", ".")) < (#msg/2) and #msg >= 4 then return true -- don't ban for non english. ignore it end -- block if more than 3 points if (matchCount >= 3) then if SS.Check(sender) == false and matchCount >= 4.5 then table.insert(SSBlocked, sender) SSBlockedReason[sender] = msgOrig if reason then print("|cffBA2323Blocked spam from " .. sender .. ". " .. reason .. "|r") else print("|cffBA2323Blocked spam from " .. sender .. ". Violation Score of " .. matchCount .. "|r") end end return true else SSLastMessage = msg return false end end ChatFrame_AddMessageEventFilter("CHAT_MSG_YELL", SS.SimpleSpam) ChatFrame_AddMessageEventFilter("CHAT_MSG_SAY", SS.SimpleSpam) ChatFrame_AddMessageEventFilter("CHAT_MSG_WHISPER", SS.SimpleSpam) ChatFrame_AddMessageEventFilter("CHAT_MSG_CHANNEL", SS.SimpleSpam)