MineClone5/mods/PLAYER/mcl_antispam/init.lua

113 lines
3.0 KiB
Lua

local ban_spammers = true
local kick_spammers = true
local revoke_shout_for_spammers = true
local limit_messages = 10
local limit_message_length = 200
local block_special_chars = true
local enable_antispam = ban_spammers or kick_spammers or revoke_shout_for_spammers
local function update_settings()
ban_spammers = minetest.settings:get_bool("ban_spammers", true)
kick_spammers = minetest.settings:get_bool("kick_spammers", true)
revoke_shout_for_spammers = minetest.settings:get_bool("revoke_shout_for_spammers", true)
limit_messages = tonumber(minetest.settings:get("limit_messages") or 10)
limit_message_length = tonumber(minetest.settings:get("limit_message_length") or 200)
block_special_chars = minetest.settings:get_bool("block_special_chars", true)
enable_antispam = ban_spammers or kick_spammers or revoke_shout_for_spammers
minetest.after(7, update_settings)
end
update_settings()
local last_messages = {}
local exceeders = {}
local special_users = {}
local function ban(name)
if revoke_shout_for_spammers then
local privs = minetest.get_player_privs(name)
if privs then
privs.shout = nil
minetest.set_player_privs(name, privs)
end
end
if ban_spammers then
minetest.ban_player(name)
elseif kick_spammers then
minetest.kick_player(name)
end
end
local last_char = string.char(127)
local function on_chat_message(name, message)
if not enable_antispam then return end
local length = message:len()
if last_messages.job then
last_messages.job:cancel()
last_messages.job = nil
end
if last_messages.name and last_messages.name == name then
last_messages.count = last_messages.count + 1
last_messages.summary_length = last_messages.summary_length + length
if last_messages.count >= limit_messages then
ban(name)
end
else
last_messages.name = name
last_messages.count = 1
last_messages.summary_length = length
end
last_messages.job = minetest.after(30, function()
last_messages.name = nil
last_messages.job = nil
end)
if limit_message_length > 0 and message:len() > limit_message_length then
if exceeders[name] then
exceeders[name] = exceeders[name] + 1
if exceeders[name] > limit_messages then
ban(name)
end
else
exceeders[name] = 1
end
message = message:sub(1, limit_message_length) .. ">8 >8 >8"
minetest.chat_send_all("<" .. name .. "> " .. message)
return true
else
if exceeders[name] then
exceeders[name] = nil
end
end
if block_special_chars then
local sc = false
local msg = ""
for i = 1, #message do
local c = message:sub(i,i)
if c >= " " and c <= last_char then
msg = msg .. c
else
sc = true
end
end
if sc then
if special_users[name] then
special_users[name] = special_users[name] + 1
if special_users[name] > limit_messages then
ban(name)
end
else
special_users[name] = 1
end
message = msg
minetest.chat_send_all("<" .. name .. "> " .. message)
return true
else
if special_users[name] then
special_users[name] = nil
end
end
end
end
minetest.register_on_chat_message(on_chat_message)