From f9de9038d2d9b795e6d50fd599e98d13859704ee Mon Sep 17 00:00:00 2001 From: Lejo1 Date: Sun, 3 Feb 2019 11:52:33 +0100 Subject: [PATCH] Replace all my mods with submodules --- .gitmodules | 19 ++ README.md | 2 +- mods/getip | 1 + mods/getip/.gitignore | 41 ---- mods/getip/README.md | 4 - mods/getip/init.lua | 36 --- mods/playtime | 1 + mods/playtime/.gitignore | 41 ---- mods/playtime/LICENSE | 1 - mods/playtime/README.md | 7 - mods/playtime/init.lua | 43 ---- mods/reportlist | 1 + mods/reportlist/.gitignore | 41 ---- mods/reportlist/LICENSE | 1 - mods/reportlist/README.md | 18 -- mods/reportlist/depends.txt | 1 - mods/reportlist/init.lua | 174 -------------- mods/serverlist_score | 1 + mods/vps_blocker | 1 + mods/vps_blocker/LICENSE | 1 - mods/vps_blocker/README.md | 29 --- mods/vps_blocker/init.lua | 102 -------- mods/xban2 | 1 + mods/xban2/.luacheckrc | 7 - mods/xban2/README.md | 106 --------- mods/xban2/bower.json | 15 -- mods/xban2/dbimport.lua | 38 --- mods/xban2/doc/API.md | 32 --- mods/xban2/doc/dbformat.txt | 45 ---- mods/xban2/gui.lua | 194 --------------- mods/xban2/importers/minetest.lua | 29 --- mods/xban2/importers/v1.lua | 33 --- mods/xban2/importers/v2.lua | 35 --- mods/xban2/init.lua | 384 ------------------------------ mods/xban2/mod.conf | 1 - mods/xban2/serialize.lua | 31 --- 36 files changed, 26 insertions(+), 1491 deletions(-) create mode 100644 .gitmodules create mode 160000 mods/getip delete mode 100644 mods/getip/.gitignore delete mode 100644 mods/getip/README.md delete mode 100644 mods/getip/init.lua create mode 160000 mods/playtime delete mode 100644 mods/playtime/.gitignore delete mode 100644 mods/playtime/LICENSE delete mode 100644 mods/playtime/README.md delete mode 100644 mods/playtime/init.lua create mode 160000 mods/reportlist delete mode 100644 mods/reportlist/.gitignore delete mode 100644 mods/reportlist/LICENSE delete mode 100644 mods/reportlist/README.md delete mode 100644 mods/reportlist/depends.txt delete mode 100644 mods/reportlist/init.lua create mode 160000 mods/serverlist_score create mode 160000 mods/vps_blocker delete mode 100644 mods/vps_blocker/LICENSE delete mode 100644 mods/vps_blocker/README.md delete mode 100644 mods/vps_blocker/init.lua create mode 160000 mods/xban2 delete mode 100644 mods/xban2/.luacheckrc delete mode 100644 mods/xban2/README.md delete mode 100644 mods/xban2/bower.json delete mode 100644 mods/xban2/dbimport.lua delete mode 100644 mods/xban2/doc/API.md delete mode 100644 mods/xban2/doc/dbformat.txt delete mode 100644 mods/xban2/gui.lua delete mode 100644 mods/xban2/importers/minetest.lua delete mode 100644 mods/xban2/importers/v1.lua delete mode 100644 mods/xban2/importers/v2.lua delete mode 100644 mods/xban2/init.lua delete mode 100644 mods/xban2/mod.conf delete mode 100644 mods/xban2/serialize.lua diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..040a0ee --- /dev/null +++ b/.gitmodules @@ -0,0 +1,19 @@ +[submodule "mods/serverlist_score"] + path = mods/serverlist_score + url = https://github.com/Lejo1/serverlist_score +[submodule "mods/getip"] + path = mods/getip + url = https://github.com/Lejo1/getip +[submodule "mods/vps_blocker"] + path = mods/vps_blocker + url = https://github.com/Lejo1/vps_blocker +[submodule "mods/playtime"] + path = mods/playtime + url = https://github.com/Lejo1/playtime +[submodule "mods/reportlist"] + path = mods/reportlist + url = https://github.com/Lejo1/reportlist +[submodule "mods/xban2"] + path = mods/xban2 + url = https://github.com/Lejo1/xban2 + branch = report diff --git a/README.md b/README.md index 83a0725..9a2ce73 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ This Repository is not for using on your own Server! Installing ---------- -1. `git clone https://github.com/Lejo1/subgames.git` +1. `git clone --recursive https://github.com/Lejo1/subgames.git` License ------- diff --git a/mods/getip b/mods/getip new file mode 160000 index 0000000..cd99dfb --- /dev/null +++ b/mods/getip @@ -0,0 +1 @@ +Subproject commit cd99dfb935b60591f33ccb042d1285e266fbac5a diff --git a/mods/getip/.gitignore b/mods/getip/.gitignore deleted file mode 100644 index 6fd0a37..0000000 --- a/mods/getip/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -# Compiled Lua sources -luac.out - -# luarocks build files -*.src.rock -*.zip -*.tar.gz - -# Object files -*.o -*.os -*.ko -*.obj -*.elf - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo -*.def -*.exp - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - diff --git a/mods/getip/README.md b/mods/getip/README.md deleted file mode 100644 index 8696d37..0000000 --- a/mods/getip/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Getip -Add a way to get ip's in Minetest. -By just typing /getip . -You can also can get ips from not connected players, if they were online since the last server restart. diff --git a/mods/getip/init.lua b/mods/getip/init.lua deleted file mode 100644 index af3cc29..0000000 --- a/mods/getip/init.lua +++ /dev/null @@ -1,36 +0,0 @@ ---[[ Getip - Minetest Mod from Lejo - Use it to get always the last ip of a player, if he isn't online. -]] - -getip = {} - -local ip = {} - ---Add the Privileg. -minetest.register_privilege("ip", "Player can get ip's from other players") - ---create new data for a player if it doesn't exist. -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - local players_ip = minetest.get_player_ip(name) - ip[name] = players_ip -end) - ---Creat the Command /getip. -minetest.register_chatcommand("getip", { - params = "", - description = "Show other ips.", - privs = {ip=true}, - func = function(name, player) - if not minetest.get_player_by_name(player) then - minetest.chat_send_player(name, "The Player is not online") - if ip[player] then - minetest.chat_send_player(name, "His last ip was: \""..ip[player].."\".") - else minetest.chat_send_player(name, "There is no ip saved for this player.") - end - else - minetest.chat_send_player(name, "The IP is \""..minetest.get_player_ip(player).."\".") - end - end, -}) diff --git a/mods/playtime b/mods/playtime new file mode 160000 index 0000000..0ec16d0 --- /dev/null +++ b/mods/playtime @@ -0,0 +1 @@ +Subproject commit 0ec16d00a6e404417ea99a080b4c3b95c1c5ddb6 diff --git a/mods/playtime/.gitignore b/mods/playtime/.gitignore deleted file mode 100644 index 6fd0a37..0000000 --- a/mods/playtime/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -# Compiled Lua sources -luac.out - -# luarocks build files -*.src.rock -*.zip -*.tar.gz - -# Object files -*.o -*.os -*.ko -*.obj -*.elf - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo -*.def -*.exp - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - diff --git a/mods/playtime/LICENSE b/mods/playtime/LICENSE deleted file mode 100644 index d30ca65..0000000 --- a/mods/playtime/LICENSE +++ /dev/null @@ -1 +0,0 @@ -CC0 diff --git a/mods/playtime/README.md b/mods/playtime/README.md deleted file mode 100644 index 9a10480..0000000 --- a/mods/playtime/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Playtime - -This mod the function: playtime.get_current_playtime(name) / playtime.get_total_playtime(name) - -License: CC0 - -Created by [Lejo](https://github.com/Lejo1) diff --git a/mods/playtime/init.lua b/mods/playtime/init.lua deleted file mode 100644 index 714193e..0000000 --- a/mods/playtime/init.lua +++ /dev/null @@ -1,43 +0,0 @@ -playtime = {} - -local storage = minetest.get_mod_storage() - -function playtime.get_current_playtime(name) - return os.time() - storage:get_int(name.."-join") -end - --- Function to get playtime -function playtime.get_total_playtime(name) - return storage:get_int(name) + playtime.get_current_playtime(name) -end - -minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - storage:set_int(name, storage:get_int(name) + (os.time() - storage:get_int(name.."-join"))) -end) - -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - storage:set_int(name.."-join", os.time()) -end) - -local function SecondsToClock(seconds) - local seconds = tonumber(seconds) - - if seconds <= 0 then - return "00:00:00"; - else - hours = string.format("%02.f", math.floor(seconds/3600)); - mins = string.format("%02.f", math.floor(seconds/60 - (hours*60))); - secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins *60)); - return hours..":"..mins..":"..secs - end -end - -minetest.register_chatcommand("playtime", { - params = "", - description = "Use it to get your own playtime!", - func = function(name) - minetest.chat_send_player(name, "Total: "..SecondsToClock(playtime.get_total_playtime(name)).." Current: "..SecondsToClock(playtime.get_current_playtime(name))) - end, -}) diff --git a/mods/reportlist b/mods/reportlist new file mode 160000 index 0000000..7d11ba6 --- /dev/null +++ b/mods/reportlist @@ -0,0 +1 @@ +Subproject commit 7d11ba608bf0512e59b0c72e51ba9db7bc014d38 diff --git a/mods/reportlist/.gitignore b/mods/reportlist/.gitignore deleted file mode 100644 index 6fd0a37..0000000 --- a/mods/reportlist/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -# Compiled Lua sources -luac.out - -# luarocks build files -*.src.rock -*.zip -*.tar.gz - -# Object files -*.o -*.os -*.ko -*.obj -*.elf - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo -*.def -*.exp - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - diff --git a/mods/reportlist/LICENSE b/mods/reportlist/LICENSE deleted file mode 100644 index d30ca65..0000000 --- a/mods/reportlist/LICENSE +++ /dev/null @@ -1 +0,0 @@ -CC0 diff --git a/mods/reportlist/README.md b/mods/reportlist/README.md deleted file mode 100644 index 3791257..0000000 --- a/mods/reportlist/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Reportlist - -This mod add a report list of players to minetest. - -A Player can only report an other player ones! - -Players can be reported by just typing /report - -You can show the report count using: /report_get - -And set it with: /report_set - -Depends: xban2 -[Here](https://github.com/Lejo1/xban2/tree/report) is a xban2 fork with report count in gui. - -License: CC0 - -Created by [Lejo](https://github.com/Lejo1) diff --git a/mods/reportlist/depends.txt b/mods/reportlist/depends.txt deleted file mode 100644 index 15d2bbf..0000000 --- a/mods/reportlist/depends.txt +++ /dev/null @@ -1 +0,0 @@ -xban2 diff --git a/mods/reportlist/init.lua b/mods/reportlist/init.lua deleted file mode 100644 index b5649a2..0000000 --- a/mods/reportlist/init.lua +++ /dev/null @@ -1,174 +0,0 @@ ---[[This is a mod that contains a player register with the count of the reports. - Mod created by Lejo!]] -report = { - report_on_cheat = { - enable = true, - only_one_report_per_cheat = false, - report_count_on_cheat = 1, - player_message_on_report_cheat = true, - global_chat_message_on_report_cheat = false, - }, - autoban = false, - autotempban = false, - ban_notification_in_chat = false, - time_played_to_report = 3600, -- in seconds Only needed when useing playtime -} -reportfunc = {} - -function reportfunc.set_count(name, amount) - local e = xban.find_entry(name) - e.reported = amount - reportfunc.check_ban(name) -end - -function reportfunc.get_count(name) - local e = xban.find_entry(name) - if e and e.reporter then - return e.reported - else return 0 - end -end - -function reportfunc.is_reporter(name, reportername) - local reporterentry = xban.find_entry(reportername) - local e = xban.find_entry(name) - if e.reporter and reporterentry.names then - for testi,value in ipairs(e.reporter) do - if reporterentry.names[value] then - return true - end - end - end -end - -function reportfunc.add_reporter(name, reportername) - local reportertable = xban.find_entry(name) - if not table.contains(reportertable.reporter, reportername) then - table.insert(reportertable.reporter, reportername) - end -end - ---Create player acout if there is no -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - local e = xban.find_entry(name) - if e and not e.reported then - e.reported = 0 - e.reporter = {} - end - reportfunc.check_ban(name) -end) - --- Auto ban players -function reportfunc.check_ban(name) - if reportfunc.get_count(name) >= 20 and report.autoban == true then - xban.ban_player(name, "Reportmod", nil, "You have been reported 20 times or cheated to much! Make sure you are useing an orginal minetest client.") - minetest.log("action", "Player "..name.." has been baned after he got reported 20 times.") - if report.ban_notification_in_chat == true then - minetest.chat_send_all("Player "..name.." has been baned, because he has been reported 20 times or cheated to much!") - end - elseif reportfunc.get_count(name) >= 10 and report.autotempban == true and not xban.get_record(name) then - xban.ban_player(name, "Reportmod", os.time()+259200, "You have been reported 10 times or cheated to much!") - minetest.log("action", "Player "..name.." has been baned for three days after he got reported 10 times.") - if report.ban_notification_in_chat == true then - minetest.chat_send_all("Player "..name.." has been baned for three days, because he has been reported 10 times or cheated to much!") - end - end -end - --- May report players on cheat -if report.report_on_cheat["enable"] == true then - minetest.register_on_cheat(function(player, cheat) - local name = player:get_player_name() - if cheat.type == "dug_unbreakable" or cheat.type == "dug_too_fast" then - local reporthim = true - if report.report_on_cheat["only_one_report_per_cheat"] == true then - if reportfunc.is_reporter(name, cheat.type) == true then - reporthim = false - else reportfunc.add_reporter(name, cheat.type) - end - end - if reporthim == true then - local count = report.report_on_cheat["report_count_on_cheat"] - reportfunc.set_count(name, reportfunc.get_count(name)+count) - if report.report_on_cheat["player_message_on_report_cheat"] == true then - minetest.chat_send_player(name, "Are you hacking/cheating? Stop it!") - end - if report.report_on_cheat["global_chat_message_on_report_cheat"] == true then - minetest.chat_send_all(name.." is maybe hacking: "..cheat.type.." ! Have a look at him.") - end - minetest.log("action", "Player "..name.." has been reported automaticly by cheating with: "..cheat.type) - end - end - end) -end - --- Add the report Command -minetest.register_chatcommand("report", { - privs = {shout=true}, - params = "", - description = "Use it to report players, if they are hacking, cheating...", - func = function(name, param) - local reportcount = 1 - if minetest.get_player_privs(name).ban then - reportcount = 10 - elseif minetest.get_player_privs(name).kick then - reportcount = 5 - end - local ename = xban.find_entry(name) - local eparam = xban.find_entry(param) - if ename and eparam then - if name ~= param and ename ~= eparam then - if minetest.get_player_by_name(param) then - if minetest.get_player_information(name).connection_uptime >= 480 then - if not playtime or playtime.get_total_playtime(name) >= report.time_played_to_report then - if reportfunc.is_reporter(param, name) ~= true then - reportfunc.set_count(param, reportfunc.get_count(param)+reportcount) - reportfunc.add_reporter(param, name) - minetest.chat_send_player(name, param.." has been reported!") - minetest.log("action", "Player "..param.." has been reported by "..name) - else minetest.chat_send_player(name, "You have already have reported "..param.." or somebody out of his ip-Group!") - end - else minetest.chat_send_player(name, "You have to play longer to report a player!") - end - else minetest.chat_send_player(name, "You have to play longer to report a player!") - end - else minetest.chat_send_player(name, "The Player "..param.." is not online!") - end - else minetest.chat_send_player(name, "You can't report yourself or somebody out of you ip-Group.") - end - else minetest.chat_send_player(name, "The Player "..param.." don't exist.") - end - end, -}) - --- Add a chat command to get the report counter -minetest.register_chatcommand("report_get", { - privs = {ban=true}, - params = "", - description = "Use it to get the report count of a player.", - func = function(name, param) - local count = reportfunc.get_count(param) - if count ~= "" then - minetest.chat_send_player(name, "The Player "..param.." has a reportcount of "..count.."!") - else minetest.chat_send_player(name, "The Player "..param.." don't exist.") - end - end, -}) - --- Add a chat command to set the report counter -minetest.register_chatcommand("report_set", { - privs = {ban=true}, - params = " ", - description = "Use it to set the report count of a player.", - func = function(name, param) - local pname, amount1 = param:match("(%S+)%s+(.+)") - local amount = tonumber(amount1) - local count = reportfunc.get_count(pname) - if count ~= "" and tonumber(amount) then - reportfunc.set_count(pname, amount) - minetest.chat_send_player(name, "The reportcount of the Player "..pname.." has been setted!") - else minetest.chat_send_player(name, "The Player don't exist.") - end - end, -}) diff --git a/mods/serverlist_score b/mods/serverlist_score new file mode 160000 index 0000000..6544d91 --- /dev/null +++ b/mods/serverlist_score @@ -0,0 +1 @@ +Subproject commit 6544d91baab2d9b9bd095ad3f7d658917f67e793 diff --git a/mods/vps_blocker b/mods/vps_blocker new file mode 160000 index 0000000..19c076a --- /dev/null +++ b/mods/vps_blocker @@ -0,0 +1 @@ +Subproject commit 19c076aff02d33cce578eb330814a2fce178a72e diff --git a/mods/vps_blocker/LICENSE b/mods/vps_blocker/LICENSE deleted file mode 100644 index d30ca65..0000000 --- a/mods/vps_blocker/LICENSE +++ /dev/null @@ -1 +0,0 @@ -CC0 diff --git a/mods/vps_blocker/README.md b/mods/vps_blocker/README.md deleted file mode 100644 index 430d768..0000000 --- a/mods/vps_blocker/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Vps Blocker - -This mod checks the ips of the player for vpns, proxys, or other hosting services. - -It gets the information from nastyhosts.com and iphub.info - -Installing ----------- - -First you need to add vps_blocker to secure.http_mods to allow https requests. - -If you want to use iphub.info you need to register there and paste your API key in the minetest config to iphub_key = 123 - -Set the kick message: - -vps_kick_message = "You are using a proxy, vpn or other hosting services, please disable them to play on this server." - -Commands --------- - -Use /vps_wl to allow people using vps. - -License -------- - -The idea for the mod is taken from https://github.com/red-001/block_vps but it's a complete redo of it. - -Created by [Lejo](https://github.com/Lejo1) -License: CC0 diff --git a/mods/vps_blocker/init.lua b/mods/vps_blocker/init.lua deleted file mode 100644 index b5e4979..0000000 --- a/mods/vps_blocker/init.lua +++ /dev/null @@ -1,102 +0,0 @@ --- Declear some default tables - -local http = minetest.request_http_api() -assert(http ~= nil, "You need to add vps_blocker to secure.http_mods") - -local kick_message = minetest.settings:get("vps_kick_message") or "You are using a proxy, vpn or other hosting services, please disable them to play on this server." -local iphub_key = minetest.settings:get("iphub_key") - -vps_blocker = {} -local storage = minetest.get_mod_storage() ---[[ -modstorage of ip == 0 not checked yet - == 1 checked allow - == 2 checked deny - == 3 checking -]] - --- Add the main ipcheckup function -function vps_blocker.check_ip(name, ip) - -- First nastyhosts request only if iphub is not used - if not iphub_key then - storage:set_int(ip, 3) - local req = { - ["url"] = "http://v1.nastyhosts.com/"..ip - } - local callback = function(result) - local data = minetest.parse_json(result.data) - if result.completed and result.succeeded and data and data.status == 200 then -- Correct request - if data.suggestion == "deny" then - storage:set_int(ip, 2) - elseif storage:get_int(ip) ~= 2 then - storage:set_int(ip, 1) - end - vps_blocker.handle_player(name, ip) - else minetest.log("error", "vps_blocker: Incorrect request!") - end - end - http.fetch(req, callback) - - else -- Second may iphub request - local ireq = { - ["url"] = "http://v2.api.iphub.info/ip/"..ip, - ["extra_headers"] = {"X-Key: "..iphub_key} - } - local icallback = function(result) - local data = minetest.parse_json(result.data) - if result.completed and result.succeeded and data and data.block then -- Correct request - if data.block == 1 then - storage:set_int(ip, 2) - elseif storage:get_int(ip) ~= 2 then - storage:set_int(ip, 1) - end - vps_blocker.handle_player(name, ip) - else minetest.log("error", "vps_blocker: Incorrect request!") - end - end - http.fetch(ireq, icallback) - end -end - --- Add a function which handels what do do(check, kick, nth...) -function vps_blocker.handle_player(name, ip) - if not name or not ip or storage:get_int(ip) == 1 or storage:get_int(name) == 1 then - return - end - if storage:get_int(ip) == 0 then - vps_blocker.check_ip(name, ip) - end - if storage:get_int(ip) == 2 then - local player = minetest.get_player_by_name(name) - if player then - minetest.kick_player(name, kick_message) - else return kick_message - end - end -end - --- Do handle_player on prejoin and norma join -minetest.register_on_prejoinplayer(vps_blocker.handle_player) -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - local ip = minetest.get_player_ip(name) - vps_blocker.handle_player(name, ip) -end) - --- Add a command to whitelist players -minetest.register_chatcommand("vps_wl", { - description = "Allow a player to use vps services.", - params = " ", - privs = {server=true}, - func = function(name, params) - local p = string.split(params, " ") - if p[1] == "add" then - storage:set_int(p[2], 1) - return true, "Added "..p[2].." to the whitelist." - elseif p[1] == "remove" then - storage:set_int(p[2], 0) - return true, "Removed "..p[2].." from the whitelist." - else return false, "Invalid Input" - end - end -}) diff --git a/mods/xban2 b/mods/xban2 new file mode 160000 index 0000000..0187069 --- /dev/null +++ b/mods/xban2 @@ -0,0 +1 @@ +Subproject commit 01870693084f0449ec6f12db9cdc21734fcedc7d diff --git a/mods/xban2/.luacheckrc b/mods/xban2/.luacheckrc deleted file mode 100644 index 8ef1636..0000000 --- a/mods/xban2/.luacheckrc +++ /dev/null @@ -1,7 +0,0 @@ - -unused_args = false -allow_defined_top = true - -read_globals = { - "minetest", -} diff --git a/mods/xban2/README.md b/mods/xban2/README.md deleted file mode 100644 index 90eed0d..0000000 --- a/mods/xban2/README.md +++ /dev/null @@ -1,106 +0,0 @@ - -# Extended Ban Mod for Minetest - -This mod attempts to be an improvement to Minetest's ban system. - -* It supports normal bans and temporary bans (from 60 seconds up to the end of - time, with 1 second granularity). -* Records and joins all accounts using the same IP address and several IP - addresses using the same name into a single record, and can ban/unban them as - a single user. -* Can ban offline players if you know their IP or username. -* Holds a record of bans for each user, so moderators and administrators can - consult it to know if a player is a repeat offender. -* Does not modify the default ban database in any way (`ipban.txt'). -* Has an API to ban and check the ban database to allows other mods to manage - users (for example, anticheat mods). - -## Chat commands - -The mod provides the following chat commands. All commands require the `ban` -privilege. - -### `xban` - -Bans a player permanently. - -**Usage:** `/xban ` - -**Example:** `/xban 127.0.0.1 Some reason.` - -### `xtempban` - -Bans a player temporarily. - -**Usage:** `/xtempban