From 522c64e983c781669932e744238dd499cea8e32b Mon Sep 17 00:00:00 2001 From: sys4-fr Date: Sat, 8 Sep 2018 23:50:43 +0200 Subject: [PATCH] =?UTF-8?q?Remplissage=20du=20d=C3=A9p=C3=B4t.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functions.lua | 70 ++++++++++++++++++++++++ init.lua | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++ init.lua.new | 76 ++++++++++++++++++++++++++ 3 files changed, 293 insertions(+) create mode 100755 functions.lua create mode 100755 init.lua create mode 100755 init.lua.new diff --git a/functions.lua b/functions.lua new file mode 100755 index 0000000..693a6b5 --- /dev/null +++ b/functions.lua @@ -0,0 +1,70 @@ +-- Functions +-- + +function whoison.functions.load(param) + --[[ + Values for param : + * `E` : Everyone + * : name + ]]-- + + if param == "E" then + for line in whoison.presence_file:lines() do + local datas = minetest.deserialize(line) + if not datas then + minetest.log("error", "[whoison] Cannot load line (" .. line .. + ") : invalid line") + return false + end + return {[datas.name] = datas.time} + end + return table + elseif minetest.get_player_by_name(param) then + for line in whoison.presence_file:lines() do + local datas = minetest.deserialize(line) + if datas then + if datas.name == param then + return datas.time + end + end + end + minetest.log("error", "[whoison] Cannot load datas for " .. param .. + " : player not registered") + return false + else + minetest.log("error", "[whoison] Cannot load datas for " .. param .. + " : not a player nor 'Everyone'") + return false + end +end + +function whoison.functions.save(param) + --[[ + Values for param : + * : name + ]]-- + + for line in whoison.presence_file:lines() do + local datas = minetest.deserialize(line) + if datas then + if datas.name == param then + -- Erase line + local i = 0 + whoison.presence_file:seek(string.len(line),"cur") + print("removing " .. string.len(line)) + while i < string.len(line) do + whoison.presence_file:write("\b") + i = i + 1 + end + whoison.presence_file:write(minetest.serialize( + {name = param, time = whoison.datas[param]} + ) .. "\n") + return true + end + end + end + whoison.presence_file:write(minetest.serialize( + {name = param, time = whoison.datas[param]} + ) .. "\n") + return true +end diff --git a/init.lua b/init.lua new file mode 100755 index 0000000..af99248 --- /dev/null +++ b/init.lua @@ -0,0 +1,147 @@ +whoison = {} +whoison.lastrun = os.time() +whoison.lastseen = {} + +local filename = minetest.get_worldpath().."/online-players" +local seenfile = minetest.get_worldpath().."/last-seen" + +function whoison.createFile(loopit) + local file = io.open(filename, "w") + file:write(os.time().."\n") + file:write(minetest.get_server_status().."\n") + for _,player in ipairs(minetest.get_connected_players()) do + + local name = player:get_player_name() + whoison.updateStats(name) + local ppos = minetest.pos_to_string(player:getpos()) + local datastring = name.."|"..ppos.."\n" + file:write( datastring ) + end + file:close() + if ( loopit == true ) then + minetest.after(300,whoison.createFile,true) + end + whoison.lastrun = os.time() +end + +function whoison.saveLastSeen() + local f = io.open(seenfile,"w") + f:write(minetest.serialize(whoison.lastseen)) + f:close() +end + +function whoison.loadLastSeen() + local f = io.open(seenfile,"r") + if ( f ~= nil ) then + local ls = f:read("*all") + f:close() + if ( ls ~= nil and ls ~= "" ) then + whoison.lastseen = minetest.deserialize(ls) or {} + end + end +end + +function whoison.getLastOnline(name) + whoison.updateFormat(name) + return whoison.lastseen[name]['lastonline'] +end + +function whoison.getTimeOnline(name) + whoison.updateFormat(name) + return whoison.lastseen[name]['timeonline'] +end + +function whoison.updateStats(name) + whoison.updateFormat(name) + whoison.lastseen[name]['timeonline'] = whoison.lastseen[name]['timeonline'] + ( os.time() - whoison.lastrun ) + whoison.lastseen[name]['lastonline'] = os.time() +end + +function whoison.updateFormat(name) + if ( whoison.lastseen and type(whoison.lastseen[name]) ~= "table" ) then + -- update old data to new format + minetest.log("action",name.." lastseen is not a table... fixing...") + local lo = whoison.lastseen[name] + whoison.lastseen[name] = {timeonline=0,lastonline=lo} + end +end + +minetest.register_on_joinplayer(function (player) + whoison.createFile(false) + whoison.saveLastSeen() +end) + +minetest.register_on_leaveplayer(function (player) + whoison.createFile(false) + whoison.saveLastSeen() +end) + +minetest.register_chatcommand("seen",{ + param = "", + description = "Tells the last time a player was online", + func = function (name, param) + if ( param ~= nil ) then + local t = whoison.getLastOnline(param) + if ( t ~= nil ) then + local diff = (os.time() - t) + minetest.chat_send_player(name,param.." was last online "..breakdowntime(diff).." ago") + else + minetest.chat_send_player(name,"Sorry, I have no record of "..param) + end + else + minetest.chat_send_player(name,"Usage is /seen ") + end + end +}) + +minetest.register_chatcommand("timeonline",{ + param = "", + description = "Shows the cumulative time a player has been online", + func = function (name, param) + if ( param ~= nil ) then + if param == "" then + param = name + end + local t = whoison.getTimeOnline(param) + if ( t ~= nil ) then + minetest.chat_send_player(name,param.." has been online for "..breakdowntime(t)) + else + minetest.chat_send_player(name,"Sorry, I have no record of "..param) + end + else + minetest.chat_send_player(name,"Usage is /timeonline []") + end + end +}) + +--minetest.register_chatcommand("timeonline", core.chatcommands["played"]) + +function breakdowntime(t) + local countdown = t + local answer = "" + + if countdown >= 86400 then + local days = math.floor(countdown / 86400) + countdown = countdown % 86400 + answer = days .. " days " + end + if countdown >= 3600 then + local hours = math.floor(countdown / 3600) + countdown = countdown % 3600 + answer = answer .. hours .. " hours " + end + if countdown >= 60 then + local minutes = math.floor(countdown / 60) + countdown = countdown % 60 + answer = answer .. minutes .. " minutes " + end + + local seconds = countdown + answer = answer .. seconds .. " seconds" + + return answer +end + +minetest.after(10,whoison.createFile,true) + +whoison.loadLastSeen() diff --git a/init.lua.new b/init.lua.new new file mode 100755 index 0000000..51702d3 --- /dev/null +++ b/init.lua.new @@ -0,0 +1,76 @@ +-- Rewrite of whoison mod, LeMagnesium +-- + +whoison = {} +whoison.datas = {} +whoison.config = {} +whoison.config.save_interval = 10 +whoison.functions = {} + +dofile(minetest.get_modpath("whoison") .. "/functions.lua") + +-- Boot, Step 0, open presence file +whoison.presence_file = io.open(minetest.get_worldpath() .. "/whoison.wio","r+") +if not whoison.presence_file then + --minetest.log("error", "[whoison] Cannot open presence file! Mod disabled.") + whoison.presence_file = io.open(minetest.get_worldpath() .. "/whoison.wio","w") + return +end + +whoison.datas = whoison.functions.load("E") +if not whoison.datas then + whoison.datas = {} +end + + +-- Boot, Step 1, define callbacks + +function whoison.functions.on_newplayer(player) + whoison.datas[player:get_player_name()] = 0 +end + +function whoison.functions.on_joinplayer(player) + local time = whoison.functions.load(player:get_player_name()) + if not time then + minetest.log("error", "[whoison] Reading failed. Player " .. + player:get_player_name()) + whoison.datas[player:get_player_name()] = 0 + + return + end + minetest.log("action", "[whoison] Successfuly read datas for player" .. + player:get_player_name()) + whoison.datas[player:get_player_name()] = time +end + +function whoison.functions.on_leaveplayer(player) + local name = player:get_player_name() + local auth = minetest.get_auth_handler().get_auth(name) + if auth and auth.last_login then + local last_login = auth.last_login + local uptime = os.difftime(os.time(),last_login) + whoison.datas[name] = whoison.datas[name] + uptime + local success = whoison.functions.save(name) + if not success then + minetest.log("error", "[whoison] Something went wrong while saving " .. + name .. "'s file") + else + minetest.log("action", "[whoison] Successfuly saved datas for " .. + "player " .. name) + end + else + minetest.log("error", "[whoison] Couldn't get " .. name .. "'s uptime") + return + end +end + +function whoison.functions.on_shutdown() + for index, player in pairs(minetest.get_connected_players()) do + whoison.functions.on_leaveplayer(player) + end +end + +minetest.register_on_joinplayer(whoison.functions.on_joinplayer) +minetest.register_on_newplayer(whoison.functions.on_newplayer) +minetest.register_on_leaveplayer(whoison.functions.on_leaveplayer) +minetest.register_on_shutdown(whoison.functions.on_shutdown)