Camas/mods/player_list/init.lua

115 lines
3.1 KiB
Lua
Raw Normal View History

2015-10-01 23:27:05 +02:00
--
-- Player listing mod
2015-10-01 23:27:05 +02:00
-- By Kaadmy, for Pixture
--
player_list = {}
2015-10-01 23:27:05 +02:00
-- current players format:
-- {<playername> = <last connect(if connected, or nil)>}
player_list.players = {}
2015-10-01 23:27:05 +02:00
local function divmod(f, d)
return {math.floor(f / d), f % d}
end
local function prettytime(time)
local a = divmod(time, 60)
local seconds = a[2]
local minutes = a[1]
local b = divmod(minutes, 60)
local hours = b[1]
minutes = b[2]
local c = divmod(hours, 24)
local days = c[1]
hours = c[2]
local str = ""
if days ~= 0 then str = str .. days .. "d " end
if hours ~= 0 then str = str .. hours .. "h " end
if minutes ~= 0 then str = str .. minutes .. "m " end
str = str .. seconds .. "s"
return str
end
local function on_joinplayer(player)
local name = player:get_player_name()
player_list.players[name] = minetest.get_gametime()
2015-10-01 23:27:05 +02:00
end
local function on_leaveplayer(player)
local name = player:get_player_name()
player_list.players[name] = minetest.get_gametime()
2015-10-01 23:27:05 +02:00
end
minetest.register_on_joinplayer(on_joinplayer)
minetest.register_on_leaveplayer(on_leaveplayer)
2015-10-01 23:27:05 +02:00
minetest.register_chatcommand(
2015-10-01 23:27:05 +02:00
"plist",
{
params = "[all|recent]",
description = "List current, recent, or all players since the last server restart",
2015-10-03 01:13:36 +02:00
func = function(player_name, param)
local time = minetest.get_gametime()
2015-10-01 23:27:05 +02:00
local str = ""
if param == "all" then
minetest.chat_send_player(player_name, "Players:")
elseif param == "recent" then
str = str .. "Recent players: "
else
str = str .. "Connected players: "
end
2015-10-01 23:27:05 +02:00
local player_count = 0
for name, jointime in pairs(player_list.players) do
local plyr = minetest.get_player_by_name(name)
if param == "all" then
if plyr ~= nil then
player_count = player_count + 1
minetest.chat_send_player(player_name, " " .. name .. ": connected for " .. prettytime(time - jointime))
else
minetest.chat_send_player(player_name, " " .. name .. ": last seen " .. prettytime(time - jointime) .. " ago")
end
elseif param == "recent" then
if plyr == nil then -- Only show players that were connected but are currently disconnected
player_count = player_count + 1
if player_count == 1 then
str = str .. name
else
str = str .. ", " .. name
end
end
elseif plyr ~= nil then
player_count = player_count + 1
if player_count == 1 then
str = str .. name
else
str = str .. ", " .. name
end
end
end
2015-10-01 23:27:05 +02:00
minetest.chat_send_player(player_name, str)
if param == "recent" then
minetest.chat_send_player(player_name, player_count .. " recent players")
else
minetest.chat_send_player(player_name, player_count .. " connected players")
end
2019-06-23 21:05:52 +02:00
return true
2015-10-01 23:27:05 +02:00
end
})
default.log("mod:player_list", "loaded")