diff --git a/api.lua b/api.lua index 9533084..c1ff515 100644 --- a/api.lua +++ b/api.lua @@ -83,6 +83,7 @@ function mail.send(m) local entry = mail.get_storage_entry(m.from) table.insert(entry.outbox, 1, msg) mail.set_storage_entry(m.from, entry) + msg.spam = #mail.check_spam(msg) >= 1 -- add in every receivers inbox for recipient in pairs(recipients) do diff --git a/ui/inbox.lua b/ui/inbox.lua index 556e822..660bb54 100644 --- a/ui/inbox.lua +++ b/ui/inbox.lua @@ -97,6 +97,9 @@ function mail.show_inbox(name, sortfieldindex, sortdirection, filter) if not mail.player_in_list(name, message.to) and cc_color_enable then table.insert(displayed_color, "additional") end + if message.spam then + table.insert(displayed_color, "warning") + end formspec[#formspec + 1] = "," .. mail.get_color(displayed_color) formspec[#formspec + 1] = "," formspec[#formspec + 1] = minetest.formspec_escape(message.from) diff --git a/util/init.lua b/util/init.lua index dca73b8..d5e0560 100644 --- a/util/init.lua +++ b/util/init.lua @@ -4,5 +4,6 @@ dofile(MP .. "/util/normalize.lua") dofile(MP .. "/util/colors.lua") dofile(MP .. "/util/contact.lua") dofile(MP .. "/util/settings.lua") +dofile(MP .. "/util/spam.lua") dofile(MP .. "/util/time_ago.lua") dofile(MP .. "/util/uuid.lua") diff --git a/util/spam.lua b/util/spam.lua new file mode 100644 index 0000000..e29ef4e --- /dev/null +++ b/util/spam.lua @@ -0,0 +1,39 @@ +local function caps_ratio(str) + local total_caps = 0 + for i = 1, #str do -- iteration through each character + local c = str:sub(i,i) + if string.lower(c) ~= c then -- do not count digits as spam + total_caps = total_caps + 1 + end + end + return total_caps/(#str or 1) -- avoid division by zero +end + +local function words_ratio(str, ratio) + local words = {} + local split_str = str:split(" ") + for _, w in ipairs(split_str) do + if not words[w] then + words[w] = 0 + else + words[w] = (words[w] or 0) + 1 + end + end + for _, n in pairs(words) do + if n/#split_str >= ratio then + return true + end + end + return false +end + +function mail.check_spam(message) + spam_checks = {} + if caps_ratio(message.subject) == 1 or caps_ratio(message.body) > 0.4 then + table.insert(spam_checks, "caps") + end + if words_ratio(message.subject, 0.6) or words_ratio(message.body, 0.2) then + table.insert(spam_checks, "words") + end + return spam_checks +end