Compare commits

...

5 Commits

Author SHA1 Message Date
Juraj Vajda 6fcb01246d copy change 2018-01-14 01:39:55 -05:00
Juraj Vajda a615845d53 some copy changes 2018-01-14 00:45:21 -05:00
Juraj Vajda 9c5921cc64 debug messages 2018-01-14 00:15:36 -05:00
Juraj Vajda 3311078987 debug messages 2018-01-14 00:14:56 -05:00
Juraj Vajda ded84548a5 format file for better readability 2018-01-13 12:52:24 -05:00
2 changed files with 113 additions and 75 deletions

4
README
View File

@ -1,5 +1,7 @@
OLD PLAYER OLD PLAYER
minetest 0.4.14 minetest 0.4.14+
Modified by SaKeL for Survival X server.
Keep only those players that really did something, like getting some materials (can adjust what in settings). Keep only those players that really did something, like getting some materials (can adjust what in settings).
Removes all player data of players that dont really play and come to just check out the server. Removes all player data of players that dont really play and come to just check out the server.

184
init.lua
View File

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