Annotate

mod_muc_activity/mod_muc_activity.lua @ 6319:63ef69b2f046

mod_http_oauth2: Assume Prosody 13.0+ roles are available Per the README, 0.12 is not supported, so we should not need to worry about this. Plus it is assumed to be present elsewhere and that would throw errors.
author Kim Alvefur <zash@zash.se>
date Wed, 02 Jul 2025 16:15:32 +0200
parent 6133:a0429c322454
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6133
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
1 local os_time = os.time;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
2 local math_floor = math.floor;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
3 local store = module:open_store("muc_activity", "keyval");
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
4
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
5 local accumulator = {};
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
6
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
7 local field_var = "{urn:xmpp:muc-activity}message-activity";
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
8
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
9 module:hook("muc-room-destroyed", function (event)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
10 local jid = event.room.jid;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
11 module:log("debug", "deleting activity data for destroyed muc %s", jid);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
12 store:set_keys(jid, {});
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
13 accumulator[jid] = nil;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
14 end)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
15
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
16 module:hook("muc-occupant-groupchat", function (event)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
17 local jid = event.room.jid;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
18 if not event.room:get_persistent() then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
19 -- we do not count stanzas in non-persistent rooms
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
20 if accumulator[jid] then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
21 -- if we have state for the room, drop it.
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
22 store:set_keys(jid, {});
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
23 accumulator[jid] = nil;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
24 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
25
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
26 return
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
27 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
28
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
29 if event.stanza:get_child("body") == nil then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
30 -- we do not count stanzas without body.
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
31 return
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
32 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
33
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
34 module:log("debug", "counting stanza for MUC activity in %s", jid);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
35 accumulator[jid] = (accumulator[jid] or 0) + 1;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
36 end)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
37
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
38 local function shift(data)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
39 for i = 1, 23 do
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
40 data[i] = data[i+1]
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
41 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
42 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
43
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
44 local function accumulate(data)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
45 if data == nil then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
46 return 0;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
47 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
48 local accum = 0;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
49 for i = 1, 24 do
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
50 local v = data[i];
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
51 if v ~= nil then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
52 accum = accum + v
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
53 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
54 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
55 return accum;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
56 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
57
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
58 module:hourly("muc-activity-shift", function ()
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
59 module:log("info", "shifting MUC activity store forward by one hour");
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
60 for jid in store:users() do
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
61 local data = store:get(jid);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
62 local new = accumulator[jid] or 0;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
63 shift(data);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
64 data[24] = new;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
65 accumulator[jid] = nil;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
66 store:set(jid, data);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
67 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
68
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
69 -- All remaining entries in the accumulator are non-existent in the store,
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
70 -- otherwise they would have been removed earlier.
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
71 for jid, count in pairs(accumulator) do
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
72 store:set(jid, { [24] = count });
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
73 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
74 accumulator = {};
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
75 end)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
76
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
77 module:hook("muc-disco#info", function(event)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
78 local room = event.room;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
79 local jid = room.jid;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
80 if not room:get_persistent() or not room:get_public() or room:get_members_only() or room:get_password() ~= nil then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
81 module:log("debug", "%s is not persistent or not public, not injecting message activity", jid);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
82 return;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
83 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
84 local count = accumulate(store:get(jid)) / 24.0;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
85 table.insert(event.form, { name = field_var, label = "Message activity" });
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
86 event.formdata[field_var] = tostring(count);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
87 end);