Software / code / prosody-modules
Comparison
mod_lastlog2/mod_lastlog2.lua @ 4012:fd582067c732
mod_lastlog2: Store last timestamp per account event
Incompatible with mod_lastlog and other modules using its data due to
use of map store
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 29 Mar 2020 15:09:25 +0200 |
| parent | 1493:mod_lastlog/mod_lastlog.lua@d5e8758d391d |
| child | 4102:4e7ff27c212c |
comparison
equal
deleted
inserted
replaced
| 4011:de40686ae9c8 | 4012:fd582067c732 |
|---|---|
| 1 local jid = require "util.jid"; | |
| 2 local time = os.time; | |
| 3 local log_ip = module:get_option_boolean("lastlog_ip_address", false); | |
| 4 | |
| 5 local store; | |
| 6 if module.host ~= "*" then -- workaround for prosodyctl loading into global context | |
| 7 store = module:open_store(nil, "map"); | |
| 8 end | |
| 9 | |
| 10 module:hook("authentication-success", function(event) | |
| 11 local session = event.session; | |
| 12 if session.username then | |
| 13 store:set(session.username, "login", { | |
| 14 timestamp = time(), | |
| 15 ip = log_ip and session and session.ip or nil, | |
| 16 }); | |
| 17 end | |
| 18 end); | |
| 19 | |
| 20 module:hook("resource-unbind", function(event) | |
| 21 local session = event.session; | |
| 22 if session.username then | |
| 23 store:set(session.username, "logout", { | |
| 24 timestamp = time(), | |
| 25 ip = log_ip and session and session.ip or nil, | |
| 26 }); | |
| 27 end | |
| 28 end); | |
| 29 | |
| 30 module:hook("user-registered", function(event) | |
| 31 local session = event.session; | |
| 32 store:set(event.username, "lastlog", { | |
| 33 event = "registered"; | |
| 34 timestamp = time(), | |
| 35 ip = log_ip and session and session.ip or nil, | |
| 36 }); | |
| 37 end); | |
| 38 | |
| 39 | |
| 40 if module:get_host_type() == "component" then | |
| 41 module:hook("message/bare", function(event) | |
| 42 local room = jid.split(event.stanza.attr.to); | |
| 43 if room then | |
| 44 store:set(room, module.host, "message", { | |
| 45 timestamp = time(), | |
| 46 }); | |
| 47 end | |
| 48 end); | |
| 49 end | |
| 50 | |
| 51 function module.command(arg) | |
| 52 if not arg[1] or arg[1] == "--help" then | |
| 53 require"util.prosodyctl".show_usage([[mod_lastlog <user@host>]], [[Show when user last logged in or out]]); | |
| 54 return 1; | |
| 55 end | |
| 56 local user, host = jid.prepped_split(table.remove(arg, 1)); | |
| 57 require"core.storagemanager".initialize_host(host); | |
| 58 store = module:context(host):open_store(); | |
| 59 local lastlog = store:get(user); | |
| 60 if lastlog then | |
| 61 for event, data in pairs(lastlog) do | |
| 62 print(("Last %s: %s"):format(event, | |
| 63 data.timestamp and os.date("%Y-%m-%d %H:%M:%S", data.timestamp) or "<unknown>")); | |
| 64 if lastlog.ip then | |
| 65 print("IP address: "..lastlog.ip); | |
| 66 end | |
| 67 end | |
| 68 else | |
| 69 print("No record found"); | |
| 70 return 1; | |
| 71 end | |
| 72 return 0; | |
| 73 end |