2018-01-13 08:59:26 -08:00
-- OLD PLAYER : keep only serious players data on server
--(c) 2015-2016 rnd
2018-01-13 09:52:24 -08:00
--
-- modified by SaKeL for Survival X server
-- - Linux support
-- - Protector (redo) support (@todo)
2018-01-13 08:59:26 -08:00
oldplayer = { }
-- SETTINGS
2018-01-13 09:52:24 -08:00
oldplayer.requirement = { " default:stick 1 " , " default:steel_ingot 1 " }
2018-01-13 21:15:36 -08:00
oldplayer.welcome = " *** IMPORTANT *** Hi new player, please have at least 1 STICK and 1 STEEL INGOT in your inventory when leaving the game to register as serious player. If not, your player data will be deleted! "
2018-01-13 08:59:26 -08:00
2018-01-13 09:52:24 -08:00
-- CORE
oldplayer.players = { }
local worldpath = minetest.get_worldpath ( )
2018-01-13 08:59:26 -08:00
2018-01-13 09:52:24 -08:00
minetest.register_on_joinplayer ( function ( player )
local name = player : get_player_name ( )
if name == nil then return end
2018-01-13 08:59:26 -08:00
-- read player inventory data
2018-01-13 09:52:24 -08:00
local inv = player : get_inventory ( )
local isoldplayer = inv : get_stack ( " oldplayer " , 1 ) : get_count ( )
inv : set_size ( " oldplayer " , 2 )
local ip = minetest.get_player_ip ( name )
if not ip then return end
2018-01-13 08:59:26 -08:00
inv : set_stack ( " oldplayer " , 2 , ItemStack ( " IP " .. ip ) ) -- string.gsub(ip,".","_")));
if isoldplayer > 0 then
oldplayer.players [ name ] = 1
2018-01-13 21:45:21 -08:00
minetest.chat_send_player ( name , " <SERVER> Welcome back, have fun! " )
2018-01-13 09:52:24 -08:00
2018-01-13 08:59:26 -08:00
else
2018-01-13 09:52:24 -08:00
local privs = minetest.get_player_privs ( name )
2018-01-13 08:59:26 -08:00
if privs.kick then
2018-01-13 09:52:24 -08:00
inv : set_stack ( " oldplayer " , 1 , ItemStack ( " oldplayer " ) )
2018-01-13 21:45:21 -08:00
minetest.chat_send_player ( name , " <SERVER> Welcome moderator. Will remember you as an old player and will not remove your player data. Have fun! " )
2018-01-13 08:59:26 -08:00
oldplayer.players [ name ] = 1
else
oldplayer.players [ name ] = 0
2018-01-13 22:39:55 -08:00
local form = " size [6,2] textarea[0,0;6.6,3.5;help;WELCOME TO SURVIVAL X SERVER; " .. oldplayer.welcome .. " ] "
2018-01-13 08:59:26 -08:00
minetest.show_formspec ( name , " oldplayer:welcome " , form )
2018-01-13 09:52:24 -08:00
-- minetest.chat_send_player(name, oldplayer.welcome)
2018-01-13 08:59:26 -08:00
end
end
end )
minetest.register_on_leaveplayer ( function ( player , timed_out )
2018-01-13 09:52:24 -08:00
local name = player : get_player_name ( )
if name == nil then return end
2018-01-13 08:59:26 -08:00
if oldplayer.players [ name ] == 1 then return end -- already old, do nothing
2018-01-13 09:52:24 -08:00
local delete = false -- should we delete player?
2018-01-13 08:59:26 -08:00
-- read player inventory data
2018-01-13 09:52:24 -08:00
local inv = player : get_inventory ( )
2018-01-13 08:59:26 -08:00
-- does player have all the required items in inventory?
for _ , item in pairs ( oldplayer.requirement ) do
if not inv : contains_item ( " main " , item ) then
delete = true
end
end
if not delete then -- set up oldplayer inventory so we know player is old next time
2018-01-13 09:52:24 -08:00
inv : set_size ( " oldplayer " , 2 )
inv : set_stack ( " oldplayer " , 1 , ItemStack ( " oldplayer " ) )
2018-01-13 08:59:26 -08:00
else -- delete player profile
2018-01-13 09:52:24 -08:00
local filename = worldpath .. " /players/ " .. name
2018-01-13 08:59:26 -08:00
-- PROBLEM: deleting doesnt always work? seems minetest itself is saving stuff.
-- so we wait a little and then delete
2018-01-13 09:52:24 -08:00
minetest.after ( 10 , function ( )
2018-01-13 21:14:56 -08:00
minetest.log ( " action " , " [oldplayer] removing player filename " .. filename )
2018-01-13 09:52:24 -08:00
2018-01-13 08:59:26 -08:00
local err , msg = os.remove ( filename )
2018-01-13 09:52:24 -08:00
if err == nil then
2018-01-13 21:14:56 -08:00
minetest.log ( " warning " , " [oldplayer] Error while removing player data " .. filename .. " error message: " .. msg )
2018-01-13 08:59:26 -08:00
end
-- TO DO: how to remove players from auth.txt easily without editing file manually like below
2018-01-13 09:52:24 -08:00
end )
2018-01-13 08:59:26 -08:00
end
end
)
-- delete file if not old player
local function remove_non_old_player_file ( name )
2018-01-13 09:52:24 -08:00
local filename = worldpath .. " /players/ " .. name
local f = io.open ( filename , " r " )
local s = f : read ( " *all " )
f : close ( )
if string.find ( s , " Item oldplayer " ) then
return false
else
os.remove ( filename )
return true
end
2018-01-13 08:59:26 -08:00
end
-- deletes data with no corresponding playerfiles from auth.txt and creates auth_new.txt
local function player_file_exists ( name )
2018-01-13 09:52:24 -08:00
local f = io.open ( worldpath .. " /players/ " .. name , " r " )
if not f then
return false
else
io.close ( f )
return true
end
2018-01-13 08:59:26 -08:00
end
local function remove_missing_players_from_auth ( )
2018-01-13 09:52:24 -08:00
local playerfilelist = minetest.get_dir_list ( worldpath .. " /players " , false )
local f = io.open ( worldpath .. " /auth.txt " , " r " )
2018-01-13 08:59:26 -08:00
if not f then return end
2018-01-13 09:52:24 -08:00
local s = f : read ( " *a " )
f : close ( )
local p1 , p2
f = io.open ( worldpath .. " /auth_new.txt " , " w " )
2018-01-13 08:59:26 -08:00
if not f then return end
2018-01-13 09:52:24 -08:00
local playerlist = { }
for _ , name in ipairs ( playerfilelist ) do
playerlist [ name ] = true
2018-01-13 08:59:26 -08:00
end
2018-01-13 09:52:24 -08:00
local i = 0
local j = 0
local k = 0
local name
local count = 0
2018-01-13 08:59:26 -08:00
-- parse through auth and remove missing players data
while j do
2018-01-13 09:52:24 -08:00
j = string.find ( s , " : " , i )
2018-01-13 08:59:26 -08:00
if j then
if i ~= 1 then
2018-01-13 09:52:24 -08:00
name = string.sub ( s , i + 1 , j - 1 )
2018-01-13 08:59:26 -08:00
else
2018-01-13 09:52:24 -08:00
name = string.sub ( s , 1 , j - 1 )
2018-01-13 08:59:26 -08:00
end
2018-01-13 09:52:24 -08:00
if j then
k = string.find ( s , " \n " , i + 1 )
2018-01-13 08:59:26 -08:00
if not k then
j = nil
2018-01-13 09:52:24 -08:00
2018-01-13 08:59:26 -08:00
if playerlist [ name ] then
2018-01-13 09:52:24 -08:00
f : write ( string.sub ( s , i + 1 ) )
2018-01-13 08:59:26 -08:00
else
2018-01-13 09:52:24 -08:00
count = count + 1
2018-01-13 08:59:26 -08:00
end
2018-01-13 09:52:24 -08:00
2018-01-13 08:59:26 -08:00
else
if playerlist [ name ] then
2018-01-13 09:52:24 -08:00
f : write ( string.sub ( s , i + 1 , k ) )
2018-01-13 08:59:26 -08:00
else
2018-01-13 09:52:24 -08:00
count = count + 1
2018-01-13 08:59:26 -08:00
end
2018-01-13 09:52:24 -08:00
i = k
2018-01-13 08:59:26 -08:00
end
end
end
end
2018-01-13 09:52:24 -08:00
f : close ( )
2018-01-13 21:14:56 -08:00
minetest.log ( " action " , " [oldplayer] Removed " .. count .. " entries from auth.txt. Replace auth.txt with auth_new.txt " )
2018-01-13 08:59:26 -08:00
end
local function remove_non_old_player_files ( )
2018-01-13 21:14:56 -08:00
local playerfilelist = minetest.get_dir_list ( worldpath .. " /players " , false ) ;
2018-01-13 08:59:26 -08:00
local count = 0 ;
for _ , name in ipairs ( playerfilelist ) do
if remove_non_old_player_file ( name ) then
count = count + 1
end
end
2018-01-13 21:14:56 -08:00
minetest.log ( " action " , " [oldplayer] Removed " .. count .. " non oldplayer player files " )
2018-01-13 08:59:26 -08:00
end
2018-01-13 09:52:24 -08:00
minetest.register_on_shutdown ( function ( )
remove_non_old_player_files ( )
remove_missing_players_from_auth ( )
end )