Annotate

plugins/mod_lastactivity.lua @ 5524:e9090966c803

util.prosodyctl: Initialize storagemanager on the host before initializing usermanager. This fixes brokenness when the auth provider opens the store on load (as they all do since eeea0eb2602a) (thanks nulani)
author Matthew Wild <mwild1@gmail.com>
date Sat, 27 Apr 2013 13:11:03 +0100
parent 2923:b7049746bd29
child 5776:bd0ff8ae98a8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2018
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2029
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2029
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
2018
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
4 --
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
6 -- COPYING file in the source package for more information.
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
7 --
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
8
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
9 local st = require "util.stanza";
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
10 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
11 local jid_bare = require "util.jid".bare;
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
12 local jid_split = require "util.jid".split;
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
13
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
14 module:add_feature("jabber:iq:last");
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
15
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
16 local map = {};
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
17
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
18 module:hook("pre-presence/bare", function(event)
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
19 local stanza = event.stanza;
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
20 if not(stanza.attr.to) and stanza.attr.type == "unavailable" then
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
21 local t = os.time();
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
22 local s = stanza:child_with_name("status");
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
23 s = s and #s.tags == 0 and s[1] or "";
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
24 map[event.origin.username] = {s = s, t = t};
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
25 end
2029
d2363643a5c0 mod_lastactivity: Gave a positive priority to the presence event hook.
Waqas Hussain <waqas20@gmail.com>
parents: 2026
diff changeset
26 end, 10);
2018
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
27
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
28 module:hook("iq/bare/jabber:iq:last:query", function(event)
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
29 local origin, stanza = event.origin, event.stanza;
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
30 if stanza.attr.type == "get" then
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
31 local username = jid_split(stanza.attr.to) or origin.username;
2025
dab1693f8a08 mod_lastactivity: Allow users to request their own last activity.
Waqas Hussain <waqas20@gmail.com>
parents: 2018
diff changeset
32 if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then
2018
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
33 local seconds, text = "0", "";
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
34 if map[username] then
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
35 seconds = tostring(os.difftime(os.time(), map[username].t));
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
36 text = map[username].s;
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
37 end
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
38 origin.send(st.reply(stanza):tag('query', {xmlns='jabber:iq:last', seconds=seconds}):text(text));
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
39 else
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
40 origin.send(st.error_reply(stanza, 'auth', 'forbidden'));
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
41 end
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
42 return true;
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
43 end
418c04834017 mod_lastactivity: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
44 end);
2026
97b17187b29d mod_lastactivity: Persist data across reloads.
Waqas Hussain <waqas20@gmail.com>
parents: 2025
diff changeset
45
97b17187b29d mod_lastactivity: Persist data across reloads.
Waqas Hussain <waqas20@gmail.com>
parents: 2025
diff changeset
46 module.save = function()
97b17187b29d mod_lastactivity: Persist data across reloads.
Waqas Hussain <waqas20@gmail.com>
parents: 2025
diff changeset
47 return {map = map};
97b17187b29d mod_lastactivity: Persist data across reloads.
Waqas Hussain <waqas20@gmail.com>
parents: 2025
diff changeset
48 end
97b17187b29d mod_lastactivity: Persist data across reloads.
Waqas Hussain <waqas20@gmail.com>
parents: 2025
diff changeset
49 module.restore = function(data)
97b17187b29d mod_lastactivity: Persist data across reloads.
Waqas Hussain <waqas20@gmail.com>
parents: 2025
diff changeset
50 map = data.map or {};
97b17187b29d mod_lastactivity: Persist data across reloads.
Waqas Hussain <waqas20@gmail.com>
parents: 2025
diff changeset
51 end
97b17187b29d mod_lastactivity: Persist data across reloads.
Waqas Hussain <waqas20@gmail.com>
parents: 2025
diff changeset
52