Mercurial > prosody-modules
diff mod_nodeinfo2/mod_nodeinfo2.lua @ 3790:352f3efe1b67
mod_nodeinfo2: Refresh the number of recent users daily
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Mon, 30 Dec 2019 22:39:17 +0100 |
parents | e3b673df3906 |
children | 34a8f9f996ec |
line wrap: on
line diff
--- a/mod_nodeinfo2/mod_nodeinfo2.lua Mon Dec 30 22:20:11 2019 +0100 +++ b/mod_nodeinfo2/mod_nodeinfo2.lua Mon Dec 30 22:39:17 2019 +0100 @@ -1,6 +1,8 @@ local json = require "util.json"; local array = require "util.array"; +local add_task = require "util.timer".add_task; local get_stats = require "core.statsmanager".get_stats; +local list_users = require "core.usermanager".users; local os_time = os.time; module:depends("http"); @@ -14,39 +16,45 @@ local main_store = module:open_store(); local lastlog_store = module:open_store("lastlog"); -local total_users = 0; -local half_year_users = 0; -local month_users = 0; -local week_users = 0; -for user in require "core.usermanager".users(module.host) do -- TODO refresh at some interval? - total_users = total_users + 1; - local lastlog = lastlog_store:get(user); - if lastlog and lastlog.timestamp then - local delta = os_time() - lastlog.timestamp; - if delta < 6 * 30 * 24 * 60 * 60 then - half_year_users = half_year_users + 1; - end - if delta < 30 * 24 * 60 * 60 then - month_users = month_users + 1; - end - if delta < 7 * 24 * 60 * 60 then - week_users = week_users + 1; - end - end -end - --- Remove the properties if we couldn’t find a single active user. It most likely means mod_lastlog isn’t in use. -if half_year_users == 0 and month_users == 0 and week_users == 0 then - half_year_users = nil; - month_users = nil; - week_users = nil; -end - local data; if expose_posts then data = main_store:get("nodeinfo2") or { message_count = 0 }; end +local total_users = 0; +local week_users = 0; +local month_users = 0; +local half_year_users = 0; + +local function update_user_list() + for user in list_users(module.host) do + total_users = total_users + 1; + local lastlog = lastlog_store:get(user); + if lastlog and lastlog.timestamp then + local delta = os_time() - lastlog.timestamp; + if delta < 7 * 86400 then + week_users = week_users + 1; + end + if delta < 30 * 86400 then + month_users = month_users + 1; + end + if delta < 6 * 30 * 86400 then + half_year_users = half_year_users + 1; + end + end + end + + -- Remove the properties if we couldn’t find a single active user. It most likely means mod_lastlog isn’t in use. + if half_year_users == 0 and month_users == 0 and week_users == 0 then + week_users = nil; + month_users = nil; + half_year_users = nil; + end +end + +add_task(86400, update_user_list); +update_user_list(); + module:provides("http", { default_path = "/.well-known/x-nodeinfo2"; route = { @@ -54,9 +62,9 @@ local usage = { users = { total = total_users; - activeHalfyear = half_year_users; + activeWeek = week_users; activeMonth = month_users; - activeWeek = week_users; + activeHalfyear = half_year_users; }; };