From 1c7f9bf23a4d02993a2d7472dd6b401d8d82bda8 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Fri, 2 Feb 2018 19:08:04 +0000 Subject: [PATCH] Add warning formspec on first violation --- .luacheckrc | 2 +- LICENSE | 3 ++- depends.txt | 1 + init.lua | 41 +++++++++++++++++++++++++++++++----- readme.md | 1 - textures/filter_warning.png | Bin 0 -> 15021 bytes 6 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 textures/filter_warning.png diff --git a/.luacheckrc b/.luacheckrc index 15eed66..3c8acff 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -10,6 +10,6 @@ read_globals = { "PseudoRandom", "ItemStack", "intllib", "default", + "rules", table = { fields = { "copy", "getn" } } } - diff --git a/LICENSE b/LICENSE index cabf76e..d45568b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ MIT License -Copyright (c) 2017 Auke Kok +Copyright (c) 2017-8 Auke Kok +Copyright (c) 2018 rubenwardy Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/depends.txt b/depends.txt index e69de29..5f590f8 100644 --- a/depends.txt +++ b/depends.txt @@ -0,0 +1 @@ +rules? diff --git a/init.lua b/init.lua index ae9933a..8c29e1a 100644 --- a/init.lua +++ b/init.lua @@ -1,7 +1,8 @@ --[[ - Copyright 2017 Auke Kok + Copyright 2017-8 Auke Kok + Copyright 2018 rubenwardy Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -86,17 +87,39 @@ function filter.mute(name, duration) end) end +function filter.show_warning_formspec(name) + local formspec = "size[7,3]bgcolor[#080808BB;true]" .. default.gui_bg .. default.gui_bg_img .. [[ + image[0,0;2,2;filter_warning.png] + label[2.3,0.5;Please watch your language!] + ]] + + if minetest.global_exists("rules") and rules.show then + formspec = formspec .. [[ + button[0.5,2.1;3,1;rules;Show Rules] + button_exit[3.5,2.1;3,1;close;Okay] + ]] + else + formspec = formspec .. [[ + button_exit[2,2.1;3,1;close;Okay] + ]] + end + minetest.show_formspec(name, "filter:warning", formspec) +end + function filter.on_violation(name, message) violations[name] = (violations[name] or 0) + 1 local resolution - if violations[name] >= 3 then - resolution = "kicked" - minetest.kick_player(name, "Please mind your language!") - else + 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 minetest.log("action", "VIOLATION (" .. resolution .. "): <" .. name .. "> ".. message) @@ -153,4 +176,12 @@ minetest.register_chatcommand("filter", { end, }) +if minetest.global_exists("rules") and rules.show then + minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "filter:warning" and fields.rules then + rules.show(player) + end + end) +end + filter.init() diff --git a/readme.md b/readme.md index 8193ce3..3b2c979 100644 --- a/readme.md +++ b/readme.md @@ -18,4 +18,3 @@ the time expires, not before. - the `shout` priv is permanently lost if the server shuts down while a player is muted. - diff --git a/textures/filter_warning.png b/textures/filter_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..da4ea7b66c2cd9ab15638eb892e7db2a7dc74a3c GIT binary patch literal 15021 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 literal 0 HcmV?d00001