124 lines
3.2 KiB
Lua
124 lines
3.2 KiB
Lua
|
local event = require('event')
|
||
|
local commands = require('commands')
|
||
|
|
||
|
config = require('config')
|
||
|
|
||
|
playtimes = {}
|
||
|
playerLogin = {}
|
||
|
initialized = false
|
||
|
|
||
|
function initTimeTracking()
|
||
|
if initialized then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
initialized = true
|
||
|
|
||
|
print('Initializing time tracking')
|
||
|
|
||
|
local loadedPlaytimes, err = config.load('playtime')
|
||
|
|
||
|
if loadedPlaytimes and not err then
|
||
|
playtimes = loadedPlaytimes
|
||
|
end
|
||
|
|
||
|
online, max, names, err = rcon:OnlinePlayers()
|
||
|
|
||
|
if err ~= nil then
|
||
|
print('Unable to load online players: ' .. err:Error())
|
||
|
return
|
||
|
end
|
||
|
|
||
|
for index = 1, #names do
|
||
|
print('Setting login time for ' .. names[index])
|
||
|
playerLogin[names[index]] = os.time()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
initTimeTracking()
|
||
|
|
||
|
event.on('init', initTimeTracking)
|
||
|
|
||
|
event.on('join', function(user)
|
||
|
playerLogin[user] = os.time()
|
||
|
end)
|
||
|
|
||
|
event.on('leave', function(user)
|
||
|
local timeOnline = os.time() - playerLogin[user]
|
||
|
|
||
|
if playtimes[user] ~= nil then
|
||
|
playtimes[user] = playtimes[user] + timeOnline
|
||
|
else
|
||
|
playtimes[user] = timeOnline
|
||
|
end
|
||
|
|
||
|
playerLogin[user] = nil
|
||
|
|
||
|
err = config.save('playtime', playtimes)
|
||
|
|
||
|
if err ~= nil then
|
||
|
print('Unable to save playtimes')
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
commands.register('playtime [name]', function(user, name)
|
||
|
if name == nil then
|
||
|
name = user
|
||
|
end
|
||
|
|
||
|
print('User ' .. user .. ' is checking playtime of ' .. name)
|
||
|
|
||
|
if playtimes[name] == nil and playerLogin[name] == nil then
|
||
|
rcon:SendMessage(user, 'User has not logged any playtime.')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local playTime = playtimes[name] or 0
|
||
|
|
||
|
if playerLogin[name] ~= nil then
|
||
|
local timeOnline = os.time() - playerLogin[name]
|
||
|
|
||
|
playTime = playTime + timeOnline
|
||
|
end
|
||
|
|
||
|
print('Time played: ' .. playTime)
|
||
|
|
||
|
rcon:SendColorfulMessage('@a', 'green', name .. ' has played for ' .. formatElapsed(playTime))
|
||
|
end)
|
||
|
|
||
|
function formatElapsed(elapsedSeconds)
|
||
|
local weeks, days, hours, minutes, seconds = formatSeconds(elapsedSeconds)
|
||
|
|
||
|
local weeksTxt, daysTxt, hoursTxt, minutesTxt, secondsTxt = ""
|
||
|
if weeks == 1 then weeksTxt = 'week' else weeksTxt = 'weeks' end
|
||
|
if days == 1 then daysTxt = 'day' else daysTxt = 'days' end
|
||
|
if hours == 1 then hoursTxt = 'hour' else hoursTxt = 'hours' end
|
||
|
if minutes == 1 then minutesTxt = 'minute' else minutesTxt = 'minutes' end
|
||
|
if seconds == 1 then secondsTxt = 'second' else secondsTxt = 'seconds' end
|
||
|
|
||
|
if elapsedSeconds >= 604800 then
|
||
|
return weeks..' '..weeksTxt..', '..days..' '..daysTxt..', '..hours..' '..hoursTxt..', '..minutes..' '..minutesTxt..', '..seconds..' '..secondsTxt
|
||
|
elseif elapsedSeconds >= 86400 then
|
||
|
return days..' '..daysTxt..', '..hours..' '..hoursTxt..', '..minutes..' '..minutesTxt..', '..seconds..' '..secondsTxt
|
||
|
elseif elapsedSeconds >= 3600 then
|
||
|
return hours..' '..hoursTxt..', '..minutes..' '..minutesTxt..', '..seconds..' '..secondsTxt
|
||
|
elseif elapsedSeconds >= 60 then
|
||
|
return minutes..' '..minutesTxt..', '..seconds..' '..secondsTxt
|
||
|
else
|
||
|
return seconds..' '..secondsTxt
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
function formatSeconds(secondsArg)
|
||
|
local weeks = math.floor(secondsArg / 604800)
|
||
|
local remainder = secondsArg % 604800
|
||
|
local days = math.floor(remainder / 86400)
|
||
|
local remainder = remainder % 86400
|
||
|
local hours = math.floor(remainder / 3600)
|
||
|
local remainder = remainder % 3600
|
||
|
local minutes = math.floor(remainder / 60)
|
||
|
local seconds = remainder % 60
|
||
|
|
||
|
return weeks, days, hours, minutes, seconds
|
||
|
end
|