66 lines
2.3 KiB
Lua
66 lines
2.3 KiB
Lua
local PLAYERS_MSG = {}
|
|
local PLAYERS_FREQ = {}
|
|
local SPAM_SPEED = 5
|
|
local SPAM_SPEED_MSECS = SPAM_SPEED * 1e6
|
|
local SPAM_WARN = 5
|
|
-- In seconds
|
|
local SPAM_KICK = SPAM_WARN + 5
|
|
local RESET_TIME = 30
|
|
-- Convert to microsecs
|
|
local RESET_TIME_MSECS = RESET_TIME * 1e6
|
|
local WARNING_COLOR = minetest.get_color_escape_sequence"#FFBB33"
|
|
minetest.register_on_leaveplayer(function(player)
|
|
PLAYERS_MSG[player:get_player_name()] = nil
|
|
PLAYERS_FREQ[player:get_player_name()] = nil
|
|
end)
|
|
minetest.register_on_joinplayer(function(player)
|
|
PLAYERS_MSG[player:get_player_name()] = {}
|
|
end)
|
|
minetest.register_on_chat_message(function(name, message)
|
|
for msg, info in pairs(PLAYERS_MSG[name]) do
|
|
if minetest.get_us_time() - info[2] >= RESET_TIME_MSECS then PLAYERS_MSG[name][msg] = nil end
|
|
end
|
|
if PLAYERS_MSG[name][message] then
|
|
local amount = PLAYERS_MSG[name][message][1] + 1
|
|
PLAYERS_MSG[name][message][1] = amount
|
|
PLAYERS_MSG[name][message][2] = minetest.get_us_time()
|
|
if amount >= SPAM_KICK then minetest.kick_player(name, "Kicked for spamming.")
|
|
elseif amount >= SPAM_WARN then
|
|
minetest.chat_send_player(name, WARNING_COLOR .. "Warning! You've sent the message '" .. message .. "' too often. Wait at least " .. RESET_TIME .. " seconds before sending it again.")
|
|
end
|
|
else PLAYERS_MSG[name][message] = { 1, minetest.get_us_time() } end
|
|
if not PLAYERS_FREQ[name] then
|
|
PLAYERS_FREQ[name] = {
|
|
0,
|
|
0,
|
|
minetest.get_us_time(),
|
|
0
|
|
}
|
|
return
|
|
end
|
|
local warns = PLAYERS_FREQ[name][4]
|
|
local amount = PLAYERS_FREQ[name][2]
|
|
local speed = PLAYERS_FREQ[name][1]
|
|
local delay = minetest.get_us_time() - PLAYERS_FREQ[name][3]
|
|
speed = (speed * amount + delay) / (amount + 1)
|
|
if amount >= SPAM_WARN then
|
|
if warns + 1 == SPAM_KICK - SPAM_WARN then minetest.kick_player(name, "Kicked for spamming.")
|
|
elseif speed <= SPAM_SPEED_MSECS then
|
|
minetest.chat_send_player(name, WARNING_COLOR .. "Warning! You are sending messages too fast. Wait at least " .. SPAM_SPEED .. " seconds before sending another message.")
|
|
warns = warns + 1
|
|
speed = SPAM_SPEED_MSECS
|
|
amount = SPAM_WARN
|
|
else
|
|
speed = 0
|
|
amount = 0
|
|
warns = 0
|
|
end
|
|
end
|
|
PLAYERS_FREQ[name] = {
|
|
speed,
|
|
amount + 1,
|
|
minetest.get_us_time(),
|
|
warns
|
|
}
|
|
end)
|