commit 47fe7b7b0f03681603ad3726074dc440b6264e4e Author: Juraj Vajda Date: Sat Jan 13 11:59:26 2018 -0500 initial commit diff --git a/README b/README new file mode 100644 index 0000000..963825c --- /dev/null +++ b/README @@ -0,0 +1,23 @@ +OLD PLAYER +minetest 0.4.14 + +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. +Removed data includes player files and auth.txt info. + +Tested on: Win7, Minetest 0.4.14 + +(c) 2015-2016 rnd + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +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. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . \ No newline at end of file diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..edfeba9 --- /dev/null +++ b/init.lua @@ -0,0 +1,167 @@ +-- OLD PLAYER : keep only serious players data on server +--(c) 2015-2016 rnd + +oldplayer = {} + +-- SETTINGS + +oldplayer.requirement = {"default:dirt 1", "default:steel_ingot 1"}; +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."; + +-- END OF SETTINGS + + +oldplayer.players = {}; +local worldpath = minetest.get_worldpath(); + + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name(); if name == nil then return end + + -- read player inventory data + 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 + inv:set_stack("oldplayer", 2, ItemStack("IP".. ip)) -- string.gsub(ip,".","_"))); + + if isoldplayer > 0 then + oldplayer.players[name] = 1 + minetest.chat_send_player(name, "#OLDPLAYER: welcome back"); + else + local privs = minetest.get_player_privs(name); + if privs.kick then + inv:set_stack("oldplayer", 1, ItemStack("oldplayer")); + minetest.chat_send_player(name, "#OLDPLAYER: welcome moderator. setting as old player."); + oldplayer.players[name] = 1 + else + oldplayer.players[name] = 0 + local form = "size [6,2] textarea[0,0;6.6,3.5;help;OLDPLAYER WELCOME;".. oldplayer.welcome.."]" + minetest.show_formspec(name, "oldplayer:welcome", form) + -- minetest.chat_send_player(name, oldplayer.welcome); + end + end + + +end) + +minetest.register_on_leaveplayer(function(player, timed_out) + local name = player:get_player_name(); if name == nil then return end + if oldplayer.players[name] == 1 then return end -- already old, do nothing + + local delete = false; -- should we delete player? + + -- read player inventory data + local inv = player:get_inventory(); + + -- 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 + inv:set_size("oldplayer", 2); + inv:set_stack("oldplayer", 1, ItemStack("oldplayer")); + else -- delete player profile + + local filename = worldpath .. "\\players\\" .. name; + + -- PROBLEM: deleting doesnt always work? seems minetest itself is saving stuff. + -- so we wait a little and then delete + minetest.after(10,function() + print("[oldplayer] removing player filename " .. filename) + local err,msg = os.remove(filename) + if err==nil then + print ("[oldplayer] error removing player data " .. filename .. " error message: " .. msg) + end + -- TO DO: how to remove players from auth.txt easily without editing file manually like below + end); + end +end +) + +-- delete file if not old player +local function remove_non_old_player_file(name) + 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 +end + +-- deletes data with no corresponding playerfiles from auth.txt and creates auth_new.txt +local function player_file_exists(name) + local f=io.open(worldpath.."\\players\\"..name,"r") + if f~=nil then io.close(f) return true else return false end +end + +local function remove_missing_players_from_auth() + + local playerfilelist = minetest.get_dir_list(worldpath.."\\players", false); + + local f = io.open(worldpath.."\\auth.txt", "r"); + if not f then return end + local s = f:read("*a");f:close(); + local p1,p2; + + f = io.open(worldpath.."\\auth_new.txt", "w"); + if not f then return end + + local playerlist = {}; + for _,name in ipairs(playerfilelist) do + playerlist[name]=true; + end + + local i=0; + local j=0; local k=0; + local name; + local count = 0; + -- parse through auth and remove missing players data + + + while j do + j=string.find(s,":",i); + if j then + if i ~= 1 then + name = string.sub(s,i+1,j-1) + else + name = string.sub(s,1,j-1) + end + if j then + k=string.find(s,"\n",i+1); + if not k then + j = nil + if playerlist[name] then + 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 + count = count + 1 + end + i=k; + end + end + end + end + f:close(); + print("#OLD PLAYER : removed " .. count .. " entries from auth.txt. Replace auth.txt with auth_new.txt"); +end + +local function remove_non_old_player_files() + local playerfilelist = minetest.get_dir_list(worldpath.."\\players", false); + + local count = 0; + for _,name in ipairs(playerfilelist) do + if remove_non_old_player_file(name) then + count = count + 1 + end + end + print("#OLD PLAYER: removed " .. count .. " non oldplayer player files"); +end + +minetest.register_on_shutdown(function() remove_non_old_player_files();remove_missing_players_from_auth() end) \ No newline at end of file