From 12bff24a1992e97beb956c9f6e276f2500632c3b Mon Sep 17 00:00:00 2001
From: tchncs <me@tchncs.de>
Date: Sat, 19 Nov 2016 11:14:26 +0100
Subject: [PATCH] (placeholder?) initial add spamprevention by krock

---
 mods/player_spam/depends.txt |  1 +
 mods/player_spam/init.lua    | 91 ++++++++++++++++++++++++++++++++++++
 2 files changed, 92 insertions(+)
 create mode 100644 mods/player_spam/depends.txt
 create mode 100644 mods/player_spam/init.lua

diff --git a/mods/player_spam/depends.txt b/mods/player_spam/depends.txt
new file mode 100644
index 00000000..4ad96d51
--- /dev/null
+++ b/mods/player_spam/depends.txt
@@ -0,0 +1 @@
+default
diff --git a/mods/player_spam/init.lua b/mods/player_spam/init.lua
new file mode 100644
index 00000000..35f33161
--- /dev/null
+++ b/mods/player_spam/init.lua
@@ -0,0 +1,91 @@
+-- Untested mod to prevent from chat flood
+-- Allows players to send 4 messages in 2s when a silence of >= 2s follows
+-- Created by Krock <mk939@ymail.com> - 2016
+-- License: BSD 3-Clause
+-- ALL YOUR BUG REPORT ARE BELONG TO ME
+
+
+local player_spam = {}
+local CHAR_REPEAT_MAX = 4
+
+minetest.register_on_chat_message(function(name, msg)
+	if msg == "" or msg:sub(1, 1) == '/' then
+		return
+	end
+	if not minetest.check_player_privs(name, {shout = true}) then
+		minetest.chat_send_player(name, "You can not chat. Missing privilege: shout")
+		return true
+	end
+
+	local count_as_messages = math.max(1, math.min(msg:len() / 100, 5))
+    player_spam[name] = (player_spam[name] or 0) + math.floor(count_as_messages + 0.5) 
+
+    if player_spam[name] > 5 then
+        minetest.kick_player(name, "You spammer you!")
+        return true
+    end
+    if player_spam[name] > 3 then
+        -- A message per second maximal
+        minetest.chat_send_player(name, "Your message was not sent due to flood detection. "..
+				"Please try again in some seconds.")
+        return true
+    end
+
+    local new_msg = ""
+    local last_char
+    local same_char_count = 0
+
+    -- Prevent from repetive characters
+    for c in msg:gmatch(".") do
+		if c:byte() < 0x20 then
+			c = ' '
+		end
+        if last_char == c:lower() then
+            same_char_count = same_char_count + 1
+        else
+            last_char = c:lower()
+            same_char_count = 0
+        end
+
+        if same_char_count < CHAR_REPEAT_MAX then
+            new_msg = new_msg .. c
+        end
+    end
+	if new_msg == msg then
+		return -- Nothing to replace (message ok)
+	end
+	
+    for i, player in pairs(minetest.get_connected_players()) do
+        local player_name = player:get_player_name()
+        if player_name ~= name then
+            minetest.chat_send_player(player_name, "<"..name.."> " .. new_msg)
+        end
+    end
+    --if new_msg:len() < msg:len() then
+    --    minetest.chat_send_player(name, "Your message was shortened a bit to prevent from spam.")
+    --end
+    return true
+end)
+
+local timed = 0
+-- 1 message per second, decrease message count by X all X seconds
+local CHECK_COUNT = 2
+minetest.register_globalstep(function(dtime)
+    timed = timed + dtime
+    if timed < CHECK_COUNT then
+        return
+    end
+    timed = 0
+
+    for i, player in pairs(minetest.get_connected_players()) do
+        local player_name = player:get_player_name()
+        local num = player_spam[player_name]
+        if num and num > 0 then
+            player_spam[player_name] = math.max(0, num - CHECK_COUNT)
+        end
+    end
+end)
+
+minetest.register_on_leaveplayer(function(player)
+    player_spam[player:get_player_name()] = nil
+end)
\ No newline at end of file
-- 
GitLab