Add on_violation callback
This commit is contained in:
parent
1c7f9bf23a
commit
dae7d9939e
36
init.lua
36
init.lua
@ -25,7 +25,7 @@
|
||||
|
||||
]]--
|
||||
|
||||
filter = {}
|
||||
filter = { registered_on_violations = {} }
|
||||
local words = {}
|
||||
local muted = {}
|
||||
local violations = {}
|
||||
@ -57,6 +57,10 @@ function filter.import_file(filepath)
|
||||
end
|
||||
end
|
||||
|
||||
function filter.register_on_violation(func)
|
||||
table.insert(filter.registered_on_violations, func)
|
||||
end
|
||||
|
||||
function filter.check_message(name, message)
|
||||
for _, w in ipairs(words) do
|
||||
if string.find(message:lower(), "%f[%a]" .. w .. "%f[%A]") then
|
||||
@ -111,15 +115,23 @@ function filter.on_violation(name, message)
|
||||
|
||||
local resolution
|
||||
|
||||
if violations[name] == 1 and minetest.get_player_by_name(name) then
|
||||
resolution = "warned"
|
||||
filter.show_warning_formspec(name)
|
||||
elseif violations[name] <= 3 then
|
||||
resolution = "muted"
|
||||
filter.mute(name, 1)
|
||||
else
|
||||
resolution = "kicked"
|
||||
minetest.kick_player(name, "Please mind your language!")
|
||||
for _, cb in pairs(filter.registered_on_violations) do
|
||||
if cb(name, message, violations) then
|
||||
resolution = "custom"
|
||||
end
|
||||
end
|
||||
|
||||
if not resolution then
|
||||
if violations[name] == 1 and minetest.get_player_by_name(name) then
|
||||
resolution = "warned"
|
||||
filter.show_warning_formspec(name)
|
||||
elseif violations[name] <= 3 then
|
||||
resolution = "muted"
|
||||
filter.mute(name, 1)
|
||||
else
|
||||
resolution = "kicked"
|
||||
minetest.kick_player(name, "Please mind your language!")
|
||||
end
|
||||
end
|
||||
|
||||
minetest.log("action", "VIOLATION (" .. resolution .. "): <" .. name .. "> ".. message)
|
||||
@ -145,9 +157,9 @@ local function step()
|
||||
violations[name] = nil
|
||||
end
|
||||
end
|
||||
minetest.after(2*60, step)
|
||||
minetest.after(10*60, step)
|
||||
end
|
||||
minetest.after(2*60, step)
|
||||
minetest.after(10*60, step)
|
||||
|
||||
minetest.register_chatcommand("filter", {
|
||||
params = "filter server",
|
||||
|
28
readme.md
28
readme.md
@ -1,5 +1,4 @@
|
||||
|
||||
## filter mod
|
||||
# filter mod
|
||||
|
||||
This mod adds a simple chat filter. There is no default word list,
|
||||
and adding words to the filter list is done through the `/filter`
|
||||
@ -14,7 +13,26 @@ muted for 1 minute. After that, their `shout` privilege is restored.
|
||||
If they leave, their `shout` privilege is still restored, but only after
|
||||
the time expires, not before.
|
||||
|
||||
## Bugs
|
||||
## API
|
||||
|
||||
- the `shout` priv is permanently lost if the server shuts down while
|
||||
a player is muted.
|
||||
### Callbacks
|
||||
|
||||
* filter.register_on_violation(func(name, message, violations))
|
||||
* Violations is the value of the player's violation counter - which is
|
||||
incremented on a violation, and halved every 10 minutes.
|
||||
* Return true if you've handled the violation. No more callbacks will be
|
||||
executation, and the default behaviour (warning/mute/kick) on violation
|
||||
will be skipped.
|
||||
|
||||
### Methods
|
||||
|
||||
* filter.import_file(path)
|
||||
* Input bad words from a file (`path`) where each line is a new word.
|
||||
* filter.check_message(name, message)
|
||||
* Checks message for violation. Returns true if okay, false if bad.
|
||||
If it returns false, you should cancel the sending of the message and
|
||||
call filter.on_violation()
|
||||
* filter.on_violation(name, message)
|
||||
* Increments violation count, runs callbacks, and punishes the players.
|
||||
* filter.mute(name, duration)
|
||||
* filter.show_warning_formspec(name)
|
||||
|
Loading…
Reference in New Issue
Block a user