122 lines
4.1 KiB
Lua
122 lines
4.1 KiB
Lua
-- mod governor by mckaygerhard, geoip specific code
|
|
-- Copyright 2023
|
|
|
|
----------------------------------------------------------------------------
|
|
-- this program can be used free but cannot be used commertially or
|
|
-- modified for, licenced CC-BY-SA-NC 4.0 unless explicit permission
|
|
|
|
-- This program is distributed in the hope that it will be useful,
|
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
|
|
--[[ init of call back on join of a player, ]]
|
|
minetest.register_on_joinplayer(function(player)
|
|
|
|
local msgsys = "#anticheat cannot get player info from minetest api.."
|
|
|
|
if not player then return end
|
|
if not gapi.is_player(player) then return end
|
|
if not minetest.get_player_ip then minetest.log("error", msgsys) end
|
|
|
|
local ip
|
|
local pos
|
|
local name
|
|
local info
|
|
|
|
pos = player:getpos()
|
|
name = player:get_player_name()
|
|
ip = minetest.get_player_ip(name)
|
|
info = minetest.get_player_information(name)
|
|
|
|
-- natural checks for player object apar of player:is_player
|
|
|
|
if not ip then
|
|
minetest.log("error", msgsys.." (ip) for "..name)
|
|
end
|
|
|
|
if not name then
|
|
minetest.log("error", msgsys.." (name) seems fake player")
|
|
end
|
|
|
|
if not info then
|
|
minetest.log("error", msgsys.." (info), processing limited")
|
|
end
|
|
|
|
-- process for ip information from player network
|
|
|
|
if governing.checkapikey ~= "" then
|
|
governing.checkip(ip, function(data) -- log, but TODO: record in storage log file
|
|
local txt = gapi.format_result_checkip(data)
|
|
if txt then minetest.log("warning", "[goberning/geoip] joined player, " .. name .. ":" .. ip .. "," .. txt)
|
|
else minetest.log("error", "[goberning/geoip] joined player, " .. name .. ":" .. ip .. ", seems fails")
|
|
end
|
|
governing.joinplayer_callback(name, data) -- execute callback
|
|
end)
|
|
else
|
|
if not governing.modgeoip then
|
|
governing.lookup(ip, function(data) -- log, but TODO: record in storage log file
|
|
local txt = gapi.format_result_checkip(data)
|
|
if txt then minetest.log("warning", "[goberning/geoip] joined player, " .. name .. ":" .. ip .. "," .. txt)
|
|
else minetest.log("error", "[goberning/geoip] joined player, " .. name .. ":" .. ip .. ", seems fails")
|
|
end
|
|
governing.joinplayer_callback(name, data) -- execute callback
|
|
end)
|
|
end
|
|
end
|
|
|
|
-- process for client and players information for cheated program
|
|
|
|
if not info then
|
|
if not gapi.is_player(player) then
|
|
name = name .. " is a bot confirmed, also"
|
|
end
|
|
msgsys = "[governing] can't retrieve info, player '" .. name .. "' disappeared or seems craker"
|
|
minetest.after(0.1, function()
|
|
for namemd,_ in pairs(cheat.moderators) do
|
|
minetest.chat_send_player(namemd,msgsys);
|
|
end
|
|
end)
|
|
minetest.log("warning", msgsys)
|
|
else
|
|
info = minetest.get_player_information(name)
|
|
msgsys = "[governing] player '" .. name .. "' joined" ..
|
|
" from:" .. info.address ..
|
|
" protocol_version:" .. (info.protocol_version or "20?") ..
|
|
" formspec_version:" .. (info.formspec_version or "old") ..
|
|
" lang_code:" .. (info.lang_code or "<unknown>") ..
|
|
" serialization_version:" .. (info.serialization_version or "20?") ..
|
|
" version_string:" .. (info.version_string or "not supported")
|
|
minetest.log("action", msgsys)
|
|
|
|
end
|
|
|
|
if info.version_string then
|
|
msgsys = "#anticheat detected a cheater client does not provide info, ".. tostring(ip).." named "..name
|
|
local dfv = gapi.isdf(info.version_string)
|
|
if dfv then
|
|
minetest.after(3, function()
|
|
minetest.chat_send_player(name, msgiplevelone);
|
|
if minetest.settings:get_bool("beowulf.dfdetect.enable_kick", false) then
|
|
minetest.kick_player(name, "Are you a cheater stupid user? change your cracked client for play")
|
|
end
|
|
for namemd,_ in pairs(cheat.moderators) do
|
|
minetest.chat_send_player(namemd,msgsys); -- advertise moderators
|
|
end
|
|
end)
|
|
minetest.log(msgsys)
|
|
end
|
|
else
|
|
for namemd,_ in pairs(cheat.moderators) do
|
|
minetest.chat_send_player(namemd,msgsys); -- advertise moderators
|
|
end
|
|
minetest.log(msgsys)
|
|
end
|
|
|
|
end)
|
|
--[[ end of call back on join of a player, ]]
|
|
|
|
|