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